Refactor `frontend_url` calculation to avoid DB access and improve
performance Das initiale Laden des Lernpfads dauerte so lange, weil das berechnen des Felds `frontend_url` sehr viele DB-Zugriffe auf die jeweiligen "parents" einer Page machten. Die gleiche Berechnung kann man aber auch direkt aus dem `slug` ohne Zugriff auf die Parents machen. Das wurde hier gemacht. Das ganze beruht darauf, dass die page-`slug` in einem bestimmten Format ist. Um das weiter zu bearbeiten, habe ich VBV-296 erstellt.
This commit is contained in:
parent
cca2e2735b
commit
45533e0b2d
|
|
@ -30,7 +30,7 @@ class CompetenceProfilePage(CourseBasePage):
|
|||
super(CompetenceProfilePage, self).full_clean(*args, **kwargs)
|
||||
|
||||
def get_frontend_url(self):
|
||||
return f"/course/{self.get_parent().slug}/competence"
|
||||
return f"/course/{self.slug.replace('-competence', '')}/competence"
|
||||
|
||||
|
||||
class CompetencePage(CourseBasePage):
|
||||
|
|
|
|||
|
|
@ -39,10 +39,15 @@ def course_page_api_view(request, slug):
|
|||
if not has_course_access_by_page_request(request, page):
|
||||
raise PermissionDenied()
|
||||
|
||||
data = api_page_cache_get_or_set(
|
||||
key=request.get_full_path(),
|
||||
func=lambda: page.specific.get_serializer_class()(page.specific).data,
|
||||
)
|
||||
with_cache = False
|
||||
|
||||
if with_cache:
|
||||
data = api_page_cache_get_or_set(
|
||||
key=request.get_full_path(),
|
||||
func=lambda: page.specific.get_serializer_class()(page.specific).data,
|
||||
)
|
||||
else:
|
||||
data = page.specific.get_serializer_class()(page.specific).data
|
||||
|
||||
return Response(data)
|
||||
except PermissionDenied as e:
|
||||
|
|
|
|||
|
|
@ -937,12 +937,12 @@ def create_circle_vernetzen(lp, title="Vernetzen"):
|
|||
LearningSequenceFactory(title="Training", parent=circle, icon="it-icon-ls-watch")
|
||||
LearningUnitFactory(title="Onlinetrainings", parent=circle)
|
||||
LearningContentFactory(
|
||||
title="???",
|
||||
title="Unknown ???",
|
||||
parent=circle,
|
||||
)
|
||||
LearningUnitFactory(title="Webinare", parent=circle)
|
||||
LearningContentFactory(
|
||||
title="???",
|
||||
title="Unknown ???",
|
||||
parent=circle,
|
||||
)
|
||||
|
||||
|
|
@ -968,7 +968,7 @@ def create_circle_pruefungsvorbereitung(lp, title="Prüfungsvorbereitung"):
|
|||
LearningSequenceFactory(title="Aufbau", parent=circle, icon="it-icon-ls-watch")
|
||||
LearningUnitFactory(title="Aufbau und Struktur", parent=circle)
|
||||
LearningContentFactory(
|
||||
title="???",
|
||||
title="Unknown ???",
|
||||
parent=circle,
|
||||
)
|
||||
|
||||
|
|
|
|||
|
|
@ -1,3 +1,5 @@
|
|||
import re
|
||||
|
||||
from django.db import models
|
||||
from django.utils.text import slugify
|
||||
from wagtail.admin.panels import FieldPanel, StreamFieldPanel
|
||||
|
|
@ -42,7 +44,7 @@ class LearningPath(CourseBasePage):
|
|||
return f"{self.title}"
|
||||
|
||||
def get_frontend_url(self):
|
||||
return f"/course/{self.get_parent().slug}/learn"
|
||||
return f"/course/{self.slug.replace('-lp', '')}/learn"
|
||||
|
||||
|
||||
class Topic(CourseBasePage):
|
||||
|
|
@ -95,8 +97,11 @@ class Circle(CourseBasePage):
|
|||
]
|
||||
|
||||
def get_frontend_url(self):
|
||||
short_slug = self.slug.replace(f"{self.get_parent().slug}-circle-", "")
|
||||
return f"{self.get_parent().specific.get_frontend_url()}/{short_slug}"
|
||||
r = re.compile(r"^(?P<coursePart>.+?)-lp-circle-(?P<circlePart>.+?)$")
|
||||
m = r.match(self.slug)
|
||||
if m is None:
|
||||
return "ERROR: could not parse slug"
|
||||
return f"/course/{m.group('coursePart')}/learn/{m.group('circlePart')}"
|
||||
|
||||
def full_clean(self, *args, **kwargs):
|
||||
self.slug = find_slug_with_parent_prefix(self, "circle")
|
||||
|
|
@ -145,8 +150,13 @@ class LearningSequence(CourseBasePage):
|
|||
super(LearningSequence, self).full_clean(*args, **kwargs)
|
||||
|
||||
def get_frontend_url(self):
|
||||
short_slug = self.slug.replace(f"{self.get_parent().slug}-", "")
|
||||
return f"{self.get_parent().specific.get_frontend_url()}#{short_slug}"
|
||||
r = re.compile(
|
||||
r"^(?P<coursePart>.+?)-lp-circle-(?P<circlePart>.+?)-ls-(?P<lsPart>.+?)$"
|
||||
)
|
||||
m = r.match(self.slug)
|
||||
if m is None:
|
||||
return "ERROR: could not parse slug"
|
||||
return f"/course/{m.group('coursePart')}/learn/{m.group('circlePart')}#ls-{m.group('lsPart')}"
|
||||
|
||||
|
||||
class LearningUnit(CourseBasePage):
|
||||
|
|
@ -186,12 +196,20 @@ class LearningUnit(CourseBasePage):
|
|||
super(LearningUnit, self).full_clean(*args, **kwargs)
|
||||
|
||||
def get_frontend_url(self):
|
||||
short_slug = self.slug.replace(f"{self.get_parent().slug}-lu-", "")
|
||||
return f"{self.get_parent().specific.get_frontend_url()}#lu-{short_slug}"
|
||||
r = re.compile(
|
||||
r"^(?P<coursePart>.+?)-lp-circle-(?P<circlePart>.+?)-lu-(?P<luPart>.+?)$"
|
||||
)
|
||||
m = r.match(self.slug)
|
||||
if m is None:
|
||||
return "ERROR: could not parse slug"
|
||||
return f"/course/{m.group('coursePart')}/learn/{m.group('circlePart')}#lu-{m.group('luPart')}"
|
||||
|
||||
def get_evaluate_url(self):
|
||||
short_slug = self.slug.replace(f"{self.get_parent().slug}-lu-", "")
|
||||
return f"{self.get_parent().specific.get_frontend_url()}/evaluate/{short_slug}"
|
||||
r = re.compile(
|
||||
r"^(?P<coursePart>.+?)-lp-circle-(?P<circlePart>.+?)-lu-(?P<luPart>.+?)$"
|
||||
)
|
||||
m = r.match(self.slug)
|
||||
return f"/course/{m.group('coursePart')}/learn/{m.group('circlePart')}/evaluate/{m.group('luPart')}"
|
||||
|
||||
def get_admin_display_title(self):
|
||||
return f"LE: {self.draft_title}"
|
||||
|
|
@ -263,8 +281,13 @@ class LearningContent(CourseBasePage):
|
|||
verbose_name = "Learning Content"
|
||||
|
||||
def get_frontend_url(self):
|
||||
short_slug = self.slug.replace(f"{self.get_parent().slug}-lc-", "")
|
||||
return f"{self.get_parent().specific.get_frontend_url()}/{short_slug}"
|
||||
r = re.compile(
|
||||
r"^(?P<coursePart>.+?)-lp-circle-(?P<circlePart>.+?)-lc-(?P<lcPart>.+)$"
|
||||
)
|
||||
m = r.match(self.slug)
|
||||
if m is None:
|
||||
return "ERROR: could not parse slug"
|
||||
return f"/course/{m.group('coursePart')}/learn/{m.group('circlePart')}/{m.group('lcPart')}"
|
||||
|
||||
def full_clean(self, *args, **kwargs):
|
||||
self.slug = find_slug_with_parent_prefix(self, "lc")
|
||||
|
|
|
|||
|
|
@ -1,3 +1,5 @@
|
|||
import re
|
||||
|
||||
from django.db import models
|
||||
from django.utils.text import slugify
|
||||
from wagtail import blocks, fields
|
||||
|
|
@ -89,8 +91,9 @@ class MediaCategoryPage(CourseBasePage):
|
|||
super(MediaCategoryPage, self).full_clean(*args, **kwargs)
|
||||
|
||||
def get_frontend_url(self):
|
||||
short_slug = self.slug.replace(f"{self.get_parent().slug}-cat-", "")
|
||||
return f"{self.get_parent().specific.get_frontend_url()}/category/{short_slug}"
|
||||
r = re.compile(r"^(?P<coursePart>.+?)-media-cat-(?P<catPart>.+)$")
|
||||
m = r.match(self.slug)
|
||||
return f"/media/{m.group('coursePart')}-media/category/{m.group('catPart')}"
|
||||
|
||||
|
||||
class LibraryDocument(AbstractDocument):
|
||||
|
|
|
|||
Loading…
Reference in New Issue