From d5e484a6c7b4265e23e3c9f5630494820b920ee1 Mon Sep 17 00:00:00 2001 From: Daniel Egger Date: Wed, 28 Sep 2022 12:58:54 +0200 Subject: [PATCH] Add CompetencePage --- .../create_default_competence_profile.py | 118 +++++++++++++++++- server/vbv_lernwelt/competence/factories.py | 12 +- .../competence/migrations/0001_initial.py | 20 ++- .../0002_performancecriteria_learning_unit.py | 22 ---- server/vbv_lernwelt/competence/models.py | 33 ++++- 5 files changed, 173 insertions(+), 32 deletions(-) delete mode 100644 server/vbv_lernwelt/competence/migrations/0002_performancecriteria_learning_unit.py diff --git a/server/vbv_lernwelt/competence/create_default_competence_profile.py b/server/vbv_lernwelt/competence/create_default_competence_profile.py index 986501b8..5cbeb126 100644 --- a/server/vbv_lernwelt/competence/create_default_competence_profile.py +++ b/server/vbv_lernwelt/competence/create_default_competence_profile.py @@ -1,4 +1,6 @@ -from vbv_lernwelt.competence.factories import CompetenceProfilePageFactory, PerformanceCriteriaFactory +from vbv_lernwelt.competence.factories import CompetenceProfilePageFactory, PerformanceCriteriaFactory, \ + CompetencePageFactory +from vbv_lernwelt.competence.models import CompetencePage from vbv_lernwelt.course.consts import COURSE_VERSICHERUNGSVERMITTLERIN from vbv_lernwelt.course.models import CoursePage, Course from vbv_lernwelt.learnpath.models import LearningUnit @@ -13,20 +15,128 @@ def create_default_competence_profile(): parent=course_page, ) + competences = [{ + 'competence_id': 'A1', + 'title': 'Weiterempfehlung für Neukunden generieren', + 'items': [ + 'Verhandlungsgeschick', + 'Überzeugtes Auftreten', + ], + }, { + 'competence_id': 'A2', + 'title': 'Kundengespräche vereinbaren', + 'items': [ + 'Gesprächsführung / Fragetechniken', + 'Selbstorganisation', + 'Arbeitstechniken', + 'Psychologische Kenntnisse / Kommunikations-psychologie', + ], + }, { + 'competence_id': 'A3', + 'title': 'Auftritt in den sozialen Medien zeitgemäss halten', + 'items': [ + 'Gesetzliche und Compliance-Anforderungen der Versicherer', + 'Datenschutzgesetz', + 'Kommunikation in den sozialen Medien', + ] + }, { + 'competence_id': 'A4', + 'title': 'Kundendaten erfassen', + 'items': [] + }, { + 'competence_id': 'B1', + 'title': 'Wünsche, Ziele und Bedürfnisse der Kunden im Gespräch ermitteln', + 'items': [ + 'Gesprächsführung', + 'Fragetechniken', + 'Kundenpsychologie', + ] + }, { + 'competence_id': 'B2', + 'title': 'Analyse des Kundenbedarfs und des Kundenbedürfnisses durchführen', + 'items': [ + 'Fragetechniken', + 'Visuelle Hilfsmittel / Visualisierungstechniken', + ] + }, { + 'competence_id': 'B3', + 'title': 'Individuelle Lösungsvorschläge erarbeiten', + 'items': [ + 'Fundierte Produktekenntnisse', + 'Regulatorische Vorschriften', + ] + }, { + 'competence_id': 'B4', + 'title': 'Lösungsvorschläge präsentieren und umsetzen', + 'items': [ + 'Verhandlungsstrategien', + 'Fundierte Produktkenntnisse', + 'Visuelle Hilfsmittel / Visualisierungstechniken', + ] + }, { + 'competence_id': 'C1', + 'title': 'Cross- und Upselling; bestehende fremdverwaltete Versicherungspolicen prüfen und in das Portfolio aufnehmen', + 'items': [ + 'Produktkenntnisse', + 'Gesprächsführung', + 'Kommunikation', + 'Fragetechnik', + 'Verhandlungsgeschick', + 'Vertragsrecht', + 'Regulatorische Vorgaben', + 'UVG, BVG, KVG, VVG', + ] + }, { + 'competence_id': 'C2', + 'title': 'Änderungswünsche entgegennehmen und bestehende Verträge anpassen', + 'items': [ + 'Produktkenntnisse', + 'Gesprächsführung', + 'Kommunikation', + 'Fragetechnik', + 'Verhandlungsgeschick', + 'Vertragsrecht', + 'Regulatorische Vorgaben', + 'UVG, BVG, KVG, VVG', + ] + }, { + 'competence_id': 'C3', + 'title': 'Kunden im Schadenfall unterstützen', + 'items': [] + }, { + 'competence_id': 'C4', + 'title': 'Bestehende Kunden pflegen', + 'items': [] + }, { + 'competence_id': 'C5', + 'title': 'Versicherungsanträge nachbearbeiten', + 'items': [] + }] + + for c in competences: + CompetencePageFactory( + parent=competence_profile_page, + competence_id=c['competence_id'], + title=c['title'], + items=[ + ('item', i) for i in c['items'] + ] + ) + PerformanceCriteriaFactory( - parent=competence_profile_page, + parent=CompetencePage.objects.get(competence_id='B1'), competence_id='B1.3', title='Innerhalb des Handlungsfelds «Fahrzeug» bin ich fähig, die Ziele und Pläne des Kunden zu ergründen (SOLL).', learning_unit=LearningUnit.objects.get(slug='versicherungsvermittlerin-lp-circle-analyse-lu-fahrzeug'), ) PerformanceCriteriaFactory( - parent=competence_profile_page, + parent=CompetencePage.objects.get(competence_id='B2'), competence_id='B2.1', title='Innerhalb des Handlungsfelds «Fahrzeug» bin ich fähig, die IST-Situation des Kunden mit der geeigneten Gesprächs-/Fragetechnik zu erfassen.', learning_unit=LearningUnit.objects.get(slug='versicherungsvermittlerin-lp-circle-analyse-lu-fahrzeug'), ) PerformanceCriteriaFactory( - parent=competence_profile_page, + parent=CompetencePage.objects.get(competence_id='B2'), competence_id='B2.2', title='Innerhalb des Handlungsfelds «Fahrzeug» bin ich fähig, die Risiken aufzuzeigen.', learning_unit=LearningUnit.objects.get(slug='versicherungsvermittlerin-lp-circle-analyse-lu-fahrzeug'), diff --git a/server/vbv_lernwelt/competence/factories.py b/server/vbv_lernwelt/competence/factories.py index 6a025f00..1e0e21ed 100644 --- a/server/vbv_lernwelt/competence/factories.py +++ b/server/vbv_lernwelt/competence/factories.py @@ -1,6 +1,6 @@ import wagtail_factories -from vbv_lernwelt.competence.models import CompetenceProfilePage, PerformanceCriteria +from vbv_lernwelt.competence.models import CompetenceProfilePage, PerformanceCriteria, CompetencePage class CompetenceProfilePageFactory(wagtail_factories.PageFactory): @@ -10,8 +10,16 @@ class CompetenceProfilePageFactory(wagtail_factories.PageFactory): model = CompetenceProfilePage +class CompetencePageFactory(wagtail_factories.PageFactory): + competence_id = 'A1' + title = 'Weiterempfehlung für Neukunden generieren' + + class Meta: + model = CompetencePage + + class PerformanceCriteriaFactory(wagtail_factories.PageFactory): - competence_id = 'A.1' + competence_id = 'A1.1' title = 'Bestehende Kunden so zu beraten, dass sie von diesen weiterempfohlen werden' class Meta: diff --git a/server/vbv_lernwelt/competence/migrations/0001_initial.py b/server/vbv_lernwelt/competence/migrations/0001_initial.py index aa2a12a9..3d564119 100644 --- a/server/vbv_lernwelt/competence/migrations/0001_initial.py +++ b/server/vbv_lernwelt/competence/migrations/0001_initial.py @@ -1,7 +1,9 @@ -# Generated by Django 3.2.13 on 2022-09-28 10:30 +# Generated by Django 3.2.13 on 2022-09-28 10:46 from django.db import migrations, models import django.db.models.deletion +import wagtail.blocks +import wagtail.fields class Migration(migrations.Migration): @@ -10,9 +12,22 @@ class Migration(migrations.Migration): dependencies = [ ('wagtailcore', '0069_log_entry_jsonfield'), + ('learnpath', '0001_initial'), ] operations = [ + migrations.CreateModel( + name='CompetencePage', + fields=[ + ('page_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='wagtailcore.page')), + ('competence_id', models.TextField(default='A1')), + ('items', wagtail.fields.StreamField([('item', wagtail.blocks.TextBlock())], use_json_field=True)), + ], + options={ + 'abstract': False, + }, + bases=('wagtailcore.page',), + ), migrations.CreateModel( name='CompetenceProfilePage', fields=[ @@ -27,7 +42,8 @@ class Migration(migrations.Migration): name='PerformanceCriteria', fields=[ ('page_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='wagtailcore.page')), - ('competence_id', models.TextField(default='')), + ('competence_id', models.TextField(default='A1.1')), + ('learning_unit', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='learnpath.learningunit')), ], options={ 'abstract': False, diff --git a/server/vbv_lernwelt/competence/migrations/0002_performancecriteria_learning_unit.py b/server/vbv_lernwelt/competence/migrations/0002_performancecriteria_learning_unit.py deleted file mode 100644 index fc957438..00000000 --- a/server/vbv_lernwelt/competence/migrations/0002_performancecriteria_learning_unit.py +++ /dev/null @@ -1,22 +0,0 @@ -# Generated by Django 3.2.13 on 2022-09-28 10:30 - -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - initial = True - - dependencies = [ - ('learnpath', '0001_initial'), - ('competence', '0001_initial'), - ] - - operations = [ - migrations.AddField( - model_name='performancecriteria', - name='learning_unit', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='learnpath.learningunit'), - ), - ] diff --git a/server/vbv_lernwelt/competence/models.py b/server/vbv_lernwelt/competence/models.py index bba180fe..4174c675 100644 --- a/server/vbv_lernwelt/competence/models.py +++ b/server/vbv_lernwelt/competence/models.py @@ -1,6 +1,8 @@ from django.db import models from django.utils.text import slugify +from wagtail import blocks from wagtail.admin.panels import FieldPanel +from wagtail.fields import StreamField from wagtail.models import Page from vbv_lernwelt.core.model_utils import find_available_slug @@ -9,7 +11,7 @@ from vbv_lernwelt.learnpath.serializer_helpers import get_it_serializer_class class CompetenceProfilePage(Page): parent_page_types = ['course.CoursePage'] - subpage_types = ['competence.PerformanceCriteria'] + subpage_types = ['competence.CompetencePage'] content_panels = [ FieldPanel('title', classname="full title"), @@ -30,9 +32,36 @@ class CompetenceProfilePage(Page): ) +class CompetencePage(Page): + parent_page_types = ['competence.CompetenceProfilePage'] + subpage_types = ['competence.PerformanceCriteria'] + competence_id = models.TextField(default='A1') + items = StreamField([ + ('item', blocks.TextBlock()), + ], use_json_field=True) + + content_panels = [ + FieldPanel('title'), + FieldPanel('competence_id'), + ] + + def full_clean(self, *args, **kwargs): + self.slug = find_available_slug(slugify(f"{self.get_parent().slug}-competence-{self.competence_id}", allow_unicode=True)) + super(CompetencePage, self).full_clean(*args, **kwargs) + + @classmethod + def get_serializer_class(cls): + return get_it_serializer_class( + cls, [ + 'id', 'title', 'slug', 'type', 'translation_key', + 'children', + ] + ) + + class PerformanceCriteria(Page): parent_page_types = ['competence.CompetenceProfilePage'] - competence_id = models.TextField(default='') + competence_id = models.TextField(default='A1.1') learning_unit = models.ForeignKey( 'learnpath.LearningUnit', null=True,