commit
8cee1346c5
|
|
@ -7,6 +7,7 @@ from pathlib import Path
|
|||
import structlog
|
||||
from environs import Env
|
||||
|
||||
from vbv_lernwelt.core.constants import DEFAULT_RICH_TEXT_FEATURES
|
||||
from vbv_lernwelt.core.utils import structlog_add_app_info
|
||||
|
||||
SERVER_ROOT_DIR = Path(__file__).resolve(strict=True).parent.parent.parent
|
||||
|
|
@ -226,26 +227,42 @@ else:
|
|||
IT_SERVE_VUE = env.bool("IT_SERVE_VUE", DEBUG)
|
||||
IT_SERVE_VUE_URL = env("IT_SERVE_VUE_URL", "http://localhost:5173")
|
||||
|
||||
LANGUAGES = [
|
||||
("de", "German"),
|
||||
("fr", "French"),
|
||||
("it", "Italian"),
|
||||
]
|
||||
# WAGTAIL
|
||||
# ------------------------------------------------------------------------------
|
||||
WAGTAIL_SITE_NAME = "VBV Lernwelt"
|
||||
WAGTAIL_I18N_ENABLED = True
|
||||
WAGTAIL_I18N_ENABLED = False
|
||||
WAGTAILADMIN_BASE_URL = "/server/cms/"
|
||||
|
||||
LANGUAGES = [
|
||||
("en-US", "English (American)"),
|
||||
("fr-CH", "Swiss French"),
|
||||
("de-CH", "Swiss German"),
|
||||
("it-CH", "Swiss Italian"),
|
||||
]
|
||||
WAGTAILREDIRECTS_AUTO_CREATE = False
|
||||
WAGTAIL_PASSWORD_MANAGEMENT_ENABLED = False
|
||||
WAGTAIL_PASSWORD_RESET_ENABLED = False
|
||||
WAGTAILUSERS_PASSWORD_ENABLED = False
|
||||
WAGTAIL_ENABLE_UPDATE_CHECK = False
|
||||
WAGTAIL_ENABLE_WHATS_NEW_BANNER = False
|
||||
WAGTAIL_CONTENT_LANGUAGES = LANGUAGES
|
||||
|
||||
WAGTAILDOCS_DOCUMENT_MODEL = "media_library.LibraryDocument"
|
||||
|
||||
WAGTAIL_CONTENT_LANGUAGES = [
|
||||
("fr-CH", "Swiss French"),
|
||||
("de-CH", "Swiss German"),
|
||||
("it-CH", "Swiss Italian"),
|
||||
]
|
||||
WAGTAILADMIN_RICH_TEXT_EDITORS = {
|
||||
"default": {
|
||||
"WIDGET": "wagtail.admin.rich_text.DraftailRichTextArea",
|
||||
"OPTIONS": {"features": DEFAULT_RICH_TEXT_FEATURES},
|
||||
},
|
||||
"secondary": {
|
||||
"WIDGET": "some.external.RichTextEditor",
|
||||
},
|
||||
}
|
||||
|
||||
# WAGTAIL_CONTENT_LANGUAGES = [
|
||||
# ("fr-CH", "Swiss French"),
|
||||
# ("de-CH", "Swiss German"),
|
||||
# ("it-CH", "Swiss Italian"),
|
||||
# ]
|
||||
|
||||
WAGTAILSEARCH_BACKENDS = {
|
||||
"default": {
|
||||
|
|
|
|||
|
|
@ -1,11 +1,8 @@
|
|||
from datetime import datetime
|
||||
|
||||
import wagtail_factories
|
||||
from dateutil.relativedelta import MO, relativedelta, TH, TU
|
||||
from django.conf import settings
|
||||
from django.utils import timezone
|
||||
from slugify import slugify
|
||||
from wagtail.models import Site
|
||||
from wagtail.rich_text import RichText
|
||||
|
||||
from vbv_lernwelt.assignment.creators.create_assignments import (
|
||||
|
|
@ -27,7 +24,6 @@ from vbv_lernwelt.core.constants import (
|
|||
TEST_COURSE_SESSION_ZURICH_ID,
|
||||
)
|
||||
from vbv_lernwelt.core.models import User
|
||||
from vbv_lernwelt.core.tests.helpers import create_locales_for_wagtail
|
||||
from vbv_lernwelt.course.consts import COURSE_TEST_ID
|
||||
from vbv_lernwelt.course.factories import CoursePageFactory
|
||||
from vbv_lernwelt.course.models import (
|
||||
|
|
@ -37,6 +33,7 @@ from vbv_lernwelt.course.models import (
|
|||
CourseSession,
|
||||
CourseSessionUser,
|
||||
)
|
||||
from vbv_lernwelt.course.utils import get_wagtail_default_site
|
||||
from vbv_lernwelt.course_session.models import (
|
||||
CourseSessionAssignment,
|
||||
CourseSessionAttendanceCourse,
|
||||
|
|
@ -70,7 +67,7 @@ from vbv_lernwelt.media_library.tests.media_library_factories import (
|
|||
|
||||
|
||||
def create_test_course(include_uk=True, include_vv=True, with_sessions=False):
|
||||
create_locales_for_wagtail()
|
||||
# create_locales_for_wagtail()
|
||||
course = create_test_course_with_categories()
|
||||
|
||||
create_test_competence_profile()
|
||||
|
|
@ -232,18 +229,9 @@ def create_test_course_with_categories(apps=None, schema_editor=None):
|
|||
]:
|
||||
CourseCategory.objects.get_or_create(course=course, title=cat)
|
||||
|
||||
# create default course page
|
||||
site = Site.objects.filter(is_default_site=True).first()
|
||||
if not site:
|
||||
site = wagtail_factories.SiteFactory(is_default_site=True)
|
||||
|
||||
if settings.APP_ENVIRONMENT == "development":
|
||||
site.port = 8000
|
||||
site.save()
|
||||
|
||||
course_page = CoursePageFactory(
|
||||
title="Test Lehrgang",
|
||||
parent=site.root_page,
|
||||
parent=get_wagtail_default_site().root_page,
|
||||
course=course,
|
||||
)
|
||||
course.slug = course_page.slug
|
||||
|
|
|
|||
|
|
@ -1,8 +1,6 @@
|
|||
import wagtail_factories
|
||||
from django.conf import settings
|
||||
from django.core.management import call_command
|
||||
from slugify import slugify
|
||||
from wagtail.models import Locale, Page, Site
|
||||
from wagtail.models import Locale, Page
|
||||
from wagtail.rich_text import RichText
|
||||
from wagtail_localize.models import LocaleSynchronization
|
||||
|
||||
|
|
@ -36,15 +34,6 @@ def create_uk_learning_path(course_id=COURSE_UK, user=None, skip_locales=True):
|
|||
if user is None:
|
||||
user = User.objects.get(username="info@iterativ.ch")
|
||||
|
||||
site = Site.objects.filter(is_default_site=True).first()
|
||||
|
||||
if not site:
|
||||
site = wagtail_factories.SiteFactory(is_default_site=True)
|
||||
|
||||
if settings.APP_ENVIRONMENT == "development":
|
||||
site.port = 8000
|
||||
site.save()
|
||||
|
||||
course_page = CoursePage.objects.get(course_id=course_id)
|
||||
lp = LearningPathFactory(
|
||||
title="Lernpfad",
|
||||
|
|
@ -93,15 +82,6 @@ def create_uk_fr_learning_path(course_id=COURSE_UK_FR, user=None, skip_locales=T
|
|||
if user is None:
|
||||
user = User.objects.get(username="info@iterativ.ch")
|
||||
|
||||
site = Site.objects.filter(is_default_site=True).first()
|
||||
|
||||
if not site:
|
||||
site = wagtail_factories.SiteFactory(is_default_site=True)
|
||||
|
||||
if settings.APP_ENVIRONMENT == "development":
|
||||
site.port = 8000
|
||||
site.save()
|
||||
|
||||
course_page = CoursePage.objects.get(course_id=course_id)
|
||||
lp = LearningPathFactory(
|
||||
title="Lernpfad",
|
||||
|
|
@ -149,15 +129,6 @@ def create_uk_it_learning_path(course_id=COURSE_UK_IT, user=None, skip_locales=T
|
|||
if user is None:
|
||||
user = User.objects.get(username="info@iterativ.ch")
|
||||
|
||||
site = Site.objects.filter(is_default_site=True).first()
|
||||
|
||||
if not site:
|
||||
site = wagtail_factories.SiteFactory(is_default_site=True)
|
||||
|
||||
if settings.APP_ENVIRONMENT == "development":
|
||||
site.port = 8000
|
||||
site.save()
|
||||
|
||||
course_page = CoursePage.objects.get(course_id=course_id)
|
||||
lp = LearningPathFactory(
|
||||
title="Lernpfad",
|
||||
|
|
|
|||
|
|
@ -1,7 +1,5 @@
|
|||
import wagtail_factories
|
||||
from django.conf import settings
|
||||
from django.core.management import call_command
|
||||
from wagtail.models import Locale, Page, Site
|
||||
from wagtail.models import Locale, Page
|
||||
from wagtail_localize.models import LocaleSynchronization
|
||||
|
||||
from vbv_lernwelt.core.admin import User
|
||||
|
|
@ -28,15 +26,6 @@ def create_uk_training_learning_path(
|
|||
if user is None:
|
||||
user = User.objects.get(username="info@iterativ.ch")
|
||||
|
||||
site = Site.objects.filter(is_default_site=True).first()
|
||||
|
||||
if not site:
|
||||
site = wagtail_factories.SiteFactory(is_default_site=True)
|
||||
|
||||
if settings.APP_ENVIRONMENT == "development":
|
||||
site.port = 8000
|
||||
site.save()
|
||||
|
||||
course_page = CoursePage.objects.get(course_id=course_id)
|
||||
lp = LearningPathFactory(
|
||||
title="Lernpfad",
|
||||
|
|
|
|||
|
|
@ -1,9 +1,6 @@
|
|||
import wagtail_factories
|
||||
from django.conf import settings
|
||||
from wagtail.models import Site
|
||||
|
||||
from vbv_lernwelt.course.consts import COURSE_VERSICHERUNGSVERMITTLERIN_ID
|
||||
from vbv_lernwelt.course.factories import CoursePageFactory
|
||||
from vbv_lernwelt.course.utils import get_wagtail_default_site
|
||||
|
||||
|
||||
def create_versicherungsvermittlerin_with_categories(
|
||||
|
|
@ -43,18 +40,9 @@ def create_versicherungsvermittlerin_with_categories(
|
|||
]:
|
||||
CourseCategory.objects.get_or_create(course=course, title=cat)
|
||||
|
||||
# create default course page
|
||||
site = Site.objects.filter(is_default_site=True).first()
|
||||
if not site:
|
||||
site = wagtail_factories.SiteFactory(is_default_site=True)
|
||||
|
||||
if settings.APP_ENVIRONMENT == "development":
|
||||
site.port = 8000
|
||||
site.save()
|
||||
|
||||
course_page = CoursePageFactory(
|
||||
title=title,
|
||||
parent=site.root_page,
|
||||
parent=get_wagtail_default_site().root_page,
|
||||
course=course,
|
||||
)
|
||||
course.slug = course_page.slug
|
||||
|
|
|
|||
|
|
@ -121,6 +121,7 @@ def command(course):
|
|||
|
||||
if COURSE_UK in course:
|
||||
create_course_uk_de()
|
||||
create_course_uk_de_course_sessions()
|
||||
create_course_uk_de_completion_data(
|
||||
CourseSession.objects.get(title="Bern 2023 a")
|
||||
)
|
||||
|
|
@ -220,26 +221,34 @@ def create_versicherungsvermittlerin_course():
|
|||
)
|
||||
|
||||
|
||||
def create_course_uk_de():
|
||||
# Überbetriebliche Kurse DE
|
||||
def create_course_uk_de(course_id=COURSE_UK, lang="de"):
|
||||
names = {
|
||||
"de": "Überbetriebliche Kurse",
|
||||
"fr": "Cours interentreprises",
|
||||
"it": "Corsi interaziendali",
|
||||
}
|
||||
course = create_versicherungsvermittlerin_with_categories(
|
||||
course_id=COURSE_UK, title="Überbetriebliche Kurse"
|
||||
course_id=course_id, title=names[lang]
|
||||
)
|
||||
|
||||
# assignments create assignments parent page
|
||||
_assignment_list_page = AssignmentListPageFactory(
|
||||
parent=course.coursepage,
|
||||
)
|
||||
create_uk_kickoff_prep_assignment(course_id=COURSE_UK)
|
||||
create_uk_basis_prep_assignment(course_id=COURSE_UK)
|
||||
create_uk_fahrzeug_casework(course_id=COURSE_UK)
|
||||
create_uk_fahrzeug_prep_assignment(course_id=COURSE_UK)
|
||||
create_uk_reflection(course_id=COURSE_UK)
|
||||
create_uk_kickoff_prep_assignment(course_id=course_id)
|
||||
create_uk_basis_prep_assignment(course_id=course_id)
|
||||
create_uk_fahrzeug_casework(course_id=course_id)
|
||||
create_uk_fahrzeug_prep_assignment(course_id=course_id)
|
||||
create_uk_reflection(course_id=course_id)
|
||||
|
||||
# learning path
|
||||
create_uk_learning_path(course_id=COURSE_UK)
|
||||
create_uk_competence_profile(course_id=COURSE_UK)
|
||||
create_default_media_library(course_id=COURSE_UK)
|
||||
create_uk_learning_path(course_id=course_id)
|
||||
create_uk_competence_profile(course_id=course_id)
|
||||
create_default_media_library(course_id=course_id)
|
||||
|
||||
|
||||
def create_course_uk_de_course_sessions():
|
||||
course = Course.objects.get(id=COURSE_UK)
|
||||
|
||||
cs = CourseSession.objects.create(
|
||||
course_id=COURSE_UK,
|
||||
|
|
|
|||
|
|
@ -2,7 +2,8 @@ import enum
|
|||
import uuid
|
||||
|
||||
from django.db import models
|
||||
from django.db.models import UniqueConstraint
|
||||
from django.db.models import UniqueConstraint, Value
|
||||
from django.db.models.functions import Replace
|
||||
from django.utils.text import slugify
|
||||
from django.utils.translation import gettext_lazy as _
|
||||
from grapple.models import GraphQLString
|
||||
|
|
@ -131,6 +132,30 @@ class CourseBasePage(Page):
|
|||
def __str__(self):
|
||||
return f"{self.title}"
|
||||
|
||||
def _update_descendant_slugs(self, old_slug, new_slug):
|
||||
"""
|
||||
this method is inspired by `_update_descendant_url_paths` from wagtail Page
|
||||
"""
|
||||
Page.objects.filter(path__startswith=self.path).exclude(pk=self.pk).update(
|
||||
slug=Replace("slug", Value(old_slug), Value(new_slug))
|
||||
)
|
||||
|
||||
def save(self, clean=True, user=None, log_action=False, **kwargs):
|
||||
slug_changed = False
|
||||
|
||||
if not self.id is None:
|
||||
old_record = Page.objects.get(id=self.id).specific
|
||||
if old_record.slug != self.slug:
|
||||
self.set_url_path(self.get_parent())
|
||||
slug_changed = True
|
||||
old_slug = old_record.slug
|
||||
new_slug = self.slug
|
||||
|
||||
super().save(**kwargs)
|
||||
|
||||
if slug_changed:
|
||||
self._update_descendant_slugs(old_slug, new_slug)
|
||||
|
||||
|
||||
class CoursePage(CourseBasePage):
|
||||
content_panels = Page.content_panels
|
||||
|
|
|
|||
|
|
@ -0,0 +1,38 @@
|
|||
from rest_framework.test import APITestCase
|
||||
|
||||
from vbv_lernwelt.core.create_default_users import create_default_users
|
||||
from vbv_lernwelt.course.creators.test_course import create_test_course
|
||||
from vbv_lernwelt.learnpath.models import Circle, LearningContentAttendanceCourse
|
||||
|
||||
|
||||
class CourseBasePageSaveTestCase(APITestCase):
|
||||
def setUp(self) -> None:
|
||||
create_default_users()
|
||||
create_test_course()
|
||||
|
||||
def test_save_willRenameSlugsOfChildren(self):
|
||||
circle_fahrzeug = Circle.objects.get(title="Fahrzeug")
|
||||
self.assertEqual(circle_fahrzeug.slug, "test-lehrgang-lp-circle-fahrzeug")
|
||||
|
||||
lc_attendance_course = LearningContentAttendanceCourse.objects.descendant_of(
|
||||
circle_fahrzeug
|
||||
).first()
|
||||
self.assertEqual(
|
||||
lc_attendance_course.slug,
|
||||
"test-lehrgang-lp-circle-fahrzeug-lc-präsenzkurs-fahrzeug",
|
||||
)
|
||||
|
||||
# title update should also update the slugs of the descendants
|
||||
circle_fahrzeug.title = "Foobar"
|
||||
circle_fahrzeug.save()
|
||||
|
||||
circle_fahrzeug = Circle.objects.get(id=circle_fahrzeug.id)
|
||||
self.assertEqual(circle_fahrzeug.slug, "test-lehrgang-lp-circle-foobar")
|
||||
|
||||
lc_attendance_course = LearningContentAttendanceCourse.objects.descendant_of(
|
||||
circle_fahrzeug
|
||||
).first()
|
||||
self.assertEqual(
|
||||
lc_attendance_course.slug,
|
||||
"test-lehrgang-lp-circle-foobar-lc-präsenzkurs-fahrzeug",
|
||||
)
|
||||
|
|
@ -0,0 +1,15 @@
|
|||
import wagtail_factories
|
||||
from django.conf import settings
|
||||
from wagtail.models import Locale, Site
|
||||
|
||||
|
||||
def get_wagtail_default_site():
|
||||
for language in settings.WAGTAIL_CONTENT_LANGUAGES:
|
||||
Locale.objects.get_or_create(language_code=language[0])
|
||||
|
||||
site = Site.objects.filter(is_default_site=True).first()
|
||||
|
||||
if not site:
|
||||
site = wagtail_factories.SiteFactory(is_default_site=True)
|
||||
|
||||
return site
|
||||
|
|
@ -39,7 +39,7 @@ def course_page_api_view(request, slug_or_id):
|
|||
if slug_or_id.isdigit():
|
||||
page = Page.objects.get(id=slug_or_id)
|
||||
else:
|
||||
page = Page.objects.get(slug=slug_or_id, locale__language_code="de-CH")
|
||||
page = Page.objects.get(slug=slug_or_id)
|
||||
if not has_course_access_by_page_request(request, page):
|
||||
raise PermissionDenied()
|
||||
|
||||
|
|
|
|||
|
|
@ -1,8 +1,6 @@
|
|||
import wagtail_factories
|
||||
from django.conf import settings
|
||||
from django.core.management import call_command
|
||||
from slugify import slugify
|
||||
from wagtail.models import Locale, Page, Site
|
||||
from wagtail.models import Locale, Page
|
||||
from wagtail.rich_text import RichText
|
||||
from wagtail_localize.models import LocaleSynchronization
|
||||
|
||||
|
|
@ -39,15 +37,6 @@ def create_vv_new_learning_path(
|
|||
if user is None:
|
||||
user = User.objects.get(username="info@iterativ.ch")
|
||||
|
||||
site = Site.objects.filter(is_default_site=True).first()
|
||||
|
||||
if not site:
|
||||
site = wagtail_factories.SiteFactory(is_default_site=True)
|
||||
|
||||
if settings.APP_ENVIRONMENT == "development":
|
||||
site.port = 8000
|
||||
site.save()
|
||||
|
||||
course_page = CoursePage.objects.get(course_id=course_id)
|
||||
lp = LearningPathFactory(
|
||||
title="Lernpfad",
|
||||
|
|
|
|||
Loading…
Reference in New Issue