From a2bb4aeb1851767b27237e2fd2ade3969b53a93b Mon Sep 17 00:00:00 2001 From: Daniel Egger Date: Mon, 10 Oct 2022 17:03:31 +0200 Subject: [PATCH 01/14] Upgrade some python packages --- server/config/settings/base.py | 5 +++- server/requirements/requirements-dev.in | 5 ++-- server/requirements/requirements-dev.txt | 38 ++++++++++++------------ server/requirements/requirements.txt | 14 ++++----- 4 files changed, 32 insertions(+), 30 deletions(-) diff --git a/server/config/settings/base.py b/server/config/settings/base.py index 50e3000f..fac8ad73 100644 --- a/server/config/settings/base.py +++ b/server/config/settings/base.py @@ -580,7 +580,10 @@ if APP_ENVIRONMENT == "development": # django-extensions # ------------------------------------------------------------------------------ # https://django-extensions.readthedocs.io/en/latest/installation_instructions.html#configuration - INSTALLED_APPS += ["django_extensions"] # noqa F405 + INSTALLED_APPS += [ + "django_extensions", + # "django_watchfiles" + ] # noqa F405 if APP_ENVIRONMENT in ["production", "caprover"] or APP_ENVIRONMENT.startswith( "caprover" diff --git a/server/requirements/requirements-dev.in b/server/requirements/requirements-dev.in index 9cdfe6b5..65754d5a 100644 --- a/server/requirements/requirements-dev.in +++ b/server/requirements/requirements-dev.in @@ -1,8 +1,6 @@ -r requirements.in -Werkzeug[watchdog] # https://github.com/pallets/werkzeug ipdb # https://github.com/gotcha/ipdb -watchgod # https://github.com/samuelcolvin/watchgod pip-tools # Testing @@ -33,5 +31,8 @@ django-extensions # https://github.com/django-extensions/django-extensions django-coverage-plugin # https://github.com/nedbat/django_coverage_plugin pytest-django # https://github.com/pytest-dev/pytest-django +# django-watchfiles custom PR +https://github.com/q0w/django-watchfiles/archive/issue-1.zip + # code checking truffleHog diff --git a/server/requirements/requirements-dev.txt b/server/requirements/requirements-dev.txt index 4784184c..7874c512 100644 --- a/server/requirements/requirements-dev.txt +++ b/server/requirements/requirements-dev.txt @@ -7,7 +7,7 @@ anyascii==0.3.1 # via wagtail anyio==3.5.0 - # via watchgod + # via watchfiles appnope==0.1.2 # via ipython argon2-cffi==21.3.0 @@ -15,9 +15,7 @@ argon2-cffi==21.3.0 argon2-cffi-bindings==21.2.0 # via argon2-cffi asgiref==3.5.0 - # via - # django - # uvicorn + # via django astroid==2.11.2 # via pylint asttokens==2.0.5 @@ -35,10 +33,12 @@ backcall==0.2.0 # via ipython beautifulsoup4==4.9.3 # via wagtail -black==22.8.0 +black==22.10.0 # via # -r requirements-dev.in # ufmt +build==0.8.0 + # via pip-tools certifi==2021.10.8 # via # requests @@ -82,11 +82,12 @@ dill==0.3.4 # via pylint distlib==0.3.4 # via virtualenv -dj-database-url==0.5.0 +dj-database-url==1.0.0 # via -r requirements.in django==3.2.13 # via # -r requirements.in + # dj-database-url # django-cors-headers # django-csp # django-debug-toolbar @@ -100,6 +101,7 @@ django==3.2.13 # django-stubs-ext # django-taggit # django-treebeard + # django-watchfiles # djangorestframework # drf-spectacular # wagtail @@ -140,6 +142,8 @@ django-taggit==2.1.0 # via wagtail django-treebeard==4.5.1 # via wagtail +django-watchfiles @ https://github.com/q0w/django-watchfiles/archive/issue-1.zip + # via -r requirements-dev.in djangorestframework==3.13.1 # via # -r requirements.in @@ -222,9 +226,7 @@ libcst==0.4.7 # ufmt # usort markupsafe==2.1.1 - # via - # jinja2 - # werkzeug + # via jinja2 marshmallow==3.15.0 # via environs matplotlib-inline==0.1.3 @@ -253,6 +255,7 @@ openpyxl==3.0.9 # via tablib packaging==21.3 # via + # build # marshmallow # pytest # pytest-sugar @@ -264,7 +267,7 @@ pathspec==0.9.0 # black # trailrunner pep517==0.12.0 - # via pip-tools + # via build pexpect==4.8.0 # via ipython pickleshare==0.7.5 @@ -273,7 +276,7 @@ pillow==9.0.1 # via # -r requirements.in # wagtail -pip-tools==6.6.2 +pip-tools==6.9.0 # via -r requirements-dev.in platformdirs==2.5.1 # via @@ -318,7 +321,7 @@ pyparsing==3.0.7 # via packaging pyrsistent==0.18.1 # via jsonschema -pytest==7.1.1 +pytest==7.1.3 # via # -r requirements-dev.in # pytest-django @@ -403,6 +406,7 @@ toml==0.10.2 tomli==2.0.1 # via # black + # build # django-stubs # mypy # pep517 @@ -450,7 +454,7 @@ urllib3==1.26.9 # sentry-sdk usort==1.0.5 # via ufmt -uvicorn[standard]==0.17.6 +uvicorn[standard]==0.18.3 # via -r requirements.in uvloop==0.16.0 # via uvicorn @@ -465,11 +469,9 @@ wagtail-factories==2.0.1 # via -r requirements.in wagtail-localize==1.2.1 # via -r requirements.in -watchdog==2.1.9 - # via werkzeug -watchgod==0.8.2 +watchfiles==0.17.0 # via - # -r requirements-dev.in + # django-watchfiles # uvicorn wcwidth==0.2.5 # via prompt-toolkit @@ -477,8 +479,6 @@ webencodings==0.5.1 # via html5lib websockets==10.2 # via uvicorn -werkzeug[watchdog]==2.2.0 - # via -r requirements-dev.in wheel==0.37.1 # via pip-tools whitenoise==6.0.0 diff --git a/server/requirements/requirements.txt b/server/requirements/requirements.txt index b3e71681..1ba89718 100644 --- a/server/requirements/requirements.txt +++ b/server/requirements/requirements.txt @@ -7,15 +7,13 @@ anyascii==0.3.1 # via wagtail anyio==3.5.0 - # via watchgod + # via watchfiles argon2-cffi==21.3.0 # via -r requirements.in argon2-cffi-bindings==21.2.0 # via argon2-cffi asgiref==3.5.0 - # via - # django - # uvicorn + # via django async-timeout==4.0.2 # via redis attrs==21.4.0 @@ -44,15 +42,15 @@ cryptography==36.0.2 # via authlib deprecated==1.2.13 # via redis -dj-database-url==0.5.0 +dj-database-url==1.0.0 # via -r requirements.in django==3.2.13 # via # -r requirements.in + # dj-database-url # django-cors-headers # django-csp # django-filter - # django-htmx # django-model-utils # django-modelcluster # django-permissionedforms @@ -204,7 +202,7 @@ urllib3==1.26.9 # via # requests # sentry-sdk -uvicorn[standard]==0.17.6 +uvicorn[standard]==0.18.3 # via -r requirements.in uvloop==0.16.0 # via uvicorn @@ -217,7 +215,7 @@ wagtail-factories==2.0.1 # via -r requirements.in wagtail-localize==1.2.1 # via -r requirements.in -watchgod==0.8.1 +watchfiles==0.17.0 # via uvicorn webencodings==0.5.1 # via html5lib From be6885454548c1ba0f39237bef26daa9b4f67453 Mon Sep 17 00:00:00 2001 From: Daniel Egger Date: Mon, 10 Oct 2022 17:14:01 +0200 Subject: [PATCH 02/14] Enable django watchfiles runserver reloader --- prepare_server.sh | 2 +- server/config/settings/base.py | 5 +---- 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/prepare_server.sh b/prepare_server.sh index ad53ff92..100d6336 100755 --- a/prepare_server.sh +++ b/prepare_server.sh @@ -75,5 +75,5 @@ fi if [ "$START_BACKGROUND" = true ]; then python3 server/manage.py runserver "${DJANGO_PORT}" --settings="$DJANGO_SETTINGS_MODULE" > /dev/null & else - python3 server/manage.py runserver "${DJANGO_PORT}" --settings="$DJANGO_SETTINGS_MODULE" + cd server && python3 manage.py runserver "${DJANGO_PORT}" --settings="$DJANGO_SETTINGS_MODULE" fi diff --git a/server/config/settings/base.py b/server/config/settings/base.py index fac8ad73..e0699943 100644 --- a/server/config/settings/base.py +++ b/server/config/settings/base.py @@ -580,10 +580,7 @@ if APP_ENVIRONMENT == "development": # django-extensions # ------------------------------------------------------------------------------ # https://django-extensions.readthedocs.io/en/latest/installation_instructions.html#configuration - INSTALLED_APPS += [ - "django_extensions", - # "django_watchfiles" - ] # noqa F405 + INSTALLED_APPS += ["django_extensions", "django_watchfiles"] # noqa F405 if APP_ENVIRONMENT in ["production", "caprover"] or APP_ENVIRONMENT.startswith( "caprover" From cf873e6f23dcbc0aaa41ecf6355076b6277870fa Mon Sep 17 00:00:00 2001 From: Daniel Egger Date: Mon, 10 Oct 2022 17:41:47 +0200 Subject: [PATCH 03/14] Add circles to competence api json --- server/vbv_lernwelt/competence/models.py | 3 ++- server/vbv_lernwelt/competence/serializers.py | 5 ++-- .../{learnpath => core}/serializer_helpers.py | 23 +++++++++++++++++++ .../learnpath/create_default_learning_path.py | 2 +- server/vbv_lernwelt/learnpath/models.py | 2 +- server/vbv_lernwelt/learnpath/serializers.py | 2 +- server/vbv_lernwelt/media_library/models.py | 2 +- 7 files changed, 32 insertions(+), 7 deletions(-) rename server/vbv_lernwelt/{learnpath => core}/serializer_helpers.py (77%) diff --git a/server/vbv_lernwelt/competence/models.py b/server/vbv_lernwelt/competence/models.py index ce1b4162..f9779974 100644 --- a/server/vbv_lernwelt/competence/models.py +++ b/server/vbv_lernwelt/competence/models.py @@ -6,7 +6,7 @@ from wagtail.fields import StreamField from wagtail.models import Page from vbv_lernwelt.core.model_utils import find_available_slug -from vbv_lernwelt.learnpath.serializer_helpers import get_it_serializer_class +from vbv_lernwelt.core.serializer_helpers import get_it_serializer_class class CompetenceProfilePage(Page): @@ -32,6 +32,7 @@ class CompetenceProfilePage(Page): cls, [ "course", + "circles", "children", ], ) diff --git a/server/vbv_lernwelt/competence/serializers.py b/server/vbv_lernwelt/competence/serializers.py index 3b4d96ef..062009bf 100644 --- a/server/vbv_lernwelt/competence/serializers.py +++ b/server/vbv_lernwelt/competence/serializers.py @@ -1,8 +1,8 @@ from rest_framework import serializers from vbv_lernwelt.competence.models import PerformanceCriteria +from vbv_lernwelt.core.serializer_helpers import get_it_serializer_class from vbv_lernwelt.course.serializers import CourseCategorySerializer -from vbv_lernwelt.learnpath.serializer_helpers import get_it_serializer_class class PerformanceCriteriaSerializer( @@ -33,7 +33,8 @@ class PerformanceCriteriaSerializer( return LearningUnitPerformanceCriteriaSerializer(obj.learning_unit).data def get_circle(self, obj): - return obj.learning_unit.get_parent().specific.title + c = obj.learning_unit.get_parent() + return {"id": c.id, "title": c.title, "translation_key": c.translation_key} def get_course_category(self, obj): if obj.learning_unit: diff --git a/server/vbv_lernwelt/learnpath/serializer_helpers.py b/server/vbv_lernwelt/core/serializer_helpers.py similarity index 77% rename from server/vbv_lernwelt/learnpath/serializer_helpers.py rename to server/vbv_lernwelt/core/serializer_helpers.py index 57c385f8..72b5f031 100644 --- a/server/vbv_lernwelt/learnpath/serializer_helpers.py +++ b/server/vbv_lernwelt/core/serializer_helpers.py @@ -35,6 +35,7 @@ class ItBaseSerializer(wagtail_serializers.BaseSerializer): course = SerializerMethodField() course_category = CourseCategorySerializer(read_only=True) frontend_url = SerializerMethodField() + circles = SerializerMethodField() meta_fields = [] @@ -62,6 +63,28 @@ class ItBaseSerializer(wagtail_serializers.BaseSerializer): return CourseSerializer(course_parent_page.specific.course).data return "" + def get_circles(self, obj): + course_parent_page = obj.get_ancestors().exact_type(CoursePage).last() + + if course_parent_page: + from vbv_lernwelt.learnpath.models import Circle + from vbv_lernwelt.learnpath.models import LearningPath + + circles = ( + course_parent_page.get_children() + .exact_type(LearningPath) + .first() + .get_children() + .exact_type(Circle) + ) + + return [ + {"id": c.id, "title": c.title, "translation_key": c.translation_key} + for c in circles + ] + + return [] + def get_frontend_url(self, obj): if hasattr(obj, "get_frontend_url"): return obj.get_frontend_url() diff --git a/server/vbv_lernwelt/learnpath/create_default_learning_path.py b/server/vbv_lernwelt/learnpath/create_default_learning_path.py index 21bcc00e..33b2dbaa 100644 --- a/server/vbv_lernwelt/learnpath/create_default_learning_path.py +++ b/server/vbv_lernwelt/learnpath/create_default_learning_path.py @@ -564,7 +564,7 @@ def create_circle_abschluss(lp): def create_circle_betreuen(lp): circle = CircleFactory( - title="Abschluss", + title="Betreuen", parent=lp, ) LearningSequenceFactory(title="Starten", parent=circle, icon="it-icon-ls-start") diff --git a/server/vbv_lernwelt/learnpath/models.py b/server/vbv_lernwelt/learnpath/models.py index 4564451b..3844c901 100644 --- a/server/vbv_lernwelt/learnpath/models.py +++ b/server/vbv_lernwelt/learnpath/models.py @@ -8,6 +8,7 @@ from wagtail.images.blocks import ImageChooserBlock from wagtail.models import Page from vbv_lernwelt.core.model_utils import find_available_slug +from vbv_lernwelt.core.serializer_helpers import get_it_serializer_class from vbv_lernwelt.course.models import CoursePage from vbv_lernwelt.learnpath.models_learning_unit_content import ( AssignmentBlock, @@ -21,7 +22,6 @@ from vbv_lernwelt.learnpath.models_learning_unit_content import ( TestBlock, VideoBlock, ) -from vbv_lernwelt.learnpath.serializer_helpers import get_it_serializer_class class LearningPath(Page): diff --git a/server/vbv_lernwelt/learnpath/serializers.py b/server/vbv_lernwelt/learnpath/serializers.py index 8884663e..8843f161 100644 --- a/server/vbv_lernwelt/learnpath/serializers.py +++ b/server/vbv_lernwelt/learnpath/serializers.py @@ -4,7 +4,7 @@ from vbv_lernwelt.competence.serializers import ( PerformanceCriteriaLearningPathSerializer, ) from vbv_lernwelt.learnpath.models import LearningUnit -from vbv_lernwelt.learnpath.serializer_helpers import get_it_serializer_class +from vbv_lernwelt.core.serializer_helpers import get_it_serializer_class class LearningUnitSerializer( diff --git a/server/vbv_lernwelt/media_library/models.py b/server/vbv_lernwelt/media_library/models.py index 0a0a5f9c..642f08f4 100644 --- a/server/vbv_lernwelt/media_library/models.py +++ b/server/vbv_lernwelt/media_library/models.py @@ -7,7 +7,7 @@ from wagtail.fields import StreamField from wagtail.models import Page from vbv_lernwelt.core.model_utils import find_available_slug -from vbv_lernwelt.learnpath.serializer_helpers import get_it_serializer_class +from vbv_lernwelt.core.serializer_helpers import get_it_serializer_class from vbv_lernwelt.media_library.content_blocks import MediaContentCollection From 64b5c5a825dbbb556f9cc693c54d23a191ea7bf0 Mon Sep 17 00:00:00 2001 From: Daniel Egger Date: Mon, 10 Oct 2022 18:23:41 +0200 Subject: [PATCH 04/14] Use circle filter on competence page --- .../competences/CompetenceDetail.vue | 8 ++- .../pages/competence/CompetenceIndexPage.vue | 50 ++++++++++-------- .../pages/competence/CompetenceListPage.vue | 10 ++-- .../competence/PerformanceCriteriaPage.vue | 8 +-- client/src/stores/competence.ts | 51 +++++++++++++++++-- client/src/types.ts | 10 +++- 6 files changed, 103 insertions(+), 34 deletions(-) diff --git a/client/src/components/competences/CompetenceDetail.vue b/client/src/components/competences/CompetenceDetail.vue index 67998432..5f3357e2 100644 --- a/client/src/components/competences/CompetenceDetail.vue +++ b/client/src/components/competences/CompetenceDetail.vue @@ -34,12 +34,16 @@ const togglePerformanceCriteria = () => {
  • diff --git a/client/src/pages/competence/CompetenceIndexPage.vue b/client/src/pages/competence/CompetenceIndexPage.vue index 58202c37..1d7b5fe6 100644 --- a/client/src/pages/competence/CompetenceIndexPage.vue +++ b/client/src/pages/competence/CompetenceIndexPage.vue @@ -1,6 +1,7 @@