From cee6c03630adb99de8f4ffac9a674bb8ad1834b0 Mon Sep 17 00:00:00 2001 From: Christian Cueni Date: Wed, 24 May 2023 16:18:00 +0200 Subject: [PATCH 1/2] =?UTF-8?q?Add=20=C3=BCK-Training=20course?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../create_uk_training_competence_profile.py | 162 ++++++++++++++++++ server/vbv_lernwelt/course/consts.py | 1 + .../commands/create_default_courses.py | 22 +++ .../commands/create_uk_training_course.py | 55 ++++++ 4 files changed, 240 insertions(+) create mode 100644 server/vbv_lernwelt/competence/create_uk_training_competence_profile.py create mode 100644 server/vbv_lernwelt/course/management/commands/create_uk_training_course.py diff --git a/server/vbv_lernwelt/competence/create_uk_training_competence_profile.py b/server/vbv_lernwelt/competence/create_uk_training_competence_profile.py new file mode 100644 index 00000000..7e8048b3 --- /dev/null +++ b/server/vbv_lernwelt/competence/create_uk_training_competence_profile.py @@ -0,0 +1,162 @@ +from vbv_lernwelt.competence.factories import ( + CompetencePageFactory, + CompetenceProfilePageFactory, + PerformanceCriteriaFactory, +) +from vbv_lernwelt.competence.models import CompetencePage +from vbv_lernwelt.course.consts import COURSE_UK, COURSE_UK_FR +from vbv_lernwelt.course.models import CoursePage +from vbv_lernwelt.learnpath.models import LearningPath, LearningUnit + + +def create_uk_training_competence_profile(course_id=COURSE_UK): + course_page = CoursePage.objects.get(course_id=course_id) + slug_prefix = course_page.get_children().exact_type(LearningPath).first().slug + + competence_profile_page = CompetenceProfilePageFactory( + title="KompetenzNavi", + parent=course_page, + ) + + competences = [ + { + "competence_id": "c3", + "title": "Betriebliche Prozesse dokumentieren, koordinieren und umsetzen", + "items": [], + }, + { + "competence_id": "e2", + "title": "Informationen im wirtschaftlichen und kaufmännischen Bereich recherchieren", + "items": [], + }, + { + "competence_id": "e4", + "title": "Betriebsbezogene Inhalte multimedial aufbereiten", + "items": [], + }, + { + "competence_id": "d2", + "title": "Informations- und Beratungsgespräche mit Kunden oder Lieferanten führen", + "items": [], + }, + { + "competence_id": "d3", + "title": "Betriebliche Prozesse dokumentieren, koordinieren und umsetzen", + "items": [], + }, + { + "competence_id": "d1", + "title": "Anliegen von Kunden oder Lieferanten entgegennehmen", + "items": [], + }, + ] + + for c in competences: + print(c["title"]) + CompetencePageFactory( + parent=competence_profile_page, + competence_id=c["competence_id"], + title=c["title"], + items=[("item", i) for i in c["items"]], + ) + # Circle Fahrzeug + PerformanceCriteriaFactory( + parent=CompetencePage.objects.get( + slug__startswith=slug_prefix.replace("-lp", ""), competence_id="c3" + ), + competence_id="c3.pv.ük2", + title="Ich bin fähig die relevanten rechtlichen Grundlagen im Handlungsfeld Fahrzeug situationsgerecht zu erläutern.", + learning_unit=LearningUnit.objects.get( + slug=f"{slug_prefix}-circle-fahrzeug-lu-vorbereitung" + ), + ) + PerformanceCriteriaFactory( + parent=CompetencePage.objects.get( + slug__startswith=slug_prefix.replace("-lp", ""), competence_id="c3" + ), + competence_id="c3.pv.ük7", + title="Ich bin fähig die gesetzlichen Bestimmungen bei Schaden- und Leistungsfällen im Handlungsfeld Fahrzeug zu erläutern.", + learning_unit=LearningUnit.objects.get( + slug=f"{slug_prefix}-circle-fahrzeug-lu-vorbereitung" + ), + ) + PerformanceCriteriaFactory( + parent=CompetencePage.objects.get( + slug__startswith=slug_prefix.replace("-lp", ""), competence_id="c3" + ), + competence_id="c3.pv.ük11", + title="Ich bin fähig die gängigen Versicherungslösungen im Handlungsbereich Fahrzeug fachkundig zu beurteilen.", + learning_unit=LearningUnit.objects.get( + slug=f"{slug_prefix}-circle-fahrzeug-lu-vorbereitung" + ), + ) + PerformanceCriteriaFactory( + parent=CompetencePage.objects.get( + slug__startswith=slug_prefix.replace("-lp", ""), competence_id="d2" + ), + competence_id="d2.pv.ük1", + title="Ich bin fähig die wichtigsten gesetzlichen Grundlagen im Bereich Motorfahrzeugversicherung umfassend zu beschreiben.", + learning_unit=LearningUnit.objects.get( + slug=f"{slug_prefix}-circle-fahrzeug-lu-vorbereitung" + ), + ) + PerformanceCriteriaFactory( + parent=CompetencePage.objects.get( + slug__startswith=slug_prefix.replace("-lp", ""), competence_id="d2" + ), + competence_id="d2.pv.ük2", + title="Ich bin fähig die relevanten Dienstleistungen und Produkte im Handlungsfeld Fahrzeug zu nennen.", + learning_unit=LearningUnit.objects.get( + slug=f"{slug_prefix}-circle-fahrzeug-lu-vorbereitung" + ), + ) + PerformanceCriteriaFactory( + parent=CompetencePage.objects.get( + slug__startswith=slug_prefix.replace("-lp", ""), competence_id="d2" + ), + competence_id="d2.pv.ük3", + title="Ich bin fähig die Leistungen und Produkte im Handlungsfeld Fahrzeug zu erläutern.", + learning_unit=LearningUnit.objects.get( + slug=f"{slug_prefix}-circle-fahrzeug-lu-vorbereitung" + ), + ) + PerformanceCriteriaFactory( + parent=CompetencePage.objects.get( + slug__startswith=slug_prefix.replace("-lp", ""), competence_id="d2" + ), + competence_id="d2.pv.ük4", + title="Ich bin fähig die Prozesse und Abläufe im Handlungsfeld Fahrzeug zu erläutern.", + learning_unit=LearningUnit.objects.get( + slug=f"{slug_prefix}-circle-fahrzeug-lu-vorbereitung" + ), + ) + PerformanceCriteriaFactory( + parent=CompetencePage.objects.get( + slug__startswith=slug_prefix.replace("-lp", ""), competence_id="e4" + ), + competence_id="e4.pv.ük1", + title="Ich bin fähig die Dienstleistungen des eigenen Betriebs im Handlungsfeld Fahrzeug zu erläutern.", + learning_unit=LearningUnit.objects.get( + slug=f"{slug_prefix}-circle-fahrzeug-lu-vorbereitung" + ), + ) + PerformanceCriteriaFactory( + parent=CompetencePage.objects.get( + slug__startswith=slug_prefix.replace("-lp", ""), competence_id="e4" + ), + competence_id="e4.pv.ük2", + title="Ich bin fähig Mitbewerber in der privaten Versicherungsbranche im Handlungsfeld Fahrzeug anhand der relevanten Kriterien zu unterscheiden.", + learning_unit=LearningUnit.objects.get( + slug=f"{slug_prefix}-circle-fahrzeug-lu-vorbereitung" + ), + ) + PerformanceCriteriaFactory( + parent=CompetencePage.objects.get( + slug__startswith=slug_prefix.replace("-lp", ""), competence_id="e4" + ), + competence_id="e4.pv.ük4", + title="Ich bin fähig die Grundlagen der Produkte von Motorfahrzeugversicherungen zu erläutern.", + learning_unit=LearningUnit.objects.get( + slug=f"{slug_prefix}-circle-fahrzeug-lu-vorbereitung" + ), + ) diff --git a/server/vbv_lernwelt/course/consts.py b/server/vbv_lernwelt/course/consts.py index 94ba8517..23fc2105 100644 --- a/server/vbv_lernwelt/course/consts.py +++ b/server/vbv_lernwelt/course/consts.py @@ -3,3 +3,4 @@ COURSE_VERSICHERUNGSVERMITTLERIN_OLD_ID = -2 COURSE_UK = -3 COURSE_VERSICHERUNGSVERMITTLERIN_ID = -4 COURSE_UK_FR = -5 +COURSE_UK_TRAINING = -6 diff --git a/server/vbv_lernwelt/course/management/commands/create_default_courses.py b/server/vbv_lernwelt/course/management/commands/create_default_courses.py index ed0779bc..1ab68743 100644 --- a/server/vbv_lernwelt/course/management/commands/create_default_courses.py +++ b/server/vbv_lernwelt/course/management/commands/create_default_courses.py @@ -14,6 +14,9 @@ from vbv_lernwelt.competence.create_uk_competence_profile import ( create_uk_competence_profile, create_uk_fr_competence_profile, ) +from vbv_lernwelt.competence.create_uk_training_competence_profile import ( + create_uk_training_competence_profile, +) from vbv_lernwelt.competence.create_vv_new_competence_profile import ( create_vv_new_competence_profile, ) @@ -24,6 +27,7 @@ from vbv_lernwelt.course.consts import ( COURSE_TEST_ID, COURSE_UK, COURSE_UK_FR, + COURSE_UK_TRAINING, COURSE_VERSICHERUNGSVERMITTLERIN_ID, ) from vbv_lernwelt.course.creators.test_course import create_test_course @@ -31,6 +35,9 @@ from vbv_lernwelt.course.creators.uk_course import ( create_uk_fr_learning_path, create_uk_learning_path, ) +from vbv_lernwelt.course.management.commands.create_uk_training_course import ( + create_uk_training_learning_path, +) from vbv_lernwelt.course.creators.versicherungsvermittlerin import ( create_versicherungsvermittlerin_with_categories, ) @@ -63,6 +70,7 @@ ADMIN_EMAILS = ["info@iterativ.ch", "admin"] COURSE_UK, COURSE_VERSICHERUNGSVERMITTLERIN_ID, COURSE_UK_FR, + COURSE_UK_TRAINING, ], ) def command(course): @@ -90,6 +98,9 @@ def command(course): if COURSE_TEST_ID in course: create_test_course(with_sessions=True) + if COURSE_UK_TRAINING in course: + create_course_training_de() + def create_versicherungsvermittlerin_course(): # Versicherungsvermittler/in mit neuen Circles @@ -404,3 +415,14 @@ def create_course_uk_de_completion_data(course_session): course_session=course_session, completion_status="fail", ) + + +def create_course_training_de(): + # Test Lehrgang für üK Trainer + create_versicherungsvermittlerin_with_categories( + course_id=COURSE_UK_TRAINING, title="myVBV Training" + ) + create_uk_assignments(course_id=COURSE_UK_TRAINING) + create_uk_training_learning_path(course_id=COURSE_UK_TRAINING) + create_uk_training_competence_profile(course_id=COURSE_UK_TRAINING) + create_default_media_library(course_id=COURSE_UK_TRAINING) diff --git a/server/vbv_lernwelt/course/management/commands/create_uk_training_course.py b/server/vbv_lernwelt/course/management/commands/create_uk_training_course.py new file mode 100644 index 00000000..21c21eb9 --- /dev/null +++ b/server/vbv_lernwelt/course/management/commands/create_uk_training_course.py @@ -0,0 +1,55 @@ +import wagtail_factories +from django.conf import settings +from django.core.management import call_command +from wagtail.models import Locale, Page, Site +from wagtail_localize.models import LocaleSynchronization + +from vbv_lernwelt.core.admin import User +from vbv_lernwelt.course.consts import COURSE_UK +from vbv_lernwelt.course.management.commands.create_uk_course import ( + create_uk_circle_fahrzeug, +) +from vbv_lernwelt.course.models import CoursePage +from vbv_lernwelt.learnpath.tests.learning_path_factories import ( + LearningPathFactory, + TopicFactory, +) + + +def create_uk_training_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", + parent=course_page, + ) + + TopicFactory(title="Training", is_visible=True, parent=lp) + create_uk_circle_fahrzeug(lp) + + # locales + if not skip_locales: + locale_de = Locale.objects.get(language_code="de-CH") + locale_fr, _ = Locale.objects.get_or_create(language_code="fr-CH") + LocaleSynchronization.objects.get_or_create( + locale_id=locale_fr.id, sync_from_id=locale_de.id + ) + locale_it, _ = Locale.objects.get_or_create(language_code="it-CH") + LocaleSynchronization.objects.get_or_create( + locale_id=locale_it.id, sync_from_id=locale_de.id + ) + call_command("sync_locale_trees") + + # all pages belong to 'admin' by default + Page.objects.update(owner=user) From 142c979b248b0de1f64b432756d6225fc0f0d21b Mon Sep 17 00:00:00 2001 From: Daniel Egger Date: Fri, 26 May 2023 15:54:22 +0200 Subject: [PATCH 2/2] Add demo tag course session --- .../vbv_lernwelt/course/creators/uk_course.py | 9 ++-- .../uk_training_course.py} | 4 +- .../commands/create_default_courses.py | 46 +++++++++++++++++-- 3 files changed, 49 insertions(+), 10 deletions(-) rename server/vbv_lernwelt/course/{management/commands/create_uk_training_course.py => creators/uk_training_course.py} (94%) diff --git a/server/vbv_lernwelt/course/creators/uk_course.py b/server/vbv_lernwelt/course/creators/uk_course.py index 7b9ccde1..84f28b82 100644 --- a/server/vbv_lernwelt/course/creators/uk_course.py +++ b/server/vbv_lernwelt/course/creators/uk_course.py @@ -319,6 +319,7 @@ def create_uk_circle_fahrzeug(lp, title="Fahrzeug"): description="In diesem Circle lernst du alles rund um Motorfahrzeugversicherungen.", goals=UK_CIRCLE_GOALS["fahrzeug"], ) + course_slug = lp.slug.replace("-lp", "") LearningSequenceFactory( title="Vorbereitung", parent=circle, icon="it-icon-ls-start" ) @@ -330,14 +331,14 @@ def create_uk_circle_fahrzeug(lp, title="Fahrzeug"): f"

In der Mediathek unter dem Handlungsfeld «{title}» findest du alle relevanten Ressourcen für deine Fachkompetenzen.

" f"

Wir empfehlen dir vor der Absolvierung der weiteren Lerneinheiten dich in die Thematik einzulesen.

" ), - content_url=f"/course/überbetriebliche-kurse/media/category/{slugify(title)}", + content_url=f"/course/{course_slug}/media/category/{slugify(title)}", ) LearningContentAssignmentFactory( title="Fahrzeug - Mein erstes Auto", assignment_type="PREP_ASSIGNMENT", parent=circle, content_assignment=Assignment.objects.get( - slug__startswith="überbetriebliche-kurse-assignment-fahrzeug-mein-erstes-auto" + slug__startswith=f"{course_slug}-assignment-fahrzeug-mein-erstes-auto" ), ), LearningSequenceFactory(title="Training", parent=circle) @@ -360,7 +361,7 @@ def create_uk_circle_fahrzeug(lp, title="Fahrzeug"): title="Überprüfen einer Motorfahrzeug-Versicherungspolice", parent=circle, content_assignment=Assignment.objects.get( - slug__startswith="überbetriebliche-kurse-assignment-überprüfen-einer-motorfahrzeugs" + slug__startswith=f"{course_slug}-assignment-überprüfen-einer-motorfahrzeugs" ), ), LearningContentAssignmentFactory( @@ -368,7 +369,7 @@ def create_uk_circle_fahrzeug(lp, title="Fahrzeug"): assignment_type="REFLECTION", parent=circle, content_assignment=Assignment.objects.get( - slug__startswith="überbetriebliche-kurse-assignment-fahrzeug-reflexionsfragen" + slug__startswith=f"{course_slug}-assignment-fahrzeug-reflexionsfragen" ), ), diff --git a/server/vbv_lernwelt/course/management/commands/create_uk_training_course.py b/server/vbv_lernwelt/course/creators/uk_training_course.py similarity index 94% rename from server/vbv_lernwelt/course/management/commands/create_uk_training_course.py rename to server/vbv_lernwelt/course/creators/uk_training_course.py index 21c21eb9..87398c7c 100644 --- a/server/vbv_lernwelt/course/management/commands/create_uk_training_course.py +++ b/server/vbv_lernwelt/course/creators/uk_training_course.py @@ -6,9 +6,7 @@ from wagtail_localize.models import LocaleSynchronization from vbv_lernwelt.core.admin import User from vbv_lernwelt.course.consts import COURSE_UK -from vbv_lernwelt.course.management.commands.create_uk_course import ( - create_uk_circle_fahrzeug, -) +from vbv_lernwelt.course.creators.uk_course import create_uk_circle_fahrzeug from vbv_lernwelt.course.models import CoursePage from vbv_lernwelt.learnpath.tests.learning_path_factories import ( LearningPathFactory, diff --git a/server/vbv_lernwelt/course/management/commands/create_default_courses.py b/server/vbv_lernwelt/course/management/commands/create_default_courses.py index 1ab68743..ef19099e 100644 --- a/server/vbv_lernwelt/course/management/commands/create_default_courses.py +++ b/server/vbv_lernwelt/course/management/commands/create_default_courses.py @@ -35,7 +35,7 @@ from vbv_lernwelt.course.creators.uk_course import ( create_uk_fr_learning_path, create_uk_learning_path, ) -from vbv_lernwelt.course.management.commands.create_uk_training_course import ( +from vbv_lernwelt.course.creators.uk_training_course import ( create_uk_training_learning_path, ) from vbv_lernwelt.course.creators.versicherungsvermittlerin import ( @@ -419,10 +419,50 @@ def create_course_uk_de_completion_data(course_session): def create_course_training_de(): # Test Lehrgang für üK Trainer - create_versicherungsvermittlerin_with_categories( + course = create_versicherungsvermittlerin_with_categories( course_id=COURSE_UK_TRAINING, title="myVBV Training" ) - create_uk_assignments(course_id=COURSE_UK_TRAINING) + + # assignments create assignments parent page + _assignment_list_page = AssignmentListPageFactory( + parent=course.coursepage, + ) + create_uk_casework(course_id=COURSE_UK_TRAINING) + create_uk_prep_assignment(course_id=COURSE_UK_TRAINING) + create_uk_reflection(course_id=COURSE_UK_TRAINING) + create_uk_training_learning_path(course_id=COURSE_UK_TRAINING) create_uk_training_competence_profile(course_id=COURSE_UK_TRAINING) create_default_media_library(course_id=COURSE_UK_TRAINING) + + cs = CourseSession.objects.create( + course_id=COURSE_UK_TRAINING, + title="Demo-Tag", + attendance_courses=[ + { + "learningContentId": LearningContentAttendanceCourse.objects.get( + slug=f"{course.slug}-lp-circle-fahrzeug-lc-präsenzkurs-fahrzeug" + ).id, + "start": "2023-05-23T08:30:00+0200", + "end": "2023-05-23T17:00:00+0200", + "location": "Handelsschule KV Bern, Zimmer 123, Eigerstrasse 16, 3012 Bern", + "trainer": "Roland Grossenbacher, roland.grossenbacher@helvetia.ch", + } + ], + assignment_details_list=[ + { + "learningContentId": LearningContentAssignment.objects.get( + slug=f"{course.slug}-lp-circle-fahrzeug-lc-überprüfen-einer-motorfahrzeug-versicherungspolice" + ).id, + "submissionDeadlineDateTimeUtc": "2023-06-13T19:00:00Z", + "evaluationDeadlineDateTimeUtc": "2023-06-27T19:00:00Z", + }, + { + "learningContentId": LearningContentAssignment.objects.get( + slug=f"{course.slug}-lp-circle-fahrzeug-lc-fahrzeug-mein-erstes-auto" + ).id, + "submissionDeadlineDateTimeUtc": "2023-06-13T19:00:00Z", + "evaluationDeadlineDateTimeUtc": "2023-06-27T19:00:00Z", + }, + ], + )