Move common functions into Wagtail superclass

This commit is contained in:
Pawel Kowalski 2018-08-16 17:26:16 +02:00
parent 2157d4e630
commit 2f52f67b64
14 changed files with 91 additions and 134 deletions

View File

@ -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 from django.db import migrations, models
import django.db.models.deletion import django.db.models.deletion
import wagtail.core.blocks
import wagtail.core.fields import wagtail.core.fields
import wagtail.images.blocks
class Migration(migrations.Migration): class Migration(migrations.Migration):
@ -10,7 +12,7 @@ class Migration(migrations.Migration):
initial = True initial = True
dependencies = [ dependencies = [
('wagtailimages', '0020_add-verbose-name'), ('wagtailimages', '0021_image_file_hash'),
('wagtailcore', '0040_page_draft_title'), ('wagtailcore', '0040_page_draft_title'),
] ]
@ -37,6 +39,19 @@ class Migration(migrations.Migration):
}, },
bases=('wagtailcore.page',), 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( migrations.CreateModel(
name='Module', name='Module',
fields=[ fields=[

View File

@ -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',),
),
]

View File

@ -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),
),
]

View File

@ -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),
),
]

View File

@ -1,12 +1,13 @@
import logging import logging
from wagtail.admin.edit_handlers import FieldPanel, TabbedInterface, ObjectList 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__) logger = logging.getLogger(__name__)
class Book(Page): class Book(StrictHierarchyPage):
class Meta: class Meta:
verbose_name = 'Buch' verbose_name = 'Buch'
verbose_name_plural = 'Bücher' verbose_name_plural = 'Bücher'
@ -27,6 +28,3 @@ class Book(Page):
template = 'generic_page.html' template = 'generic_page.html'
subpage_types = ['book.Topic'] subpage_types = ['book.Topic']
def get_child_ids(self):
return self.get_children().values_list('id', flat=True)

View File

@ -1,13 +1,13 @@
import logging import logging
from wagtail.admin.edit_handlers import FieldPanel, TabbedInterface, \ from wagtail.admin.edit_handlers import FieldPanel, TabbedInterface, ObjectList
ObjectList
from wagtail.core.models import Page from core.wagtail_utils import StrictHierarchyPage
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
class Chapter(Page): class Chapter(StrictHierarchyPage):
class Meta: class Meta:
verbose_name = 'Kapitel' verbose_name = 'Kapitel'
verbose_name_plural = 'Kapitel' verbose_name_plural = 'Kapitel'
@ -30,9 +30,3 @@ class Chapter(Page):
parent_page_types = ['book.Module'] parent_page_types = ['book.Module']
subpage_types = ['book.ContentBlock'] 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()

View File

@ -1,19 +1,17 @@
import logging import logging
from django.db import models 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.fields import StreamField
from wagtail.core.models import Page
from wagtail.images.blocks import ImageChooserBlock from wagtail.images.blocks import ImageChooserBlock
from book.blocks import TextBlock, ModalTextBlock, StudentEntryBlock from book.blocks import TextBlock, ModalTextBlock, StudentEntryBlock
from core.wagtail_utils import StrictHierarchyPage
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
class ContentBlock(Page): class ContentBlock(StrictHierarchyPage):
class Meta: class Meta:
verbose_name = 'Inhaltsblock' verbose_name = 'Inhaltsblock'
verbose_name_plural = 'Inhaltsblöcke' verbose_name_plural = 'Inhaltsblöcke'
@ -55,6 +53,3 @@ class ContentBlock(Page):
parent_page_types = ['book.Chapter'] parent_page_types = ['book.Chapter']
@classmethod
def get_chapter_content_blocks(cls, chapter):
return cls.objects.filter(id__in=chapter.get_child_ids()).live()

View File

@ -1,18 +1,17 @@
import logging import logging
from django.db import models from django.db import models
from wagtail.admin.edit_handlers import FieldPanel, TabbedInterface, \ from wagtail.admin.edit_handlers import FieldPanel, TabbedInterface, ObjectList
ObjectList
from wagtail.core.fields import RichTextField from wagtail.core.fields import RichTextField
from wagtail.core.models import Page
from wagtail.images.edit_handlers import ImageChooserPanel from wagtail.images.edit_handlers import ImageChooserPanel
from book.blocks import DEFAULT_RICH_TEXT_FEATURES from book.blocks import DEFAULT_RICH_TEXT_FEATURES
from core.wagtail_utils import StrictHierarchyPage
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
class Module(Page): class Module(StrictHierarchyPage):
class Meta: class Meta:
verbose_name = 'Modul' verbose_name = 'Modul'
verbose_name_plural = 'Module' verbose_name_plural = 'Module'
@ -57,7 +56,3 @@ class Module(Page):
def get_child_ids(self): def get_child_ids(self):
return self.get_children().values_list('id', flat=True) 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()

View File

@ -1,17 +1,16 @@
import logging import logging
from django.db import models from django.db import models
from wagtail.admin.edit_handlers import FieldPanel, TabbedInterface, \ from wagtail.admin.edit_handlers import FieldPanel, TabbedInterface, ObjectList
ObjectList
from wagtail.core.fields import RichTextField from wagtail.core.fields import RichTextField
from wagtail.core.models import Page
from book.blocks import DEFAULT_RICH_TEXT_FEATURES from book.blocks import DEFAULT_RICH_TEXT_FEATURES
from core.wagtail_utils import StrictHierarchyPage
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
class Topic(Page): class Topic(StrictHierarchyPage):
class Meta: class Meta:
verbose_name = 'Thema' verbose_name = 'Thema'
verbose_name_plural = 'Themen' verbose_name_plural = 'Themen'
@ -40,10 +39,3 @@ class Topic(Page):
parent_page_types = ['book.Book'] parent_page_types = ['book.Book']
subpage_types = ['book.Module'] 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()

View File

@ -32,7 +32,7 @@ class ChapterNode(DjangoObjectType):
interfaces = (relay.Node,) interfaces = (relay.Node,)
def resolve_content_blocks(self, *args, **kwargs): def resolve_content_blocks(self, *args, **kwargs):
return ContentBlock.get_chapter_content_blocks(self) return ContentBlock.get_by_parent(self)
class ModuleNode(DjangoObjectType): class ModuleNode(DjangoObjectType):
@ -59,7 +59,7 @@ class ModuleNode(DjangoObjectType):
return self.hero_image.file.url return self.hero_image.file.url
def resolve_chapters(self, *args, **kwargs): def resolve_chapters(self, *args, **kwargs):
return Chapter.get_module_chapters(self) return Chapter.get_by_parent(self)
class TopicNode(DjangoObjectType): class TopicNode(DjangoObjectType):
@ -81,7 +81,7 @@ class TopicNode(DjangoObjectType):
return self.id return self.id
def resolve_modules(self, *args, **kwargs): def resolve_modules(self, *args, **kwargs):
return Module.get_topic_modules(self) return Module.get_by_parent(self)
class BookNode(DjangoObjectType): class BookNode(DjangoObjectType):
@ -103,7 +103,7 @@ class BookNode(DjangoObjectType):
return self.id return self.id
def resolve_topics(self, *args, **kwargs): def resolve_topics(self, *args, **kwargs):
return Topic.get_book_topics(self) return Topic.get_by_parent(self)
class BookQuery(object): class BookQuery(object):

View File

@ -1,4 +1,17 @@
from django.contrib import admin 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): def wagtail_parent_filter(parent_cls, child_cls):

View File

@ -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 from django.db import migrations, models
import django.db.models.deletion import django.db.models.deletion
@ -10,8 +9,6 @@ class Migration(migrations.Migration):
initial = True initial = True
dependencies = [ dependencies = [
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
('book', '0001_initial'),
] ]
operations = [ operations = [
@ -31,8 +28,6 @@ class Migration(migrations.Migration):
fields=[ fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('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')), ('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={ options={
'verbose_name': 'Lernziel Gruppe', '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')), ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('done', models.BooleanField(default=False, verbose_name='Lernziel erledigt?')), ('done', models.BooleanField(default=False, verbose_name='Lernziel erledigt?')),
('objective', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='objectives.Objective')), ('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={ options={
'verbose_name': 'Lernzielstatus', 'verbose_name': 'Lernzielstatus',
'verbose_name_plural': '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'),
),
] ]

View File

@ -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'),
),
]

View File

@ -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.models
import django.contrib.auth.validators import django.contrib.auth.validators