diff --git a/server/vbv_lernwelt/assignment/creators/create_assignments.py b/server/vbv_lernwelt/assignment/creators/create_assignments.py index c0ba555d..e75e37cb 100644 --- a/server/vbv_lernwelt/assignment/creators/create_assignments.py +++ b/server/vbv_lernwelt/assignment/creators/create_assignments.py @@ -14,7 +14,11 @@ from vbv_lernwelt.assignment.tests.assignment_factories import ( UserTextInputBlockFactory, ) from vbv_lernwelt.core.utils import replace_whitespace -from vbv_lernwelt.course.consts import COURSE_UK, COURSE_VERSICHERUNGSVERMITTLERIN_ID +from vbv_lernwelt.course.consts import ( + COURSE_UK, + COURSE_UK_FR, + COURSE_VERSICHERUNGSVERMITTLERIN_ID, +) from vbv_lernwelt.course.models import CoursePage from wagtail.blocks import StreamValue from wagtail.blocks.list_block import ListBlock, ListValue @@ -465,7 +469,481 @@ def create_uk_fahrzeug_casework(course_id=COURSE_UK): return assignment -def create_uk_fahrzeug_prep_assignment(course_id=COURSE_UK): +def create_uk_fr_fahrzeug_casework(course_id=COURSE_UK_FR): + assignment_list_page = ( + CoursePage.objects.get(course_id=course_id) + .get_children() + .exact_type(AssignmentListPage) + .first() + ) + + assignment = AssignmentFactory( + parent=assignment_list_page, + title="Vérification d'une police d’assurance de véhicule à moteur", + effort_required="5 heures environ", + intro_text=replace_whitespace( + """ +

Exposé de la situation

+

+ Une personne de ta famille ou de tes connaissances souhaite faire vérifier sa police d'assurance. Elle se + tourne alors vers toi et te demande, en ta qualité de spécialiste de l'assurance, de l'examiner d’un œil + critique et de lui soumettre, le cas échéant, des propositions d'adaptation. Dans le cadre de cette évaluation + des compétences, tu peux maintenant prouver tes connaissances et tes compétences dans le domaine de l'assurance + des véhicules à moteur. +

+ """ + ), + performance_objectives=[ + ( + "performance_objective", + PerformanceObjectiveBlockFactory( + text="d2.pv.ük3: Ils expliquent les services et les produits dans le domaine de l’assurance." + ), + ), + ( + "performance_objective", + PerformanceObjectiveBlockFactory( + text="c3.pv.ük11: Ils évaluent les solutions d’assurance courantes avec professionnalisme (C3)." + ), + ), + ], + evaluation_document_url="/static/media/assignments/fr_üK1_FZ_09_NACH_KN_Beurteilungsraster.pdf", + evaluation_description="Diese geleitete Fallarbeit wird auf Grund des folgenden Beurteilungsintrument bewertet.", + ) + + assignment.evaluation_tasks = [] + assignment.evaluation_tasks.append( + ( + "task", + EvaluationTaskBlockFactory( + title="Exposé de la situation de départ", + description=RichText( + "L'apprenant(e) expose-t-il / elle la situation de départ dans son intégralité?" + ), + max_points=6, + sub_tasks=ListValue( + ListBlock(EvaluationSubTaskBlock()), + values=[ + EvaluationSubTaskBlockFactory( + title="La situation de départ est décrite dans son intégralité:", + description=RichText( + replace_whitespace( + """ + + """ + ) + ), + points=6, + ), + EvaluationSubTaskBlockFactory( + title="La situation de départ est en grande partie décrite dans son intégralité.", + points=4, + ), + EvaluationSubTaskBlockFactory( + title="La description de la situation de départ est incomplète - seuls 2 points ont été exposés.", + points=2, + ), + EvaluationSubTaskBlockFactory( + title="La description de la situation de départ est incomplète - il manque plus de 2 points importants.", + points=0, + ), + ], + ), + ), + ), + ) + assignment.evaluation_tasks.append( + ( + "task", + EvaluationTaskBlockFactory( + title="Analyse de contenu et structure", + max_points=6, + description=RichText( + "Les couvertures de la police sont-elles documentées de manière exhaustive et compréhensible?" + ), + sub_tasks=ListValue( + ListBlock(EvaluationSubTaskBlock()), + values=[ + EvaluationSubTaskBlockFactory( + title="L'analyse comprend toutes les couvertures présentes dans la police et est structurée de manière logique.", + points=6, + ), + EvaluationSubTaskBlockFactory( + title="L'analyse comprend la plupart des couvertures existantes dans la police et est en grande partie structurée de manière logique.", + points=4, + ), + EvaluationSubTaskBlockFactory( + title="L'analyse est incomplète (il manque plus de 3 couvertures), et le fil conducteur n'est pas clair.", + points=2, + ), + EvaluationSubTaskBlockFactory( + title="Dans l'ensemble, l'analyse n'est pas compréhensible, et il manque certaines couvertures.", + points=0, + ), + ], + ), + ), + ), + ) + assignment.evaluation_tasks.append( + ( + "task", + EvaluationTaskBlockFactory( + title="Recommandations judicieuses", + max_points=6, + description=RichText( + "La personne apprenante en déduit-elle des recommandations pertinentes et appropriées?" + ), + sub_tasks=ListValue( + ListBlock(EvaluationSubTaskBlock()), + values=[ + EvaluationSubTaskBlockFactory( + title="Les recommandations sont toujours pertinentes et argumentées de manière compréhensible.", + points=6, + ), + EvaluationSubTaskBlockFactory( + title="Les recommandations sont pour la plupart pertinentes et argumentées de manière compréhensible.", + points=4, + ), + EvaluationSubTaskBlockFactory( + title="Les recommandations manquent de pertinence et ne sont pas entièrement étayées par une argumentation.", + points=2, + ), + EvaluationSubTaskBlockFactory( + title="Les recommandations ne sont ni pertinentes ni argumentées de manière compréhensible.", + points=0, + ), + ], + ), + ), + ), + ) + assignment.evaluation_tasks.append( + ( + "task", + EvaluationTaskBlockFactory( + title="Qualité de la réflexion", + max_points=3, + description=RichText( + "La personne apprenante reproduit-elle le déroulement de l’étude de cas dirigée?" + ), + sub_tasks=ListValue( + ListBlock(EvaluationSubTaskBlock()), + values=[ + EvaluationSubTaskBlockFactory( + title="La réflexion porte sur l’étude de cas dirigée et comprend des aspects positifs et négatifs compréhensibles.", + points=3, + ), + EvaluationSubTaskBlockFactory( + title="La réflexion porte sur l’étude de cas dirigée et comprend en grande partie des aspects positifs et négatifs compréhensibles.", + points=2, + ), + EvaluationSubTaskBlockFactory( + title="La réflexion est incomplète.", + points=1, + ), + EvaluationSubTaskBlockFactory( + title="La réflexion ne porte pas sur l’étude de cas dirigée.", + points=0, + ), + ], + ), + ), + ), + ) + assignment.evaluation_tasks.append( + ( + "task", + EvaluationTaskBlockFactory( + title="Adéquation des connaissances acquises", + max_points=3, + description=RichText( + "La personne apprenante tire-t-elle des connaissances appropriées de la réflexion?" + ), + sub_tasks=ListValue( + ListBlock(EvaluationSubTaskBlock()), + values=[ + EvaluationSubTaskBlockFactory( + title="Les connaissances acquises se rapportent à l’étude de cas dirigée, et leur contenu est pertinent.", + points=3, + ), + EvaluationSubTaskBlockFactory( + title="Les connaissances acquises se rapportent en grande partie à l’étude de cas dirigée, et leur contenu est pertinent.", + points=2, + ), + EvaluationSubTaskBlockFactory( + title="Les connaissances acquises se rapportent en partie à l’étude de cas dirigée, et leur contenu manque de pertinence.", + points=1, + ), + EvaluationSubTaskBlockFactory( + title="Les connaissances acquises ne portent pas sur l’étude de cas dirigée.", + points=0, + ), + ], + ), + ), + ), + ) + + assignment.tasks = [] + assignment.tasks.append( + ( + "task", + TaskBlockFactory( + title="Exercice 1: Trouver un exemple de police d'assurance", + # it is hard to create a StreamValue programmatically, we have to + # create a `StreamValue` manually. Ask Daniel and/or Ramon + content=StreamValue( + TaskContentStreamBlock(), + stream_data=[ + ( + "explanation", + ExplanationBlockFactory( + text=RichText( + "Demande à quelqu'un de ta famille ou de tes connaissances de te fournir sa police d'assurance automobile." + ) + ), + ), + ( + "user_confirmation", + ExplanationBlockFactory( + text=RichText( + "Ja, ich habe Motorfahrzeugversicherungspolice von jemandem aus meiner Familie oder meinem Freundeskreis erhalten." + ) + ), + ), + ], + ), + ), + ) + ) + + assignment.tasks.append( + ( + "task", + TaskBlockFactory( + title="Exercice 2: Situation du client et position de départ", + content=StreamValue( + TaskContentStreamBlock(), + stream_data=[ + ( + "explanation", + ExplanationBlockFactory( + text=RichText( + replace_whitespace( + """ + Explique la situation du client et le contexte de départ. + + """ + ) + ) + ), + ), + ("user_text_input", UserTextInputBlockFactory()), + ], + ), + ), + ) + ) + + assignment.tasks.append( + ( + "task", + TaskBlockFactory( + title="Exercice 3: Assurance en cours", + # TODO: add document upload + content=StreamValue( + TaskContentStreamBlock(), + stream_data=[ + ( + "explanation", + ExplanationBlockFactory( + text=RichText( + "Expose maintenant dans le détail comment le client de ton exemple est assuré pour le moment." + ) + ), + ), + ("user_text_input", UserTextInputBlockFactory()), + ], + ), + ), + ) + ) + + assignment.tasks.append( + ( + "task", + TaskBlockFactory( + title="Exercice 4: Tes recommandations", + content=StreamValue( + TaskContentStreamBlock(), + stream_data=[ + ( + "explanation", + ExplanationBlockFactory( + text=RichText( + "Sur la base de ce que tu as observé, formule maintenant une recommandation." + ) + ), + ), + ( + "user_text_input", + UserTextInputBlockFactory( + text=RichText( + "Recommanderais-tu la souscription de couvertures supplémentaires? Argumente ta recommandation." + ) + ), + ), + ( + "user_text_input", + UserTextInputBlockFactory( + text=RichText( + " Supprimerais-tu certaines couvertures? Argumente ta recommandation." + ) + ), + ), + ( + "user_text_input", + UserTextInputBlockFactory( + text=RichText( + "Si tu estimes que la personne est assurée exactement comme il faut, précise pour quelles raisons tu arrives à cette conclusion." + ) + ), + ), + ], + ), + ), + ) + ) + + assignment.tasks.append( + ( + "task", + TaskBlockFactory( + title="Exercice 5: Réflexion", + content=StreamValue( + TaskContentStreamBlock(), + stream_data=[ + ( + "explanation", + ExplanationBlockFactory( + text=RichText( + "Réfléchis à ton comportement et consigne tes conclusions. Pose-toi les questions suivantes:" + ) + ), + ), + ( + "user_text_input", + UserTextInputBlockFactory( + text=RichText( + "As-tu traité correctement cette étude de cas dirigée? Justifie ton sentiment." + ) + ), + ), + ( + "user_text_input", + UserTextInputBlockFactory( + text=RichText( + "Qu’est-ce que tu as réussi à bien traiter dans cette étude de cas?" + ) + ), + ), + ( + "user_text_input", + UserTextInputBlockFactory( + text=RichText( + "Qu’est-ce que tu as moins bien réussi à traiter dans cette étude de cas?" + ) + ), + ), + ( + "explanation", + ExplanationBlockFactory( + text=RichText( + "Note tes conclusions dans la documentation et télécharge-la ensuite sur la plateforme d’apprentissage pour l’évaluation." + ) + ), + ), + ], + ), + ), + ) + ) + + assignment.tasks.append( + ( + "task", + TaskBlockFactory( + title="Exercice 6: Apprentissages", + content=StreamValue( + TaskContentStreamBlock(), + stream_data=[ + ( + "explanation", + ExplanationBlockFactory( + text=RichText( + "En t’appuyant sur l’exercice n°5, dresse le bilan de ce que tu as appris." + ) + ), + ), + ( + "user_text_input", + UserTextInputBlockFactory( + text=RichText( + "Qu’est-ce que tu ferais différemment la prochaine fois?" + ) + ), + ), + ( + "user_text_input", + UserTextInputBlockFactory( + text=RichText( + "Qu’as-tu appris de nouveau en traitant cette étude de cas?" + ) + ), + ), + ], + ), + ), + ) + ) + + assignment.tasks.append( + ( + "task", + TaskBlockFactory( + title="Exercice 7: Apprentissages", + content=StreamValue( + TaskContentStreamBlock(), + stream_data=[ + ( + "explanation", + ExplanationBlockFactory( + text=RichText( + "Rédige une documentation compréhensible et logique et transmets-la dans les délais." + ) + ), + ), + ], + ), + ), + ) + ) + + assignment.save() + + return assignment + + +def create_uk_fahrzeug_prep_assignment(course_id=COURSE_UK_FR): assignment_list_page = ( CoursePage.objects.get(course_id=course_id) .get_children() @@ -780,6 +1258,244 @@ def create_uk_fahrzeug_prep_assignment(course_id=COURSE_UK): return assignment +def create_uk_fr_fahrzeug_prep_assignment(course_id=COURSE_UK): + assignment_list_page = ( + CoursePage.objects.get(course_id=course_id) + .get_children() + .exact_type(AssignmentListPage) + .first() + ) + + assignment = AssignmentFactory( + parent=assignment_list_page, + assignment_type=AssignmentType.PREP_ASSIGNMENT.name, + title="Véhicule à moteur – «Ma première voiture»", + effort_required="3 heures environ", + intro_text=replace_whitespace( + """ +

Compétences opérationnelles, situations de travail et objectifs à atteindre

+

+ Compétence opérationnelle d2 : Mener des entretiens d’information et de conseil avec des + clients et des fournisseurs
+ Situation de travail 4 : Conseiller les clients et s’occuper des processus correspondants
+

+

+ +

+ Compétence opérationnelle e4 : Préparer des contenus en lien avec l’entreprise à l’aide d’outils multimédia
+ Situation de travail 1 : Mettre en avant les caractéristiques de la branche et les points forts de l’entreprise
+

+

+ +

Exposé de la situation

+

+ Imagine que tu viens de réussir ton permis de conduire et que tu vas enfin pouvoir être davantage mobile. + Quelle sera ta première voiture? Et cette voiture, tu vas évidemment vouloir la protéger et l’assurer correctement. +

+ """ + ), + performance_objectives=[], + ) + + assignment.tasks = [] + assignment.tasks.append( + ( + "task", + TaskBlockFactory( + title="Exercice 1: Obtenez un premier aperçu du sujet.", + # it is hard to create a StreamValue programmatically, we have to + # create a `StreamValue` manually. Ask Daniel and/or Ramon + content=StreamValue( + TaskContentStreamBlock(), + stream_data=[ + ( + "explanation", + ExplanationBlockFactory( + text=RichText( + 'Commence par te faire une première idée de ce sujet: regarde la vidéo suivante: Comment fonctionne une assurance auto? Un sujet expliqué simplement?' + ) + ), + ), + ( + "user_confirmation", + ExplanationBlockFactory( + text=RichText( + "Oui, j'ai regardé la vidéo et j'ai compris." + ) + ), + ), + ], + ), + ), + ) + ) + + assignment.tasks.append( + ( + "task", + TaskBlockFactory( + title="Exercice 2: Lire le chapitre «Droit de la responsabilité civile et assurances des véhicules à moteur»", + # it is hard to create a StreamValue programmatically, we have to + # create a `StreamValue` manually. Ask Daniel and/or Ramon + content=StreamValue( + TaskContentStreamBlock(), + stream_data=[ + ( + "explanation", + ExplanationBlockFactory( + text=RichText( + "Lis et traite les chapitres correspondants dans le manuel «Droit de la responsabilité civile et assurances des véhicules à moteur»." + ) + ), + ), + ( + "user_confirmation", + ExplanationBlockFactory( + text=RichText("Oui, j'ai lu et compris le chapitre.") + ), + ), + ], + ), + ), + ) + ) + + assignment.tasks.append( + ( + "task", + TaskBlockFactory( + title="Exercice 3: Établir une offre", + # it is hard to create a StreamValue programmatically, we have to + # create a `StreamValue` manually. Ask Daniel and/or Ramon + content=StreamValue( + TaskContentStreamBlock(), + stream_data=[ + ( + "explanation", + ExplanationBlockFactory( + text=RichText( + replace_whitespace( + """ +

+ C’est parti! Établis une offre correspondante pour ta première voiture. Réfléchis aux couvertures que tu souhaites absolument inclure et celles qui seraient souhaitables dans ton cas. À cet effet, utilise l’outil de ta compagnie pour l’établissement des offres. Tu peux aussi utiliser n'importe quel outil équivalent en ligne. +

+

+ Tu devras peut-être tricher un peu avec ton année de naissance pour être assez âgé(e) pour t’établir une offre. +

+ """ + ) + ) + ), + ), + ( + "user_confirmation", + ExplanationBlockFactory( + text=RichText("Oui, j'ai établi une offre.") + ), + ), + ], + ), + ), + ) + ) + + assignment.tasks.append( + ( + "task", + TaskBlockFactory( + title="Exercice 4: Notes et questions", + content=StreamValue( + TaskContentStreamBlock(), + stream_data=[ + ( + "explanation", + ExplanationBlockFactory( + text=RichText( + "Au cours de ce processus, prends des notes pour répondre aux questions suivantes:" + ) + ), + ), + ( + "user_text_input", + UserTextInputBlockFactory( + text=RichText( + "Comment as-tu procédé pour établir ton offre?" + ) + ), + ), + ( + "user_text_input", + UserTextInputBlockFactory( + text=RichText( + "Quelles difficultés as-tu rencontrées lors de l’établissement de l’offre? Comment as-tu résolu ces difficultés?" + ) + ), + ), + ( + "user_text_input", + UserTextInputBlockFactory( + text=RichText( + "Quelles informations sont indispensables pour pouvoir établir une offre correcte d’assurance des véhicules à moteur?" + ) + ), + ), + ( + "user_text_input", + UserTextInputBlockFactory( + text=RichText( + "Pour quelles couvertures complémentaires as-tu opté? Pour quelles raisons?" + ) + ), + ), + ( + "user_text_input", + UserTextInputBlockFactory( + text=RichText( + "Quels sont les principaux facteurs / éléments qui déterminent le montant de la prime?" + ) + ), + ), + ], + ), + ), + ) + ) + + assignment.tasks.append( + ( + "task", + TaskBlockFactory( + title="Exercice 5: Cours en présentiel", + content=StreamValue( + TaskContentStreamBlock(), + stream_data=[ + ( + "explanation", + ExplanationBlockFactory( + text=RichText( + "

Apporte l’offre et tes notes en cours.

" + "

N'oublie pas les CGA correspondantes. Ce n’est pas un problème si tu n’as ces documents que sous forme électronique.

" + ) + ), + ), + ], + ), + ), + ) + ) + + assignment.save() + + return assignment + + def create_uk_kickoff_prep_assignment(course_id=COURSE_UK): assignment_list_page = ( CoursePage.objects.get(course_id=course_id) @@ -1407,6 +2123,310 @@ def create_uk_reflection(course_id=COURSE_UK, circle_title="Fahrzeug"): return assignment +def create_uk_fr_reflection(course_id=COURSE_UK_FR, circle_title="Véhicule"): + assignment_list_page = ( + CoursePage.objects.get(course_id=course_id) + .get_children() + .exact_type(AssignmentListPage) + .first() + ) + + assignment = AssignmentFactory( + parent=assignment_list_page, + assignment_type=AssignmentType.REFLECTION.name, + title=f"Reflexion", + effort_required="", + intro_text=replace_whitespace( + """ +

+ Tu as reçu beaucoup de nouveaux contenus et d'inputs dans ce Circle. Il est maintenant temps de jeter à nouveau un coup d'œil sur ton profil de compétences. Répondre aux questions de réflexion t'aide à rendre visible et compréhensible ton propre processus d'apprentissage et de réflexion. Elle met en évidence tes forces et tes faiblesses personnelles pendant l'élaboration et t'aide à t'améliorer en permanence. +

+ """ + ), + performance_objectives=[], + ) + + assignment.tasks = [] + assignment.tasks.append( + ( + "task", + TaskBlockFactory( + title="Question 1: Qu'est-ce que je réussis déjà bien?", + content=StreamValue( + TaskContentStreamBlock(), + stream_data=[ + ( + "user_text_input", + UserTextInputBlockFactory(), + ), + ], + ), + ), + ) + ) + + assignment.tasks.append( + ( + "task", + TaskBlockFactory( + title="Question 2: Approfondissment", + content=StreamValue( + TaskContentStreamBlock(), + stream_data=[ + ( + "user_text_input", + UserTextInputBlockFactory( + text=RichText( + "Où dois-je encore approfondir ou répéter? " + ) + ), + ), + ], + ), + ), + ) + ) + + assignment.tasks.append( + ( + "task", + TaskBlockFactory( + title="Question 3: Qu'est-ce que je retiens?", + content=StreamValue( + TaskContentStreamBlock(), + stream_data=[ + ( + "user_text_input", + UserTextInputBlockFactory(), + ), + ], + ), + ), + ) + ) + + assignment.tasks.append( + ( + "task", + TaskBlockFactory( + title="Question 4: Préparation", + content=StreamValue( + TaskContentStreamBlock(), + stream_data=[ + ( + "user_text_input", + UserTextInputBlockFactory( + text=RichText( + "Comment me suis-je préparé(e) au Cercle (par ex. en prévoyant du temps d'étude)?" + ) + ), + ), + ], + ), + ), + ) + ) + + assignment.tasks.append( + ( + "task", + TaskBlockFactory( + title="Question 5: Cours de présence", + content=StreamValue( + TaskContentStreamBlock(), + stream_data=[ + ( + "user_text_input", + UserTextInputBlockFactory( + text=RichText( + "Quel a été mon degré d'engagement dans les cours de présence?" + ) + ), + ), + ], + ), + ), + ) + ) + + assignment.tasks.append( + ( + "task", + TaskBlockFactory( + title="Question 6: Amélioration", + content=StreamValue( + TaskContentStreamBlock(), + stream_data=[ + ( + "user_text_input", + UserTextInputBlockFactory( + text=RichText( + "Qu'est-ce que je veux changer/améliorer dans le processus d'apprentissage pour le prochain Circle?" + ) + ), + ), + ], + ), + ), + ) + ) + + assignment.save() + + return assignment + + +def create_uk_it_reflection(course_id=COURSE_UK_FR, circle_title="Véhicule"): + assignment_list_page = ( + CoursePage.objects.get(course_id=course_id) + .get_children() + .exact_type(AssignmentListPage) + .first() + ) + + assignment = AssignmentFactory( + parent=assignment_list_page, + assignment_type=AssignmentType.REFLECTION.name, + title=f"Riflessione", + effort_required="", + intro_text=replace_whitespace( + """ +

+ In questo Circle hai ricevuto molti nuovi contenuti e input. Ora è il momento di dare un'altra occhiata al tuo profilo di competenza. Rispondere alle domande di riflessione aiuta a rendere visibile e comprensibile il proprio processo di apprendimento e di pensiero. Rivela i punti di forza e di debolezza personali durante l'elaborazione e aiuta a migliorare continuamente. +

+ """ + ), + performance_objectives=[], + ) + + assignment.tasks = [] + assignment.tasks.append( + ( + "task", + TaskBlockFactory( + title="Domanda 1: Cosa sto già facendo bene?", + content=StreamValue( + TaskContentStreamBlock(), + stream_data=[ + ( + "user_text_input", + UserTextInputBlockFactory(), + ), + ], + ), + ), + ) + ) + + assignment.tasks.append( + ( + "task", + TaskBlockFactory( + title="Domanda 2: Approfondimento", + content=StreamValue( + TaskContentStreamBlock(), + stream_data=[ + ( + "user_text_input", + UserTextInputBlockFactory( + text=RichText( + "Dove devo ancora approfondire o ripetere le mie conoscenze?" + ) + ), + ), + ], + ), + ), + ) + ) + + assignment.tasks.append( + ( + "task", + TaskBlockFactory( + title="Domanda 3: Cosa porterò con me?", + content=StreamValue( + TaskContentStreamBlock(), + stream_data=[ + ( + "user_text_input", + UserTextInputBlockFactory(), + ), + ], + ), + ), + ) + ) + + assignment.tasks.append( + ( + "task", + TaskBlockFactory( + title="Domanda 4: Preparazione", + content=StreamValue( + TaskContentStreamBlock(), + stream_data=[ + ( + "user_text_input", + UserTextInputBlockFactory( + text=RichText( + "Come mi sono preparato per il Circle (ad esempio, programmando il tempo di studio)?" + ) + ), + ), + ], + ), + ), + ) + ) + + assignment.tasks.append( + ( + "task", + TaskBlockFactory( + title="Domanda 5: Insegnamento in classe", + content=StreamValue( + TaskContentStreamBlock(), + stream_data=[ + ( + "user_text_input", + UserTextInputBlockFactory( + text=RichText("Quanto mi sono impegnato in classe?") + ), + ), + ], + ), + ), + ) + ) + + assignment.tasks.append( + ( + "task", + TaskBlockFactory( + title="Domanda 6: Miglioramento", + content=StreamValue( + TaskContentStreamBlock(), + stream_data=[ + ( + "user_text_input", + UserTextInputBlockFactory( + text=RichText( + "Cosa voglio cambiare/migliorare nel processo di apprendimento per il prossimo Circle?" + ) + ), + ), + ], + ), + ), + ) + ) + + assignment.save() + + return assignment + + def create_vv_reflection( course_id=COURSE_VERSICHERUNGSVERMITTLERIN_ID, _circle_title="Fahrzeug" ): diff --git a/server/vbv_lernwelt/competence/create_uk_competence_profile.py b/server/vbv_lernwelt/competence/create_uk_competence_profile.py index b617c087..81c6eac4 100644 --- a/server/vbv_lernwelt/competence/create_uk_competence_profile.py +++ b/server/vbv_lernwelt/competence/create_uk_competence_profile.py @@ -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.ük2", + title="Ich bin fähig die relevanten rechtlichen Grundlagen im Handlungsfeld Fahrzeug situationsgerecht zu erläutern.", learning_unit=LearningUnit.objects.get( slug=f"{slug_prefix}-circle-véhicule-lu-vorbereitung" ), @@ -348,7 +289,7 @@ def create_uk_fr_competence_profile(course_id=COURSE_UK_FR): 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)", + title="Ich bin fähig die gesetzlichen Bestimmungen bei Schaden- und Leistungsfällen im Handlungsfeld Fahrzeug zu erläutern.", learning_unit=LearningUnit.objects.get( slug=f"{slug_prefix}-circle-véhicule-lu-vorbereitung" ), @@ -358,7 +299,77 @@ def create_uk_fr_competence_profile(course_id=COURSE_UK_FR): slug__startswith=slug_prefix.replace("-lp", ""), competence_id="c3" ), competence_id="c3.pv.ük11", - title="Sie beurteilen gängige Versicherungslösungen fachkundig. (K3)", + title="Ich bin fähig die gängigen Versicherungslösungen im Handlungsbereich Fahrzeug fachkundig zu beurteilen.", + 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="Ich bin fähig die wichtigsten gesetzlichen Grundlagen im Bereich Motorfahrzeugversicherung umfassend zu beschreiben.", + 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="Ich bin fähig die relevanten Dienstleistungen und Produkte im Handlungsfeld Fahrzeug zu nennen.", + 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="Ils expliquent les services et les produits dans le domaine de l’assurance. (C2)", + 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="Ils expliquent les processus et procédures dans le domaine de l’assurance privée. (C2)", + 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="Ils expliquent les services proposés par l’entreprise. (C2)", + 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="Ils distinguent les concurrents sur le marché de l’assurance privée les uns des autres en utilisant les critères appropriés. (C2)", + 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="Ils expliquent les principes sur lesquels reposent les produits des assurances privées. (C2)", learning_unit=LearningUnit.objects.get( slug=f"{slug_prefix}-circle-véhicule-lu-vorbereitung" ), diff --git a/server/vbv_lernwelt/competence/create_uk_training_competence_profile.py b/server/vbv_lernwelt/competence/create_uk_training_competence_profile.py index 7e8048b3..1243fc19 100644 --- a/server/vbv_lernwelt/competence/create_uk_training_competence_profile.py +++ b/server/vbv_lernwelt/competence/create_uk_training_competence_profile.py @@ -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="Ich bin fähig die relevanten rechtlichen Grundlagen im Handlungsfeld Fahrzeug situationsgerecht zu erläutern.", + 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="Ich bin fähig die gesetzlichen Bestimmungen bei Schaden- und Leistungsfällen im Handlungsfeld Fahrzeug zu erläutern.", + 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="Ich bin fähig die gängigen Versicherungslösungen im Handlungsbereich Fahrzeug fachkundig zu beurteilen.", + 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="Ich bin fähig die wichtigsten gesetzlichen Grundlagen im Bereich Motorfahrzeugversicherung umfassend zu beschreiben.", + 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="Ich bin fähig die relevanten Dienstleistungen und Produkte im Handlungsfeld Fahrzeug zu nennen.", + 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="Ils expliquent les services et les produits dans le domaine de l’assurance. (C2)", + 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="Ich bin fähig die Prozesse und Abläufe im Handlungsfeld Fahrzeug zu erläutern.", + 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="Ich bin fähig die Dienstleistungen des eigenen Betriebs im Handlungsfeld Fahrzeug zu erläutern.", + 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="Ils distinguent les concurrents sur le marché de l’assurance privée les uns des autres en utilisant les critères appropriés. (C2)", + 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="Ils expliquent les principes sur lesquels reposent les produits des assurances privées. (C2)", + learning_unit=LearningUnit.objects.get( + slug=f"{slug_prefix}-circle-véhicule-lu-vorbereitung" + ), + ) diff --git a/server/vbv_lernwelt/course/consts.py b/server/vbv_lernwelt/course/consts.py index 23fc2105..5960844d 100644 --- a/server/vbv_lernwelt/course/consts.py +++ b/server/vbv_lernwelt/course/consts.py @@ -4,3 +4,4 @@ COURSE_UK = -3 COURSE_VERSICHERUNGSVERMITTLERIN_ID = -4 COURSE_UK_FR = -5 COURSE_UK_TRAINING = -6 +COURSE_UK_TRAINING_FR = -7 diff --git a/server/vbv_lernwelt/course/creators/uk_course.py b/server/vbv_lernwelt/course/creators/uk_course.py index cc474a0a..f725b317 100644 --- a/server/vbv_lernwelt/course/creators/uk_course.py +++ b/server/vbv_lernwelt/course/creators/uk_course.py @@ -106,9 +106,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 +304,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"

In der Mediathek unter «Allgemeines zu Versicherungen» findest du alle relevanten Ressourcen für deine Fachkompetenzen.

" + f"

Wir empfehlen dir vor der Absolvierung der weiteren Lerneinheiten dich in die Thematik einzulesen.

" + ), + 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 +500,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"

In der Mediathek unter «Allgemeines zu Versicherungen» findest du alle relevanten Ressourcen für deine Fachkompetenzen.

" + f"

Wir empfehlen dir vor der Absolvierung der weiteren Lerneinheiten dich in die Thematik einzulesen.

" + ), + 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( + "

Folgender Test mit Wissens- und Verständnisfragen ist Teil des Kompetenznachweises. Der Test kann nur einmal durchgeführt werden und ist notenrelevant.

" + ), + 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 +744,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="In diesem Circle lernst du alles rund um das Fahrzeug und die dazugehörigen Versicherungen.", + goals=UK_CIRCLE_GOALS["fahrzeug"], + ) + course_slug = lp.slug.replace("-lp", "") + LearningSequenceFactory( + title="Vorbereitung", parent=circle, icon="it-icon-ls-start" + ) + LearningUnitFactory(title="Vorbereitung", title_hidden=True, parent=circle) + LearningContentMediaLibraryFactory( + title=f"Handlungsfeld «{title}»", + parent=circle, + description=RichText( + f"

In der Mediathek unter dem Handlungsfeld «{title}» findest du alle relevanten Ressourcen für deine Fachkompetenzen.

" + f"

Wir empfehlen dir vor der Absolvierung der weiteren Lerneinheiten dich in die Thematik einzulesen.

" + ), + 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="Präsenzkurs", title_hidden=True, parent=circle) + LearningContentAttendanceCourseFactory( + title="Präsenzkurs Fahrzeug", + 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/fr_üK1_FZ_00_Prгentation.pdf", + ), + ), + ( + "document", + LearnMediaBlockFactory( + title="Begriffe", + description="", + icon_url="/static/icons/demo/icon-hf-book.png", + link_display_text="Dokument anzeigen", + url="/static/media/uk/fr_üK1_FZ_02_Begriffe.pdf", + ), + ), + ( + "document", + LearnMediaBlockFactory( + title="Checkliste", + description="", + icon_url="/static/icons/demo/icon-hf-book.png", + link_display_text="Dokument anzeigen", + url="/static/media/uk/fr_üK1_FZ_04_Checkliste.pdf", + ), + ), + ( + "document", + LearnMediaBlockFactory( + title="Arbeitsblatt Schadenfälle", + description="", + icon_url="/static/icons/demo/icon-hf-book.png", + link_display_text="Dokument anzeigen", + url="/static/media/uk/fr_üK1_FZ_05_A_Schaden.pdf", + ), + ), + ( + "document", + LearnMediaBlockFactory( + title="Überblick Kasko", + description="", + icon_url="/static/icons/demo/icon-hf-book.png", + link_display_text="Dokument anzeigen", + url="/static/media/uk/fr_üK1_FZ_07_Kasko.pdf", + ), + ), + ( + "document", + LearnMediaBlockFactory( + title="Offerte und anschliessendes Verkaufsgespräch", + description="", + icon_url="/static/icons/demo/icon-hf-book.png", + link_display_text="Dokument anzeigen", + url="/static/media/uk/fr_üK1_FZ_08_A_Offerte und Verkaufsgespräch.pdf", + ), + ), + ( + "document", + LearnMediaBlockFactory( + title="Arbeitsblatt Schadenfälle Reserve", + description="", + icon_url="/static/icons/demo/icon-hf-book.png", + link_display_text="Dokument anzeigen", + url="/static/media/uk/fr_üK1_FZ_A_Reserve_Schaden.pdf", + ), + ), + ], + ) + LearningUnitFactory(title="Feedback", title_hidden=True, parent=circle) + LearningContentFeedbackFactory( + parent=circle, + ) + + LearningSequenceFactory(title="Transfer", parent=circle, icon="it-icon-ls-end") + LearningUnitFactory(title="Kompetenznachweis", title_hidden=True, parent=circle) + LearningContentAssignmentFactory( + title="Vérification d'une police d’assurance 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="Reflexion", title_hidden=True, parent=circle) + LearningContentAssignmentFactory( + title="Reflexion", + assignment_type="REFLECTION", + parent=circle, + content_assignment=Assignment.objects.get( + slug__startswith=f"{course_slug}-assignment-reflexion" + ), + ), + + UK_CIRCLE_GOALS = { "kickoff": """

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!

diff --git a/server/vbv_lernwelt/course/creators/uk_training_course.py b/server/vbv_lernwelt/course/creators/uk_training_course.py index 87398c7c..89135f40 100644 --- a/server/vbv_lernwelt/course/creators/uk_training_course.py +++ b/server/vbv_lernwelt/course/creators/uk_training_course.py @@ -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: diff --git a/server/vbv_lernwelt/course/management/commands/create_default_courses.py b/server/vbv_lernwelt/course/management/commands/create_default_courses.py index f503ad39..32ec7da1 100644 --- a/server/vbv_lernwelt/course/management/commands/create_default_courses.py +++ b/server/vbv_lernwelt/course/management/commands/create_default_courses.py @@ -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) @@ -469,18 +486,18 @@ def create_course_training_de(): current_dir = os.path.dirname(os.path.realpath(__file__)) print(current_dir) course = Course.objects.get(id=COURSE_UK_TRAINING) - import_course_sessions_from_excel( - course, - f"{current_dir}/../../../importer/tests/Schulungen_Durchfuehrung_Trainer.xlsx", - ) - import_trainers_from_excel( - course, - f"{current_dir}/../../../importer/tests/Schulungen_Durchfuehrung_Trainer.xlsx", - ) - import_students_from_excel( - course, - f"{current_dir}/../../../importer/tests/Schulungen_Teilnehmende.xlsx", - ) + # import_course_sessions_from_excel( + # course, + # f"{current_dir}/../../../importer/tests/Schulungen_Durchfuehrung_Trainer.xlsx", + # ) + # import_trainers_from_excel( + # course, + # f"{current_dir}/../../../importer/tests/Schulungen_Durchfuehrung_Trainer.xlsx", + # ) + # import_students_from_excel( + # course, + # f"{current_dir}/../../../importer/tests/Schulungen_Teilnehmende.xlsx", + # ) for cs in CourseSession.objects.filter(course_id=COURSE_UK_TRAINING): cs.assignment_details_list = [ @@ -529,3 +546,89 @@ 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", + ) + import_trainers_from_excel( + course, + f"{current_dir}/../../../importer/tests/Schulungen_Durchfuehrung_Trainer.xlsx", + ) + import_students_from_excel( + course, + 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() diff --git a/server/vbv_lernwelt/static/media/uk/fr_üK1_FZ_00_Prгentation.pdf b/server/vbv_lernwelt/static/media/uk/fr_üK1_FZ_00_Prгentation.pdf new file mode 100644 index 00000000..89df5cfb Binary files /dev/null and b/server/vbv_lernwelt/static/media/uk/fr_üK1_FZ_00_Prгentation.pdf differ diff --git a/server/vbv_lernwelt/static/media/uk/fr_üK1_FZ_01_VOR.pdf b/server/vbv_lernwelt/static/media/uk/fr_üK1_FZ_01_VOR.pdf new file mode 100644 index 00000000..656b54bd Binary files /dev/null and b/server/vbv_lernwelt/static/media/uk/fr_üK1_FZ_01_VOR.pdf differ diff --git a/server/vbv_lernwelt/static/media/uk/fr_üK1_FZ_02_Begriffe.pdf b/server/vbv_lernwelt/static/media/uk/fr_üK1_FZ_02_Begriffe.pdf new file mode 100644 index 00000000..c216e082 Binary files /dev/null and b/server/vbv_lernwelt/static/media/uk/fr_üK1_FZ_02_Begriffe.pdf differ diff --git a/server/vbv_lernwelt/static/media/uk/fr_üK1_FZ_03_A_VOR.pdf b/server/vbv_lernwelt/static/media/uk/fr_üK1_FZ_03_A_VOR.pdf new file mode 100644 index 00000000..f39a1aee Binary files /dev/null and b/server/vbv_lernwelt/static/media/uk/fr_üK1_FZ_03_A_VOR.pdf differ diff --git a/server/vbv_lernwelt/static/media/uk/fr_üK1_FZ_04_Checkliste.pdf b/server/vbv_lernwelt/static/media/uk/fr_üK1_FZ_04_Checkliste.pdf new file mode 100644 index 00000000..5e812122 Binary files /dev/null and b/server/vbv_lernwelt/static/media/uk/fr_üK1_FZ_04_Checkliste.pdf differ diff --git a/server/vbv_lernwelt/static/media/uk/fr_üK1_FZ_05_A_Schaden.pdf b/server/vbv_lernwelt/static/media/uk/fr_üK1_FZ_05_A_Schaden.pdf new file mode 100644 index 00000000..f5eb9615 Binary files /dev/null and b/server/vbv_lernwelt/static/media/uk/fr_üK1_FZ_05_A_Schaden.pdf differ diff --git a/server/vbv_lernwelt/static/media/uk/fr_üK1_FZ_07_Kasko.pdf b/server/vbv_lernwelt/static/media/uk/fr_üK1_FZ_07_Kasko.pdf new file mode 100644 index 00000000..403b4ce7 Binary files /dev/null and b/server/vbv_lernwelt/static/media/uk/fr_üK1_FZ_07_Kasko.pdf differ diff --git a/server/vbv_lernwelt/static/media/uk/fr_üK1_FZ_08_A_Offerte und Verkaufsgespr⏀h.pdf b/server/vbv_lernwelt/static/media/uk/fr_üK1_FZ_08_A_Offerte und Verkaufsgespr⏀h.pdf new file mode 100644 index 00000000..7d9306af Binary files /dev/null and b/server/vbv_lernwelt/static/media/uk/fr_üK1_FZ_08_A_Offerte und Verkaufsgespr⏀h.pdf differ diff --git a/server/vbv_lernwelt/static/media/uk/fr_üK1_FZ_09_NACH_KN.pdf b/server/vbv_lernwelt/static/media/uk/fr_üK1_FZ_09_NACH_KN.pdf new file mode 100644 index 00000000..0fe06a52 Binary files /dev/null and b/server/vbv_lernwelt/static/media/uk/fr_üK1_FZ_09_NACH_KN.pdf differ diff --git a/server/vbv_lernwelt/static/media/uk/fr_üK1_FZ_09_NACH_KN_Beurteilungsraster.pdf b/server/vbv_lernwelt/static/media/uk/fr_üK1_FZ_09_NACH_KN_Beurteilungsraster.pdf new file mode 100644 index 00000000..4b86cc6b Binary files /dev/null and b/server/vbv_lernwelt/static/media/uk/fr_üK1_FZ_09_NACH_KN_Beurteilungsraster.pdf differ diff --git a/server/vbv_lernwelt/static/media/uk/fr_üK1_FZ_A_Reserve_Schaden.pdf b/server/vbv_lernwelt/static/media/uk/fr_üK1_FZ_A_Reserve_Schaden.pdf new file mode 100644 index 00000000..9e2ab6e2 Binary files /dev/null and b/server/vbv_lernwelt/static/media/uk/fr_üK1_FZ_A_Reserve_Schaden.pdf differ