diff --git a/server/vbv_lernwelt/learnpath/migrations/0003_learningunit_learning_sequence.py b/server/vbv_lernwelt/learnpath/migrations/0003_learningunit_learning_sequence.py new file mode 100644 index 00000000..af75d54f --- /dev/null +++ b/server/vbv_lernwelt/learnpath/migrations/0003_learningunit_learning_sequence.py @@ -0,0 +1,19 @@ +# Generated by Django 3.2.12 on 2022-05-03 11:03 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('learnpath', '0002_auto_20220427_1058'), + ] + + operations = [ + migrations.AddField( + model_name='learningunit', + name='learning_sequence', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='circles', to='learnpath.learningsequence'), + ), + ] diff --git a/server/vbv_lernwelt/learnpath/migrations/0004_alter_learningunit_learning_sequence.py b/server/vbv_lernwelt/learnpath/migrations/0004_alter_learningunit_learning_sequence.py new file mode 100644 index 00000000..385e7a36 --- /dev/null +++ b/server/vbv_lernwelt/learnpath/migrations/0004_alter_learningunit_learning_sequence.py @@ -0,0 +1,19 @@ +# Generated by Django 3.2.12 on 2022-05-03 11:22 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('learnpath', '0003_learningunit_learning_sequence'), + ] + + operations = [ + migrations.AlterField( + model_name='learningunit', + name='learning_sequence', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='learning_units', to='learnpath.learningsequence'), + ), + ] diff --git a/server/vbv_lernwelt/learnpath/models.py b/server/vbv_lernwelt/learnpath/models.py index a4b845d6..bd890d39 100644 --- a/server/vbv_lernwelt/learnpath/models.py +++ b/server/vbv_lernwelt/learnpath/models.py @@ -132,6 +132,13 @@ class LearningSequence(Orderable): class LearningUnit(Page, Orderable): # TODO: Review model architecture, is the stream fiel the right thing here? parent_page_types = ['learnpath.Circle'] + learning_sequence = models.ForeignKey( + 'learnpath.LearningSequence', + null=True, + blank=True, + on_delete=models.CASCADE, + related_name='learning_units' + ) content_blocks = [ ('web_based_training', WebBasedTrainingBlock()), @@ -143,7 +150,8 @@ class LearningUnit(Page, Orderable): content_panels = [ FieldPanel('title', classname="full title"), - StreamFieldPanel('contents') + StreamFieldPanel('contents'), + FieldPanel('learning_sequence') ] subpage_types = [] @@ -159,7 +167,6 @@ class LearningUnit(Page, Orderable): return f"{self.title}" - def find_available_slug(model, requested_slug, ignore_page_id=None): """ Finds an available slug within the specified parent. diff --git a/server/vbv_lernwelt/learnpath/tests/create_default_learning_path.py b/server/vbv_lernwelt/learnpath/tests/create_default_learning_path.py index 44b6bf4a..3358f9ff 100644 --- a/server/vbv_lernwelt/learnpath/tests/create_default_learning_path.py +++ b/server/vbv_lernwelt/learnpath/tests/create_default_learning_path.py @@ -12,24 +12,23 @@ def create_default_learning_path(): if not site: site = wagtail_factories.SiteFactory(is_default_site=True) - lp = LearningPathFactory.create(title="Versicherungsvermittler/in", parent=site.root_page) + lp = LearningPathFactory(title="Versicherungsvermittler/in", parent=site.root_page) - tp = TopicFactory.create(title="Basis", is_visible=False, learning_path=lp) - tp.save() + tp = TopicFactory(title="Basis", is_visible=False, learning_path=lp) - circle_1 = CircleFactory.create(title="Basis", parent=lp, topic=tp, description="""In diesem Circle erklären wir dir, wie der Lehrgang + circle_1 = CircleFactory(title="Basis", parent=lp, topic=tp, description="""In diesem Circle erklären wir dir, wie der Lehrgang Versicherungsvermittler / in " aufgebaut ist. Zudem vermitteln wir dir die wichtigsten Grundlagen, damit erfolgreich mit deinem Lernpfad starten kannst.""") - ls_1 = LearningSequenceFactory.create(title='Einleitung', circle=circle_1) - lu_1 = LearningUnitFactory.create(title="Herzlich Willkommmen", parent=circle_1) + ls_1 = LearningSequenceFactory(title='Einleitung', circle=circle_1) + lu_1 = LearningUnitFactory(title="Herzlich Willkommmen", parent=circle_1, learning_sequence=ls_1) - ls_2 = LearningSequenceFactory.create(title='Grundlagen', circle=circle_1) - lu_1 = LearningUnitFactory.create(title="Aber jetzt, Butter bei die Fische", parent=circle_1) + ls_2 = LearningSequenceFactory(title='Grundlagen', circle=circle_1) + lu_1 = LearningUnitFactory(title="Aber jetzt, Butter bei die Fische", parent=circle_1, learning_sequence=ls_2) - tp = TopicFactory.create(title="Gewinnen von Kunden", learning_path=lp) - tp.save() - circle_2 = CircleFactory.create(title="Gewinnen", parent=lp, description="""Versicherungsvermittlerinnen und -vermittler verfügen über + tp = TopicFactory(title="Gewinnen von Kunden", learning_path=lp) + + circle_2 = CircleFactory(title="Gewinnen", parent=lp, description="""Versicherungsvermittlerinnen und -vermittler verfügen über ein starkes Netzwerk, das sie gezielt pflegen und ausbauen. Sie beraten und betreuen ihre bestehenden Kundinnen und Kunden professionell und gewinnen so ihr Vertrauen. Dadurch schaffen sie die Basis für das Gewinnen von neuen Kundinnen und Kunden. Versicherungsvermittlerinnen und -vermittler sprechen ihre bestehenden Kundinnen und Kunden auf Weiterempfehlung an. So nutzen sie ihre @@ -46,9 +45,9 @@ von Neukunden zu benützen — Das Thema Risiko und Sicherheit in einem Gespräch gezielt und auf die Situation des jeweiligen Gesprächspartners bezogen einfliessen zu lassen — Im täglichen Kontakt potenzielle Kundinnen und Kunden zu erkennen""") - tp = TopicFactory.create(title="Beraten der Kunden", learning_path=lp).save() - circle_3 = CircleFactory.create(title="Einstieg", parent=lp, topic=tp) - circle_4 = CircleFactory.create(title="Analyse", parent=lp, topic=tp, + tp = TopicFactory(title="Beraten der Kunden", learning_path=lp) + circle_3 = CircleFactory(title="Einstieg", parent=lp, topic=tp) + circle_4 = CircleFactory(title="Analyse", parent=lp, topic=tp, description="""Nach dem Gespräch werten sie die Analyse aus und erstellen mit den zur Verfügung stehenden Systemen formal korrekte Lösungsvorschläge bzw. Ausschreibungen. Je nach Komplexität der Situation ziehen sie die nötigen @@ -61,10 +60,11 @@ von Neukunden zu benützen — Lösungsvorschläge zu skizzieren und zu visualisieren""") - sequence_1 = LearningSequenceFactory.create(title="Starten", circle=circle_4).save() - learning_unit = LearningUnitFactory.create(title='Einleitung Circle "Anlayse"', parent=circle_4) + sequence_1 = LearningSequenceFactory(title="Starten", circle=circle_4) + learning_unit = LearningUnitFactory(title='Einleitung Circle "Anlayse"', parent=circle_4, learning_sequence=sequence_1) + learning_unit.learning_sequence = sequence_1 - learning_unit = LearningUnitFactory.create(title='** Einstieg Video"', parent=circle_4) + learning_unit = LearningUnitFactory.create(title='** Einstieg Video"', parent=circle_4, learning_sequence=sequence_1) video_url = "https://www.vbv.ch/fileadmin/vbv/Videos/Statements_Externe/Janos_M/Testimonial_Janos_Mischler_PositiveEffekte.mp4" video_title = "Ausbildung ist pflicht" video_description = "Erfahren Sie, was für Janos Mischler die positiven Aspekte von ständiger Weiterbildung sind – aus fachlicher und aus persönlicher Sicht." @@ -72,39 +72,39 @@ von Neukunden zu benützen learning_unit.contents.append(('video', video_block)) learning_unit.save() - learning_unit = LearningUnitFactory.create(title='** Web Based Training"', parent=circle_4) + learning_unit = LearningUnitFactory.create(title='** Web Based Training"', parent=circle_4, learning_sequence=sequence_1) wbt_url = "web_based_trainings/rise_cmi5_test_export/scormcontent/index.html" wbt_block = WebBasedTrainingBlockFactory(type="web_based_training", url=wbt_url) learning_unit.contents.append(('web_based_training', wbt_block)) learning_unit.save() - learning_unit = LearningUnitFactory.create(title="Selbsteinschätzung", parent=circle_4) + learning_unit = LearningUnitFactory.create(title="Selbsteinschätzung", parent=circle_4, learning_sequence=sequence_1) - sequence_2 = LearningSequenceFactory.create(title="Beobachten", circle=circle_4).save() - learning_unit = LearningUnitFactory.create(title="Mein Motorfahrzeug kaufen", parent=circle_4) - learning_unit = LearningUnitFactory.create(title="Sich selbständig machen", parent=circle_4) + sequence_2 = LearningSequenceFactory.create(title="Beobachten", circle=circle_4) + learning_unit = LearningUnitFactory.create(title="Mein Motorfahrzeug kaufen", parent=circle_4, learning_sequence=sequence_2) + learning_unit = LearningUnitFactory.create(title="Sich selbständig machen", parent=circle_4, learning_sequence=sequence_2) - sequence_3 = LearningSequenceFactory.create(title="Anwenden", circle=circle_4).save() - learning_unit = LearningUnitFactory.create(title="Nora kauft sich ein neues Auto", parent=circle_4) - learning_unit = LearningUnitFactory.create(title="Manuel träumt von einem neuen Tesla", parent=circle_4) - learning_unit = LearningUnitFactory.create(title="Deine Erkenntnisse und Learnings", parent=circle_4) + sequence_3 = LearningSequenceFactory.create(title="Anwenden", circle=circle_4) + learning_unit = LearningUnitFactory.create(title="Nora kauft sich ein neues Auto", parent=circle_4, learning_sequence=sequence_3) + learning_unit = LearningUnitFactory.create(title="Manuel träumt von einem neuen Tesla", parent=circle_4, learning_sequence=sequence_3) + learning_unit = LearningUnitFactory.create(title="Deine Erkenntnisse und Learnings", parent=circle_4, learning_sequence=sequence_3) - sequence_4 = LearningSequenceFactory.create(title="Üben", circle=circle_4).save() - learning_unit = LearningUnitFactory.create(title="Ermittlung des Kundenbedarfs", parent=circle_4) - learning_unit = LearningUnitFactory.create(title="Aktives Zuhören", parent=circle_4) - learning_unit = LearningUnitFactory.create(title="In Bildern Sprechen", parent=circle_4) - learning_unit = LearningUnitFactory.create(title="Priorisieren des Bedarfs", parent=circle_4) - learning_unit = LearningUnitFactory.create(title="Zusammenfassung des Bedarfs", parent=circle_4) + sequence_4 = LearningSequenceFactory.create(title="Üben", circle=circle_4) + learning_unit = LearningUnitFactory.create(title="Ermittlung des Kundenbedarfs", parent=circle_4, learning_sequence=sequence_4) + learning_unit = LearningUnitFactory.create(title="Aktives Zuhören", parent=circle_4, learning_sequence=sequence_4) + learning_unit = LearningUnitFactory.create(title="In Bildern Sprechen", parent=circle_4, learning_sequence=sequence_4) + learning_unit = LearningUnitFactory.create(title="Priorisieren des Bedarfs", parent=circle_4, learning_sequence=sequence_4) + learning_unit = LearningUnitFactory.create(title="Zusammenfassung des Bedarfs", parent=circle_4, learning_sequence=sequence_4) - sequence_5 = LearningSequenceFactory.create(title="Testen", circle=circle_4).save() - learning_unit = LearningUnitFactory.create(title="Bedarfsfragen", parent=circle_4) - learning_unit = LearningUnitFactory.create(title="Andwendung der Fragetechniken", parent=circle_4) + sequence_5 = LearningSequenceFactory.create(title="Testen", circle=circle_4) + learning_unit = LearningUnitFactory.create(title="Bedarfsfragen", parent=circle_4, learning_sequence=sequence_5) + learning_unit = LearningUnitFactory.create(title="Andwendung der Fragetechniken", parent=circle_4, learning_sequence=sequence_5) - sequence_5 = LearningSequenceFactory.create(title="Vernetzen", circle=circle_4).save() - learning_unit = LearningUnitFactory.create(title="Online Training", parent=circle_4) + sequence_5 = LearningSequenceFactory.create(title="Vernetzen", circle=circle_4) + learning_unit = LearningUnitFactory.create(title="Online Training", parent=circle_4, learning_sequence=sequence_5) - sequence_6 = LearningSequenceFactory.create(title="Beenden", circle=circle_4).save() - learning_unit = LearningUnitFactory.create(title="Selbsteinschätzung", parent=circle_4) + sequence_6 = LearningSequenceFactory.create(title="Beenden", circle=circle_4) + learning_unit = LearningUnitFactory.create(title="Selbsteinschätzung", parent=circle_4, learning_sequence=sequence_6) circle_5 = CircleFactory.create(title="Lösung", parent=lp, @@ -122,10 +122,10 @@ von Neukunden zu benützen goals="""— Je nach Komplexität der Lösungsvorschläge (z.B. Offerten oder Offertvergleich) einen Fachspezialisten aufzubieten — Sich kundenorientiert auf das Gespräch vorzubereiten und sich passend zu präsentieren""") - tp = TopicFactory.create(title="Betreuen und Ausbauen des Kundenstamms", learning_path=lp).save() + tp = TopicFactory.create(title="Betreuen und Ausbauen des Kundenstamms", learning_path=lp) circle_7 = CircleFactory.create(title="Betreuen", parent=lp, topic=tp) - tp = TopicFactory.create(title="Prüfung", is_visible=False, learning_path=lp).save() + tp = TopicFactory.create(title="Prüfung", is_visible=False, learning_path=lp) circle_7 = CircleFactory.create(title="Prüfungsvorbereitung", parent=lp, topic=tp) diff --git a/server/vbv_lernwelt/learnpath/tests/learningpath_factories.py b/server/vbv_lernwelt/learnpath/tests/learningpath_factories.py index f3da9b20..3566a7fe 100644 --- a/server/vbv_lernwelt/learnpath/tests/learningpath_factories.py +++ b/server/vbv_lernwelt/learnpath/tests/learningpath_factories.py @@ -11,7 +11,7 @@ class LearningPathFactory(wagtail_factories.PageFactory): model = LearningPath -class TopicFactory(factory.Factory): +class TopicFactory(factory.django.DjangoModelFactory): title = "Gewinnen von Kunden" is_visible = True @@ -26,7 +26,7 @@ class CircleFactory(wagtail_factories.PageFactory): model = Circle -class LearningSequenceFactory(factory.Factory): +class LearningSequenceFactory(factory.django.DjangoModelFactory): title = "Grundlagen" class Meta: diff --git a/server/vbv_lernwelt/templates/learnpath/circle.html b/server/vbv_lernwelt/templates/learnpath/circle.html index 2e5e09c3..057b190d 100644 --- a/server/vbv_lernwelt/templates/learnpath/circle.html +++ b/server/vbv_lernwelt/templates/learnpath/circle.html @@ -31,10 +31,10 @@