Merged in feature/VBV-445-uk-fr (pull request #139)

Feature/VBV-445 uk fr
This commit is contained in:
Christian Cueni 2023-06-15 06:48:36 +00:00
commit 895d32935c
26 changed files with 1827 additions and 118 deletions

File diff suppressed because it is too large Load Diff

View File

@ -273,72 +273,13 @@ def create_uk_fr_competence_profile(course_id=COURSE_UK_FR):
items=[("item", i) for i in c["items"]],
)
# Circle Fahrzeug
PerformanceCriteriaFactory(
parent=CompetencePage.objects.get(
slug__startswith=slug_prefix.replace("-lp", ""), competence_id="e4"
slug__startswith=slug_prefix.replace("-lp", ""), competence_id="c3"
),
competence_id="e4.pv.ük1",
title="Sie erläutern die Dienstleistungen des Betriebs. (K2)",
learning_unit=LearningUnit.objects.get(
slug=f"{slug_prefix}-circle-véhicule-lu-vorbereitung"
),
)
PerformanceCriteriaFactory(
parent=CompetencePage.objects.get(
slug__startswith=slug_prefix.replace("-lp", ""), competence_id="e4"
),
competence_id="e4.pv.ük3",
title="Sie stellen die Wertschöpfungskette und die verschiedenen organisatorischen Bereiche ihres Betriebs dar. (K2).",
learning_unit=LearningUnit.objects.get(
slug=f"{slug_prefix}-circle-véhicule-lu-vorbereitung"
),
)
PerformanceCriteriaFactory(
parent=CompetencePage.objects.get(
slug__startswith=slug_prefix.replace("-lp", ""), competence_id="e4"
),
competence_id="e4.pv.ük4",
title="Sie erläutern die relevanten rechtlichen Grundlagen ihrer Branche situationsgerecht. (K2)",
learning_unit=LearningUnit.objects.get(
slug=f"{slug_prefix}-circle-véhicule-lu-vorbereitung"
),
)
PerformanceCriteriaFactory(
parent=CompetencePage.objects.get(
slug__startswith=slug_prefix.replace("-lp", ""), competence_id="d2"
),
competence_id="d2.pv.ük1",
title="Sie beschreiben die wichtigsten gesetzlichen Grundlagen im Versicherungsbereich umfassend. (K2)",
learning_unit=LearningUnit.objects.get(
slug=f"{slug_prefix}-circle-véhicule-lu-vorbereitung"
),
)
PerformanceCriteriaFactory(
parent=CompetencePage.objects.get(
slug__startswith=slug_prefix.replace("-lp", ""), competence_id="d2"
),
competence_id="d2.pv.ük2",
title="Sie nennen die relevanten Dienstleistungen und Produkte im Versicherungsbereich. (K1)",
learning_unit=LearningUnit.objects.get(
slug=f"{slug_prefix}-circle-véhicule-lu-vorbereitung"
),
)
PerformanceCriteriaFactory(
parent=CompetencePage.objects.get(
slug__startswith=slug_prefix.replace("-lp", ""), competence_id="d2"
),
competence_id="d2.pv.ük3",
title="Sie erklären die Leistungen und Produkte im Versicherungsbereich. (K2)",
learning_unit=LearningUnit.objects.get(
slug=f"{slug_prefix}-circle-véhicule-lu-vorbereitung"
),
)
PerformanceCriteriaFactory(
parent=CompetencePage.objects.get(
slug__startswith=slug_prefix.replace("-lp", ""), competence_id="d2"
),
competence_id="d2.pv.ük4",
title="Sie erläutern die Prozesse und Abläufe im privaten Versicherungsbereich verständlich. (K2)",
competence_id="c3.pv.ci2",
title="Je suis capable de d'expliquer les fondements légaux applicables dans le champ d'action des véhicules.",
learning_unit=LearningUnit.objects.get(
slug=f"{slug_prefix}-circle-véhicule-lu-vorbereitung"
),
@ -347,8 +288,8 @@ def create_uk_fr_competence_profile(course_id=COURSE_UK_FR):
parent=CompetencePage.objects.get(
slug__startswith=slug_prefix.replace("-lp", ""), competence_id="c3"
),
competence_id="c3.pv.ük7",
title="Sie erläutern die gesetzlichen Bestimmungen bei Schaden- und Leistungsfällen. (K2)",
competence_id="c3.pv.ci7",
title="Je suis capable de d'expliquer les dispositions légales en cas de sinistres et de versement de prestations dans le champ d'action des véhicules.",
learning_unit=LearningUnit.objects.get(
slug=f"{slug_prefix}-circle-véhicule-lu-vorbereitung"
),
@ -357,8 +298,78 @@ def create_uk_fr_competence_profile(course_id=COURSE_UK_FR):
parent=CompetencePage.objects.get(
slug__startswith=slug_prefix.replace("-lp", ""), competence_id="c3"
),
competence_id="c3.pv.ük11",
title="Sie beurteilen gängige Versicherungslösungen fachkundig. (K3)",
competence_id="c3.pv.ci11",
title="Je suis capable de d'évaluer de manière compétente les solutions dassurance courantes dans le domaine d'action des véhicules.",
learning_unit=LearningUnit.objects.get(
slug=f"{slug_prefix}-circle-véhicule-lu-vorbereitung"
),
)
PerformanceCriteriaFactory(
parent=CompetencePage.objects.get(
slug__startswith=slug_prefix.replace("-lp", ""), competence_id="d2"
),
competence_id="d2.pv.ci1",
title="Je suis capable de décrire de manière complète les principales bases légales dans le domaine de l'assurance des véhicules à moteur.",
learning_unit=LearningUnit.objects.get(
slug=f"{slug_prefix}-circle-véhicule-lu-vorbereitung"
),
)
PerformanceCriteriaFactory(
parent=CompetencePage.objects.get(
slug__startswith=slug_prefix.replace("-lp", ""), competence_id="d2"
),
competence_id="d2.pv.ci2",
title="Je suis capable de citer les prestations de service et les produits pertinents dans le champ d'action des véhicules.",
learning_unit=LearningUnit.objects.get(
slug=f"{slug_prefix}-circle-véhicule-lu-vorbereitung"
),
)
PerformanceCriteriaFactory(
parent=CompetencePage.objects.get(
slug__startswith=slug_prefix.replace("-lp", ""), competence_id="d2"
),
competence_id="d2.pv.ci3",
title="Je suis capable de d'expliquer les services et les produits dans le champ d'action des véhicules.",
learning_unit=LearningUnit.objects.get(
slug=f"{slug_prefix}-circle-véhicule-lu-vorbereitung"
),
)
PerformanceCriteriaFactory(
parent=CompetencePage.objects.get(
slug__startswith=slug_prefix.replace("-lp", ""), competence_id="d2"
),
competence_id="d2.pv.ci4",
title="Je suis capable de d'expliquer de manière compréhensible les processus et procédures dans le champ d'action des véhicules.",
learning_unit=LearningUnit.objects.get(
slug=f"{slug_prefix}-circle-véhicule-lu-vorbereitung"
),
)
PerformanceCriteriaFactory(
parent=CompetencePage.objects.get(
slug__startswith=slug_prefix.replace("-lp", ""), competence_id="e4"
),
competence_id="e4.pv.ci1",
title="Je suis capable de d'expliquer les services de l'entreprise dans le champ d'action des véhicules.",
learning_unit=LearningUnit.objects.get(
slug=f"{slug_prefix}-circle-véhicule-lu-vorbereitung"
),
)
PerformanceCriteriaFactory(
parent=CompetencePage.objects.get(
slug__startswith=slug_prefix.replace("-lp", ""), competence_id="e4"
),
competence_id="e4.pv.ci2",
title="Je suis capable de de distinguer les concurrents dans le secteur des assurances privées dans le champ d'action des véhicules à l'aide des critères pertinents.",
learning_unit=LearningUnit.objects.get(
slug=f"{slug_prefix}-circle-véhicule-lu-vorbereitung"
),
)
PerformanceCriteriaFactory(
parent=CompetencePage.objects.get(
slug__startswith=slug_prefix.replace("-lp", ""), competence_id="e4"
),
competence_id="e4.pv.ci4",
title="Je suis capable de d'expliquer les principes sur lesquelles reposent les produits d'assurance automobile.",
learning_unit=LearningUnit.objects.get(
slug=f"{slug_prefix}-circle-véhicule-lu-vorbereitung"
),

View File

@ -4,7 +4,7 @@ from vbv_lernwelt.competence.factories import (
PerformanceCriteriaFactory,
)
from vbv_lernwelt.competence.models import CompetencePage
from vbv_lernwelt.course.consts import COURSE_UK, COURSE_UK_FR
from vbv_lernwelt.course.consts import COURSE_UK
from vbv_lernwelt.course.models import CoursePage
from vbv_lernwelt.learnpath.models import LearningPath, LearningUnit
@ -160,3 +160,156 @@ def create_uk_training_competence_profile(course_id=COURSE_UK):
slug=f"{slug_prefix}-circle-fahrzeug-lu-vorbereitung"
),
)
def create_uk_fr_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.ci2",
title="Je suis capable de d'expliquer les fondements légaux applicables dans le champ d'action des véhicules.",
learning_unit=LearningUnit.objects.get(
slug=f"{slug_prefix}-circle-véhicule-lu-vorbereitung"
),
)
PerformanceCriteriaFactory(
parent=CompetencePage.objects.get(
slug__startswith=slug_prefix.replace("-lp", ""), competence_id="c3"
),
competence_id="c3.pv.ci7",
title="Je suis capable de d'expliquer les dispositions légales en cas de sinistres et de versement de prestations dans le champ d'action des véhicules.",
learning_unit=LearningUnit.objects.get(
slug=f"{slug_prefix}-circle-véhicule-lu-vorbereitung"
),
)
PerformanceCriteriaFactory(
parent=CompetencePage.objects.get(
slug__startswith=slug_prefix.replace("-lp", ""), competence_id="c3"
),
competence_id="c3.pv.ci11",
title="Je suis capable de d'évaluer de manière compétente les solutions dassurance courantes dans le domaine d'action des véhicules.",
learning_unit=LearningUnit.objects.get(
slug=f"{slug_prefix}-circle-véhicule-lu-vorbereitung"
),
)
PerformanceCriteriaFactory(
parent=CompetencePage.objects.get(
slug__startswith=slug_prefix.replace("-lp", ""), competence_id="d2"
),
competence_id="d2.pv.ci1",
title="Je suis capable de décrire de manière complète les principales bases légales dans le domaine de l'assurance des véhicules à moteur.",
learning_unit=LearningUnit.objects.get(
slug=f"{slug_prefix}-circle-véhicule-lu-vorbereitung"
),
)
PerformanceCriteriaFactory(
parent=CompetencePage.objects.get(
slug__startswith=slug_prefix.replace("-lp", ""), competence_id="d2"
),
competence_id="d2.pv.ci2",
title="Je suis capable de citer les prestations de service et les produits pertinents dans le champ d'action des véhicules.",
learning_unit=LearningUnit.objects.get(
slug=f"{slug_prefix}-circle-véhicule-lu-vorbereitung"
),
)
PerformanceCriteriaFactory(
parent=CompetencePage.objects.get(
slug__startswith=slug_prefix.replace("-lp", ""), competence_id="d2"
),
competence_id="d2.pv.ci3",
title="Je suis capable de d'expliquer les services et les produits dans le champ d'action des véhicules.",
learning_unit=LearningUnit.objects.get(
slug=f"{slug_prefix}-circle-véhicule-lu-vorbereitung"
),
)
PerformanceCriteriaFactory(
parent=CompetencePage.objects.get(
slug__startswith=slug_prefix.replace("-lp", ""), competence_id="d2"
),
competence_id="d2.pv.ci4",
title="Je suis capable de d'expliquer de manière compréhensible les processus et procédures dans le champ d'action des véhicules.",
learning_unit=LearningUnit.objects.get(
slug=f"{slug_prefix}-circle-véhicule-lu-vorbereitung"
),
)
PerformanceCriteriaFactory(
parent=CompetencePage.objects.get(
slug__startswith=slug_prefix.replace("-lp", ""), competence_id="e4"
),
competence_id="e4.pv.ci1",
title="Je suis capable de d'expliquer les services de l'entreprise dans le champ d'action des véhicules.",
learning_unit=LearningUnit.objects.get(
slug=f"{slug_prefix}-circle-véhicule-lu-vorbereitung"
),
)
PerformanceCriteriaFactory(
parent=CompetencePage.objects.get(
slug__startswith=slug_prefix.replace("-lp", ""), competence_id="e4"
),
competence_id="e4.pv.ci2",
title="Je suis capable de de distinguer les concurrents dans le secteur des assurances privées dans le champ d'action des véhicules à l'aide des critères pertinents.",
learning_unit=LearningUnit.objects.get(
slug=f"{slug_prefix}-circle-véhicule-lu-vorbereitung"
),
)
PerformanceCriteriaFactory(
parent=CompetencePage.objects.get(
slug__startswith=slug_prefix.replace("-lp", ""), competence_id="e4"
),
competence_id="e4.pv.ci4",
title="Je suis capable de d'expliquer les principes sur lesquelles reposent les produits d'assurance automobile.",
learning_unit=LearningUnit.objects.get(
slug=f"{slug_prefix}-circle-véhicule-lu-vorbereitung"
),
)

View File

@ -48,6 +48,9 @@ class CourseSessionUserAdmin(admin.ModelAdmin):
"course_session",
"role",
]
raw_id_fields = [
"user",
]
fieldsets = [
(None, {"fields": ("user", "course_session", "role")}),

View File

@ -4,3 +4,4 @@ COURSE_UK = -3
COURSE_VERSICHERUNGSVERMITTLERIN_ID = -4
COURSE_UK_FR = -5
COURSE_UK_TRAINING = -6
COURSE_UK_TRAINING_FR = -7

View File

@ -0,0 +1,32 @@
UK_FR_CIRCLE_GOALS = {
"fahrzeug": """
<p class="mt-4">Pour beaucoup, la voiture est la plus grande fierté. Mais elle recèle aussi un grand potentiel de
danger. Les prix actuels des véhicules et les frais de réparation peuvent rapidement atteindre des
sommes considérables que le propriétaire du véhicule a souvent du mal à assumer lui-même en cas
de sinistre important. L&#39;assurance automobile a pour but de te protéger et de protéger financièrement
les autres usagers de la route en cas d&#39;accident. Ce Cercle t&#39;aide à y voir plus clair dans la jungle des
assurances véhicules à moteur et à prendre la route en toute sécurité!</p>
<p class="mt-4">Dans ce cercle, tu développes tes compétences d&#39;action pour ces thèmes:</p>
<ul>
<li class="flex items-center"><it-icon-check class="h-12 w-12 flex-none text-sky-500 lg:inline-block it-icon"></it-icon-check>Comment protéger au mieux sa voiture</li>
<li class="flex items-center"><it-icon-check class="h-12 w-12 flex-none text-sky-500 lg:inline-block it-icon"></it-icon-check>Les grandes lignes du droit de la responsabilité civile</li>
<li class="flex items-center"><it-icon-check class="h-12 w-12 flex-none text-sky-500 lg:inline-block it-icon"></it-icon-check>Quels sont les aspects à prendre en compte lors d'une offre</li>
<li class="flex items-center"><it-icon-check class="h-12 w-12 flex-none text-sky-500 lg:inline-block it-icon"></it-icon-check>Comment présenter la solution au client</li>
<li class="flex items-center"><it-icon-check class="h-12 w-12 flex-none text-sky-500 lg:inline-block it-icon"></it-icon-check>Le processus de la proposition à la police</li>
</ul>
<p class="mt-4">Tu travailles sur les objectifs évaluateurs suivants du profil de qualification:</p>
<ul>
<li class="flex items-center"><it-icon-check class="hidden h-12 w-12 flex-none text-sky-500 lg:inline-block it-icon"></it-icon-check>c3.pv.ci6 : Ils citent les principes les plus courants en matière de conception des produits et des
services dans le domaine de lassurance. (C1)</li>
<li class="flex items-center"><it-icon-check class="h-12 w-12 flex-none text-sky-500 lg:inline-block it-icon"></it-icon-check>d2.pv.ci1 : Ils décrivent dans le détail les principales bases légales dans le domaine de
lassurance. (C2)</li>
</ul>
<h3 class="mt-4">Objectifs évaluateurs pour l'auto-évaluation:</h3>
<p class="mt-4">Je suis capable de...</p>
<ul>
<li class="flex items-center"><it-icon-check class="h-12 w-12 flex-none text-sky-500 lg:inline-block it-icon"></it-icon-check>c3.pv.ci6 : ... de citer les principes les plus courants en matière de conception des produits et des
services dans le domaine de lassurance.</li>
<li class="flex items-center"><it-icon-check class="h-12 w-12 flex-none text-sky-500 lg:inline-block it-icon"></it-icon-check>d2.pv.ci1 : ... de décrire en détail les principales bases légales dans le domaine de lassurance.</li>
</ul>
""",
}

View File

@ -9,6 +9,7 @@ from wagtail_localize.models import LocaleSynchronization
from vbv_lernwelt.assignment.models import Assignment
from vbv_lernwelt.core.admin import User
from vbv_lernwelt.course.consts import COURSE_UK, COURSE_UK_FR
from vbv_lernwelt.course.creators.uk_circle_goals_fr import UK_FR_CIRCLE_GOALS
from vbv_lernwelt.course.models import CoursePage
from vbv_lernwelt.learnpath.tests.learning_path_factories import (
CircleFactory,
@ -106,9 +107,9 @@ def create_uk_fr_learning_path(course_id=COURSE_UK_FR, user=None, skip_locales=T
)
TopicFactory(title="1ère année", is_visible=True, parent=lp)
create_uk_circle(lp, title="Coup d'envoi")
create_uk_circle(lp, title="Base")
create_uk_circle(lp, title="Véhicule")
create_uk_fr_circle_kickoff(lp, title="Coup d'envoi")
create_uk_fr_circle_basis(lp, title="Base")
create_uk_fr_circle_fahrzeug(lp, title="Véhicule")
create_uk_circle(lp, title="Budget Partie 1")
create_uk_circle(lp, title="Budget Partie 2")
@ -304,6 +305,94 @@ In diesem Circle erfährst du wie die überbetrieblichen Kurse aufgebaut sind. Z
),
def create_uk_fr_circle_kickoff(lp, title="Coup d'envoi"):
circle = CircleFactory(
title=title,
parent=lp,
description="""
In diesem Circle erfährst du wie die überbetrieblichen Kurse aufgebaut sind. Zudem lernst du die wichtigsten Grundlagen, damit du erfolgreich mit deinem Lernpfad (durch-)starten kannst.
""".strip(),
goals=UK_CIRCLE_GOALS["kickoff"],
)
LearningSequenceFactory(
title="Vorbereitung", parent=circle, icon="it-icon-ls-start"
)
LearningUnitFactory(title="Vorbereitung", title_hidden=True, parent=circle)
LearningContentMediaLibraryFactory(
title=f"Allgemeines zu Versicherungen",
parent=circle,
description=RichText(
f"<p>In der Mediathek unter «Allgemeines zu Versicherungen» 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/überbetriebliche-kurse/media",
)
LearningContentAssignmentFactory(
title="Versicherungswirtschaft",
assignment_type="PREP_ASSIGNMENT",
parent=circle,
content_assignment=Assignment.objects.get(
slug__startswith=f"überbetriebliche-kurse-assignment-kickoff-versicherungswirtschaft"
),
),
LearningSequenceFactory(title="Training", parent=circle)
LearningUnitFactory(title="Präsenzkurs", title_hidden=True, parent=circle)
LearningContentAttendanceCourseFactory(
title="Präsenzkurs Kickoff",
parent=circle,
)
LearningContentDocumentListFactory(
title="Unterlagen für den Unterricht",
parent=circle,
documents=[
(
"document",
LearnMediaBlockFactory(
title="Präsentation 1a",
description="",
icon_url="/static/icons/demo/icon-hf-book.png",
link_display_text="Dokument anzeigen",
url="/static/media/uk/de_üK1_KO_03b_A_Einteilungen.pdf",
),
),
(
"document",
LearnMediaBlockFactory(
title="Präsentation 1b",
description="",
icon_url="/static/icons/demo/icon-hf-book.png",
link_display_text="Dokument anzeigen",
url="/static/media/uk/de_üK1_KO_03b_A_Einteilungen.pdf",
),
),
(
"document",
LearnMediaBlockFactory(
title="Arbeitsblatt Einteilung der Versicherungen",
description="",
icon_url="/static/icons/demo/icon-hf-book.png",
link_display_text="Dokument anzeigen",
url="/static/media/uk/de_üK1_KO_03b_A_Einteilungen.pdf",
),
),
],
)
LearningUnitFactory(title="Feedback", title_hidden=True, parent=circle)
LearningContentFeedbackFactory(
parent=circle,
)
LearningSequenceFactory(title="Transfer", parent=circle, icon="it-icon-ls-end")
LearningUnitFactory(title="Reflexion", title_hidden=True, parent=circle)
LearningContentAssignmentFactory(
title="Reflexion",
assignment_type="REFLECTION",
parent=circle,
content_assignment=Assignment.objects.get(
slug__startswith=f"überbetriebliche-kurse-assignment-reflexion"
),
),
def create_uk_circle_basis(lp, title="Basis"):
circle = CircleFactory(
title=title,
@ -412,6 +501,114 @@ In diesem Circle lernst du die wichtigsten Grundlagen bezüglich Versicherungswi
),
def create_uk_fr_circle_basis(lp, title="Base"):
circle = CircleFactory(
title=title,
parent=lp,
description="""
In diesem Circle lernst du die wichtigsten Grundlagen bezüglich Versicherungswirtschaft und Versicherungsrecht.
""".strip(),
goals=UK_CIRCLE_GOALS["basis"],
)
LearningSequenceFactory(
title="Vorbereitung", parent=circle, icon="it-icon-ls-start"
)
LearningUnitFactory(title="Vorbereitung", title_hidden=True, parent=circle)
LearningContentMediaLibraryFactory(
title=f"Allgemeines zu Versicherungen",
parent=circle,
description=RichText(
f"<p>In der Mediathek unter «Allgemeines zu Versicherungen» 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/überbetriebliche-kurse/media",
)
LearningContentAssignmentFactory(
title="Vorbereitungsauftrag Circle Basis",
assignment_type="PREP_ASSIGNMENT",
parent=circle,
content_assignment=Assignment.objects.get(
slug__startswith=f"überbetriebliche-kurse-assignment-circle-basis"
),
),
LearningSequenceFactory(title="Training", parent=circle)
LearningUnitFactory(title="Präsenzkurs", title_hidden=True, parent=circle)
LearningContentAttendanceCourseFactory(
title="Präsenzkurs Basis",
parent=circle,
)
LearningContentDocumentListFactory(
title="Unterlagen für den Unterricht",
parent=circle,
documents=[
(
"document",
LearnMediaBlockFactory(
title="Präsentation",
description="",
icon_url="/static/icons/demo/icon-hf-book.png",
link_display_text="Dokument anzeigen",
url="/static/media/uk/de_üK1_BA_04_A_Risikomanagement.pdf",
),
),
(
"document",
LearnMediaBlockFactory(
title="Risikomanagement",
description="",
icon_url="/static/icons/demo/icon-hf-book.png",
link_display_text="Dokument anzeigen",
url="/static/media/uk/de_üK1_BA_04_A_Risikomanagement.pdf",
),
),
(
"document",
LearnMediaBlockFactory(
title="Quizzes",
description="",
icon_url="/static/icons/demo/icon-hf-book.png",
link_display_text="Dokument anzeigen",
url="/static/media/uk/de_üK1_BA_05_QR_Quizzes.pdf",
),
),
(
"document",
LearnMediaBlockFactory(
title="Versicherungsrecht",
description="Antragsannahme, Bindefrist und Widerrufsrecht Kleine Fallstudie",
icon_url="/static/icons/demo/icon-hf-book.png",
link_display_text="Dokument anzeigen",
url="/static/media/uk/de_üK1_BA_06_A_Versicherungsrecht.pdf",
),
),
],
)
LearningUnitFactory(title="Kompetenznachweis", title_hidden=True, parent=circle)
LearningContentTestFactory(
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>"
),
checkbox_text="Hiermit bestätige ich, dass ich die Anweisungen verstanden habe und den Test durchführen möchte.",
content_url="https://exam.vbv-afa.ch/",
)
LearningUnitFactory(title="Feedback", title_hidden=True, parent=circle)
LearningContentFeedbackFactory(
parent=circle,
)
LearningSequenceFactory(title="Transfer", parent=circle, icon="it-icon-ls-end")
LearningUnitFactory(title="Reflexion", parent=circle)
LearningContentAssignmentFactory(
title="Reflexion",
assignment_type="REFLECTION",
parent=circle,
content_assignment=Assignment.objects.get(
slug__startswith=f"überbetriebliche-kurse-assignment-reflexion"
),
),
def create_uk_circle_fahrzeug(lp, title="Fahrzeug"):
circle = CircleFactory(
title=title,
@ -548,6 +745,142 @@ def create_uk_circle_fahrzeug(lp, title="Fahrzeug"):
),
def create_uk_fr_circle_fahrzeug(lp, title="Véhicule"):
circle = CircleFactory(
title=title,
parent=lp,
description="Dans ce cercle, tu apprends tout ce qui concerne les assurances véhicules à moteur.",
goals=UK_FR_CIRCLE_GOALS["fahrzeug"],
)
course_slug = lp.slug.replace("-lp", "")
LearningSequenceFactory(title="Préparation", parent=circle, icon="it-icon-ls-start")
LearningUnitFactory(title="Vorbereitung", title_hidden=True, parent=circle)
LearningContentMediaLibraryFactory(
title=f"Champs daction «Véhicule à moteur»",
parent=circle,
description=RichText(
f"<p>Trouve toutes les ressources des champs daction, comme les outils didactiques, les liens et autres informations utiles.</p>"
f"<p>Nous te recommandons de te familiariser avec le sujet avant de suivre les autres unités de cours.</p>"
),
content_url=f"/course/{course_slug}/media/category/{slugify(title)}",
)
LearningContentAssignmentFactory(
title="Véhicule à moteur Ma première voiture",
assignment_type="PREP_ASSIGNMENT",
parent=circle,
content_assignment=Assignment.objects.get(
slug__startswith=f"{course_slug}-assignment-véhicule-à-moteur-ma-première-voiture"
),
),
LearningSequenceFactory(title="Training", parent=circle)
LearningUnitFactory(title="Cours de présence", title_hidden=True, parent=circle)
LearningContentAttendanceCourseFactory(
title="Cours de présence Véhicule à moteur",
parent=circle,
)
LearningContentDocumentListFactory(
title="Documentation pour la formation",
parent=circle,
documents=[
(
"document",
LearnMediaBlockFactory(
title="Présentation",
description="",
icon_url="/static/icons/demo/icon-hf-book.png",
link_display_text="Afficher le document",
url="/static/media/uk/fr_üK1_FZ_00_Prгentation.pdf",
),
),
(
"document",
LearnMediaBlockFactory(
title="Notions",
description="",
icon_url="/static/icons/demo/icon-hf-book.png",
link_display_text="Afficher le document",
url="/static/media/uk/fr_üK1_FZ_02_Begriffe.pdf",
),
),
(
"document",
LearnMediaBlockFactory(
title="Checklist",
description="",
icon_url="/static/icons/demo/icon-hf-book.png",
link_display_text="Afficher le document",
url="/static/media/uk/fr_üK1_FZ_04_Checkliste.pdf",
),
),
(
"document",
LearnMediaBlockFactory(
title="Fiche de travail cas de sinistres",
description="",
icon_url="/static/icons/demo/icon-hf-book.png",
link_display_text="Afficher le document",
url="/static/media/uk/fr_üK1_FZ_05_A_Schaden.pdf",
),
),
(
"document",
LearnMediaBlockFactory(
title="Aperçu casco",
description="",
icon_url="/static/icons/demo/icon-hf-book.png",
link_display_text="Aperçu casco",
url="/static/media/uk/fr_üK1_FZ_07_Kasko.pdf",
),
),
(
"document",
LearnMediaBlockFactory(
title="Offre et entretien de vente",
description="",
icon_url="/static/icons/demo/icon-hf-book.png",
link_display_text="Afficher le document",
url="/static/media/uk/fr_üK1_FZ_08_A_Offerte und Verkaufsgespräch.pdf",
),
),
(
"document",
LearnMediaBlockFactory(
title="Fiche de travail cas de sinistres (réserve)",
description="",
icon_url="/static/icons/demo/icon-hf-book.png",
link_display_text="Afficher le document",
url="/static/media/uk/fr_üK1_FZ_A_Reserve_Schaden.pdf",
),
),
],
)
LearningUnitFactory(title="Feedback", title_hidden=True, parent=circle)
LearningContentFeedbackFactory(
parent=circle,
)
LearningSequenceFactory(title="Transfert", parent=circle, icon="it-icon-ls-end")
LearningUnitFactory(
title="Contrôle de compétences", title_hidden=True, parent=circle
)
LearningContentAssignmentFactory(
title="Vérification d'une police dassurance de véhicule à moteur",
parent=circle,
content_assignment=Assignment.objects.get(
slug__startswith=f"{course_slug}-assignment-vérification-d-une-police-d-assurance-de-véhicule-à-moteur"
),
),
LearningUnitFactory(title="Réflexion", title_hidden=True, parent=circle)
LearningContentAssignmentFactory(
title="Réflexion",
assignment_type="REFLECTION",
parent=circle,
content_assignment=Assignment.objects.get(
slug__startswith=f"{course_slug}-assignment-reflexion"
),
),
UK_CIRCLE_GOALS = {
"kickoff": """
<p class="mt-4">Hey, willkommen im ersten überbetrieblichen Kurs! Du bist in einer spannenden Branche gelandet. Wir wissen, dass es am Anfang oft eine Herausforderung sein kann, sich in einem neuen Umfeld zurechtzufinden und die vielen neuen Eindrücke zu verarbeiten. Aber keine Sorge, wir sind hier, um dir dabei zu helfen. In deiner Ausbildung wirst du viele neue Fähigkeiten erlernen und dein Wissen vertiefen. In diesem Circle helfen wir dir dabei, den Überblick zu gewinnen und dich mit den neuen Arbeitsabläufen und myVBV vertraut zu machen. Lass uns gemeinsam diese neue Herausforderung meistern und das Beste aus deiner Ausbildung herausholen! </p>

View File

@ -5,8 +5,11 @@ 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.creators.uk_course import create_uk_circle_fahrzeug
from vbv_lernwelt.course.consts import COURSE_UK_TRAINING, COURSE_UK_TRAINING_FR
from vbv_lernwelt.course.creators.uk_course import (
create_uk_circle_fahrzeug,
create_uk_fr_circle_fahrzeug,
)
from vbv_lernwelt.course.models import CoursePage
from vbv_lernwelt.learnpath.tests.learning_path_factories import (
LearningPathFactory,
@ -14,7 +17,9 @@ from vbv_lernwelt.learnpath.tests.learning_path_factories import (
)
def create_uk_training_learning_path(course_id=COURSE_UK, user=None, skip_locales=True):
def create_uk_training_learning_path(
course_id=COURSE_UK_TRAINING, user=None, skip_locales=True
):
if user is None:
user = User.objects.get(username="info@iterativ.ch")
@ -33,8 +38,12 @@ def create_uk_training_learning_path(course_id=COURSE_UK, user=None, skip_locale
parent=course_page,
)
TopicFactory(title="Training", is_visible=True, parent=lp)
create_uk_circle_fahrzeug(lp)
if course_id == COURSE_UK_TRAINING:
TopicFactory(title="Training", is_visible=True, parent=lp)
create_uk_circle_fahrzeug(lp)
elif course_id == COURSE_UK_TRAINING_FR:
TopicFactory(title="Training", is_visible=True, parent=lp)
create_uk_fr_circle_fahrzeug(lp)
# locales
if not skip_locales:

View File

@ -7,6 +7,9 @@ from vbv_lernwelt.assignment.creators.create_assignments import (
create_uk_basis_prep_assignment,
create_uk_fahrzeug_casework,
create_uk_fahrzeug_prep_assignment,
create_uk_fr_fahrzeug_casework,
create_uk_fr_fahrzeug_prep_assignment,
create_uk_fr_reflection,
create_uk_kickoff_prep_assignment,
create_uk_reflection,
create_vv_einkommenssicherung_casework,
@ -22,6 +25,7 @@ from vbv_lernwelt.competence.create_uk_competence_profile import (
create_uk_fr_competence_profile,
)
from vbv_lernwelt.competence.create_uk_training_competence_profile import (
create_uk_fr_training_competence_profile,
create_uk_training_competence_profile,
)
from vbv_lernwelt.competence.create_vv_new_competence_profile import (
@ -35,6 +39,7 @@ from vbv_lernwelt.course.consts import (
COURSE_UK,
COURSE_UK_FR,
COURSE_UK_TRAINING,
COURSE_UK_TRAINING_FR,
COURSE_VERSICHERUNGSVERMITTLERIN_ID,
)
from vbv_lernwelt.course.creators.test_course import create_test_course
@ -88,6 +93,7 @@ ADMIN_EMAILS = ["info@iterativ.ch", "admin"]
COURSE_VERSICHERUNGSVERMITTLERIN_ID,
COURSE_UK_FR,
COURSE_UK_TRAINING,
COURSE_UK_TRAINING_FR,
],
)
def command(course):
@ -118,6 +124,9 @@ def command(course):
if COURSE_UK_TRAINING in course:
create_course_training_de()
if COURSE_UK_TRAINING_FR in course:
create_course_training_fr()
def create_versicherungsvermittlerin_course():
# Versicherungsvermittler/in mit neuen Circles
@ -339,9 +348,17 @@ def create_course_uk_de():
def create_course_uk_fr():
# Überbetriebliche Kurse FR
create_versicherungsvermittlerin_with_categories(
course = create_versicherungsvermittlerin_with_categories(
course_id=COURSE_UK_FR, title="Course hors établissement"
)
# assignments create assignments parent page
_assignment_list_page = AssignmentListPageFactory(
parent=course.coursepage,
)
create_uk_fr_fahrzeug_casework(course_id=COURSE_UK_FR)
create_uk_fr_fahrzeug_prep_assignment(course_id=COURSE_UK_FR)
create_uk_fr_reflection(course_id=COURSE_UK_FR)
create_uk_fr_learning_path(course_id=COURSE_UK_FR)
create_uk_fr_competence_profile(course_id=COURSE_UK_FR)
create_default_media_library(course_id=COURSE_UK_FR)
@ -478,7 +495,6 @@ def create_course_training_de():
f"{current_dir}/../../../importer/tests/Schulungen_Durchfuehrung_Trainer.xlsx",
)
import_students_from_excel(
course,
f"{current_dir}/../../../importer/tests/Schulungen_Teilnehmende.xlsx",
)
@ -529,3 +545,90 @@ def create_course_training_de():
)
csu.save()
def create_course_training_fr():
# Test Lehrgang für üK Trainer FR
course = create_versicherungsvermittlerin_with_categories(
course_id=COURSE_UK_TRAINING_FR, title="myVBV Training (FR)"
)
# assignments create assignments parent page
_assignment_list_page = AssignmentListPageFactory(
parent=course.coursepage,
)
create_uk_fr_fahrzeug_casework(course_id=COURSE_UK_TRAINING_FR)
create_uk_fr_fahrzeug_prep_assignment(course_id=COURSE_UK_TRAINING_FR)
create_uk_fr_reflection(course_id=COURSE_UK_TRAINING_FR)
create_uk_training_learning_path(course_id=COURSE_UK_TRAINING_FR)
create_uk_fr_training_competence_profile(course_id=COURSE_UK_TRAINING_FR)
create_default_media_library(course_id=COURSE_UK_TRAINING_FR)
current_dir = os.path.dirname(os.path.realpath(__file__))
print(current_dir)
course = Course.objects.get(id=COURSE_UK_TRAINING_FR)
import_course_sessions_from_excel(
course,
f"{current_dir}/../../../importer/tests/Schulungen_Durchfuehrung_Trainer.xlsx",
language="fr",
)
import_trainers_from_excel(
course,
f"{current_dir}/../../../importer/tests/Schulungen_Durchfuehrung_Trainer.xlsx",
language="fr",
)
import_students_from_excel(
f"{current_dir}/../../../importer/tests/Schulungen_Teilnehmende.xlsx",
)
for cs in CourseSession.objects.filter(course_id=COURSE_UK_TRAINING_FR):
cs.assignment_details_list = [
{
"learningContentId": LearningContentAssignment.objects.get(
slug=f"{course.slug}-lp-circle-véhicule-lc-vérification-dune-police-dassurance-de-véhicule-à-moteur"
).id,
"submissionDeadlineDateTimeUtc": "2023-06-13T19:00:00Z",
"evaluationDeadlineDateTimeUtc": "2023-06-27T19:00:00Z",
},
{
"learningContentId": LearningContentAssignment.objects.get(
slug=f"{course.slug}-lp-circle-véhicule-lc-véhicule-à-moteur-ma-première-voiture"
).id,
"submissionDeadlineDateTimeUtc": "2023-06-13T19:00:00Z",
"evaluationDeadlineDateTimeUtc": "2023-06-27T19:00:00Z",
},
]
cs.save()
# attach users as trainers to ÜK course
course_uk = Course.objects.filter(id=COURSE_UK_FR).first()
if course_uk:
users = [
csu.user
for csu in CourseSessionUser.objects.filter(
course_session__course_id=COURSE_UK_TRAINING_FR
)
]
cs = CourseSession.objects.get(
course_id=COURSE_UK_FR,
title="Cours hors établissement année 1 - Région Fribourg",
)
for user in users:
csu, _created = CourseSessionUser.objects.get_or_create(
course_session_id=cs.id, user_id=user.id
)
csu.role = CourseSessionUser.Role.EXPERT
csu.expert.add(
Circle.objects.get(slug="überbetriebliche-kurse-lp-circle-kickoff")
)
csu.expert.add(
Circle.objects.get(slug="überbetriebliche-kurse-lp-circle-basis")
)
csu.expert.add(
Circle.objects.get(slug="überbetriebliche-kurse-lp-circle-fahrzeug")
)
csu.save()

View File

@ -52,16 +52,20 @@ def create_or_update_user(
return user
def import_course_sessions_from_excel(course: Course, filename: str):
def import_course_sessions_from_excel(course: Course, filename: str, language="de"):
workbook = load_workbook(filename=filename)
sheet = workbook["Schulungen Durchführung"]
tuple_list = calc_header_tuple_list_from_pyxl_sheet(sheet)
for row in tuple_list:
create_or_update_course_session(course, dict(row), circles=["Fahrzeug"])
create_or_update_course_session(
course, dict(row), language=language, circles=["Fahrzeug"]
)
def create_or_update_course_session(course: Course, data: Dict[str, Any], circles=None):
def create_or_update_course_session(
course: Course, data: Dict[str, Any], language="de", circles=None
):
"""
:param data: the following keys are required to process the data: Generation, Region, Klasse
:return:
@ -86,6 +90,10 @@ def create_or_update_course_session(course: Course, data: Dict[str, Any], circle
title = f"{region} {generation} {group}"
if not import_id.lower().startswith(language.lower()):
# FIXME: language check depends on import_id format for now...
return None
cs, _created = CourseSession.objects.get_or_create(
import_id=import_id, group=group, course=course
)
@ -102,56 +110,80 @@ def create_or_update_course_session(course: Course, data: Dict[str, Any], circle
cs.save()
for circle in circles:
attendance_course_lp_qs = LearningContentAttendanceCourse.objects.filter(
slug=f"{course.slug}-lp-circle-{circle.lower()}-lc-präsenzkurs-{circle.lower()}"
)
if attendance_course_lp_qs.exists():
cs.attendance_courses.append(
{
"learningContentId": attendance_course_lp_qs.first().id,
"start": try_parse_datetime(data[f"{circle} Start"])[1].isoformat(),
"end": try_parse_datetime(data[f"{circle} Ende"])[1].isoformat(),
"location": data[f"{circle} Raum"],
"trainer": "",
}
if language == "de":
attendance_course_lp_qs = LearningContentAttendanceCourse.objects.filter(
slug=f"{course.slug}-lp-circle-{circle.lower()}-lc-präsenzkurs-{circle.lower()}"
)
cs.save()
if attendance_course_lp_qs.exists():
cs.attendance_courses.append(
{
"learningContentId": attendance_course_lp_qs.first().id,
"start": try_parse_datetime(data[f"{circle} Start"])[
1
].isoformat(),
"end": try_parse_datetime(data[f"{circle} Ende"])[
1
].isoformat(),
"location": data[f"{circle} Raum"],
"trainer": "",
}
)
cs.save()
elif language == "fr":
# todo: this is a hack remove me
print(f"{course.slug}-lp-circle-véhicule-lc-cours-de-présence-véhicule")
attendance_course_lp_qs = LearningContentAttendanceCourse.objects.filter(
slug=f"{course.slug}-lp-circle-véhicule-lc-cours-de-présence-véhicule-à-moteur"
)
if attendance_course_lp_qs.exists():
cs.attendance_courses.append(
{
"learningContentId": attendance_course_lp_qs.first().id,
"start": try_parse_datetime(data[f"{circle} Start"])[
1
].isoformat(),
"end": try_parse_datetime(data[f"{circle} Ende"])[
1
].isoformat(),
"location": data[f"{circle} Raum"],
"trainer": "",
}
)
cs.save()
return cs
def import_trainers_from_excel(course: Course, filename: str):
def import_trainers_from_excel(course: Course, filename: str, language="de"):
workbook = load_workbook(filename=filename)
sheet = workbook["Schulungen Trainer"]
tuple_list = calc_header_tuple_list_from_pyxl_sheet(sheet)
for row in tuple_list:
create_or_update_trainer(course, dict(row))
create_or_update_trainer(course, dict(row), language=language)
def create_or_update_trainer(course: Course, data: Dict[str, Any]):
def create_or_update_trainer(course: Course, data: Dict[str, Any], language="de"):
logger.debug(
"create_or_update_trainer",
course=course.title,
data=data,
label="import",
)
user = create_or_update_user(
email=data["Email"],
email=data["Email"].lower(),
first_name=data["Vorname"],
last_name=data["Name"],
)
# TODO: handle language
groups = [g.strip() for g in data["Klasse"].strip().split(",")]
# general expert handling
for group in groups:
import_id = f"{data['Generation'].strip()} {group}"
course_session = CourseSession.objects.filter(
import_id=import_id, group=group, course=course
import_id=import_id,
group=group,
).first()
if course_session:
csu, _created = CourseSessionUser.objects.get_or_create(
@ -159,19 +191,34 @@ def create_or_update_trainer(course: Course, data: Dict[str, Any]):
)
csu.role = CourseSessionUser.Role.EXPERT
csu.save()
else:
logger.warning(
"create_or_update_trainer: course_session not found",
import_id=import_id,
group=group,
label="import",
)
if not course:
return
# circle expert handling
circle_data = parse_circle_group_string(data["Circles"])
for circle_string in circle_data:
parts = circle_string.split("(", 1)
circle_name = parts[0].strip()
groups = [g.strip() for g in parts[1].rstrip(")").strip().split(",")]
# FIXME: hardcoded translation
if language == "fr" and circle_name == "Fahrzeug":
circle_name = "Véhicule"
# print(circle_name, groups)
for group in groups:
import_id = f"{data['Generation'].strip()} {group}"
course_session = CourseSession.objects.filter(
import_id=import_id, group=group, course=course
import_id=import_id, group=group
).first()
circle = Circle.objects.filter(
slug=f"{course.slug}-lp-circle-{circle_name.lower()}"
@ -186,25 +233,24 @@ def create_or_update_trainer(course: Course, data: Dict[str, Any]):
csu.save()
def import_students_from_excel(course: Course, filename: str):
def import_students_from_excel(filename: str):
workbook = load_workbook(filename=filename)
sheet = workbook.active
tuple_list = calc_header_tuple_list_from_pyxl_sheet(sheet)
for row in tuple_list:
create_or_update_student(course, dict(row))
create_or_update_student(dict(row))
def create_or_update_student(course: Course, data: Dict[str, Any]):
def create_or_update_student(data: Dict[str, Any]):
logger.debug(
"create_or_update_student",
course=course.title,
data=data,
label="import",
)
user = create_or_update_user(
email=data["Email"],
email=data["Email"].lower(),
first_name=data["Vorname"],
last_name=data["Name"],
)
@ -214,9 +260,7 @@ def create_or_update_student(course: Course, data: Dict[str, Any]):
# general expert handling
import_ids = [i.strip() for i in data["Durchführungen"].split(",")]
for import_id in import_ids:
course_session = CourseSession.objects.filter(
import_id=import_id, course=course
).first()
course_session = CourseSession.objects.filter(import_id=import_id).first()
if course_session:
csu, _created = CourseSessionUser.objects.get_or_create(
course_session_id=course_session.id, user_id=user.id

View File

@ -25,10 +25,10 @@ class ImportCourseSessionTestCase(TestCase):
for row in tuple_list:
print(row)
create_or_update_course_session(
self.course, dict(row), circles=["Fahrzeug"]
self.course, dict(row), language="de", circles=["Fahrzeug"]
)
self.assertEqual(CourseSession.objects.count(), 6)
self.assertEqual(CourseSession.objects.count(), 3)
class CreateOrUpdateCourseSessionTestCase(TestCase):

View File

@ -29,7 +29,7 @@ class ImportStudentsTestCase(TestCase):
tuple_list = calc_header_tuple_list_from_pyxl_sheet(sheet)
for row in tuple_list:
print(row)
create_or_update_student(self.course, dict(row))
create_or_update_student(dict(row))
self.assertEqual(CourseSessionUser.objects.count(), 14)
@ -59,7 +59,7 @@ class CreateOrUpdateStudentTestCase(TestCase):
(None, None),
]
create_or_update_student(self.course, dict(row))
create_or_update_student(dict(row))
self.assertEqual(
CourseSessionUser.objects.filter(

View File

@ -37,7 +37,7 @@ def authorize(request):
user_data = _user_data_from_token_data(decoded_token)
user = create_or_update_user(
email=user_data.get("email"),
email=user_data.get("email").lower(),
sso_id=user_data.get("sso_id"),
first_name=user_data.get("first_name", ""),
last_name=user_data.get("last_name", ""),