Refactor Circle data model

This commit is contained in:
Daniel Egger 2022-06-03 17:52:22 +02:00
parent 4ce3b5f005
commit 20d10da944
5 changed files with 342 additions and 99 deletions

View File

@ -1,4 +1,4 @@
# Generated by Django 3.2.12 on 2022-06-01 15:39
# Generated by Django 3.2.12 on 2022-06-03 13:11
from django.db import migrations, models
import django.db.models.deletion
@ -52,6 +52,7 @@ class Migration(migrations.Migration):
name='LearningSequence',
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')),
('icon', models.CharField(default='IconLsStart', max_length=255)),
],
options={
'verbose_name': 'Learning Sequence',
@ -62,7 +63,9 @@ class Migration(migrations.Migration):
name='LearningUnit',
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')),
('contents', wagtail.core.fields.StreamField([('web_based_training', wagtail.core.blocks.StructBlock([('url', wagtail.core.blocks.URLBlock())])), ('video', wagtail.core.blocks.StructBlock([('url', wagtail.core.blocks.URLBlock())]))], blank=True, null=True)),
('minutes', models.PositiveIntegerField(default=15)),
('package', models.CharField(blank=True, default='', max_length=255)),
('contents', wagtail.core.fields.StreamField([('video', wagtail.core.blocks.StructBlock([('description', wagtail.core.blocks.TextBlock()), ('url', wagtail.core.blocks.URLBlock())])), ('rise_training', wagtail.core.blocks.StructBlock([('description', wagtail.core.blocks.TextBlock()), ('url', wagtail.core.blocks.URLBlock())])), ('podcast', wagtail.core.blocks.StructBlock([('description', wagtail.core.blocks.TextBlock()), ('url', wagtail.core.blocks.URLBlock())])), ('competence', wagtail.core.blocks.StructBlock([('description', wagtail.core.blocks.TextBlock())])), ('exercise', wagtail.core.blocks.StructBlock([('description', wagtail.core.blocks.TextBlock())])), ('self_evaluation', wagtail.core.blocks.StructBlock([('description', wagtail.core.blocks.TextBlock())])), ('document', wagtail.core.blocks.StructBlock([('description', wagtail.core.blocks.TextBlock())])), ('knowledge', wagtail.core.blocks.StructBlock([('description', wagtail.core.blocks.TextBlock())]))])),
],
options={
'verbose_name': 'Learning Unit',

View File

@ -8,7 +8,8 @@ from wagtail.core.fields import StreamField
from wagtail.core.models import Page, Orderable
from vbv_lernwelt.learnpath.models_competences import *
from vbv_lernwelt.learnpath.models_learning_unit_content import WebBasedTrainingBlock, VideoBlock
from vbv_lernwelt.learnpath.models_learning_unit_content import RiseTrainingBlock, VideoBlock, PodcastBlock, \
CompetenceBlock, ExerciseBlock, SelfEvaluationBlock, DocumentBlock, KnowledgeBlock
from vbv_lernwelt.learnpath.serializer_helpers import get_it_serializer_class
@ -106,9 +107,14 @@ class Circle(Page):
class LearningSequence(Page):
icon = models.CharField(max_length=255, default="IconLsStart")
parent_page_types = ['learnpath.Circle']
panels = [FieldPanel('title'), FieldPanel('circle')]
panels = [
FieldPanel('title'),
FieldPanel('icon'),
]
class Meta:
verbose_name = "Learning Sequence"
@ -118,10 +124,10 @@ class LearningSequence(Page):
@classmethod
def get_serializer_class(cls):
return get_it_serializer_class(cls, field_names=['id', 'title', 'slug', 'type', 'translation_key'])
return get_it_serializer_class(cls, field_names=['id', 'title', 'icon', 'slug', 'type', 'translation_key'])
def get_admin_display_title(self):
return f'Lernsequenz: {self.draft_title}'
return f'{self.icon} {self.draft_title}'
def full_clean(self, *args, **kwargs):
super(LearningSequence, self).full_clean(*args, **kwargs)
@ -135,29 +141,42 @@ class LearningUnit(Page):
# TODO: Review model architecture, is the stream field the right thing here?
parent_page_types = ['learnpath.Circle']
subpage_types = []
minutes = models.PositiveIntegerField(default=15)
package = models.CharField(max_length=255, default="", blank=True)
content_blocks = [
('web_based_training', WebBasedTrainingBlock()),
('video', VideoBlock()),
('rise_training', RiseTrainingBlock()),
('podcast', PodcastBlock()),
('competence', CompetenceBlock()),
('exercise', ExerciseBlock()),
('self_evaluation', SelfEvaluationBlock()),
('document', DocumentBlock()),
('knowledge', KnowledgeBlock()),
]
contents = StreamField(
StreamBlock(content_blocks), null=True, blank=True, min_num=1, max_num=1
StreamBlock(content_blocks), blank=False, min_num=1, max_num=1
)
content_panels = [
FieldPanel('title', classname="full title"),
# FieldPanel('learning_sequence'),
FieldPanel('minutes'),
StreamFieldPanel('contents'),
]
api_fields = [
APIField('title'),
APIField('contents'),
]
def get_admin_display_title(self):
return f'FOOBAR {self.draft_title}'
display_title = ''
if self.package:
display_title += f'{self.package}: '
if len(self.contents) > 0:
display_title += f'{self.contents[0].block_type.capitalize()}: '
display_title += self.draft_title
return display_title
class Meta:
verbose_name = "Learning Unit"
@ -168,7 +187,7 @@ class LearningUnit(Page):
@classmethod
def get_serializer_class(cls):
return get_it_serializer_class(cls, field_names=['id', 'title', 'contents', 'slug', 'type', 'translation_key'])
return get_it_serializer_class(cls, field_names=['id', 'title', 'minutes', 'package', 'contents', 'slug', 'type', 'translation_key'])
def __str__(self):
return f"{self.title}"

View File

@ -1,31 +1,61 @@
from django.db import models
from wagtail.core import blocks
class VideoBlock(blocks.StructBlock):
# TODO: Possible video Types for the user, upload file, add URL
title = models.CharField(max_length=255, default="")
description = models.TextField(default="")
description = blocks.TextBlock()
url = blocks.URLBlock()
class Meta:
icon = 'media'
RISE = 'rise'
CONTENT_TYPE_CHOICES = (
(RISE, 'Rise'),
)
class WebBasedTrainingBlock(blocks.StructBlock):
class RiseTrainingBlock(blocks.StructBlock):
description = blocks.TextBlock()
url = blocks.URLBlock()
content_type = models.CharField(
max_length=255,
choices=CONTENT_TYPE_CHOICES,
default=RISE
)
class Meta:
icon = 'media'
class PodcastBlock(blocks.StructBlock):
description = blocks.TextBlock()
url = blocks.URLBlock()
class Meta:
icon = 'media'
class CompetenceBlock(blocks.StructBlock):
description = blocks.TextBlock()
class Meta:
icon = 'media'
class ExerciseBlock(blocks.StructBlock):
description = blocks.TextBlock()
class Meta:
icon = 'media'
class SelfEvaluationBlock(blocks.StructBlock):
description = blocks.TextBlock()
class Meta:
icon = 'media'
class DocumentBlock(blocks.StructBlock):
description = blocks.TextBlock()
class Meta:
icon = 'media'
class KnowledgeBlock(blocks.StructBlock):
description = blocks.TextBlock()
class Meta:
icon = 'media'

View File

@ -5,7 +5,8 @@ from wagtail.core.models import Site, Page
from vbv_lernwelt.core.admin import User
from vbv_lernwelt.learnpath.models import LearningPath, Topic, Circle, LearningSequence, LearningUnit
from vbv_lernwelt.learnpath.tests.learning_path_factories import LearningPathFactory, TopicFactory, CircleFactory, \
LearningSequenceFactory, LearningUnitFactory, VideoBlockFactory, WebBasedTrainingBlockFactory
LearningSequenceFactory, LearningUnitFactory, VideoBlockFactory, PodcastBlockFactory, CompetenceBlockFactory, \
ExerciseBlockFactory, SelfEvaluationBlockFactory, DocumentBlockFactory
def create_default_learning_path(user=None):
@ -53,7 +54,8 @@ von Neukunden zu benützen
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,
circe_analyse = 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
@ -66,71 +68,217 @@ von Neukunden zu benützen
Lösungsvorschläge zu skizzieren und
zu visualisieren""")
sequence_1 = LearningSequenceFactory(title="Starten", parent=circle_4)
LearningSequenceFactory(title='Starten', parent=circe_analyse)
LearningUnitFactory(
title='Einleitung Circle "Anlayse"',
parent=circe_analyse,
minutes=15,
contents=[('video', VideoBlockFactory())]
)
learning_unit = LearningUnitFactory(title='Einleitung Circle "Anlayse"', parent=circle_4)
learning_unit = LearningUnitFactory.create(title='** Einstieg Video"', parent=circle_4)
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."
video_block = VideoBlockFactory(content_type="video", url=video_url, title=video_title, description=video_description)
learning_unit.contents.append(('video', video_block))
learning_unit.save()
LearningSequenceFactory(title='Beobachten', parent=circe_analyse, icon='IconLsWatch')
LearningUnitFactory(
title='Ermittlung des Kundenbedarfs',
parent=circe_analyse,
package='Absicherung der Familie',
minutes=30,
contents=[('podcast', PodcastBlockFactory())]
)
LearningUnitFactory(
title='Kundenbedürfnisse erkennen',
parent=circe_analyse,
package='Absicherung der Familie',
minutes=30,
contents=[('competence', CompetenceBlockFactory())]
)
LearningUnitFactory(
title='Was braucht eine Familie?',
parent=circe_analyse,
package='Absicherung der Familie',
minutes=60,
contents=[('exercise', ExerciseBlockFactory())]
)
LearningUnitFactory(
title='Selbsteinschätzung',
parent=circe_analyse,
package='Absicherung der Familie',
minutes=0,
contents=[('self_evaluation', SelfEvaluationBlockFactory())]
)
learning_unit = LearningUnitFactory.create(title='** Web Based Training"', parent=circle_4)
wbt_url = "web_based_trainings/rise_cmi5_test_export/scormcontent/index.html"
wbt_block = WebBasedTrainingBlockFactory(content_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)
LearningSequenceFactory(title='Anwenden', parent=circe_analyse, icon='IconLsApply')
LearningUnitFactory(
title='Versicherungsbedarf für Familien',
parent=circe_analyse,
package='Prämien einsparen',
minutes=60,
contents=[('exercise', ExerciseBlockFactory())]
)
LearningUnitFactory(
title='Alles klar?',
parent=circe_analyse,
package='Prämien einsparen',
minutes=60,
contents=[('exercise', ExerciseBlockFactory())]
)
LearningUnitFactory(
title='Selbsteinschätzung',
parent=circe_analyse,
package='Prämien einsparen',
minutes=0,
contents=[('self_evaluation', SelfEvaluationBlockFactory())]
)
sequence_2 = LearningSequenceFactory.create(title="Beobachten", parent=circle_4)
learning_unit = LearningUnitFactory.create(title="Mein Motorfahrzeug kaufen", parent=circle_4)
learning_unit = LearningUnitFactory.create(title="Sich selbständig machen", parent=circle_4)
LearningUnitFactory(
title='GmbH oder AG',
parent=circe_analyse,
package='Sich selbständig machen',
minutes=120,
contents=[('video', VideoBlockFactory())]
)
LearningUnitFactory(
title='Tiertherapie Patrizia Feller',
parent=circe_analyse,
package='Sich selbständig machen',
minutes=120,
contents=[('exercise', ExerciseBlockFactory())]
)
LearningUnitFactory(
title='Selbsteinschätzung',
parent=circe_analyse,
package='Sich selbständig machen',
minutes=0,
contents=[('self_evaluation', SelfEvaluationBlockFactory())]
)
sequence_3 = LearningSequenceFactory.create(title="Anwenden", parent=circle_4)
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)
LearningUnitFactory(
title='Motorfahrzeugversicherung',
parent=circe_analyse,
package='Auto verkaufen',
minutes=240,
contents=[('competence', CompetenceBlockFactory())]
)
LearningUnitFactory(
title='Nora kauft sich ein neues Auto',
parent=circe_analyse,
package='Auto verkaufen',
minutes=60,
contents=[('podcast', PodcastBlockFactory())]
)
LearningUnitFactory(
title='Ermittlung des Kundenbedarfs',
parent=circe_analyse,
package='Auto verkaufen',
minutes=120,
contents=[('document', DocumentBlockFactory())]
)
LearningUnitFactory(
title='Motorfahrzeug kaufen',
parent=circe_analyse,
package='Auto verkaufen',
minutes=120,
contents=[('exercise', ExerciseBlockFactory())]
)
LearningUnitFactory(
title='Selbsteinschätzung',
parent=circe_analyse,
package='Auto verkaufen',
minutes=0,
contents=[('self_evaluation', SelfEvaluationBlockFactory())]
)
sequence_4 = LearningSequenceFactory.create(title="Üben", parent=circle_4)
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)
LearningSequenceFactory(title='Üben', parent=circe_analyse, icon='IconLsPractice')
LearningUnitFactory(
title='Hausrat',
parent=circe_analyse,
package='Kind zieht von zu Hause aus',
minutes=120,
contents=[('competence', CompetenceBlockFactory())]
)
LearningUnitFactory(
title='Privathaftpflicht',
parent=circe_analyse,
package='Kind zieht von zu Hause aus',
minutes=60,
contents=[('competence', CompetenceBlockFactory())]
)
LearningUnitFactory(
title='Kind zieht von zu Hause aus',
parent=circe_analyse,
package='Kind zieht von zu Hause aus',
minutes=60,
contents=[('competence', CompetenceBlockFactory())]
)
LearningUnitFactory(
title='Selbsteinschätzung',
parent=circe_analyse,
package='Kind zieht von zu Hause aus',
minutes=0,
contents=[('self_evaluation', SelfEvaluationBlockFactory())]
)
sequence_5 = LearningSequenceFactory.create(title="Testen", parent=circle_4)
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="Vernetzen", parent=circle_4)
learning_unit = LearningUnitFactory.create(title="Online Training", parent=circle_4)
sequence_6 = LearningSequenceFactory.create(title="Beenden", parent=circle_4)
learning_unit = LearningUnitFactory.create(title="Selbsteinschätzung", parent=circle_4)
circle_5 = CircleFactory.create(title="Lösung",
parent=lp,
topic=tp,
goals="""— Die Daten des Kunden korrekt in die notwendigen Systeme einzutragen
Fachspezialisten beizuziehen, falls dies angezeigt ist
Mit den zur Verfügung stehenden Systemen korrekte Lösungsvorschläge
(z.B. Offerten oder Ausschreibungen) zu verfassen
Falls nötig die Lösungsvorschläge dem Underwriting weiterzuleiten und
Unklarheiten zu bereinigen """)
circle_6 = CircleFactory.create(title="Abschluss",
parent=lp,
topic=tp,
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)
circle_7 = CircleFactory.create(title="Betreuen", parent=lp, topic=tp)
tp = TopicFactory.create(title="Prüfung", is_visible=False, learning_path=lp)
circle_7 = CircleFactory.create(title="Prüfungsvorbereitung", parent=lp, topic=tp)
# learning_unit = LearningUnitFactory.create(title='** Einstieg Video"', parent=circle_4)
# 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."
# video_block = VideoBlockFactory(content_type="video", url=video_url, title=video_title, description=video_description)
# learning_unit.contents.append(('video', video_block))
# learning_unit.save()
#
# learning_unit = LearningUnitFactory.create(title='** Web Based Training"', parent=circle_4)
# wbt_url = "web_based_trainings/rise_cmi5_test_export/scormcontent/index.html"
# wbt_block = WebBasedTrainingBlockFactory(content_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)
#
# sequence_2 = LearningSequenceFactory.create(title="Beobachten", parent=circle_4)
# learning_unit = LearningUnitFactory.create(title="Mein Motorfahrzeug kaufen", parent=circle_4)
# learning_unit = LearningUnitFactory.create(title="Sich selbständig machen", parent=circle_4)
#
# sequence_3 = LearningSequenceFactory.create(title="Anwenden", parent=circle_4)
# 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_4 = LearningSequenceFactory.create(title="Üben", parent=circle_4)
# 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_5 = LearningSequenceFactory.create(title="Testen", parent=circle_4)
# 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="Vernetzen", parent=circle_4)
# learning_unit = LearningUnitFactory.create(title="Online Training", parent=circle_4)
#
# sequence_6 = LearningSequenceFactory.create(title="Beenden", parent=circle_4)
# learning_unit = LearningUnitFactory.create(title="Selbsteinschätzung", parent=circle_4)
#
# circle_5 = CircleFactory.create(title="Lösung",
# parent=lp,
# topic=tp,
# goals="""— Die Daten des Kunden korrekt in die notwendigen Systeme einzutragen
# — Fachspezialisten beizuziehen, falls dies angezeigt ist
# — Mit den zur Verfügung stehenden Systemen korrekte Lösungsvorschläge
# (z.B. Offerten oder Ausschreibungen) zu verfassen
# — Falls nötig die Lösungsvorschläge dem Underwriting weiterzuleiten und
# Unklarheiten zu bereinigen """)
#
# circle_6 = CircleFactory.create(title="Abschluss",
# parent=lp,
# topic=tp,
# 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)
# circle_7 = CircleFactory.create(title="Betreuen", parent=lp, topic=tp)
#
# tp = TopicFactory.create(title="Prüfung", is_visible=False, learning_path=lp)
# circle_7 = CircleFactory.create(title="Prüfungsvorbereitung", parent=lp, topic=tp)
# all pages belong to 'admin' by default
Page.objects.update(owner=user)

View File

@ -2,7 +2,8 @@ import factory
import wagtail_factories
from vbv_lernwelt.learnpath.models import LearningPath, Topic, Circle, LearningSequence, LearningUnit
from vbv_lernwelt.learnpath.models_learning_unit_content import VideoBlock, WebBasedTrainingBlock
from vbv_lernwelt.learnpath.models_learning_unit_content import VideoBlock, RiseTrainingBlock, PodcastBlock, \
CompetenceBlock, ExerciseBlock, SelfEvaluationBlock, DocumentBlock, KnowledgeBlock
class LearningPathFactory(wagtail_factories.PageFactory):
@ -42,17 +43,59 @@ class LearningUnitFactory(wagtail_factories.PageFactory):
class VideoBlockFactory(wagtail_factories.StructBlockFactory):
title = "Ausbildung ist Pflicht"
url = "https://www.vbv.ch/fileadmin/vbv/Videos/Statements_Externe/Janos_M/Testimonial_Janos_Mischler_PositiveEffekte.mp4"
url = "https://www.youtube.com/watch?v=dQw4w9WgXcQ"
description = "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam"
class Meta:
model = VideoBlock
class WebBasedTrainingBlockFactory(wagtail_factories.StructBlockFactory):
title = "Beispiel Rise Modul"
class RiseTrainingBlockFactory(wagtail_factories.StructBlockFactory):
url = "https://www.example.com"
description = "Beispiel Rise Modul"
class Meta:
model = RiseTrainingBlock
class PodcastBlockFactory(wagtail_factories.StructBlockFactory):
description = "Beispiel Podcast"
url = "https://docs.wagtail.org/en/stable/topics/streamfield.html"
class Meta:
model = WebBasedTrainingBlock
model = PodcastBlock
class CompetenceBlockFactory(wagtail_factories.StructBlockFactory):
description = "Beispiel Kompetenz"
class Meta:
model = CompetenceBlock
class ExerciseBlockFactory(wagtail_factories.StructBlockFactory):
description = "Beispiel Aufgabe"
class Meta:
model = ExerciseBlock
class SelfEvaluationBlockFactory(wagtail_factories.StructBlockFactory):
description = "Beispiel Selbsteinschätzung"
class Meta:
model = SelfEvaluationBlock
class DocumentBlockFactory(wagtail_factories.StructBlockFactory):
description = "Beispiel Dokument"
class Meta:
model = DocumentBlock
class KnowledgeBlockFactory(wagtail_factories.StructBlockFactory):
description = "Beispiel Wissen"
class Meta:
model = KnowledgeBlock