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

970 lines
35 KiB
Python

from collections import deque
from datetime import datetime
from dateutil.relativedelta import MO, TH, TU, WE, relativedelta
from django.utils import timezone
from slugify import slugify
from wagtail.rich_text import RichText
from vbv_lernwelt.assignment.creators.create_assignments import (
create_uk_condition_acceptance,
create_uk_fahrzeug_casework,
create_uk_fahrzeug_prep_assignment,
create_uk_reflection,
create_vv_gewinnen_casework,
)
from vbv_lernwelt.assignment.models import (
Assignment,
AssignmentCompletionStatus,
AssignmentListPage,
)
from vbv_lernwelt.assignment.services import update_assignment_completion
from vbv_lernwelt.assignment.tests.assignment_factories import (
AssignmentFactory,
AssignmentListPageFactory,
EvaluationTaskBlockFactory,
)
from vbv_lernwelt.competence.factories import (
ActionCompetenceFactory,
ActionCompetenceListPageFactory,
CompetenceCertificateFactory,
CompetenceCertificateListFactory,
CompetenceNaviPageFactory,
PerformanceCriteriaFactory,
)
from vbv_lernwelt.competence.models import ActionCompetence
from vbv_lernwelt.core.constants import (
TEST_BERUFSBILDNER1_USER_ID,
TEST_COURSE_SESSION_BERN_ID,
TEST_COURSE_SESSION_ZURICH_ID,
TEST_STUDENT1_USER_ID,
TEST_STUDENT2_USER_ID,
TEST_STUDENT3_USER_ID,
TEST_SUPERVISOR1_USER_ID,
TEST_TRAINER1_USER_ID,
)
from vbv_lernwelt.core.models import User
from vbv_lernwelt.core.utils import safe_deque_popleft
from vbv_lernwelt.course.consts import COURSE_TEST_ID
from vbv_lernwelt.course.factories import CoursePageFactory
from vbv_lernwelt.course.models import (
Course,
CourseCategory,
CourseConfiguration,
CoursePage,
CourseSession,
CourseSessionUser,
)
from vbv_lernwelt.course.utils import get_wagtail_default_site
from vbv_lernwelt.course_session.models import (
CourseSessionAssignment,
CourseSessionAttendanceCourse,
CourseSessionEdoniqTest,
)
from vbv_lernwelt.course_session_group.models import CourseSessionGroup
from vbv_lernwelt.feedback.services import update_feedback_response
from vbv_lernwelt.learning_mentor.models import AgentParticipantRelation
from vbv_lernwelt.learnpath.models import (
Circle,
LearningContentAssignment,
LearningContentAttendanceCourse,
LearningContentEdoniqTest,
)
from vbv_lernwelt.learnpath.tests.learning_path_factories import (
CircleFactory,
LearningContentAssignmentFactory,
LearningContentAttendanceCourseFactory,
LearningContentEdoniqTestFactory,
LearningContentFeedbackUKFactory,
LearningContentFeedbackVVFactory,
LearningContentKnowledgeAssessmentFactory,
LearningContentLearningModuleFactory,
LearningContentMediaLibraryFactory,
LearningContentPlaceholderFactory,
LearningContentRichTextFactory,
LearningContentVideoFactory,
LearningPathFactory,
LearningSequenceFactory,
LearningUnitFactory,
TopicFactory,
)
from vbv_lernwelt.media_files.create_default_documents import (
create_default_collections,
create_default_content_documents,
)
from vbv_lernwelt.media_files.create_default_images import create_default_images
from vbv_lernwelt.media_files.models import ContentDocument, ContentImage, UserImage
from vbv_lernwelt.media_library.tests.media_library_factories import (
MediaLibraryCategoryPageFactory,
MediaLibraryContentPageFactory,
MediaLibraryPageFactory,
MediaLibraryUrlPageFactory,
)
def create_test_course(
include_uk=True, include_vv=True, with_sessions=False, with_documents=False
):
# create_locales_for_wagtail()
create_default_collections()
if with_documents:
create_default_content_documents()
if UserImage.objects.count() == 0 and ContentImage.objects.count() == 0:
create_default_images()
course: Course = create_test_course_with_categories()
course.configuration.enable_learning_mentor = False
competence_certificate = create_test_competence_navi()
# assignments create assignments parent page
course_page = CoursePage.objects.get(course_id=COURSE_TEST_ID)
_assignment_list_page = AssignmentListPageFactory(
parent=course_page,
)
if include_uk:
create_uk_fahrzeug_casework(
course_id=COURSE_TEST_ID,
competence_certificate=competence_certificate,
with_documents=with_documents,
)
create_uk_fahrzeug_prep_assignment(course_id=COURSE_TEST_ID)
create_uk_condition_acceptance(course_id=COURSE_TEST_ID)
create_uk_reflection(course_id=COURSE_TEST_ID)
create_edoniq_test_assignment(
course_id=COURSE_TEST_ID,
title="Edoniq Wissens- und Verständisfragen - Circle Fahrzeug (Demo)",
competence_certificate=competence_certificate,
)
course.configuration.is_uk = True
if include_vv:
create_vv_gewinnen_casework(course_id=COURSE_TEST_ID)
course.configuration.is_vv = True
course.configuration.save()
create_test_learning_path(
include_uk=include_uk, include_vv=include_vv, with_documents=with_documents
)
create_test_media_library()
if with_sessions:
now = timezone.now()
# course sessions
cs_bern = CourseSession.objects.create(
course_id=COURSE_TEST_ID,
title="Test Bern 2022 a",
import_id="Test Bern 2022 a",
id=TEST_COURSE_SESSION_BERN_ID,
start_date=now,
)
cs_zurich = CourseSession.objects.create(
course_id=COURSE_TEST_ID,
title="Test Zürich 2022 a",
import_id="Test Zürich 2022 a",
id=TEST_COURSE_SESSION_ZURICH_ID,
start_date=now,
)
csac = CourseSessionAttendanceCourse.objects.create(
course_session=cs_bern,
learning_content=LearningContentAttendanceCourse.objects.get(
slug="test-lehrgang-lp-circle-fahrzeug-lc-präsenzkurs-fahrzeug"
),
location="Handelsschule KV Bern, Zimmer 123, Eigerstrasse 16, 3012 Bern",
trainer="Roland Grossenbacher, roland.grossenbacher@helvetia.ch",
)
wednesday_in_four_weeks = (
datetime.now() + relativedelta(weekday=TU) + relativedelta(weeks=1)
)
csac.due_date.start = timezone.make_aware(
wednesday_in_four_weeks.replace(hour=8, minute=30, second=0, microsecond=0)
)
csac.due_date.end = timezone.make_aware(
wednesday_in_four_weeks.replace(hour=17, minute=0, second=0, microsecond=0)
)
csac.due_date.save()
if include_vv:
csac = CourseSessionAttendanceCourse.objects.create(
course_session=cs_bern,
learning_content=LearningContentAttendanceCourse.objects.get(
slug="test-lehrgang-lp-circle-reisen-lc-präsenzkurs-reisen"
),
location="Handelsschule KV Bern, Zimmer 123, Eigerstrasse 16, 3012 Bern",
trainer="Roland Grossenbacher, roland.grossenbacher@helvetia.ch",
)
wednesday_in_four_weeks = (
datetime.now() + relativedelta(weekday=TU) + relativedelta(weeks=4)
)
csac.due_date.start = timezone.make_aware(
wednesday_in_four_weeks.replace(
hour=8, minute=15, second=0, microsecond=0
)
)
csac.due_date.end = timezone.make_aware(
wednesday_in_four_weeks.replace(
hour=17, minute=30, second=0, microsecond=0
)
)
csac.due_date.save()
for course_session in [cs_bern, cs_zurich]:
csa = CourseSessionAssignment.objects.create(
course_session=course_session,
learning_content=LearningContentAssignment.objects.get(
slug=f"{course.slug}-lp-circle-fahrzeug-lc-überprüfen-einer-motorfahrzeug-versicherungspolice"
),
)
next_thursday = datetime.now() + relativedelta(weekday=TH(2))
csa.submission_deadline.start = timezone.make_aware(
(next_thursday + relativedelta(weeks=3)).replace(
hour=23, minute=59, second=59, microsecond=0
)
)
csa.submission_deadline.save()
csa.evaluation_deadline.start = timezone.make_aware(
(next_thursday + relativedelta(weeks=5)).replace(
hour=23, minute=59, second=59, microsecond=0
)
)
csa.evaluation_deadline.save()
csa = CourseSessionAssignment.objects.create(
course_session=cs_bern,
learning_content=LearningContentAssignment.objects.get(
slug="test-lehrgang-lp-circle-fahrzeug-lc-fahrzeug-mein-erstes-auto"
),
)
next_monday = datetime.now() + relativedelta(weekday=MO(2))
csa.submission_deadline.start = timezone.make_aware(
(next_monday + relativedelta(weeks=1)).replace(
hour=23, minute=59, second=59, microsecond=0
)
)
csa.submission_deadline.save()
for course_session in [cs_bern, cs_zurich]:
cset = CourseSessionEdoniqTest.objects.create(
course_session=course_session,
learning_content=LearningContentEdoniqTest.objects.get(
slug="test-lehrgang-lp-circle-fahrzeug-lc-wissens-und-verständnisfragen"
),
)
cset.deadline.start = timezone.make_aware(
(next_monday + relativedelta(days=3)).replace(
hour=21, minute=0, second=0, microsecond=0
)
)
cset.deadline.save()
if include_vv:
_csa = CourseSessionAssignment.objects.create(
course_session=cs_bern,
learning_content=LearningContentAssignment.objects.get(
slug="test-lehrgang-lp-circle-reisen-lc-mein-kundenstamm"
),
)
csac = CourseSessionAttendanceCourse.objects.create(
course_session=cs_zurich,
learning_content=LearningContentAttendanceCourse.objects.get(
slug="test-lehrgang-lp-circle-fahrzeug-lc-präsenzkurs-fahrzeug"
),
location="siehe Anzeigetafel, Bildungszentrum Jungholz, Jungholzstrasse 43, 8050 Zürich-Oerlikon",
trainer="Catia Logarzo",
)
wednesday_in_four_weeks = (
datetime.now() + relativedelta(weekday=WE) + relativedelta(weeks=1)
)
csac.due_date.start = timezone.make_aware(
wednesday_in_four_weeks.replace(hour=8, minute=30, second=0, microsecond=0)
)
csac.due_date.end = timezone.make_aware(
wednesday_in_four_weeks.replace(hour=17, minute=0, second=0, microsecond=0)
)
csac.due_date.save()
region1 = CourseSessionGroup.objects.create(
name="Region 1",
course=course,
)
region1.course_session.add(cs_bern)
region1.course_session.add(cs_zurich)
region1.supervisor.set([User.objects.get(id=TEST_SUPERVISOR1_USER_ID)])
csu = CourseSessionUser.objects.create(
course_session=cs_bern,
user=User.objects.get(id=TEST_TRAINER1_USER_ID),
role=CourseSessionUser.Role.EXPERT,
)
csu.expert.add(Circle.objects.get(slug="test-lehrgang-lp-circle-fahrzeug"))
if include_vv:
csu.expert.add(Circle.objects.get(slug="test-lehrgang-lp-circle-reisen"))
trainer2 = User.objects.get(email="test-trainer2@example.com")
csu = CourseSessionUser.objects.create(
course_session=cs_zurich,
user=trainer2,
role=CourseSessionUser.Role.EXPERT,
)
csu.expert.add(Circle.objects.get(slug="test-lehrgang-lp-circle-fahrzeug"))
CourseSessionUser.objects.create(
course_session=cs_bern, user=User.objects.get(id=TEST_STUDENT1_USER_ID)
)
# in both sessions (BE and ZH)
test_student_2 = User.objects.get(id=TEST_STUDENT2_USER_ID)
CourseSessionUser.objects.create(course_session=cs_bern, user=test_student_2)
CourseSessionUser.objects.create(course_session=cs_zurich, user=test_student_2)
CourseSessionUser.objects.create(
course_session=cs_bern,
user=User.objects.get(id=TEST_STUDENT3_USER_ID),
)
# add berufsbildner
AgentParticipantRelation.objects.create(
agent=User.objects.get(id=TEST_BERUFSBILDNER1_USER_ID),
participant=CourseSessionUser.objects.get(
user__id=TEST_STUDENT1_USER_ID,
course_session=cs_bern,
),
role="BERUFSBILDNER",
)
AgentParticipantRelation.objects.create(
agent=User.objects.get(id=TEST_BERUFSBILDNER1_USER_ID),
participant=CourseSessionUser.objects.get(
user__id=TEST_STUDENT2_USER_ID,
course_session=cs_bern,
),
role="BERUFSBILDNER",
)
AgentParticipantRelation.objects.create(
agent=User.objects.get(id=TEST_BERUFSBILDNER1_USER_ID),
participant=CourseSessionUser.objects.get(
user__id=TEST_STUDENT2_USER_ID,
course_session=cs_zurich,
),
role="BERUFSBILDNER",
)
AgentParticipantRelation.objects.create(
agent=User.objects.get(id=TEST_BERUFSBILDNER1_USER_ID),
participant=CourseSessionUser.objects.get(
user__id=TEST_STUDENT3_USER_ID,
course_session=cs_bern,
),
role="BERUFSBILDNER",
)
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,
learning_content_page=assignment.learningcontentassignment_set.first(),
completion_data={
subtask["id"]: {
"user_data": {"text": user_text},
}
},
)
update_assignment_completion(
assignment_user=user,
assignment=assignment,
course_session=course_session,
learning_content_page=assignment.learningcontentassignment_set.first(),
completion_status=AssignmentCompletionStatus.SUBMITTED,
)
def create_test_assignment_evaluation_data(
assignment,
course_session,
assignment_user,
evaluation_user,
input_scores=None,
points_deducted=0,
):
if assignment and course_session and assignment_user and evaluation_user:
subtasks = assignment.get_evaluation_tasks()
evaluation_points = 0
input_scores_deque = deque(input_scores) if input_scores else deque()
for index, evaluation_task in enumerate(subtasks):
task_score = evaluation_task["value"]["max_points"]
input_score = safe_deque_popleft(input_scores_deque)
if input_score is not None:
task_score = input_scores[index]
evaluation_points += task_score
ac, _ = update_assignment_completion(
assignment_user=assignment_user,
assignment=assignment,
course_session=course_session,
learning_content_page=assignment.find_attached_learning_content(),
completion_data={
evaluation_task["id"]: {
"expert_data": {
"points": task_score,
"text": f"Kriterium {index + 1}: Gut gemacht!",
}
},
},
completion_status=AssignmentCompletionStatus.EVALUATION_IN_PROGRESS,
evaluation_user=evaluation_user,
)
ac, _ = update_assignment_completion(
assignment_user=assignment_user,
assignment=assignment,
course_session=course_session,
learning_content_page=assignment.find_attached_learning_content(),
completion_data={},
completion_status=AssignmentCompletionStatus.EVALUATION_SUBMITTED,
evaluation_user=evaluation_user,
evaluation_points=evaluation_points,
)
# take the last input score as deduction if there is one left...
if points_deducted > 0:
ac.evaluation_points_deducted = points_deducted
ac.evaluation_points_deducted_reason = "Assignment Punkteabzug Test"
ac.save()
def create_edoniq_test_result_data(
assignment,
course_session,
assignment_user,
user_points=19,
max_points=24,
evaluation_points_deducted=0,
):
assignment.assignment.evaluation_tasks.raw_data[0]["value"]["max_points"] = (
max_points
)
assignment.assignment.save()
if assignment and course_session and assignment_user:
ac, _ = update_assignment_completion(
assignment_user=assignment_user,
assignment=assignment,
course_session=course_session,
learning_content_page=assignment.find_attached_learning_content(),
completion_data={},
completion_status=AssignmentCompletionStatus.EVALUATION_SUBMITTED,
evaluation_user=User.objects.get(username="admin"),
evaluation_points=user_points,
evaluation_max_points=max_points,
)
if evaluation_points_deducted > 0:
ac.evaluation_points_deducted = evaluation_points_deducted
ac.evaluation_points_deducted_reason = "Edoniq Punkteabzug Test"
ac.save()
def create_feedback_response_data(
course_session,
feedback_user,
learning_content_feedback_page,
submitted=True,
feedback_data=None,
):
if feedback_data is None:
feedback_data = {
"satisfaction": 4,
"goal_attainment": 3,
"proficiency": 80,
"preparation_task_clarity": True,
"instructor_competence": 4,
"instructor_respect": 4,
"instructor_open_feedback": "Super Kurs!",
"would_recommend": True,
"course_negative_feedback": "Nichts Schlechtes",
"course_positive_feedback": "Nur Gutes.",
"feedback_type": "uk",
}
return update_feedback_response(
feedback_user=feedback_user,
course_session=course_session,
learning_content_feedback_page=learning_content_feedback_page,
submitted=submitted,
validated_data=feedback_data,
)
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)
course_page = CoursePageFactory(
title="Test Lehrgang",
parent=get_wagtail_default_site().root_page,
course=course,
)
course.slug = course_page.slug
course.save()
config = CourseConfiguration.objects.get_or_create(course=course)[0]
config.is_uk = True
config.save()
return course
def create_test_learning_path(include_uk=True, include_vv=True, with_documents=False):
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", with_documents=with_documents
)
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", with_documents=False):
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)
LearningContentRichTextFactory(
title="Verschaffe dir einen Überblick",
parent=circle,
text=RichText(
"""
<h3>Arbeitsblätter «Vorbereitungsauftrag»</h3>
<p>Handlungskompetenz d2: Informations-und Beratungsgespräch mit Kunden oder Lieferanten führen</p>
<p>Arbeitssituation 4: Kunden beraten und dazugehörige Prozesse abwickeln</p>
<p>Die Kaufleute führen Bedarfserhebungen für Kunden durch und schlagen ihnen angemessene Versicherungslösungen vor. Sie führen Beratungs-und Verkaufsgespräche und erteilen Auskünfte. Sieführen Kundenaufträge aus und behandeln Beschwerden. Sie formulieren Aufträge an relevante Anspruchsgruppen und unterstützen den Aussendient in verkaufsrelevanten Belangen.</p>
<ul>
<li>d2.pv.ük3: Sie erläutern die Leistungen und Produkte im Versicherungsbereich. (K2)</li>
<li>d2pv.ük4: Sie erläutern die Prozesse und Abläufe im privaten Versicherungsbereich. (K2)</li>
</ul>
"""
),
)
LearningContentMediaLibraryFactory(
title=f"Handlungsfeld «{title}»",
parent=circle,
description=RichText(
f"<p>In der Mediathek unter dem Handlungsfeld «{title}» findest du alle relevanten Ressourcen für deine Fachkompetenzen.</p>"
f"<p>Wir empfehlen dir vor der Absolvierung der weiteren Lerneinheiten dich in die Thematik einzulesen.</p>"
),
content_url=f"/course/{lp.get_course().slug}/media/handlungsfelder/{slugify(title)}",
)
(
LearningContentAssignmentFactory(
title="Redlichkeitserklärung",
parent=circle,
content_assignment=Assignment.objects.get(
slug__startswith="test-lehrgang-assignment-redlichkeits"
),
),
)
(
LearningContentAssignmentFactory(
title="Fahrzeug - Mein erstes Auto",
assignment_type="PREP_ASSIGNMENT",
parent=circle,
content_assignment=Assignment.objects.get(
slug__startswith="test-lehrgang-assignment-fahrzeug-mein-erstes-auto"
),
),
)
PerformanceCriteriaFactory(
parent=ActionCompetence.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=ActionCompetence.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="Präsenzkurs", parent=circle)
LearningContentAttendanceCourseFactory(
title="Präsenzkurs Fahrzeug",
parent=circle,
)
LearningUnitFactory(title="Unterlagen", parent=circle)
LearningContentPlaceholderFactory(
title="Unterlagen für den Unterricht",
parent=circle,
)
LearningUnitFactory(title="Kompetenznachweis", parent=circle)
LearningContentEdoniqTestFactory(
title="Wissens- und Verständnisfragen",
parent=circle,
description=RichText(
"<p>Folgender Test mit Wissens- und Verständnisfragen ist Teil des Kompetenznachweises. Der Test kann nur einmal durchgeführt werden und ist notenrelevant.</p>"
),
content_assignment=Assignment.objects.get(
slug__startswith="test-lehrgang-assignment-edoniq-wissens-und-verständisfragen-circle-fahrzeug-demo"
),
checkbox_text="Hiermit bestätige ich, dass ich die Anweisungen verstanden und die Redlichkeitserklärung akzeptiert habe.",
test_url="https://exam.vbv-afa.ch/e-tutor/v4/user/course/pre_course_object?aid=1689096897473,2147466097",
edoniq_course_release_id="1689096523730",
edoniq_sequence_id="1688059890497",
extended_time_test_url="https://exam2.vbv-afa.ch/e-tutor/v4/user/course/pre_course_object?aid=1689096897473,2147466097",
edoniq_extended_course_release_id="1691157696911",
edoniq_extended_sequence_id="1691151920116",
)
LearningSequenceFactory(title="Transfer", parent=circle, icon="it-icon-ls-end")
LearningUnitFactory(title="Transfer", parent=circle)
(
LearningContentAssignmentFactory(
title="Reflexion",
assignment_type="REFLECTION",
parent=circle,
content_assignment=Assignment.objects.get(
slug__startswith="test-lehrgang-assignment-reflexion"
),
),
)
assignment = Assignment.objects.get(
slug__startswith="test-lehrgang-assignment-überprüfen-einer-motorfahrzeugs"
)
if with_documents:
assignment.solution_sample = ContentDocument.objects.get(
title="Musterlösung Fahrzeug"
)
assignment.save()
LearningContentAssignmentFactory(
title="Überprüfen einer Motorfahrzeug-Versicherungspolice",
parent=circle,
content_assignment=Assignment.objects.get(
slug__startswith="test-lehrgang-assignment-überprüfen-einer-motorfahrzeugs"
),
)
LearningContentFeedbackUKFactory(
title="Feedback",
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="Mediathek Reisen",
parent=circle,
content_url="/course/test-lehrgang/media/handlungsfelder/reisen",
)
LearningSequenceFactory(title="Training", parent=circle)
LearningUnitFactory(title="Präsenzkurs", parent=circle)
LearningContentAttendanceCourseFactory(
title="Präsenzkurs Reisen",
parent=circle,
)
LearningUnitFactory(title="Unterlagen", parent=circle)
LearningContentPlaceholderFactory(
title="Unterlagen für den Unterricht",
parent=circle,
)
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",
)
(
LearningContentAssignmentFactory(
title="Mein Kundenstamm",
assignment_type="PRAXIS_ASSIGNMENT",
parent=circle,
content_assignment=Assignment.objects.get(
slug__startswith="test-lehrgang-assignment-mein-kundenstamm"
),
),
)
PerformanceCriteriaFactory(
parent=ActionCompetence.objects.get(competence_id="Y1"),
competence_id="Y1.1",
title="Ich bin fähig zu Reisen eine Gesprächsführung zu machen",
learning_unit=lu,
)
PerformanceCriteriaFactory(
parent=ActionCompetence.objects.get(competence_id="Y2"),
competence_id="Y2.1",
title="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="Fachcheck Reisen",
parent=parent,
)
LearningContentKnowledgeAssessmentFactory(
title="Wissens- und Verständnisfragen",
parent=parent,
content_url="https://s3.eu-central-1.amazonaws.com/myvbv-wbt.iterativ.ch/emma-und-ayla-campen-durch-amerika-analyse-xapi-FZoZOP9y/index.html",
)
LearningContentPlaceholderFactory(
title="Reflexion",
parent=parent,
)
LearningContentFeedbackVVFactory(
title="Feedback",
parent=parent,
)
def create_test_competence_navi():
course_page = CoursePage.objects.get(course_id=COURSE_TEST_ID)
competence_navi_page = CompetenceNaviPageFactory(
title="KompetenzNavi",
parent=course_page,
)
competence_certificate_list = CompetenceCertificateListFactory(
title="Kompetenznachweise",
parent=competence_navi_page,
)
competence_certificate = CompetenceCertificateFactory(
title="Kompetenznachweis 1",
parent=competence_certificate_list,
)
competence_profile_page = ActionCompetenceListPageFactory(
title="Handlungskompetenzen",
parent=competence_navi_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:
ActionCompetenceFactory(
parent=competence_profile_page,
competence_id=c["competence_id"],
title=c["title"],
items=[("item", i) for i in c["items"]],
)
return competence_certificate
def create_test_media_library():
course_page = CoursePage.objects.get(course_id=COURSE_TEST_ID)
media_lib_page = MediaLibraryPageFactory(
title="Mediathek",
parent=course_page,
)
media_lib_handlungsfelder = MediaLibraryCategoryPageFactory(
title="Handlungsfelder",
parent=media_lib_page,
)
media_lib_allgemeines = MediaLibraryCategoryPageFactory(
title="Allgemeines",
parent=media_lib_page,
)
MediaLibraryUrlPageFactory(
title="Lexikon",
parent=media_lib_page,
content_url="https://www.vbv.ch/de/der-vbv/lernen-lehren/lexikon",
url_open_blank=True,
)
handlungsfelder = [
"Fahrzeug",
"Reisen",
"Einkommenssicherung",
"Haushalt",
"Wohneigentum",
"Pensionierung",
"Rechtsstreitigkeiten",
"KMU",
"Gesundheit",
]
for cat in handlungsfelder:
MediaLibraryContentPageFactory(
title=cat,
parent=media_lib_handlungsfelder,
icon_detail_url=f"/static/icons/handlungsfelder/icon-hf-{cat.lower()}-detail.svg",
icon_overview_url=f"/static/icons/handlungsfelder/icon-hf-{cat.lower()}.svg",
description="""
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(),
body=RichText(
"<h2>Lernmedien</h2>"
"<h3>Allgemeines</h3>"
"<ul><li>Mit Risiken im Strassenverkehr umgehen</li><li>Versicherungsschutz</li><li>Vertragsarten</li><li>Zusammenfassung</li></ul>"
),
)
allgemeines = [
"Versicherungswirtschaft",
"Steuern",
"Verkauf",
"Recht",
"Lern- und Arbeitstechnik",
"Sozialversicherungen",
"Hilfsmittel",
]
for cat in allgemeines:
MediaLibraryContentPageFactory(
title=cat,
parent=media_lib_allgemeines,
body=RichText(
"<h2>Lernmedien</h2>"
"<h3>Allgemeines</h3>"
"<ul><li>Mit Risiken im Strassenverkehr umgehen</li><li>Versicherungsschutz</li><li>Vertragsarten</li><li>Zusammenfassung</li></ul>"
),
)
def create_edoniq_test_assignment(
course_id=COURSE_TEST_ID, title="", competence_certificate=None
):
assignment_list_page = (
CoursePage.objects.get(course_id=course_id)
.get_children()
.exact_type(AssignmentListPage)
.first()
)
assignment = AssignmentFactory(
parent=assignment_list_page,
assignment_type="EDONIQ_TEST",
title=title,
competence_certificate=competence_certificate,
effort_required="ca. 2 Stunden",
intro_text="Edoniq Test",
performance_objectives=[],
evaluation_document_url="",
evaluation_description="",
)
assignment.evaluation_tasks = []
assignment.evaluation_tasks.append(
(
"task",
EvaluationTaskBlockFactory(
title="Maximale Punktzahl vom Edoniq Test",
max_points=24,
),
),
)
assignment.save()
return assignment