From 79c0fb8b119a63de974abd677d06e902a26b1908 Mon Sep 17 00:00:00 2001 From: Daniel Egger Date: Fri, 23 Sep 2022 15:14:42 +0200 Subject: [PATCH] Refactor --- .../__tests__/request_learning_path_json.py | 2 +- client/src/stores/learningPath.ts | 2 +- server/config/settings/base.py | 2 +- server/config/urls.py | 6 ++--- server/vbv_lernwelt/course/apps.py | 7 ++++++ server/vbv_lernwelt/course/signals.py | 16 +++++++++++++ server/vbv_lernwelt/course/views.py | 20 ++++++++++++++-- server/vbv_lernwelt/learnpath/signals.py | 16 ------------- .../vbv_lernwelt/learnpath/tests/test_api.py | 2 +- server/vbv_lernwelt/learnpath/views.py | 23 ------------------- server/vbv_lernwelt/media_library/views.py | 3 --- 11 files changed, 48 insertions(+), 51 deletions(-) create mode 100644 server/vbv_lernwelt/course/signals.py delete mode 100644 server/vbv_lernwelt/learnpath/signals.py diff --git a/client/src/services/__tests__/request_learning_path_json.py b/client/src/services/__tests__/request_learning_path_json.py index 023dcf9b..1a7cadbc 100644 --- a/client/src/services/__tests__/request_learning_path_json.py +++ b/client/src/services/__tests__/request_learning_path_json.py @@ -16,7 +16,7 @@ def main(): ) response = client.get( - 'http://localhost:8000/api/learnpath/page/unit-test-lernpfad/', + 'http://localhost:8000/api/course/page/unit-test-lernpfad/', ) print(response.status_code) print(response.json()) diff --git a/client/src/stores/learningPath.ts b/client/src/stores/learningPath.ts index b2e3b598..8d8f9241 100644 --- a/client/src/stores/learningPath.ts +++ b/client/src/stores/learningPath.ts @@ -19,7 +19,7 @@ export const useLearningPathStore = defineStore({ if (this.learningPath && !reload) { return this.learningPath; } - const learningPathData = await itGet(`/api/learnpath/page/${slug}/`); + const learningPathData = await itGet(`/api/course/page/${slug}/`); const completionData = await itGet(`/api/completion/learning_path/${learningPathData.translation_key}/`); if (!learningPathData) { diff --git a/server/config/settings/base.py b/server/config/settings/base.py index b8f99e8c..047a5627 100644 --- a/server/config/settings/base.py +++ b/server/config/settings/base.py @@ -515,7 +515,7 @@ if "django_redis.cache.RedisCache" in env("IT_DJANGO_CACHE_BACKEND", default="") }, } -CACHES["learning_path_cache"] = { +CACHES["api_page_cache"] = { "BACKEND": "django.core.cache.backends.db.DatabaseCache", "LOCATION": "django_cache_learning_path", } diff --git a/server/config/urls.py b/server/config/urls.py index ba97a6b9..cd4ecba0 100644 --- a/server/config/urls.py +++ b/server/config/urls.py @@ -17,7 +17,7 @@ from vbv_lernwelt.core.views import ( rate_limit_exceeded_view, permission_denied_view, check_rate_limit, cypress_reset_view, vue_home, vue_login, me_user_view, vue_logout, generate_web_component_icons, ) -from vbv_lernwelt.learnpath.views import page_api_view +from vbv_lernwelt.course.views import page_api_view def raise_example_error(request): @@ -47,8 +47,8 @@ urlpatterns = [ # core re_path(r"server/core/icons/$", generate_web_component_icons, name="generate_web_component_icons"), - # learnpath - path(r"api/learnpath/page//", page_api_view, name="page_api_view"), + # course + path(r"api/course/page//", page_api_view, name="page_api_view"), # completion path(r"api/completion/circle//", request_circle_completion, name="request_circle_completion"), diff --git a/server/vbv_lernwelt/course/apps.py b/server/vbv_lernwelt/course/apps.py index 80834c00..9453e526 100644 --- a/server/vbv_lernwelt/course/apps.py +++ b/server/vbv_lernwelt/course/apps.py @@ -4,3 +4,10 @@ from django.apps import AppConfig class CourseConfig(AppConfig): default_auto_field = 'django.db.models.BigAutoField' name = 'vbv_lernwelt.course' + + def ready(self): + try: + # pylint: disable=unused-import,import-outside-toplevel + import vbv_lernwelt.course.signals # noqa F401 + except ImportError: + pass diff --git a/server/vbv_lernwelt/course/signals.py b/server/vbv_lernwelt/course/signals.py new file mode 100644 index 00000000..d7e767d9 --- /dev/null +++ b/server/vbv_lernwelt/course/signals.py @@ -0,0 +1,16 @@ +import structlog +from django.core.cache import caches +from django.db.models.signals import post_delete, post_save +from wagtail.models import Page + +logger = structlog.get_logger(__name__) + + +def invalidate_api_page_cache(sender, **kwargs): + logger.debug('invalidate api_page_cache', label='api_page_cache') + caches['api_page_cache'].clear() + + +for subclass in Page.__subclasses__(): + post_save.connect(invalidate_api_page_cache, subclass) + post_delete.connect(invalidate_api_page_cache, subclass) diff --git a/server/vbv_lernwelt/course/views.py b/server/vbv_lernwelt/course/views.py index 91ea44a2..48e1c86e 100644 --- a/server/vbv_lernwelt/course/views.py +++ b/server/vbv_lernwelt/course/views.py @@ -1,3 +1,19 @@ -from django.shortcuts import render +import structlog +from django.views.decorators.cache import cache_page +from rest_framework.decorators import api_view +from rest_framework.response import Response +from wagtail.models import Page -# Create your views here. +logger = structlog.get_logger(__name__) + + +@api_view(['GET']) +@cache_page(60 * 60 * 8, cache="api_page_cache") +def page_api_view(request, slug): + try: + page = Page.objects.get(slug=slug, locale__language_code='de-CH') + serializer = page.specific.get_serializer_class()(page.specific) + return Response(serializer.data) + except Exception as e: + logger.error(e) + return Response({"error": str(e)}, status=404) diff --git a/server/vbv_lernwelt/learnpath/signals.py b/server/vbv_lernwelt/learnpath/signals.py deleted file mode 100644 index 48369730..00000000 --- a/server/vbv_lernwelt/learnpath/signals.py +++ /dev/null @@ -1,16 +0,0 @@ -import structlog -from django.core.cache import caches -from django.db.models.signals import post_delete, post_save -from wagtail.models import Page - -logger = structlog.get_logger(__name__) - - -def invalidate_learning_path_cache(sender, **kwargs): - logger.debug('invalidate learning_path_cache', label='learning_path_cache') - caches['learning_path_cache'].clear() - - -for subclass in Page.__subclasses__(): - post_save.connect(invalidate_learning_path_cache, subclass) - post_delete.connect(invalidate_learning_path_cache, subclass) diff --git a/server/vbv_lernwelt/learnpath/tests/test_api.py b/server/vbv_lernwelt/learnpath/tests/test_api.py index 7fa29ae0..aa630184 100644 --- a/server/vbv_lernwelt/learnpath/tests/test_api.py +++ b/server/vbv_lernwelt/learnpath/tests/test_api.py @@ -18,7 +18,7 @@ class TestRetrieveLearingPathContents(APITestCase): def test_get_learnpathPage(self): learning_path = LearningPath.objects.get(slug='unit-test-lernpfad') - response = self.client.get('/api/learnpath/page/unit-test-lernpfad/') + response = self.client.get('/api/course/page/unit-test-lernpfad/') print(response) self.assertEqual(response.status_code, 200) data = response.json() diff --git a/server/vbv_lernwelt/learnpath/views.py b/server/vbv_lernwelt/learnpath/views.py index 2e6856be..e69de29b 100644 --- a/server/vbv_lernwelt/learnpath/views.py +++ b/server/vbv_lernwelt/learnpath/views.py @@ -1,23 +0,0 @@ -# Create your views here. - -import structlog -from django.views.decorators.cache import cache_page -from rest_framework.decorators import api_view -from rest_framework.response import Response -from wagtail.models import Page - -logger = structlog.get_logger(__name__) - - -@api_view(['GET']) -@cache_page(60 * 60 * 8, cache="learning_path_cache") -def page_api_view(request, slug): - try: - page = Page.objects.get(slug=slug, locale__language_code='de-CH') - serializer = page.specific.get_serializer_class()(page.specific) - return Response(serializer.data) - except Exception as e: - logger.error(e) - return Response({"error": str(e)}, status=404) - - diff --git a/server/vbv_lernwelt/media_library/views.py b/server/vbv_lernwelt/media_library/views.py index 91ea44a2..e69de29b 100644 --- a/server/vbv_lernwelt/media_library/views.py +++ b/server/vbv_lernwelt/media_library/views.py @@ -1,3 +0,0 @@ -from django.shortcuts import render - -# Create your views here.