diff --git a/server/config/settings/base.py b/server/config/settings/base.py index 3149af31..1f5b6845 100644 --- a/server/config/settings/base.py +++ b/server/config/settings/base.py @@ -103,7 +103,7 @@ THIRD_PARTY_APPS = [ LOCAL_APPS = [ "vbv_lernwelt.core", "vbv_lernwelt.simpletodo", - # Your stuff: custom apps go here + "vbv_lernwelt.learnpath", ] # https://docs.djangoproject.com/en/dev/ref/settings/#installed-apps INSTALLED_APPS = DJANGO_APPS + THIRD_PARTY_APPS + LOCAL_APPS diff --git a/server/vbv_lernwelt/learnpath/apps.py b/server/vbv_lernwelt/learnpath/apps.py index ee511faf..384ba36a 100644 --- a/server/vbv_lernwelt/learnpath/apps.py +++ b/server/vbv_lernwelt/learnpath/apps.py @@ -3,4 +3,11 @@ from django.apps import AppConfig class LearnpathConfig(AppConfig): default_auto_field = 'django.db.models.BigAutoField' - name = 'learnpath' + name = 'vbv_lernwelt.learnpath' + + def ready(self): + try: + # pylint: disable=unused-import,import-outside-toplevel + import vbv_lernwelt.learnpath.signals # noqa F401 + except ImportError: + pass diff --git a/server/vbv_lernwelt/learnpath/migrations/0001_initial.py b/server/vbv_lernwelt/learnpath/migrations/0001_initial.py new file mode 100644 index 00000000..b48e97d9 --- /dev/null +++ b/server/vbv_lernwelt/learnpath/migrations/0001_initial.py @@ -0,0 +1,79 @@ +# Generated by Django 3.2.12 on 2022-03-29 09:21 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ('wagtailcore', '0066_collection_management_permissions'), + ] + + operations = [ + migrations.CreateModel( + name='LearnBlock', + 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')), + ('internal_name', models.CharField(max_length=255)), + ], + options={ + 'abstract': False, + }, + bases=('wagtailcore.page',), + ), + migrations.CreateModel( + name='Circle', + fields=[ + ('learnblock_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='learnpath.learnblock')), + ('description', models.TextField(default='')), + ], + options={ + 'abstract': False, + }, + bases=('learnpath.learnblock',), + ), + migrations.CreateModel( + name='LearnPath', + fields=[ + ('learnblock_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='learnpath.learnblock')), + ], + options={ + 'abstract': False, + }, + bases=('learnpath.learnblock',), + ), + migrations.CreateModel( + name='LearnSequence', + fields=[ + ('learnblock_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='learnpath.learnblock')), + ], + options={ + 'abstract': False, + }, + bases=('learnpath.learnblock',), + ), + migrations.CreateModel( + name='LearnUnit', + fields=[ + ('learnblock_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='learnpath.learnblock')), + ], + options={ + 'abstract': False, + }, + bases=('learnpath.learnblock',), + ), + migrations.CreateModel( + name='Topic', + fields=[ + ('learnblock_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='learnpath.learnblock')), + ('is_visible', models.BooleanField(default=True)), + ], + options={ + 'abstract': False, + }, + bases=('learnpath.learnblock',), + ), + ] diff --git a/server/vbv_lernwelt/learnpath/migrations/0002_auto_20220329_1506.py b/server/vbv_lernwelt/learnpath/migrations/0002_auto_20220329_1506.py new file mode 100644 index 00000000..2ef45943 --- /dev/null +++ b/server/vbv_lernwelt/learnpath/migrations/0002_auto_20220329_1506.py @@ -0,0 +1,55 @@ +# Generated by Django 3.2.12 on 2022-03-29 13:06 + +from django.conf import settings +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('wagtailcore', '0066_collection_management_permissions'), + ('wagtailredirects', '0007_add_autocreate_fields'), + ('contenttypes', '0002_remove_content_type_name'), + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('wagtailforms', '0004_add_verbose_name_plural'), + ('learnpath', '0001_initial'), + ] + + operations = [ + migrations.RenameModel( + old_name='LearnPath', + new_name='LearningPath', + ), + migrations.RenameModel( + old_name='LearnSequence', + new_name='LearningSequence', + ), + migrations.RenameModel( + old_name='LearnUnit', + new_name='LearningUnit', + ), + migrations.AlterModelOptions( + name='circle', + options={'verbose_name': 'Circle'}, + ), + migrations.AlterModelOptions( + name='learningpath', + options={'verbose_name': 'Learning Path'}, + ), + migrations.AlterModelOptions( + name='learningsequence', + options={'verbose_name': 'homepage'}, + ), + migrations.AlterModelOptions( + name='learningunit', + options={'verbose_name': 'Learning Unig'}, + ), + migrations.AlterModelOptions( + name='topic', + options={'verbose_name': 'Topic'}, + ), + migrations.RemoveField( + model_name='learnblock', + name='internal_name', + ), + ] diff --git a/server/vbv_lernwelt/learnpath/models.py b/server/vbv_lernwelt/learnpath/models.py index 952e11ea..4a7f5e8e 100644 --- a/server/vbv_lernwelt/learnpath/models.py +++ b/server/vbv_lernwelt/learnpath/models.py @@ -1,47 +1,80 @@ # Create your models here. -import uuid from django.db import models +from wagtail.core.models import Page +from wagtail.admin.edit_handlers import FieldPanel +# +# +# class LearnBlock(Page): +# pass +# # id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False) +# -class LearnBlock: - id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False) - internal_name = models.CharField(max_length=255) - title = models.CharField(max_length=255) +class LearningPath(Page): + content_panels = Page.content_panels + [ + FieldPanel('title', classname="full"), + ] + subpage_types = ['learnpath.Topic'] -class LearnPath(LearnBlock): + class Meta: + verbose_name = "Learning Path" def __str__(self): return f"{self.title}" -class Topic(LearnBlock): - learn_path = models.ForeignKey(LearnPath, on_delete=models.CASCADE) +class Topic(Page): is_visible = models.BooleanField(default=True) + + content_panels = Page.content_panels + [ + FieldPanel('is_visible', classname="full"), + ] + + parent_page_types = ['learnpath.LearningPath'] + subpage_types = ['learnpath.Circle'] + + class Meta: + verbose_name = "Topic" + def __str__(self): return f"{self.title}" -class Circle(LearnBlock): - topic = models.ForeignKey(Topic, on_delete=models.CASCADE) +# TODO: Ordering + +class Circle(Page): description = models.TextField(default="") - def __str__(self): - return f"{self.title}" + parent_page_types = ['learnpath.Topic'] + subpage_types = ['learnpath.LearningSequence'] - -class LearnSequence(LearnBlock): - circle = models.ForeignKey(Circle, on_delete=models.CASCADE) + class Meta: + verbose_name = "Circle" def __str__(self): return f"{self.title}" -class LernUnit(LearnBlock): - learn_sequence = models.ForeignKey(LearnSequence, on_delete=models.CASCADE) +class LearningSequence(Page): + parent_page_types = ['learnpath.Circle'] + subpage_types = ['learnpath.LearningUnit'] + + class Meta: + verbose_name = "homepage" + + def __str__(self): + return f"{self.title}" + + +class LearningUnit(Page): + parent_page_types = ['learnpath.Circle'] + + class Meta: + verbose_name = "Learning Unig" def __str__(self): return f"{self.title}" diff --git a/server/vbv_lernwelt/learnpath/tests/__init__.py b/server/vbv_lernwelt/learnpath/tests/__init__.py new file mode 100644 index 00000000..33212a11 --- /dev/null +++ b/server/vbv_lernwelt/learnpath/tests/__init__.py @@ -0,0 +1,9 @@ +# -*- coding: utf-8 -*- +# +# Iterativ GmbH +# http://www.iterativ.ch/ +# +# Copyright (c) 2015 Iterativ GmbH. All rights reserved. +# +# Created on 2022-03-29 +# @author: lorenz.padberg@iterativ.ch diff --git a/server/vbv_lernwelt/learnpath/tests/creat_default_learning_path.py b/server/vbv_lernwelt/learnpath/tests/creat_default_learning_path.py new file mode 100644 index 00000000..7d4c696d --- /dev/null +++ b/server/vbv_lernwelt/learnpath/tests/creat_default_learning_path.py @@ -0,0 +1,5 @@ +from server.vbv_lernwelt.learnpath.tests.learningpath_factories import LearningPathFactory + + +def create_default_learning_path(): + lp = LearningPathFactory(title="Versicherungsvermittler/in") diff --git a/server/vbv_lernwelt/learnpath/tests/learningpath_factories.py b/server/vbv_lernwelt/learnpath/tests/learningpath_factories.py new file mode 100644 index 00000000..e28d3228 --- /dev/null +++ b/server/vbv_lernwelt/learnpath/tests/learningpath_factories.py @@ -0,0 +1,9 @@ + +import factory + +from server.vbv_lernwelt.learnpath.models import LearningPath + + +class LearningPathFactory(factory.django.DjangoModelFactory): + class Meta: + model = LearningPath diff --git a/server/vbv_lernwelt/learnpath/tests/test_create_default_learning_path.py b/server/vbv_lernwelt/learnpath/tests/test_create_default_learning_path.py new file mode 100644 index 00000000..2e5ca4ce --- /dev/null +++ b/server/vbv_lernwelt/learnpath/tests/test_create_default_learning_path.py @@ -0,0 +1,23 @@ +# -*- coding: utf-8 -*- +# +# Iterativ GmbH +# http://www.iterativ.ch/ +# +# Copyright (c) 2015 Iterativ GmbH. All rights reserved. +# +# Created on 2022-03-29 +# @author: lorenz.padberg@iterativ.ch + + +from django.test import TestCase + +from server.vbv_lernwelt.learnpath.models import LearningPath +from server.vbv_lernwelt.learnpath.tests.creat_default_learning_path import create_default_learning_path + + +class TestCreateDefaultLearningPaths(TestCase): + def test_create_learning_path(self): + create_default_learning_path() + self.assertTrue(LearningPath.objects.filter(title="Versicherungsvermittler/in").exist()) + + diff --git a/server/vbv_lernwelt/learnpath/tests/test_factories.py b/server/vbv_lernwelt/learnpath/tests/test_factories.py new file mode 100644 index 00000000..33212a11 --- /dev/null +++ b/server/vbv_lernwelt/learnpath/tests/test_factories.py @@ -0,0 +1,9 @@ +# -*- coding: utf-8 -*- +# +# Iterativ GmbH +# http://www.iterativ.ch/ +# +# Copyright (c) 2015 Iterativ GmbH. All rights reserved. +# +# Created on 2022-03-29 +# @author: lorenz.padberg@iterativ.ch