diff --git a/server/book/migrations/0001_initial.py b/server/book/migrations/0001_initial.py index 41987db3..c9c33c82 100644 --- a/server/book/migrations/0001_initial.py +++ b/server/book/migrations/0001_initial.py @@ -1,8 +1,10 @@ -# Generated by Django 2.0.6 on 2018-08-14 14:08 +# Generated by Django 2.0.6 on 2018-08-16 15:24 from django.db import migrations, models import django.db.models.deletion +import wagtail.core.blocks import wagtail.core.fields +import wagtail.images.blocks class Migration(migrations.Migration): @@ -10,7 +12,7 @@ class Migration(migrations.Migration): initial = True dependencies = [ - ('wagtailimages', '0020_add-verbose-name'), + ('wagtailimages', '0021_image_file_hash'), ('wagtailcore', '0040_page_draft_title'), ] @@ -37,6 +39,19 @@ class Migration(migrations.Migration): }, bases=('wagtailcore.page',), ), + migrations.CreateModel( + name='ContentBlock', + 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([('text_block', wagtail.core.blocks.StructBlock([('text', wagtail.core.blocks.RichTextBlock())], icon='doc-full')), ('modal_text', wagtail.core.blocks.StructBlock([('description', wagtail.core.blocks.RichTextBlock()), ('url', wagtail.core.blocks.URLBlock())], icon='placeholder')), ('student_entry', wagtail.core.blocks.StructBlock([('task_text', wagtail.core.blocks.RichTextBlock())], icon='download')), ('image_block', wagtail.images.blocks.ImageChooserBlock(icon='image')), ('task', wagtail.core.blocks.StructBlock([('text', wagtail.core.blocks.RichTextBlock())], icon='tick'))], blank=True, null=True)), + ('type', models.CharField(choices=[('plain', 'Normal'), ('yellow', 'Gelb'), ('green', 'Grün'), ('blue', 'Blau')], max_length=100)), + ], + options={ + 'verbose_name': 'Inhaltsblock', + 'verbose_name_plural': 'Inhaltsblöcke', + }, + bases=('wagtailcore.page',), + ), migrations.CreateModel( name='Module', fields=[ diff --git a/server/book/migrations/0002_contentblock.py b/server/book/migrations/0002_contentblock.py deleted file mode 100644 index 8b4dd024..00000000 --- a/server/book/migrations/0002_contentblock.py +++ /dev/null @@ -1,31 +0,0 @@ -# Generated by Django 2.0.6 on 2018-08-15 08:45 - -from django.db import migrations, models -import django.db.models.deletion -import wagtail.core.blocks -import wagtail.core.fields -import wagtail.images.blocks - - -class Migration(migrations.Migration): - - dependencies = [ - ('wagtailcore', '0040_page_draft_title'), - ('book', '0001_initial'), - ] - - operations = [ - migrations.CreateModel( - name='ContentBlock', - 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([('text', wagtail.core.blocks.StructBlock([('text', wagtail.core.blocks.RichTextBlock())], icon='doc-full')), ('modal_text', wagtail.core.blocks.StructBlock([('description', wagtail.core.blocks.RichTextBlock()), ('modal_content', wagtail.core.blocks.RichTextBlock())], icon='placeholder')), ('student_entry', wagtail.core.blocks.StructBlock([('task_text', wagtail.core.blocks.CharBlock())], icon='download')), ('image', wagtail.images.blocks.ImageChooserBlock(icon='image')), ('task', wagtail.core.blocks.StructBlock([('text', wagtail.core.blocks.RichTextBlock())], icon='tick'))])), - ('type', models.CharField(choices=[('plain', 'Normal'), ('yellow', 'Gelb'), ('green', 'Grün'), ('blue', 'Blau')], max_length=100)), - ], - options={ - 'verbose_name_plural': 'Inhaltsblöcke', - 'verbose_name': 'Inhaltsblock', - }, - bases=('wagtailcore.page',), - ), - ] diff --git a/server/book/migrations/0003_auto_20180815_1349.py b/server/book/migrations/0003_auto_20180815_1349.py deleted file mode 100644 index d4960603..00000000 --- a/server/book/migrations/0003_auto_20180815_1349.py +++ /dev/null @@ -1,21 +0,0 @@ -# Generated by Django 2.0.6 on 2018-08-15 13:49 - -from django.db import migrations -import wagtail.core.blocks -import wagtail.core.fields -import wagtail.images.blocks - - -class Migration(migrations.Migration): - - dependencies = [ - ('book', '0002_contentblock'), - ] - - operations = [ - migrations.AlterField( - model_name='contentblock', - name='contents', - field=wagtail.core.fields.StreamField([('text_block', wagtail.core.blocks.StructBlock([('text', wagtail.core.blocks.RichTextBlock())], icon='doc-full')), ('modal_text', wagtail.core.blocks.StructBlock([('description', wagtail.core.blocks.RichTextBlock()), ('modal_content', wagtail.core.blocks.RichTextBlock())], icon='placeholder')), ('student_entry', wagtail.core.blocks.StructBlock([('task_text', wagtail.core.blocks.CharBlock())], icon='download')), ('image', wagtail.images.blocks.ImageChooserBlock(icon='image')), ('task', wagtail.core.blocks.StructBlock([('text', wagtail.core.blocks.RichTextBlock())], icon='tick'))], blank=True, null=True), - ), - ] diff --git a/server/book/migrations/0004_auto_20180815_1629.py b/server/book/migrations/0004_auto_20180815_1629.py deleted file mode 100644 index 8a1b6d6e..00000000 --- a/server/book/migrations/0004_auto_20180815_1629.py +++ /dev/null @@ -1,21 +0,0 @@ -# Generated by Django 2.0.6 on 2018-08-15 16:29 - -from django.db import migrations -import wagtail.core.blocks -import wagtail.core.fields -import wagtail.images.blocks - - -class Migration(migrations.Migration): - - dependencies = [ - ('book', '0003_auto_20180815_1349'), - ] - - operations = [ - migrations.AlterField( - model_name='contentblock', - name='contents', - field=wagtail.core.fields.StreamField([('text_block', wagtail.core.blocks.StructBlock([('text', wagtail.core.blocks.RichTextBlock())], icon='doc-full')), ('modal_text', wagtail.core.blocks.StructBlock([('description', wagtail.core.blocks.RichTextBlock()), ('modal_content', wagtail.core.blocks.RichTextBlock())], icon='placeholder')), ('student_entry', wagtail.core.blocks.StructBlock([('task_text', wagtail.core.blocks.CharBlock())], icon='download')), ('image_block', wagtail.images.blocks.ImageChooserBlock(icon='image')), ('task', wagtail.core.blocks.StructBlock([('text', wagtail.core.blocks.RichTextBlock())], icon='tick'))], blank=True, null=True), - ), - ] diff --git a/server/book/models/book.py b/server/book/models/book.py index 1d1916d9..2ba40052 100644 --- a/server/book/models/book.py +++ b/server/book/models/book.py @@ -1,12 +1,13 @@ import logging from wagtail.admin.edit_handlers import FieldPanel, TabbedInterface, ObjectList -from wagtail.core.models import Page + +from core.wagtail_utils import StrictHierarchyPage logger = logging.getLogger(__name__) -class Book(Page): +class Book(StrictHierarchyPage): class Meta: verbose_name = 'Buch' verbose_name_plural = 'Bücher' @@ -27,6 +28,3 @@ class Book(Page): template = 'generic_page.html' subpage_types = ['book.Topic'] - - def get_child_ids(self): - return self.get_children().values_list('id', flat=True) diff --git a/server/book/models/chapter.py b/server/book/models/chapter.py index 803404d4..e257d1f8 100644 --- a/server/book/models/chapter.py +++ b/server/book/models/chapter.py @@ -1,13 +1,13 @@ import logging -from wagtail.admin.edit_handlers import FieldPanel, TabbedInterface, \ - ObjectList -from wagtail.core.models import Page +from wagtail.admin.edit_handlers import FieldPanel, TabbedInterface, ObjectList + +from core.wagtail_utils import StrictHierarchyPage logger = logging.getLogger(__name__) -class Chapter(Page): +class Chapter(StrictHierarchyPage): class Meta: verbose_name = 'Kapitel' verbose_name_plural = 'Kapitel' @@ -30,9 +30,3 @@ class Chapter(Page): parent_page_types = ['book.Module'] subpage_types = ['book.ContentBlock'] - def get_child_ids(self): - return self.get_children().values_list('id', flat=True) - - @classmethod - def get_module_chapters(cls, module): - return cls.objects.filter(id__in=module.get_child_ids()).live() diff --git a/server/book/models/contentblock.py b/server/book/models/contentblock.py index ed6129d2..ae0dba66 100644 --- a/server/book/models/contentblock.py +++ b/server/book/models/contentblock.py @@ -1,19 +1,17 @@ import logging from django.db import models - -from wagtail.admin.edit_handlers import FieldPanel, TabbedInterface, \ - ObjectList, StreamFieldPanel +from wagtail.admin.edit_handlers import FieldPanel, TabbedInterface, ObjectList, StreamFieldPanel from wagtail.core.fields import StreamField -from wagtail.core.models import Page from wagtail.images.blocks import ImageChooserBlock from book.blocks import TextBlock, ModalTextBlock, StudentEntryBlock +from core.wagtail_utils import StrictHierarchyPage logger = logging.getLogger(__name__) -class ContentBlock(Page): +class ContentBlock(StrictHierarchyPage): class Meta: verbose_name = 'Inhaltsblock' verbose_name_plural = 'Inhaltsblöcke' @@ -55,6 +53,3 @@ class ContentBlock(Page): parent_page_types = ['book.Chapter'] - @classmethod - def get_chapter_content_blocks(cls, chapter): - return cls.objects.filter(id__in=chapter.get_child_ids()).live() diff --git a/server/book/models/module.py b/server/book/models/module.py index 328f08c0..6866db6c 100644 --- a/server/book/models/module.py +++ b/server/book/models/module.py @@ -1,18 +1,17 @@ import logging from django.db import models -from wagtail.admin.edit_handlers import FieldPanel, TabbedInterface, \ - ObjectList +from wagtail.admin.edit_handlers import FieldPanel, TabbedInterface, ObjectList from wagtail.core.fields import RichTextField -from wagtail.core.models import Page from wagtail.images.edit_handlers import ImageChooserPanel from book.blocks import DEFAULT_RICH_TEXT_FEATURES +from core.wagtail_utils import StrictHierarchyPage logger = logging.getLogger(__name__) -class Module(Page): +class Module(StrictHierarchyPage): class Meta: verbose_name = 'Modul' verbose_name_plural = 'Module' @@ -57,7 +56,3 @@ class Module(Page): def get_child_ids(self): return self.get_children().values_list('id', flat=True) - - @classmethod - def get_topic_modules(cls, topic): - return cls.objects.filter(id__in=topic.get_child_ids()).live() diff --git a/server/book/models/topic.py b/server/book/models/topic.py index 8f2de09c..e2d8d0d0 100644 --- a/server/book/models/topic.py +++ b/server/book/models/topic.py @@ -1,17 +1,16 @@ import logging from django.db import models -from wagtail.admin.edit_handlers import FieldPanel, TabbedInterface, \ - ObjectList +from wagtail.admin.edit_handlers import FieldPanel, TabbedInterface, ObjectList from wagtail.core.fields import RichTextField -from wagtail.core.models import Page from book.blocks import DEFAULT_RICH_TEXT_FEATURES +from core.wagtail_utils import StrictHierarchyPage logger = logging.getLogger(__name__) -class Topic(Page): +class Topic(StrictHierarchyPage): class Meta: verbose_name = 'Thema' verbose_name_plural = 'Themen' @@ -40,10 +39,3 @@ class Topic(Page): parent_page_types = ['book.Book'] subpage_types = ['book.Module'] - - def get_child_ids(self): - return self.get_children().values_list('id', flat=True) - - @classmethod - def get_book_topics(cls, book): - return cls.objects.filter(id__in=book.get_child_ids()).live() diff --git a/server/book/schema.py b/server/book/schema.py index 91977615..cf44b4c9 100644 --- a/server/book/schema.py +++ b/server/book/schema.py @@ -32,7 +32,7 @@ class ChapterNode(DjangoObjectType): interfaces = (relay.Node,) def resolve_content_blocks(self, *args, **kwargs): - return ContentBlock.get_chapter_content_blocks(self) + return ContentBlock.get_by_parent(self) class ModuleNode(DjangoObjectType): @@ -59,7 +59,7 @@ class ModuleNode(DjangoObjectType): return self.hero_image.file.url def resolve_chapters(self, *args, **kwargs): - return Chapter.get_module_chapters(self) + return Chapter.get_by_parent(self) class TopicNode(DjangoObjectType): @@ -81,7 +81,7 @@ class TopicNode(DjangoObjectType): return self.id def resolve_modules(self, *args, **kwargs): - return Module.get_topic_modules(self) + return Module.get_by_parent(self) class BookNode(DjangoObjectType): @@ -103,7 +103,7 @@ class BookNode(DjangoObjectType): return self.id def resolve_topics(self, *args, **kwargs): - return Topic.get_book_topics(self) + return Topic.get_by_parent(self) class BookQuery(object): diff --git a/server/core/wagtail_utils.py b/server/core/wagtail_utils.py index 0a0f7d13..8269b6c9 100644 --- a/server/core/wagtail_utils.py +++ b/server/core/wagtail_utils.py @@ -1,4 +1,17 @@ from django.contrib import admin +from wagtail.core.models import Page + + +class StrictHierarchyPage(Page): + class Meta: + abstract = True + + def get_child_ids(self): + return self.get_children().values_list('id', flat=True) + + @classmethod + def get_by_parent(cls, parent): + return cls.objects.filter(id__in=parent.get_child_ids()).live() def wagtail_parent_filter(parent_cls, child_cls): diff --git a/server/objectives/migrations/0001_initial.py b/server/objectives/migrations/0001_initial.py index b09d89c8..176ab88c 100644 --- a/server/objectives/migrations/0001_initial.py +++ b/server/objectives/migrations/0001_initial.py @@ -1,6 +1,5 @@ -# Generated by Django 2.0.6 on 2018-08-14 14:08 +# Generated by Django 2.0.6 on 2018-08-16 15:24 -from django.conf import settings from django.db import migrations, models import django.db.models.deletion @@ -10,8 +9,6 @@ class Migration(migrations.Migration): initial = True dependencies = [ - migrations.swappable_dependency(settings.AUTH_USER_MODEL), - ('book', '0001_initial'), ] operations = [ @@ -31,8 +28,6 @@ class Migration(migrations.Migration): fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('title', models.CharField(blank=True, max_length=255, verbose_name='title')), - ('module', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='book.Module')), - ('user', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), ], options={ 'verbose_name': 'Lernziel Gruppe', @@ -45,16 +40,10 @@ class Migration(migrations.Migration): ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('done', models.BooleanField(default=False, verbose_name='Lernziel erledigt?')), ('objective', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='objectives.Objective')), - ('user', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), ], options={ 'verbose_name': 'Lernzielstatus', 'verbose_name_plural': 'Lernzielstatus', }, ), - migrations.AddField( - model_name='objective', - name='group', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='objectives.ObjectiveGroup'), - ), ] diff --git a/server/objectives/migrations/0002_auto_20180816_1524.py b/server/objectives/migrations/0002_auto_20180816_1524.py new file mode 100644 index 00000000..da762841 --- /dev/null +++ b/server/objectives/migrations/0002_auto_20180816_1524.py @@ -0,0 +1,39 @@ +# Generated by Django 2.0.6 on 2018-08-16 15:24 + +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('book', '0001_initial'), + ('objectives', '0001_initial'), + ] + + operations = [ + migrations.AddField( + model_name='objectiveprogressstatus', + name='user', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL), + ), + migrations.AddField( + model_name='objectivegroup', + name='module', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='book.Module'), + ), + migrations.AddField( + model_name='objectivegroup', + name='user', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL), + ), + migrations.AddField( + model_name='objective', + name='group', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='objectives.ObjectiveGroup'), + ), + ] diff --git a/server/user/migrations/0001_initial.py b/server/user/migrations/0001_initial.py index 89defd54..67ac96ff 100644 --- a/server/user/migrations/0001_initial.py +++ b/server/user/migrations/0001_initial.py @@ -1,4 +1,4 @@ -# Generated by Django 2.0.6 on 2018-08-14 12:41 +# Generated by Django 2.0.6 on 2018-08-16 15:24 import django.contrib.auth.models import django.contrib.auth.validators