added graphql fields for wagtail models

This commit is contained in:
Lorenz Padberg 2022-05-12 17:15:09 +02:00
parent cb0611ce6e
commit 1df0f47966
8 changed files with 241 additions and 44 deletions

View File

@ -0,0 +1,36 @@
# Generated by Django 3.2.12 on 2022-05-12 12:56
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('learnpath', '0002_fullfillmentcriteria_sort_order'),
]
operations = [
migrations.RemoveField(
model_name='learningunit',
name='learning_sequence',
),
migrations.CreateModel(
name='LearningPackage',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('sort_order', models.IntegerField(blank=True, editable=False, null=True)),
('title', models.CharField(default='', max_length=256)),
('learning_sequence', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='learning_packages', to='learnpath.learningsequence')),
],
options={
'ordering': ['sort_order'],
'abstract': False,
},
),
migrations.AddField(
model_name='learningunit',
name='learning_package',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='learning_units', to='learnpath.learningpackage'),
),
]

View File

@ -0,0 +1,19 @@
# Generated by Django 3.2.12 on 2022-05-12 12:56
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('learnpath', '0003_auto_20220512_1456'),
]
operations = [
migrations.AlterField(
model_name='learningpackage',
name='learning_sequence',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='learning_packages', to='learnpath.learningsequence'),
),
]

View File

@ -0,0 +1,19 @@
# Generated by Django 3.2.12 on 2022-05-12 12:56
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('learnpath', '0004_alter_learningpackage_learning_sequence'),
]
operations = [
migrations.AlterField(
model_name='learningunit',
name='learning_package',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='learning_units', to='learnpath.learningpackage'),
),
]

View File

@ -1,19 +1,22 @@
# Create your models here. # Create your models here.
from django.db import models from django.utils.text import slugify
from modelcluster.fields import ParentalKey
from wagtail.admin.edit_handlers import FieldPanel, StreamFieldPanel, InlinePanel
from wagtail.core.blocks import StreamBlock from wagtail.core.blocks import StreamBlock
from wagtail.core.fields import StreamField from wagtail.core.fields import StreamField
from wagtail.core.models import Page, Orderable from wagtail.core.models import Page, Orderable
from django.utils.text import slugify
from vbv_lernwelt.learnpath.models_learning_unit_content import WebBasedTrainingBlock, VideoBlock
from vbv_lernwelt.learnpath.models_competences import * from vbv_lernwelt.learnpath.models_competences import *
from vbv_lernwelt.learnpath.models_learning_unit_content import WebBasedTrainingBlock, VideoBlock
from grapple.helpers import register_query_field
import graphene
from grapple.models import (
GraphQLString, GraphQLPage,
GraphQLStreamfield, GraphQLBoolean, GraphQLInt, GraphQLForeignKey, GraphQLField
)
@register_query_field("learning_path")
class LearningPath(Page): class LearningPath(Page):
# PageChooserPanel('related_page', 'demo.PublisherPage'), # PageChooserPanel('related_page', 'demo.PublisherPage'),
@ -23,6 +26,10 @@ class LearningPath(Page):
subpage_types = ['learnpath.Circle'] subpage_types = ['learnpath.Circle']
graphql_fields = [
GraphQLString("title", required=True),
]
class Meta: class Meta:
verbose_name = "Learning Path" verbose_name = "Learning Path"
@ -45,6 +52,11 @@ class Topic(Orderable):
FieldPanel('is_visible'), FieldPanel('is_visible'),
] ]
graphql_fields = [
GraphQLString("title"),
GraphQLBoolean("is_visible"),
]
# content_panels = Page.content_panels + [ # content_panels = Page.content_panels + [
# FieldPanel('is_visible', classname="full"), # FieldPanel('is_visible', classname="full"),
# PageChooserPanel('learning_path', 'learnpath.LearningPath'), # PageChooserPanel('learning_path', 'learnpath.LearningPath'),
@ -56,7 +68,6 @@ class Topic(Orderable):
self.slug = find_available_slug(Topic, slugify(self.title, allow_unicode=True)) self.slug = find_available_slug(Topic, slugify(self.title, allow_unicode=True))
super(Topic, self).full_clean(*args, **kwargs) super(Topic, self).full_clean(*args, **kwargs)
class Meta: class Meta:
verbose_name = "Topic" verbose_name = "Topic"
@ -84,6 +95,13 @@ class Circle(Page, Orderable):
FieldPanel('goals'), FieldPanel('goals'),
InlinePanel('learning_sequences', label="Learning Sequences"), InlinePanel('learning_sequences', label="Learning Sequences"),
] ]
#
graphql_fields = [
GraphQLString("title", required=True),
GraphQLString("description"),
GraphQLString("goals"),
]
def full_clean(self, *args, **kwargs): def full_clean(self, *args, **kwargs):
self.slug = find_available_slug(Circle, slugify(self.title, allow_unicode=True)) self.slug = find_available_slug(Circle, slugify(self.title, allow_unicode=True))
@ -92,8 +110,6 @@ class Circle(Page, Orderable):
class Meta: class Meta:
verbose_name = "Circle" verbose_name = "Circle"
def __str__(self): def __str__(self):
return f"{self.title}" return f"{self.title}"
@ -121,9 +137,16 @@ class LearningSequence(Orderable):
on_delete=models.CASCADE, on_delete=models.CASCADE,
related_name='learning_sequences', related_name='learning_sequences',
) )
icon = ""
panels = [FieldPanel('title'), FieldPanel('category')] panels = [FieldPanel('title'), FieldPanel('category'), FieldPanel('circle')]
graphql_fields = [
GraphQLString("title", required=True),
GraphQLBoolean("category"),
]
class Meta: class Meta:
verbose_name = "Learning Sequence" verbose_name = "Learning Sequence"
@ -131,15 +154,46 @@ class LearningSequence(Orderable):
def __str__(self): def __str__(self):
return f"{self.title}" return f"{self.title}"
def full_clean(self, *args, **kwargs):
self.slug = find_available_slug(LearningSequence, slugify(self.title, allow_unicode=True))
super(LearningSequence, self).full_clean(*args, **kwargs)
class LearningPackage(Orderable):
title = models.CharField(max_length=256, default='')
class LearningUnit(Page, Orderable):
# TODO: Review model architecture, is the stream field the right thing here?
parent_page_types = ['learnpath.Circle']
learning_sequence = models.ForeignKey( learning_sequence = models.ForeignKey(
'learnpath.LearningSequence', 'learnpath.LearningSequence',
null=True, null=True,
blank=True, blank=True,
on_delete=models.CASCADE, on_delete=models.SET_NULL,
related_name='learning_packages',
)
panels = [FieldPanel('title')]
graphql_fields = [
GraphQLString("title", required=False),
]
def full_clean(self, *args, **kwargs):
self.slug = find_available_slug(LearningPackage, slugify(self.title, allow_unicode=True))
super(LearningPackage, self).full_clean(*args, **kwargs)
class LearningUnit(Page, Orderable):
"""
This is a group of contents, with the übung and test it is one unit. ... more of a structural charactacter.
"""
# TODO: Review model architecture, is the stream field the right thing here?
parent_page_types = ['learnpath.Circle']
learning_package = models.ForeignKey(
'learnpath.LearningPackage',
null=True,
blank=True,
on_delete=models.SET_NULL,
related_name='learning_units', related_name='learning_units',
) )
@ -153,10 +207,15 @@ class LearningUnit(Page, Orderable):
content_panels = [ content_panels = [
FieldPanel('title', classname="full title"), FieldPanel('title', classname="full title"),
FieldPanel('learning_sequence'), FieldPanel('learning_package'),
StreamFieldPanel('contents'), StreamFieldPanel('contents'),
] ]
graphql_fields = [
GraphQLString("title", required=True),
GraphQLStreamfield('contents')
]
subpage_types = [] subpage_types = []
class Meta: class Meta:
@ -170,6 +229,7 @@ class LearningUnit(Page, Orderable):
return f"{self.title}" return f"{self.title}"
def find_available_slug(model, requested_slug, ignore_page_id=None): def find_available_slug(model, requested_slug, ignore_page_id=None):
""" """
Finds an available slug within the specified parent. Finds an available slug within the specified parent.
@ -197,7 +257,6 @@ def find_available_slug(model, requested_slug, ignore_page_id=None):
slug = requested_slug slug = requested_slug
number = 1 number = 1
while slug in existing_slugs: while slug in existing_slugs:
slug = requested_slug + "-" + str(number) slug = requested_slug + "-" + str(number)
number += 1 number += 1

View File

@ -4,10 +4,7 @@ from wagtail.core.models import Site
from vbv_lernwelt.learnpath.models import LearningPath, Topic, Circle, LearningSequence, LearningUnit from vbv_lernwelt.learnpath.models import LearningPath, Topic, Circle, LearningSequence, LearningUnit
from vbv_lernwelt.learnpath.tests.create_default_competences import create_default_competences from vbv_lernwelt.learnpath.tests.create_default_competences import create_default_competences
from vbv_lernwelt.learnpath.tests.learningpath_factories import LearningPathFactory, TopicFactory, CircleFactory, \ from vbv_lernwelt.learnpath.tests.learningpath_factories import LearningPathFactory, TopicFactory, CircleFactory, \
LearningSequenceFactory, LearningUnitFactory, VideoBlockFactory, WebBasedTrainingBlockFactory LearningSequenceFactory, LearningUnitFactory, VideoBlockFactory, WebBasedTrainingBlockFactory, LearningPackageFactory
def create_default_learning_path(): def create_default_learning_path():
@ -27,10 +24,17 @@ def create_default_learning_path():
damit erfolgreich mit deinem Lernpfad starten kannst.""") damit erfolgreich mit deinem Lernpfad starten kannst.""")
ls_1 = LearningSequenceFactory(title='Einleitung', circle=circle_1) ls_1 = LearningSequenceFactory(title='Einleitung', circle=circle_1)
lu_1 = LearningUnitFactory(title="Herzlich Willkommmen", parent=circle_1, learning_sequence=ls_1)
lpck_1 = LearningPackageFactory(title="Wunderbar !", learning_sequence=ls_1)
lu_1 = LearningUnitFactory(title="Herzlich Willkommmen", parent=circle_1, learning_package=lpck_1)
lu_1 = LearningUnitFactory(title="Herzlich Willkommmen 1", parent=circle_1, learning_package=lpck_1)
lu_1 = LearningUnitFactory(title="Herzlich Willkommmen 2", parent=circle_1, learning_package=lpck_1)
ls_2 = LearningSequenceFactory(title='Grundlagen', circle=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) lpck_1 = LearningPackageFactory(title="Wunderbar !", learning_sequence=ls_2)
lu_1 = LearningUnitFactory(title="Aber jetzt, Butter bei die Fische", parent=circle_1, learning_package=lpck_1)
tp = TopicFactory(title="Gewinnen von Kunden", learning_path=lp) tp = TopicFactory(title="Gewinnen von Kunden", learning_path=lp)
@ -67,10 +71,10 @@ von Neukunden zu benützen
zu visualisieren""") zu visualisieren""")
sequence_1 = LearningSequenceFactory(title="Starten", circle=circle_4) sequence_1 = LearningSequenceFactory(title="Starten", circle=circle_4)
learning_unit = LearningUnitFactory(title='Einleitung Circle "Anlayse"', parent=circle_4, learning_sequence=sequence_1) lpck_1 = LearningPackageFactory(title="Wunderbar !", learning_sequence=sequence_1)
learning_unit.learning_sequence = sequence_1
learning_unit = LearningUnitFactory.create(title='** Einstieg Video"', parent=circle_4, learning_sequence=sequence_1) learning_unit = LearningUnitFactory(title='Einleitung Circle "Anlayse"', parent=circle_4, learning_package=lpck_1)
learning_unit = LearningUnitFactory.create(title='** Einstieg Video"', parent=circle_4, learning_package=lpck_1)
video_url = "https://www.vbv.ch/fileadmin/vbv/Videos/Statements_Externe/Janos_M/Testimonial_Janos_Mischler_PositiveEffekte.mp4" video_url = "https://www.vbv.ch/fileadmin/vbv/Videos/Statements_Externe/Janos_M/Testimonial_Janos_Mischler_PositiveEffekte.mp4"
video_title = "Ausbildung ist pflicht" 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_description = "Erfahren Sie, was für Janos Mischler die positiven Aspekte von ständiger Weiterbildung sind aus fachlicher und aus persönlicher Sicht."
@ -78,39 +82,56 @@ von Neukunden zu benützen
learning_unit.contents.append(('video', video_block)) learning_unit.contents.append(('video', video_block))
learning_unit.save() learning_unit.save()
learning_unit = LearningUnitFactory.create(title='** Web Based Training"', parent=circle_4, learning_sequence=sequence_1) learning_unit = LearningUnitFactory.create(title='** Web Based Training"', parent=circle_4, learning_package=lpck_1)
wbt_url = "web_based_trainings/rise_cmi5_test_export/scormcontent/index.html" wbt_url = "web_based_trainings/rise_cmi5_test_export/scormcontent/index.html"
wbt_block = WebBasedTrainingBlockFactory(type="web_based_training", url=wbt_url) wbt_block = WebBasedTrainingBlockFactory(type="web_based_training", url=wbt_url)
learning_unit.contents.append(('web_based_training', wbt_block)) learning_unit.contents.append(('web_based_training', wbt_block))
learning_unit.save() learning_unit.save()
learning_unit = LearningUnitFactory.create(title="Selbsteinschätzung", parent=circle_4, learning_sequence=sequence_1) learning_unit = LearningUnitFactory.create(title="Selbsteinschätzung", parent=circle_4, learning_package=lpck_1)
sequence_2 = LearningSequenceFactory.create(title="Beobachten", circle=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) lpck_1 = LearningPackageFactory(title="Wunderbar !", learning_sequence=sequence_2)
learning_unit = LearningUnitFactory.create(title="Sich selbständig machen", parent=circle_4, learning_sequence=sequence_2)
learning_unit = LearningUnitFactory.create(title="Mein Motorfahrzeug kaufen", parent=circle_4, learning_package=lpck_1)
learning_unit = LearningUnitFactory.create(title="Sich selbständig machen", parent=circle_4, learning_package=lpck_1)
sequence_3 = LearningSequenceFactory.create(title="Anwenden", circle=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) lpck_1 = LearningPackageFactory(title="Wunderbar !", 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) learning_unit = LearningUnitFactory.create(title="Nora kauft sich ein neues Auto", parent=circle_4, learning_package=lpck_1)
learning_unit = LearningUnitFactory.create(title="Manuel träumt von einem neuen Tesla", parent=circle_4, learning_package=lpck_1)
lpck_1 = LearningPackageFactory(title="Wunderbar !", learning_sequence=sequence_3)
learning_unit = LearningUnitFactory.create(title="Deine Erkenntnisse und Learnings", parent=circle_4, learning_package=lpck_1)
sequence_4 = LearningSequenceFactory.create(title="Üben", circle=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) lpck_1 = LearningPackageFactory(title="Wunderbar !", learning_sequence=sequence_4)
learning_unit = LearningUnitFactory.create(title="In Bildern Sprechen", parent=circle_4, learning_sequence=sequence_4) learning_unit = LearningUnitFactory.create(title="Ermittlung des Kundenbedarfs", parent=circle_4, learning_package=lpck_1)
learning_unit = LearningUnitFactory.create(title="Priorisieren des Bedarfs", parent=circle_4, learning_sequence=sequence_4) learning_unit = LearningUnitFactory.create(title="Aktives Zuhören", parent=circle_4, learning_package=lpck_1)
learning_unit = LearningUnitFactory.create(title="Zusammenfassung des Bedarfs", parent=circle_4, learning_sequence=sequence_4) learning_unit = LearningUnitFactory.create(title="In Bildern Sprechen", parent=circle_4, learning_package=lpck_1)
lpck_1 = LearningPackageFactory(title="Wunderbar !", learning_sequence=sequence_4)
learning_unit = LearningUnitFactory.create(title="Priorisieren des Bedarfs", parent=circle_4, learning_package=lpck_1)
learning_unit = LearningUnitFactory.create(title="Zusammenfassung des Bedarfs", parent=circle_4, learning_package=lpck_1)
sequence_5 = LearningSequenceFactory.create(title="Testen", circle=circle_4) sequence_5 = LearningSequenceFactory.create(title="Testen", circle=circle_4)
learning_unit = LearningUnitFactory.create(title="Bedarfsfragen", parent=circle_4, learning_sequence=sequence_5) lpck_1 = LearningPackageFactory(title="Wunderbar !", learning_sequence=sequence_5)
learning_unit = LearningUnitFactory.create(title="Andwendung der Fragetechniken", parent=circle_4, learning_sequence=sequence_5)
learning_unit = LearningUnitFactory.create(title="Bedarfsfragen", parent=circle_4, learning_package=lpck_1)
learning_unit = LearningUnitFactory.create(title="Andwendung der Fragetechniken", parent=circle_4, learning_package=lpck_1)
sequence_5 = LearningSequenceFactory.create(title="Vernetzen", circle=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) lpck_1 = LearningPackageFactory(title="Wunderbar !", learning_sequence=sequence_5)
learning_unit = LearningUnitFactory.create(title="Online Training", parent=circle_4, learning_package=lpck_1)
sequence_6 = LearningSequenceFactory.create(title="Beenden", circle=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) lpck_1 = LearningPackageFactory(title="Wunderbar !", learning_sequence=sequence_6)
learning_unit = LearningUnitFactory.create(title="Selbsteinschätzung", parent=circle_4, learning_package=lpck_1)
circle_5 = CircleFactory.create(title="Lösung", circle_5 = CircleFactory.create(title="Lösung",
parent=lp, parent=lp,

View File

@ -0,0 +1,20 @@
GET http://localhost:8000/graphql/
Accept: application/json
###
{
page(id: 8) {
children {
__typename
id
title
children {
__typename
id
title
}
}
}
}

View File

@ -0,0 +1,17 @@
{
page(id: 8) {
children {
__typename
id
title
children {
__typename
id
title
}
}
}
}

View File

@ -1,6 +1,6 @@
import wagtail_factories import wagtail_factories
import factory import factory
from vbv_lernwelt.learnpath.models import LearningPath, Topic, Circle, LearningSequence, LearningUnit from vbv_lernwelt.learnpath.models import LearningPath, Topic, Circle, LearningSequence, LearningUnit, LearningPackage
from vbv_lernwelt.learnpath.models_learning_unit_content import VideoBlock, WebBasedTrainingBlock from vbv_lernwelt.learnpath.models_learning_unit_content import VideoBlock, WebBasedTrainingBlock
@ -32,6 +32,12 @@ class LearningSequenceFactory(factory.django.DjangoModelFactory):
class Meta: class Meta:
model = LearningSequence model = LearningSequence
class LearningPackageFactory(factory.django.DjangoModelFactory):
title = "Whatever"
class Meta:
model = LearningPackage
class LearningUnitFactory(wagtail_factories.PageFactory): class LearningUnitFactory(wagtail_factories.PageFactory):
title = "Herzlich Willkommen" title = "Herzlich Willkommen"