970 lines
35 KiB
Python
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
|