diff --git a/.gitignore b/.gitignore index 1f9e5551..3fa6450e 100644 --- a/.gitignore +++ b/.gitignore @@ -283,3 +283,5 @@ cypress/screenshots cypress/test-reports /server/vbv_lernwelt/static/css/tailwind.css +/server/vbv_lernwelt/static/vue/ +/server/vbv_lernwelt/templates/vue/index.html diff --git a/caprover_create_app.py b/caprover_create_app.py index 652f1d88..2306907f 100644 --- a/caprover_create_app.py +++ b/caprover_create_app.py @@ -28,7 +28,7 @@ cap.deploy_one_click_app( namespace='vbv-lernwelt', # check https://github.com/caprover/one-click-apps/blob/master/public/v4/apps/postgres.yml app_variables={ - '$$cap_postgres_version': '14.1', + '$$cap_postgres_version': '14.2', '$$cap_pg_user': db_user, '$$cap_pg_pass': db_pass, '$$cap_pg_db': db_name, diff --git a/caprover_deploy.sh b/caprover_deploy.sh index 292cf0d7..aa996df9 100755 --- a/caprover_deploy.sh +++ b/caprover_deploy.sh @@ -1,5 +1,8 @@ #!/bin/bash +# create client +npm run build + # create and push new docker container docker build -f compose/django/Dockerfile -t iterativ/vbv-lernwelt-django . docker push iterativ/vbv-lernwelt-django diff --git a/client/package.json b/client/package.json index bbdae473..b69a742a 100644 --- a/client/package.json +++ b/client/package.json @@ -3,7 +3,7 @@ "version": "0.0.0", "scripts": { "dev": "vite", - "build": "vue-tsc --noEmit && vite build", + "build": "vue-tsc --noEmit && vite build && cp ./dist/index.html ../server/vbv_lernwelt/templates/vue/index.html && cp -r ./dist/static/vue ../server/vbv_lernwelt/static/", "preview": "vite preview --port 5050", "test:unit": "vitest --environment jsdom", "test:e2e": "start-server-and-test preview http://127.0.0.1:5050/ 'cypress open'", diff --git a/client/src/main.ts b/client/src/main.ts index 52412ad1..b0b3f535 100644 --- a/client/src/main.ts +++ b/client/src/main.ts @@ -1,7 +1,7 @@ -import { createApp } from 'vue' -import { createPinia } from 'pinia' +import {createApp} from 'vue' +import {createPinia} from 'pinia' -import {setupI18n, loadLocaleMessages} from './i18n' +import {setupI18n} from './i18n' import App from './App.vue' import router from './router' @@ -11,7 +11,7 @@ const i18n = setupI18n() const app = createApp(App) // todo: define lang setup -await loadLocaleMessages(i18n, 'de') +// await loadLocaleMessages(i18n, 'de') app.use(createPinia()) app.use(router) diff --git a/client/src/router/index.ts b/client/src/router/index.ts index 3b072d4c..4dfb3c49 100644 --- a/client/src/router/index.ts +++ b/client/src/router/index.ts @@ -36,8 +36,8 @@ const router = createRouter({ component: () => import('../views/ProfileView.vue'), }, { - path: '/learningpath/:learningPathId', - component: () => import('../views/LearningPathOverview.vue'), + path: '/:pathMatch(.*)*', + component: () => import('../views/404View.vue'), }, ] }) diff --git a/client/src/views/404View.vue b/client/src/views/404View.vue new file mode 100644 index 00000000..4437a8d1 --- /dev/null +++ b/client/src/views/404View.vue @@ -0,0 +1,11 @@ + + + + + diff --git a/client/src/views/LearningPathOverview.vue b/client/src/views/LearningPathOverview.vue deleted file mode 100644 index 197c1a8c..00000000 --- a/client/src/views/LearningPathOverview.vue +++ /dev/null @@ -1,16 +0,0 @@ - - - - - diff --git a/client/vite.config.ts b/client/vite.config.ts index 6fcf6971..0420dde0 100644 --- a/client/vite.config.ts +++ b/client/vite.config.ts @@ -1,9 +1,8 @@ -import path from 'path' import {fileURLToPath, URL} from 'url' import {defineConfig, loadEnv} from 'vite' import vue from '@vitejs/plugin-vue' -import vueI18n from '@intlify/vite-plugin-vue-i18n' +// import vueI18n from '@intlify/vite-plugin-vue-i18n' import alias from '@rollup/plugin-alias' // https://vitejs.dev/config/ @@ -12,17 +11,18 @@ export default ({mode}) => { return defineConfig({ plugins: [ vue(), - vueI18n({ - include: path.resolve(__dirname, './locales/**') - }), + // vueI18n({ + // include: path.resolve(__dirname, './locales/**') + // }), // won't work in vite's resolve.alias, so we'll make the alias here alias({ - entries: [ - { - find: 'vue-i18n', - replacement: path.resolve(__dirname, './node_modules/vue-i18n/dist/vue-i18n.runtime.esm-bundler.js') - } - ] + // TODO: why is that used? + // entries: [ + // { + // find: 'vue-i18n', + // replacement: path.resolve(__dirname, './node_modules/vue-i18n/dist/vue-i18n.runtime.esm-bundler.js') + // } + // ] }) ], resolve: { @@ -30,5 +30,8 @@ export default ({mode}) => { '@': fileURLToPath(new URL('./src', import.meta.url)), }, }, + build: { + assetsDir: 'static/vue', + } }) } diff --git a/compose/django/Dockerfile b/compose/django/Dockerfile index dbd61353..c437b663 100644 --- a/compose/django/Dockerfile +++ b/compose/django/Dockerfile @@ -13,10 +13,7 @@ FROM node:16-bullseye-slim as client-builder ARG APP_HOME=/app WORKDIR ${APP_HOME} -COPY ./server/package.json ${APP_HOME} -RUN npm install && npm cache clean --force COPY ./server ${APP_HOME} -RUN npm run build # define an alias for the specfic python version used in this file. FROM python:${PYTHON_VERSION} as python diff --git a/compose/django/docker_start.sh b/compose/django/docker_start.sh index ddc94453..9c06873f 100644 --- a/compose/django/docker_start.sh +++ b/compose/django/docker_start.sh @@ -4,9 +4,8 @@ set -o errexit set -o pipefail set -o nounset - python /app/manage.py collectstatic --noinput -python /app/manage.py migrate python /app/manage.py createcachetable +python /app/manage.py migrate /usr/local/bin/gunicorn config.asgi --bind 0.0.0.0:80 --chdir=/app -k uvicorn.workers.UvicornWorker diff --git a/package.json b/package.json index e648cbdd..6f79d5ff 100644 --- a/package.json +++ b/package.json @@ -2,6 +2,8 @@ "name": "vbv_lernwelt_cypress", "version": "1.0.0", "scripts": { + "build": "npm install --prefix client && npm run build --prefix client && npm run build:tailwind", + "build:tailwind": "tailwindcss -i ./tailwind/input.css -o ./server/vbv_lernwelt/static/css/tailwind.css --minify", "test": "echo \"Error: no test specified\" && exit 1", "cypress:open": "cypress open", "cypress:run": "cypress run", diff --git a/prepare_server.sh b/prepare_server.sh index 09d92220..81a13cf0 100755 --- a/prepare_server.sh +++ b/prepare_server.sh @@ -57,7 +57,7 @@ if [ "$SKIP_SETUP" = false ]; then python3 server/manage.py createcachetable --settings="$DJANGO_SETTINGS_MODULE" python3 server/manage.py migrate --settings="$DJANGO_SETTINGS_MODULE" python3 server/manage.py create_default_users --settings="$DJANGO_SETTINGS_MODULE" - python3 server/manage.py create_default_learningpath --settings="$DJANGO_SETTINGS_MODULE" + python3 server/manage.py create_default_learning_path --settings="$DJANGO_SETTINGS_MODULE" # make django translations (cd server && python3 manage.py compilemessages --settings="$DJANGO_SETTINGS_MODULE") diff --git a/production.yml b/production.yml deleted file mode 100644 index f04b1f56..00000000 --- a/production.yml +++ /dev/null @@ -1,46 +0,0 @@ -version: '3' - -volumes: - production_postgres_data: {} - production_postgres_data_backups: {} - production_traefik: {} - -services: - django: - build: - context: . - dockerfile: ./compose/production/django/Dockerfile - image: vbv_lernwelt_production_django - depends_on: - - postgres - - redis - env_file: - - env_secrets/production.env - command: /start - - postgres: - build: - context: . - dockerfile: ./compose/production/postgres/Dockerfile - image: vbv_lernwelt_production_postgres - volumes: - - production_postgres_data:/var/lib/postgresql/data:Z - - production_postgres_data_backups:/backups:z - env_file: - - env_secrets/production.env - - traefik: - build: - context: . - dockerfile: ./compose/production/traefik/Dockerfile - image: vbv_lernwelt_production_traefik - depends_on: - - django - volumes: - - production_traefik:/etc/traefik/acme:z - ports: - - "0.0.0.0:80:80" - - "0.0.0.0:443:443" - - redis: - image: redis:6 diff --git a/server/config/urls.py b/server/config/urls.py index efb530e4..209ba4bf 100644 --- a/server/config/urls.py +++ b/server/config/urls.py @@ -1,4 +1,3 @@ - from django.conf import settings from django.conf.urls.static import static from django.contrib import admin @@ -19,7 +18,7 @@ from vbv_lernwelt.core.middleware.auth import django_view_authentication_exempt from vbv_lernwelt.core.views import ( rate_limit_exceeded_view, permission_denied_view, - check_rate_limit, vue_home, + check_rate_limit, vue_home, cypress_reset_view, ) from .wagtail_api import api_router @@ -65,6 +64,11 @@ urlpatterns += [ path("api/docs/", SpectacularSwaggerView.as_view(url_name="api-schema"), name="api-docs",), path("", include(grapple_urls)), ] + +if settings.APP_ENVIRONMENT != 'production': + urlpatterns += [ + re_path(r'cypressreset/$', cypress_reset_view, name='cypress_reset_view'), + ] # fmt: on diff --git a/server/setup_test_data.sh b/server/setup_test_data.sh deleted file mode 100644 index 7a1dd173..00000000 --- a/server/setup_test_data.sh +++ /dev/null @@ -1,5 +0,0 @@ -python manage.py migrate -python manage.py createcachetable -python manage.py create_default_users -#python manage.py create_default_learingpath - diff --git a/server/vbv_lernwelt/core/create_default_users.py b/server/vbv_lernwelt/core/create_default_users.py index 5cd12ce7..886e736f 100644 --- a/server/vbv_lernwelt/core/create_default_users.py +++ b/server/vbv_lernwelt/core/create_default_users.py @@ -4,17 +4,24 @@ from django.contrib.auth.models import Group from vbv_lernwelt.core.models import User -def create_default_users(user_model=User, group_model=Group): +def create_default_users(user_model=User, group_model=Group, default_password=None): admin_group, created = group_model.objects.get_or_create(name='admin_group') content_creator_grop, created = group_model.objects.get_or_create(name='content_creator_grop') student_group, created = group_model.objects.get_or_create(name='student_group') - admin_user, created = _get_or_create_user(user_model=user_model, username='admin', password='admin') + admin_password = default_password + if not admin_password: + admin_password = 'admin' + admin_user, created = _get_or_create_user(user_model=user_model, username='admin', password=admin_password) admin_user.is_superuser = True + admin_user.is_staff = True admin_user.groups.add(admin_group) admin_user.save() - student_user, created = _get_or_create_user(user_model=user_model, username='student', password='student') + student_user_password = default_password + if not student_user_password: + student_user_password = 'student' + student_user, created = _get_or_create_user(user_model=user_model, username='student', password=student_user_password) student_user.groups.add(student_group) student_user.save() diff --git a/server/vbv_lernwelt/core/management/commands/create_default_users.py b/server/vbv_lernwelt/core/management/commands/create_default_users.py index 2d7c365d..2053c336 100644 --- a/server/vbv_lernwelt/core/management/commands/create_default_users.py +++ b/server/vbv_lernwelt/core/management/commands/create_default_users.py @@ -1,8 +1,7 @@ -from vbv_lernwelt.core.create_default_users import create_default_users - - import djclick as click +from vbv_lernwelt.core.create_default_users import create_default_users + @click.command() def command(): diff --git a/server/vbv_lernwelt/core/management/commands/cypress_reset.py b/server/vbv_lernwelt/core/management/commands/cypress_reset.py index 76dbf7cb..934dc1f2 100644 --- a/server/vbv_lernwelt/core/management/commands/cypress_reset.py +++ b/server/vbv_lernwelt/core/management/commands/cypress_reset.py @@ -1,7 +1,7 @@ -# pylint: disable=import-outside-toplevel - import djclick as click -from django.contrib.auth import get_user_model + +from vbv_lernwelt.learnpath.tests.create_default_learning_path import create_default_learning_path, \ + delete_default_learning_path @click.command() @@ -9,17 +9,5 @@ from django.contrib.auth import get_user_model def command(customer_language): print("cypress reset data") - User = get_user_model() - - users = [ - "cypress@example.com", - ] - for user in users: - User.objects.filter(username=user).delete() - - user = User.objects.create( - username=user, - email=user, - ) - user.set_password("test") - user.save() + delete_default_learning_path() + create_default_learning_path() diff --git a/server/vbv_lernwelt/core/migrations/0002_create_users.py b/server/vbv_lernwelt/core/migrations/0002_create_users.py index 0d19f917..e5d92cfa 100644 --- a/server/vbv_lernwelt/core/migrations/0002_create_users.py +++ b/server/vbv_lernwelt/core/migrations/0002_create_users.py @@ -1,20 +1,16 @@ +from django.conf import settings +from django.contrib.auth.models import Group from django.db import migrations +from vbv_lernwelt.core.create_default_users import create_default_users from vbv_lernwelt.core.models import User -def create_iterativ_users(apps, schema_editor): - for username in [ - "info@iterativ.ch", - ]: - user = User.objects.create( - username=username, - email=username, - is_superuser=True, - is_staff=True, - ) - user.set_password("ACEEs0DCmNaPxdoNV8vhccuCTRl9b") - user.save() +def create_users(apps, schema_editor): + default_password = 'ACEEs0DCmNaPxdoNV8vhccuCTRl9b' + if settings.APP_ENVIRONMENT == 'development': + default_password = None + create_default_users(user_model=User, group_model=Group, default_password=default_password) class Migration(migrations.Migration): @@ -23,5 +19,5 @@ class Migration(migrations.Migration): ] operations = [ - migrations.RunPython(create_iterativ_users), + migrations.RunPython(create_users), ] diff --git a/server/vbv_lernwelt/core/views.py b/server/vbv_lernwelt/core/views.py index 50597690..52d37736 100644 --- a/server/vbv_lernwelt/core/views.py +++ b/server/vbv_lernwelt/core/views.py @@ -1,10 +1,14 @@ # Create your views here. import requests from django.conf import settings -from django.http import JsonResponse, HttpResponse +from django.core.management import call_command +from django.http import JsonResponse, HttpResponse, HttpResponseRedirect from django.shortcuts import render from django.views.decorators.csrf import ensure_csrf_cookie from ratelimit.decorators import ratelimit +from rest_framework import authentication +from rest_framework.decorators import api_view, authentication_classes, permission_classes +from rest_framework.permissions import IsAdminUser from vbv_lernwelt.core.middleware.auth import django_view_authentication_exempt @@ -24,7 +28,7 @@ def vue_home(request): ) # render index.html from `npm run build` - return render(request, 'index.html', {}) + return render(request, 'vue/index.html', {}) def permission_denied_view(request, exception): @@ -51,3 +55,13 @@ def server_json_error(request, *args, **kwargs): @django_view_authentication_exempt def check_rate_limit(request): return HttpResponse(content=b"Hello") + + +@api_view(['POST']) +@authentication_classes((authentication.SessionAuthentication,)) +@permission_classes((IsAdminUser,)) +def cypress_reset_view(request): + if settings.APP_ENVIRONMENT != 'production': + call_command('cypress_reset') + + return HttpResponseRedirect('/admin/') diff --git a/server/vbv_lernwelt/learnpath/management/commands/create_default_learningpath.py b/server/vbv_lernwelt/learnpath/management/commands/create_default_learning_path.py similarity index 81% rename from server/vbv_lernwelt/learnpath/management/commands/create_default_learningpath.py rename to server/vbv_lernwelt/learnpath/management/commands/create_default_learning_path.py index 1f5702fb..7df9caaf 100644 --- a/server/vbv_lernwelt/learnpath/management/commands/create_default_learningpath.py +++ b/server/vbv_lernwelt/learnpath/management/commands/create_default_learning_path.py @@ -1,5 +1,3 @@ -# pylint: disable=import-outside-toplevel - import djclick as click from vbv_lernwelt.learnpath.tests.create_default_learning_path import create_default_learning_path diff --git a/server/vbv_lernwelt/learnpath/management/commands/delete_default_learning_path.py b/server/vbv_lernwelt/learnpath/management/commands/delete_default_learning_path.py new file mode 100644 index 00000000..c07106f5 --- /dev/null +++ b/server/vbv_lernwelt/learnpath/management/commands/delete_default_learning_path.py @@ -0,0 +1,8 @@ +import djclick as click + +from vbv_lernwelt.learnpath.tests.create_default_learning_path import delete_default_learning_path + + +@click.command() +def command(): + delete_default_learning_path() diff --git a/server/vbv_lernwelt/learnpath/management/commands/delete_default_learningpath.py b/server/vbv_lernwelt/learnpath/management/commands/delete_default_learningpath.py deleted file mode 100644 index 2da68a66..00000000 --- a/server/vbv_lernwelt/learnpath/management/commands/delete_default_learningpath.py +++ /dev/null @@ -1,14 +0,0 @@ -# pylint: disable=import-outside-toplevel - -import djclick as click -from django.contrib.auth import get_user_model - -from vbv_lernwelt.learnpath.tests.create_default_learning_path import create_default_learning_path, \ - delete_default_learning_path - -import djclick as click - - -@click.command() -def command(): - delete_default_learning_path() diff --git a/server/vbv_lernwelt/learnpath/migrations/0001_initial.py b/server/vbv_lernwelt/learnpath/migrations/0001_initial.py index 6b3a574a..5d2b7871 100644 --- a/server/vbv_lernwelt/learnpath/migrations/0001_initial.py +++ b/server/vbv_lernwelt/learnpath/migrations/0001_initial.py @@ -1,4 +1,4 @@ -# Generated by Django 3.2.12 on 2022-05-04 15:52 +# Generated by Django 3.2.12 on 2022-05-30 13:51 from django.db import migrations, models import django.db.models.deletion @@ -51,6 +51,18 @@ class Migration(migrations.Migration): }, bases=('wagtailcore.page',), ), + migrations.CreateModel( + name='LearningPackage', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('sort_order', models.IntegerField(blank=True, editable=False, null=True)), + ('title', models.CharField(default='', max_length=256)), + ], + options={ + 'ordering': ['sort_order'], + 'abstract': False, + }, + ), migrations.CreateModel( name='LearningPath', fields=[ @@ -61,19 +73,6 @@ class Migration(migrations.Migration): }, bases=('wagtailcore.page',), ), - migrations.CreateModel( - name='LearningSequence', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('sort_order', models.IntegerField(blank=True, editable=False, null=True)), - ('title', models.CharField(default='', max_length=256)), - ('category', models.CharField(choices=[('INCIRCLE', 'In Circle'), ('START', 'Start'), ('END', 'End')], default='INCIRCLE', max_length=16)), - ('circle', modelcluster.fields.ParentalKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='learning_sequences', to='learnpath.circle')), - ], - options={ - 'verbose_name': 'Learning Sequence', - }, - ), migrations.CreateModel( name='Topic', fields=[ @@ -93,17 +92,36 @@ class Migration(migrations.Migration): ('page_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='wagtailcore.page')), ('sort_order', models.IntegerField(blank=True, editable=False, null=True)), ('contents', wagtail.core.fields.StreamField([('web_based_training', wagtail.core.blocks.StructBlock([('url', wagtail.core.blocks.URLBlock())])), ('video', wagtail.core.blocks.StructBlock([('url', wagtail.core.blocks.URLBlock())]))], blank=True, null=True)), - ('learning_sequence', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='learning_units', to='learnpath.learningsequence')), + ('learning_package', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='learning_units', to='learnpath.learningpackage')), ], options={ 'verbose_name': 'Learning Unit', }, bases=('wagtailcore.page', models.Model), ), + migrations.CreateModel( + name='LearningSequence', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('sort_order', models.IntegerField(blank=True, editable=False, null=True)), + ('title', models.CharField(default='', max_length=256)), + ('category', models.CharField(choices=[('INCIRCLE', 'In Circle'), ('START', 'Start'), ('END', 'End')], default='INCIRCLE', max_length=16)), + ('circle', modelcluster.fields.ParentalKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='learning_sequences', to='learnpath.circle')), + ], + options={ + 'verbose_name': 'Learning Sequence', + }, + ), + migrations.AddField( + model_name='learningpackage', + name='learning_sequence', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='learning_packages', to='learnpath.learningsequence'), + ), migrations.CreateModel( name='FullfillmentCriteria', fields=[ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('sort_order', models.IntegerField(blank=True, editable=False, null=True)), ('name', models.CharField(max_length=2048)), ('competence', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='learnpath.competence')), ], diff --git a/server/vbv_lernwelt/learnpath/migrations/0002_fullfillmentcriteria_sort_order.py b/server/vbv_lernwelt/learnpath/migrations/0002_fullfillmentcriteria_sort_order.py deleted file mode 100644 index 5fe74a62..00000000 --- a/server/vbv_lernwelt/learnpath/migrations/0002_fullfillmentcriteria_sort_order.py +++ /dev/null @@ -1,18 +0,0 @@ -# Generated by Django 3.2.12 on 2022-05-04 16:00 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('learnpath', '0001_initial'), - ] - - operations = [ - migrations.AddField( - model_name='fullfillmentcriteria', - name='sort_order', - field=models.IntegerField(blank=True, editable=False, null=True), - ), - ] diff --git a/server/vbv_lernwelt/learnpath/migrations/0003_auto_20220512_1456.py b/server/vbv_lernwelt/learnpath/migrations/0003_auto_20220512_1456.py deleted file mode 100644 index 6e3dd602..00000000 --- a/server/vbv_lernwelt/learnpath/migrations/0003_auto_20220512_1456.py +++ /dev/null @@ -1,36 +0,0 @@ -# Generated by Django 3.2.12 on 2022-05-12 12:56 - -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - dependencies = [ - ('learnpath', '0002_fullfillmentcriteria_sort_order'), - ] - - operations = [ - migrations.RemoveField( - model_name='learningunit', - name='learning_sequence', - ), - migrations.CreateModel( - name='LearningPackage', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('sort_order', models.IntegerField(blank=True, editable=False, null=True)), - ('title', models.CharField(default='', max_length=256)), - ('learning_sequence', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='learning_packages', to='learnpath.learningsequence')), - ], - options={ - 'ordering': ['sort_order'], - 'abstract': False, - }, - ), - migrations.AddField( - model_name='learningunit', - name='learning_package', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='learning_units', to='learnpath.learningpackage'), - ), - ] diff --git a/server/vbv_lernwelt/learnpath/migrations/0004_alter_learningpackage_learning_sequence.py b/server/vbv_lernwelt/learnpath/migrations/0004_alter_learningpackage_learning_sequence.py deleted file mode 100644 index fd4b51c7..00000000 --- a/server/vbv_lernwelt/learnpath/migrations/0004_alter_learningpackage_learning_sequence.py +++ /dev/null @@ -1,19 +0,0 @@ -# Generated by Django 3.2.12 on 2022-05-12 12:56 - -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - dependencies = [ - ('learnpath', '0003_auto_20220512_1456'), - ] - - operations = [ - migrations.AlterField( - model_name='learningpackage', - name='learning_sequence', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='learning_packages', to='learnpath.learningsequence'), - ), - ] diff --git a/server/vbv_lernwelt/learnpath/migrations/0005_alter_learningunit_learning_package.py b/server/vbv_lernwelt/learnpath/migrations/0005_alter_learningunit_learning_package.py deleted file mode 100644 index 6a1128a7..00000000 --- a/server/vbv_lernwelt/learnpath/migrations/0005_alter_learningunit_learning_package.py +++ /dev/null @@ -1,19 +0,0 @@ -# Generated by Django 3.2.12 on 2022-05-12 12:56 - -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - dependencies = [ - ('learnpath', '0004_alter_learningpackage_learning_sequence'), - ] - - operations = [ - migrations.AlterField( - model_name='learningunit', - name='learning_package', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='learning_units', to='learnpath.learningpackage'), - ), - ] diff --git a/server/vbv_lernwelt/learnpath/tests/competences_factories.py b/server/vbv_lernwelt/learnpath/tests/competences_factories.py index 6a043add..fd6ed29e 100644 --- a/server/vbv_lernwelt/learnpath/tests/competences_factories.py +++ b/server/vbv_lernwelt/learnpath/tests/competences_factories.py @@ -2,7 +2,7 @@ import factory import wagtail_factories from vbv_lernwelt.learnpath.models_competences import Competence, FullfillmentCriteria, CompetencePage -from vbv_lernwelt.learnpath.tests.learningpath_factories import LearningPathFactory +from vbv_lernwelt.learnpath.tests.learning_path_factories import LearningPathFactory class CompetencePageFactory(wagtail_factories.PageFactory): diff --git a/server/vbv_lernwelt/learnpath/tests/create_default_learning_path.py b/server/vbv_lernwelt/learnpath/tests/create_default_learning_path.py index 06946978..a9ae001c 100644 --- a/server/vbv_lernwelt/learnpath/tests/create_default_learning_path.py +++ b/server/vbv_lernwelt/learnpath/tests/create_default_learning_path.py @@ -1,8 +1,9 @@ import wagtail_factories +from django.conf import settings from wagtail.core.models import Site from vbv_lernwelt.learnpath.models import LearningPath, Topic, Circle, LearningSequence, LearningUnit -from vbv_lernwelt.learnpath.tests.learningpath_factories import LearningPathFactory, TopicFactory, CircleFactory, \ +from vbv_lernwelt.learnpath.tests.learning_path_factories import LearningPathFactory, TopicFactory, CircleFactory, \ LearningSequenceFactory, LearningUnitFactory, VideoBlockFactory, WebBasedTrainingBlockFactory, \ LearningPackageFactory @@ -13,8 +14,9 @@ def create_default_learning_path(): if not site: site = wagtail_factories.SiteFactory(is_default_site=True) - site.port = 8000 - site.save() + if settings.APP_ENVIRONMENT == 'development': + site.port = 8000 + site.save() # create_default_competences() diff --git a/server/vbv_lernwelt/learnpath/tests/learningpath_factories.py b/server/vbv_lernwelt/learnpath/tests/learning_path_factories.py similarity index 99% rename from server/vbv_lernwelt/learnpath/tests/learningpath_factories.py rename to server/vbv_lernwelt/learnpath/tests/learning_path_factories.py index 3e9ff9c8..1df771da 100644 --- a/server/vbv_lernwelt/learnpath/tests/learningpath_factories.py +++ b/server/vbv_lernwelt/learnpath/tests/learning_path_factories.py @@ -1,5 +1,6 @@ -import wagtail_factories import factory +import wagtail_factories + from vbv_lernwelt.learnpath.models import LearningPath, Topic, Circle, LearningSequence, LearningUnit, LearningPackage from vbv_lernwelt.learnpath.models_learning_unit_content import VideoBlock, WebBasedTrainingBlock diff --git a/server/vbv_lernwelt/learnpath/tests/test_api.py b/server/vbv_lernwelt/learnpath/tests/test_api.py index 05f08641..8b412f7e 100644 --- a/server/vbv_lernwelt/learnpath/tests/test_api.py +++ b/server/vbv_lernwelt/learnpath/tests/test_api.py @@ -1,5 +1,3 @@ -from django.test import TestCase - from rest_framework.test import APITestCase from vbv_lernwelt.core.admin import User @@ -14,8 +12,8 @@ class TestRetrieveLearingPathContents(APITestCase): def setUpClass(cls) -> None: super(TestRetrieveLearingPathContents, cls).setUpClass() create_locales_for_wagtail() - create_default_learning_path() create_default_users() + create_default_learning_path() def setUp(self) -> None: qs = LearningPath.objects.filter(title="Versicherungsvermittler/in") diff --git a/server/vbv_lernwelt/learnpath/tests/test_create_default_competences.py b/server/vbv_lernwelt/learnpath/tests/test_create_default_competences.py index 714dc179..64cdd3c5 100644 --- a/server/vbv_lernwelt/learnpath/tests/test_create_default_competences.py +++ b/server/vbv_lernwelt/learnpath/tests/test_create_default_competences.py @@ -1,10 +1,6 @@ -from django.conf import settings from django.test import TestCase -from wagtail.core.models import Locale -from vbv_lernwelt.learnpath.models import LearningPath from vbv_lernwelt.learnpath.tests.create_default_competences import create_default_competences -from vbv_lernwelt.learnpath.tests.create_default_learning_path import create_default_learning_path class TestCreateDefaultCompetences(TestCase): diff --git a/server/vbv_lernwelt/static/vue/.gitkeep b/server/vbv_lernwelt/static/vue/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/server/vbv_lernwelt/templates/admin/index.html b/server/vbv_lernwelt/templates/admin/index.html new file mode 100644 index 00000000..61e80fee --- /dev/null +++ b/server/vbv_lernwelt/templates/admin/index.html @@ -0,0 +1,15 @@ +{% extends "admin/index.html" %} + +{% block content %} +
+ {% include "admin/app_list.html" with app_list=app_list show_changelinks=True %} + +
+
+ {% csrf_token %} + +
+
+
+ +{% endblock %} diff --git a/server/vbv_lernwelt/templates/base.html b/server/vbv_lernwelt/templates/base.html index d6cf109e..a9d781d5 100644 --- a/server/vbv_lernwelt/templates/base.html +++ b/server/vbv_lernwelt/templates/base.html @@ -8,29 +8,22 @@ - - {% block css %} + - - {% endblock %} {# Placed at the top of the document so pages load faster with defer #} - {% block javascript %} - - - {% endblock javascript %} diff --git a/server/vbv_lernwelt/templates/vue/.gitkeep b/server/vbv_lernwelt/templates/vue/.gitkeep new file mode 100644 index 00000000..e69de29b