diff --git a/server/book/admin.py b/server/book/admin.py index d45bcd4d..4d60c5ed 100644 --- a/server/book/admin.py +++ b/server/book/admin.py @@ -1,6 +1,7 @@ from django.contrib import admin from book.models import Book, Topic, Module +from book.models.chapter import Chapter from core.wagtail_utils import wagtail_parent_filter @@ -19,3 +20,9 @@ class TopicAdmin(admin.ModelAdmin): class ModuleAdmin(admin.ModelAdmin): list_display = ('title', 'slug', 'meta_title', 'teaser') list_filter = (wagtail_parent_filter(Topic, Module),) + + +@admin.register(Chapter) +class ChapterAdmin(admin.ModelAdmin): + list_display = ('title', 'slug') + list_filter = (wagtail_parent_filter(Module, Chapter),) diff --git a/server/book/factories.py b/server/book/factories.py index 16e1b381..a67f9061 100644 --- a/server/book/factories.py +++ b/server/book/factories.py @@ -27,6 +27,6 @@ class ModuleFactory(BasePageFactory): order = 0 meta_title = factory.LazyAttribute(lambda x: fake.text(max_nb_chars=20)) teaser = factory.LazyAttribute(lambda x: fake.sentence(nb_words=random.randint(8, 12))) - description = factory.LazyAttribute(lambda x: fake.text(max_nb_chars=200)) + intro = factory.LazyAttribute(lambda x: fake.text(max_nb_chars=200)) hero_image = factory.SubFactory(DummyImageFactory) diff --git a/server/book/migrations/0001_initial.py b/server/book/migrations/0001_initial.py index 78cc0c7d..49876159 100644 --- a/server/book/migrations/0001_initial.py +++ b/server/book/migrations/0001_initial.py @@ -1,4 +1,4 @@ -# Generated by Django 2.0.6 on 2018-08-08 09:26 +# Generated by Django 2.0.6 on 2018-08-14 12:41 from django.db import migrations, models import django.db.models.deletion @@ -26,13 +26,25 @@ class Migration(migrations.Migration): }, bases=('wagtailcore.page',), ), + migrations.CreateModel( + name='Chapter', + 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')), + ], + options={ + 'verbose_name': 'Kapitel', + 'verbose_name_plural': 'Kapitel', + }, + bases=('wagtailcore.page',), + ), migrations.CreateModel( name='Module', 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')), + ('order', models.PositiveIntegerField(help_text='Order of the module')), ('meta_title', models.CharField(help_text="e.g. 'Intro' or 'Modul 1'", max_length=255)), ('teaser', models.TextField()), - ('description', wagtail.core.fields.RichTextField()), + ('intro', wagtail.core.fields.RichTextField()), ('hero_image', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to='wagtailimages.Image')), ], options={ @@ -45,6 +57,7 @@ class Migration(migrations.Migration): name='Topic', 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')), + ('order', models.PositiveIntegerField(help_text='Order of the topic')), ('teaser', models.TextField()), ('description', wagtail.core.fields.RichTextField()), ], diff --git a/server/book/migrations/0002_topic_order.py b/server/book/migrations/0002_topic_order.py deleted file mode 100644 index 1b133eba..00000000 --- a/server/book/migrations/0002_topic_order.py +++ /dev/null @@ -1,19 +0,0 @@ -# Generated by Django 2.0.6 on 2018-08-08 13:12 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('book', '0001_initial'), - ] - - operations = [ - migrations.AddField( - model_name='topic', - name='order', - field=models.PositiveIntegerField(default=0, help_text='Order of the topic'), - preserve_default=False, - ), - ] diff --git a/server/book/migrations/0003_module_order.py b/server/book/migrations/0003_module_order.py deleted file mode 100644 index 55be633d..00000000 --- a/server/book/migrations/0003_module_order.py +++ /dev/null @@ -1,19 +0,0 @@ -# Generated by Django 2.0.6 on 2018-08-08 13:38 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('book', '0002_topic_order'), - ] - - operations = [ - migrations.AddField( - model_name='module', - name='order', - field=models.PositiveIntegerField(default=0, help_text='Order of the module'), - preserve_default=False, - ), - ] diff --git a/server/book/models/chapter.py b/server/book/models/chapter.py index c7e4f832..7a004763 100644 --- a/server/book/models/chapter.py +++ b/server/book/models/chapter.py @@ -18,8 +18,6 @@ class Chapter(Page): verbose_name = 'Kapitel' verbose_name_plural = 'Kapitel' - book = models.ForeignKey(Book, blank=False, null=False, on_delete=models.CASCADE) - content_panels = [ FieldPanel('title', classname="full title"), ] diff --git a/server/core/management/commands/dummy_data.py b/server/core/management/commands/dummy_data.py index dc6dd3db..2c22875c 100644 --- a/server/core/management/commands/dummy_data.py +++ b/server/core/management/commands/dummy_data.py @@ -11,6 +11,7 @@ from wagtail.core.models import Page from book.factories import BookFactory, TopicFactory, ModuleFactory from core.factories import UserFactory +from objectives.factories import ObjectiveGroupFactory, ObjectiveFactory data = [ { @@ -25,7 +26,28 @@ data = [ 'order': 1, 'title': 'Video', 'meta_title': 'Intro', - 'teaser': 'Die Berufsbildung ist ein neuer Lebensabschnitt' + 'teaser': 'Die Berufsbildung ist ein neuer Lebensabschnitt', + # 'objective_groups': [ + # { + # 'title': 'Gesellschaft', + # 'objectives': [ + # {'title': 'Ich kann wichtige personelle und organisatorische Strukturen der Berufsfachschule beschreiben.'}, + # {'title': 'Ich kenne die Angebote und Regeln meiner Schule.'}, + # {'title': 'Ich kenne den Aufbau des Schullehrplans ABU und können das Qualifikationsverfahren des allgemeinbildenden Unterrichts ABU beschreiben.'}, + # {'title': 'Ich kann die drei Lernorte unterscheiden.'} + # ] + # }, + # { + # 'title': 'Sprache und Kommunikation', + # 'objectives': [ + # {'title': 'Ich kenne verschiedene Arten von Fragen.'}, + # {'title': 'Ich kann ein Interview mit geeigneten Fragen vorbereiten.'}, + # {'title': 'Ich kann ein Interview führen und auf interessante oder ausweichende Antworten näher eingehen.'}, + # {'title': 'Ich kann ein mündlich geführtes Interview schriftlich in Standardsprache festhalten.'}, + # {'title': 'Ich kann mein Arbeitsplatz genau beschreiben.'} + # ] + # } + # ] }, { 'order': 2, @@ -148,3 +170,15 @@ class Command(BaseCommand): for module_idx, module_data in enumerate(modules_data): module = ModuleFactory.create(parent=topic, **module_data) + + default_objective_groups = [{} for i in range(0, 2)] + objective_group_data = module_data.get('objective_groups', default_objective_groups) + + for objective_group_idx, objective_group_entry in enumerate(objective_group_data): + objective_group = ObjectiveGroupFactory.create(module=module, **self.filter_data(objective_group_entry, 'objectives')) + + default_objectives = [{} for i in range(0, 6)] + objectives_data = objective_group_entry.get('objectives', default_objectives) + + for objective_idx, objective_data in enumerate(objectives_data): + objective = ObjectiveFactory.create(group=objective_group, **objective_data) diff --git a/server/objectives/admin.py b/server/objectives/admin.py index 8c38f3f3..f3a2a278 100644 --- a/server/objectives/admin.py +++ b/server/objectives/admin.py @@ -1,3 +1,21 @@ from django.contrib import admin -# Register your models here. +from objectives.models import ObjectiveGroup, Objective, ObjectiveProgressStatus + + +@admin.register(ObjectiveGroup) +class ObjectiveGroupAdmin(admin.ModelAdmin): + list_display = ('title', 'module', 'user') + list_filter = ('module', 'user') + + +@admin.register(Objective) +class ObjectiveAdmin(admin.ModelAdmin): + list_display = ('text', 'group') + list_filter = ('group',) + + +@admin.register(ObjectiveProgressStatus) +class ObjectiveProgressStatusAdmin(admin.ModelAdmin): + list_display = ('objective', 'user', 'done') + list_filter = ('objective', 'user', 'done') diff --git a/server/objectives/factories.py b/server/objectives/factories.py new file mode 100644 index 00000000..ebc609f9 --- /dev/null +++ b/server/objectives/factories.py @@ -0,0 +1,38 @@ +import random + +import factory +from django.contrib.auth import get_user_model + +from book.factories import ModuleFactory +from core.factories import fake, UserFactory +from objectives.models import ObjectiveGroup, Objective + + +class ObjectiveGroupFactory(factory.django.DjangoModelFactory): + class Meta: + model = ObjectiveGroup + + # title = factory.LazyAttribute(lambda x: fake.sentence(nb_words=random.randint(4, 8))) + title = factory.Sequence(lambda n: 'Title: %s' % n) + + module = factory.SubFactory(ModuleFactory) + user = factory.Iterator(get_user_model().objects.all()) + + +class ObjectiveFactory(factory.django.DjangoModelFactory): + class Meta: + model = Objective + + text = factory.LazyAttribute(lambda x: fake.sentence(nb_words=random.randint(4, 8))) + + group = factory.SubFactory(ObjectiveGroupFactory) + + +# class ObjectiveProgressStatusFactory(factory.django.DjangoModelFactory): +# class Meta: +# model = ObjectiveProgressStatus +# +# objective = factory.SubFactory(ObjectiveFactory) +# user = factory.Iterator(get_user_model().objects.all()) +# +# done = factory.Sequence([True, False]) diff --git a/server/objectives/migrations/0001_initial.py b/server/objectives/migrations/0001_initial.py new file mode 100644 index 00000000..7eea7edd --- /dev/null +++ b/server/objectives/migrations/0001_initial.py @@ -0,0 +1,49 @@ +# Generated by Django 2.0.6 on 2018-08-14 12:41 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ] + + operations = [ + migrations.CreateModel( + name='Objective', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('text', models.CharField(blank=True, max_length=255, verbose_name='text')), + ], + options={ + 'verbose_name': 'Lernziel', + 'verbose_name_plural': 'Lernziele', + }, + ), + migrations.CreateModel( + name='ObjectiveGroup', + 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')), + ], + options={ + 'verbose_name': 'Lernziel Gruppe', + 'verbose_name_plural': 'Lernziel Gruppen', + }, + ), + migrations.CreateModel( + name='ObjectiveProgressStatus', + fields=[ + ('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')), + ], + options={ + 'verbose_name': 'Lernzielstatus', + 'verbose_name_plural': 'Lernzielstatus', + }, + ), + ] diff --git a/server/objectives/migrations/0002_auto_20180814_1241.py b/server/objectives/migrations/0002_auto_20180814_1241.py new file mode 100644 index 00000000..8d9b518f --- /dev/null +++ b/server/objectives/migrations/0002_auto_20180814_1241.py @@ -0,0 +1,39 @@ +# Generated by Django 2.0.6 on 2018-08-14 12:41 + +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ('objectives', '0001_initial'), + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('book', '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/objectives/models.py b/server/objectives/models.py index 0db0a412..ee6fb22e 100644 --- a/server/objectives/models.py +++ b/server/objectives/models.py @@ -7,11 +7,13 @@ from django_extensions.db.models import TitleDescriptionModel from book.models import Module -class ObjectiveGroup(TitleDescriptionModel): +class ObjectiveGroup(models.Model): class Meta: verbose_name = 'Lernziel Gruppe' verbose_name_plural = 'Lernziel Gruppen' + title = models.CharField('title', blank=True, null=False, max_length=255) + module = models.ForeignKey(Module, blank=False, null=False, on_delete=models.CASCADE) user = models.ForeignKey(get_user_model(), blank=True, null=True, on_delete=models.CASCADE) # klass = models.ForeignKey(Klass, null=True, on_delete=models.CASCADE) @@ -20,25 +22,28 @@ class ObjectiveGroup(TitleDescriptionModel): return 'ObjectiveGroup {}-{}-{}'.format(self.id, self.module, self.title) -class Objective(TitleDescriptionModel): +class Objective(models.Model): class Meta: verbose_name = 'Lernziel' verbose_name_plural = 'Lernziele' - # several competence entries are grouped in current focus + text = models.CharField('text', blank=True, null=False, max_length=255) + group = models.ForeignKey(ObjectiveGroup, blank=False, null=False, on_delete=models.CASCADE) def __str__(self): - return 'Objective {}-{}'.format(self.id, self.title) + return 'Objective {}-{}'.format(self.id, self.text) -class ObjectiveProgressStatus(TitleDescriptionModel): +class ObjectiveProgressStatus(models.Model): class Meta: verbose_name = 'Lernzielstatus' verbose_name_plural = 'Lernzielstatus' + done = models.BooleanField('Lernziel erledigt?', default=False) + objective = models.ForeignKey(Objective, blank=False, null=False, on_delete=models.CASCADE) user = models.ForeignKey(get_user_model(), blank=True, null=True, on_delete=models.CASCADE) def __str__(self): - return 'Lernzielstatus {}-{}'.format(self.objective, self.title) + return 'Lernzielstatus {}-{}'.format(self.objective, self.done) diff --git a/server/user/migrations/0001_initial.py b/server/user/migrations/0001_initial.py index 2d57d7ea..89defd54 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-06 15:01 +# Generated by Django 2.0.6 on 2018-08-14 12:41 import django.contrib.auth.models import django.contrib.auth.validators