vbv/server/vbv_lernwelt/course/creators/test_course.py

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,
)