449 lines
15 KiB
Python
449 lines
15 KiB
Python
import json
|
|
|
|
import wagtail_factories
|
|
from django.conf import settings
|
|
from slugify import slugify
|
|
from wagtail.models import Site
|
|
|
|
from vbv_lernwelt.assignment.creators.create_assignments import create_test_assignment
|
|
from vbv_lernwelt.assignment.models import Assignment
|
|
from vbv_lernwelt.assignment.services import update_assignment_completion
|
|
from vbv_lernwelt.competence.factories import (
|
|
CompetencePageFactory,
|
|
CompetenceProfilePageFactory,
|
|
PerformanceCriteriaFactory,
|
|
)
|
|
from vbv_lernwelt.competence.models import CompetencePage
|
|
from vbv_lernwelt.core.constants import (
|
|
TEST_COURSE_SESSION_BERN_ID,
|
|
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 (
|
|
Course,
|
|
CourseCategory,
|
|
CoursePage,
|
|
CourseSession,
|
|
CourseSessionUser,
|
|
)
|
|
from vbv_lernwelt.learnpath.models import Circle
|
|
from vbv_lernwelt.learnpath.tests.learning_path_factories import (
|
|
CircleFactory,
|
|
LearningContentAssignmentFactory,
|
|
LearningContentAttendanceDayFactory,
|
|
LearningContentFeedbackFactory,
|
|
LearningContentLearningModuleFactory,
|
|
LearningContentMediaLibraryFactory,
|
|
LearningContentPlaceholderFactory,
|
|
LearningContentVideoFactory,
|
|
LearningPathFactory,
|
|
LearningSequenceFactory,
|
|
LearningUnitFactory,
|
|
TopicFactory,
|
|
)
|
|
from vbv_lernwelt.media_library.tests.media_library_factories import (
|
|
create_external_link_block,
|
|
create_learn_media_block,
|
|
create_media_collection,
|
|
ExternalLinkBlockFactory,
|
|
LearnMediaBlockFactory,
|
|
MediaCategoryPageFactory,
|
|
MediaLibraryPageFactory,
|
|
)
|
|
|
|
|
|
def create_test_course(include_uk=True, include_vv=True, with_sessions=False):
|
|
create_locales_for_wagtail()
|
|
course = create_test_course_with_categories()
|
|
|
|
create_test_competence_profile()
|
|
if include_uk:
|
|
create_test_assignment()
|
|
|
|
create_test_learning_path(include_uk=include_uk, include_vv=include_vv)
|
|
create_test_media_library()
|
|
|
|
if with_sessions:
|
|
# course sessions
|
|
cs_bern = CourseSession.objects.create(
|
|
course_id=COURSE_TEST_ID,
|
|
title="Test Bern 2022 a",
|
|
id=TEST_COURSE_SESSION_BERN_ID,
|
|
)
|
|
cs_zurich = CourseSession.objects.create(
|
|
course_id=COURSE_TEST_ID,
|
|
title="Test Zürich 2022 a",
|
|
id=TEST_COURSE_SESSION_ZURICH_ID,
|
|
)
|
|
|
|
trainer1 = User.objects.get(email="test-trainer1@example.com")
|
|
csu = CourseSessionUser.objects.create(
|
|
course_session=cs_bern,
|
|
user=trainer1,
|
|
role=CourseSessionUser.Role.EXPERT,
|
|
)
|
|
csu.expert.add(Circle.objects.get(slug="test-lehrgang-lp-circle-fahrzeug"))
|
|
|
|
student1 = User.objects.get(email="test-student1@example.com")
|
|
_csu = CourseSessionUser.objects.create(
|
|
course_session=cs_bern,
|
|
user=student1,
|
|
)
|
|
|
|
student2 = User.objects.get(email="test-student2@example.com")
|
|
_csu = CourseSessionUser.objects.create(
|
|
course_session=cs_bern,
|
|
user=student2,
|
|
)
|
|
student2 = User.objects.get(email="test-student2@example.com")
|
|
_csu = CourseSessionUser.objects.create(
|
|
course_session=cs_zurich,
|
|
user=student2,
|
|
)
|
|
|
|
return course
|
|
|
|
|
|
def create_test_assignment_submitted_data(assignment, course_session, user):
|
|
if assignment and course_session and user:
|
|
subtasks = assignment.filter_user_subtasks(subtask_types=["user_text_input"])
|
|
for index, subtask in enumerate(subtasks):
|
|
user_text = f"Lorem ipsum dolor sit amet... {index}"
|
|
|
|
update_assignment_completion(
|
|
assignment_user=user,
|
|
assignment=assignment,
|
|
course_session=course_session,
|
|
completion_data={
|
|
subtask["id"]: {
|
|
"user_data": {"text": user_text},
|
|
}
|
|
},
|
|
)
|
|
update_assignment_completion(
|
|
assignment_user=user,
|
|
assignment=assignment,
|
|
course_session=course_session,
|
|
completion_status="SUBMITTED",
|
|
)
|
|
|
|
|
|
def create_test_course_with_categories(apps=None, schema_editor=None):
|
|
if apps is not None:
|
|
Course = apps.get_model("course", "Course")
|
|
CourseCategory = apps.get_model("course", "CourseCategory")
|
|
else:
|
|
# pylint: disable=import-outside-toplevel
|
|
from vbv_lernwelt.course.models import Course, CourseCategory
|
|
|
|
course, _ = Course.objects.get_or_create(
|
|
id=COURSE_TEST_ID, title="Test Lehrgang", category_name="Handlungsfeld"
|
|
)
|
|
|
|
CourseCategory.objects.get_or_create(course=course, title="Allgemein", general=True)
|
|
|
|
for cat in [
|
|
"Fahrzeug",
|
|
"Reisen",
|
|
]:
|
|
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,
|
|
course=course,
|
|
)
|
|
course.slug = course_page.slug
|
|
course.save()
|
|
|
|
return course
|
|
|
|
|
|
def create_test_learning_path(include_uk=True, include_vv=True):
|
|
course_page = CoursePage.objects.get(course_id=COURSE_TEST_ID)
|
|
lp = LearningPathFactory(title="Test Lernpfad", parent=course_page)
|
|
|
|
if include_uk:
|
|
TopicFactory(title="Circle ÜK", is_visible=False, parent=lp)
|
|
create_test_uk_circle_fahrzeug(lp, title="Fahrzeug")
|
|
|
|
if include_vv:
|
|
TopicFactory(title="Circle VV", is_visible=False, parent=lp)
|
|
create_test_circle_reisen(lp)
|
|
|
|
|
|
def create_test_uk_circle_fahrzeug(lp, title="Fahrzeug"):
|
|
circle = CircleFactory(
|
|
title=title,
|
|
parent=lp,
|
|
description="""
|
|
In diesem Circle erfährst du wie der Lehrgang aufgebaut ist.
|
|
Zudem lernst du die wichtigsten Grundlagen,
|
|
damit du erfolgreich mit deinem Lernpfad (durch-)starten kannst.
|
|
""".strip(),
|
|
)
|
|
LearningSequenceFactory(
|
|
title="Vorbereitung", parent=circle, icon="it-icon-ls-start"
|
|
)
|
|
lu = LearningUnitFactory(title="Vorbereitung", parent=circle)
|
|
LearningContentPlaceholderFactory(
|
|
title="Verschaffe dir einen Überblick",
|
|
parent=circle,
|
|
)
|
|
LearningContentMediaLibraryFactory(
|
|
title=f"Mediathek {title}",
|
|
parent=circle,
|
|
content_url=f"/media/überbetriebliche-kurse-media/category/{slugify(title)}",
|
|
)
|
|
LearningContentPlaceholderFactory(
|
|
title="Vorbereitungsauftrag",
|
|
parent=circle,
|
|
)
|
|
|
|
PerformanceCriteriaFactory(
|
|
parent=CompetencePage.objects.get(competence_id="X1"),
|
|
competence_id="X1.1",
|
|
title="Innerhalb des Handlungsfelds «Fahrzeug» bin ich fähig, die Ziele und Pläne des Kunden zu ergründen (SOLL).",
|
|
learning_unit=lu,
|
|
)
|
|
PerformanceCriteriaFactory(
|
|
parent=CompetencePage.objects.get(competence_id="X1"),
|
|
competence_id="X1.1",
|
|
title="Innerhalb des Handlungsfelds «Fahrzeug» bin ich fähig, die IST-Situation des Kunden mit der geeigneten Gesprächs-/Fragetechnik zu erfassen.",
|
|
learning_unit=lu,
|
|
)
|
|
|
|
LearningSequenceFactory(title="Training", parent=circle)
|
|
LearningUnitFactory(title="Unterlagen", parent=circle)
|
|
LearningContentPlaceholderFactory(
|
|
title="Unterlagen für den Unterricht",
|
|
parent=circle,
|
|
)
|
|
LearningUnitFactory(title="Präsenztag", parent=circle)
|
|
LearningContentAttendanceDayFactory(
|
|
title="Präsenztag Fahrzeug",
|
|
parent=circle,
|
|
)
|
|
LearningUnitFactory(title="Kompetenznachweis", parent=circle)
|
|
LearningContentPlaceholderFactory(
|
|
title="Wissens- und Verständnisfragen",
|
|
parent=circle,
|
|
)
|
|
LearningSequenceFactory(title="Transfer", parent=circle, icon="it-icon-ls-end")
|
|
LearningUnitFactory(title="Transfer", parent=circle)
|
|
LearningContentPlaceholderFactory(
|
|
title="Reflexion",
|
|
parent=circle,
|
|
)
|
|
LearningContentAssignmentFactory(
|
|
title="Überprüfen einer Motorfahrzeug-Versicherungspolice",
|
|
parent=circle,
|
|
content_assignment=Assignment.objects.get(
|
|
slug__startswith="test-lehrgang-assignment-überprüfen-einer-motorfahrzeugs"
|
|
),
|
|
)
|
|
LearningContentFeedbackFactory(
|
|
parent=circle,
|
|
)
|
|
|
|
|
|
def create_test_circle_reisen(lp):
|
|
circle = CircleFactory(
|
|
title="Reisen",
|
|
parent=lp,
|
|
)
|
|
LearningSequenceFactory(title="Starten", parent=circle, icon="it-icon-ls-start")
|
|
LearningUnitFactory(title="Einführung", parent=circle)
|
|
LearningContentVideoFactory(
|
|
title="Verschaff dir einen Überblick",
|
|
parent=circle,
|
|
content_url="https://player.vimeo.com/video/772512710?h=30f912f15a",
|
|
description="Willkommen im Lehrgang Versicherungsvermitler VBV",
|
|
)
|
|
LearningContentMediaLibraryFactory(
|
|
title=f"Mediathek Reisen",
|
|
parent=circle,
|
|
content_url=f"/media/test-lehrgang-media/category/reisen",
|
|
)
|
|
|
|
LearningSequenceFactory(title="Analyse", parent=circle)
|
|
|
|
# analyse
|
|
lu = LearningUnitFactory(
|
|
title="Bedarfsanalyse, Ist- und Soll-Situation",
|
|
parent=circle,
|
|
course_category=CourseCategory.objects.get(
|
|
course_id=COURSE_TEST_ID, title="Reisen"
|
|
),
|
|
)
|
|
|
|
LearningContentLearningModuleFactory(
|
|
title="Emma und Ayla campen durch Amerika - Analyse",
|
|
parent=circle,
|
|
content_url="https://s3.eu-central-1.amazonaws.com/myvbv-wbt.iterativ.ch/emma-und-ayla-campen-durch-amerika-analyse-xapi-FZoZOP9y/index.html",
|
|
)
|
|
|
|
PerformanceCriteriaFactory(
|
|
parent=CompetencePage.objects.get(competence_id="Y1"),
|
|
competence_id=f"Y1.1",
|
|
title=f"Ich bin fähig zu Reisen eine Gesprächsführung zu machen",
|
|
learning_unit=lu,
|
|
)
|
|
PerformanceCriteriaFactory(
|
|
parent=CompetencePage.objects.get(competence_id="Y2"),
|
|
competence_id=f"Y2.1",
|
|
title=f"Ich bin fähig zu Reisen eine Analyse zu machen",
|
|
learning_unit=lu,
|
|
)
|
|
|
|
# transfer
|
|
parent = circle
|
|
LearningSequenceFactory(title="Transfer", parent=parent, icon="it-icon-ls-end")
|
|
LearningUnitFactory(title="Transfer, Reflexion, Feedback", parent=parent)
|
|
LearningContentPlaceholderFactory(
|
|
title="Auswandern: Woran muss ich denken?",
|
|
parent=parent,
|
|
)
|
|
LearningContentPlaceholderFactory(
|
|
title=f"Fachcheck Reisen",
|
|
parent=parent,
|
|
)
|
|
LearningContentPlaceholderFactory(
|
|
title="Reflexion",
|
|
parent=parent,
|
|
)
|
|
LearningContentFeedbackFactory(
|
|
parent=parent,
|
|
)
|
|
|
|
|
|
def create_test_competence_profile():
|
|
_course = Course.objects.get(id=COURSE_TEST_ID)
|
|
course_page = CoursePage.objects.get(course_id=COURSE_TEST_ID)
|
|
|
|
competence_profile_page = CompetenceProfilePageFactory(
|
|
title="KompetenzNavi",
|
|
parent=course_page,
|
|
)
|
|
|
|
competences = [
|
|
{
|
|
"competence_id": "X1",
|
|
"title": "Weiterempfehlung für Neukunden generieren",
|
|
"items": [
|
|
"Verhandlungsgeschick",
|
|
"Überzeugtes Auftreten",
|
|
],
|
|
},
|
|
{
|
|
"competence_id": "Y1",
|
|
"title": "Wünsche, Ziele und Bedürfnisse der Kunden im Gespräch ermitteln",
|
|
"items": [
|
|
"Gesprächsführung",
|
|
"Fragetechniken",
|
|
"Kundenpsychologie",
|
|
],
|
|
},
|
|
{
|
|
"competence_id": "Y2",
|
|
"title": "Analyse des Kundenbedarfs und des Kundenbedürfnisses durchführen",
|
|
"items": [
|
|
"Fragetechniken",
|
|
"Visuelle Hilfsmittel / Visualisierungstechniken",
|
|
],
|
|
},
|
|
]
|
|
|
|
for c in competences:
|
|
CompetencePageFactory(
|
|
parent=competence_profile_page,
|
|
competence_id=c["competence_id"],
|
|
title=c["title"],
|
|
items=[("item", i) for i in c["items"]],
|
|
)
|
|
|
|
|
|
def create_test_media_library():
|
|
course = Course.objects.get(id=COURSE_TEST_ID)
|
|
course_page = CoursePage.objects.get(course_id=COURSE_TEST_ID)
|
|
|
|
media_lib_page = MediaLibraryPageFactory(
|
|
title="Mediathek",
|
|
parent=course_page,
|
|
)
|
|
|
|
icons = [
|
|
"icon-hf-fahrzeug",
|
|
"icon-hf-reisen",
|
|
"icon-hf-einkommenssicherung",
|
|
]
|
|
for idx, cat in enumerate(course.coursecategory_set.all()):
|
|
overview_icon = icons[(idx + 2) % len(icons)]
|
|
introduction_text = """
|
|
Das Auto ist für viele der grösste Stolz! Es birgt aber auch ein grosses Gefahrenpotenzial.
|
|
Dabei geht es bei den heutigen Fahrzeugpreisen und Reparaturkosten rasch um namhafte Summen,
|
|
die der Fahrzeugbesitzer und die Fahrzeugbesitzerin in einem grösseren Schadenfall oft nur schwer selbst aufbringen kann.""".strip()
|
|
description_title = "Das erwartet dich in diesem Handlungsfeld"
|
|
description_text = """
|
|
In diesem berufstypischem Handlungsfeld lernst du alles rund um Motorfahrzeugversicherungen,
|
|
wie man sein Auto optimal schützen kann, wie du vorgehst bei einem Fahrzeugwechsel,
|
|
welche Aspekte du bei einer Offerte beachten musst und wie du dem Kunden die Lösung präsentierst.""".strip()
|
|
items = [
|
|
("item", "Motorfahrzeughaftpflichtversicherung"),
|
|
("item", "Motorfahrzeugkaskoversicherung"),
|
|
("item", "Insassenunfallversicherung"),
|
|
]
|
|
body_data = json.dumps(
|
|
[
|
|
create_media_collection(
|
|
title="Lernmedien",
|
|
contents=[
|
|
create_learn_media_block(LearnMediaBlockFactory()),
|
|
create_learn_media_block(LearnMediaBlockFactory()),
|
|
create_learn_media_block(LearnMediaBlockFactory()),
|
|
create_learn_media_block(LearnMediaBlockFactory()),
|
|
],
|
|
),
|
|
create_media_collection(
|
|
title="Links",
|
|
contents=[
|
|
create_external_link_block(
|
|
ExternalLinkBlockFactory(
|
|
title="Nationales Versicherungsbüro",
|
|
url="https://www.vbv.ch/",
|
|
)
|
|
),
|
|
create_external_link_block(
|
|
ExternalLinkBlockFactory(
|
|
title="Adressen der Strassenverkehrsämter",
|
|
url="https://www.vbv.ch/",
|
|
)
|
|
),
|
|
],
|
|
),
|
|
]
|
|
)
|
|
media_category = MediaCategoryPageFactory(
|
|
overview_icon=overview_icon,
|
|
title=cat.title,
|
|
course_category=cat,
|
|
parent=media_lib_page,
|
|
introduction_text=introduction_text,
|
|
description_title=description_title,
|
|
description_text=description_text,
|
|
items=items,
|
|
body=body_data,
|
|
)
|