Add the objectives module
This commit is contained in:
parent
579d54c8c5
commit
29499350c1
|
|
@ -1,6 +1,7 @@
|
||||||
from django.contrib import admin
|
from django.contrib import admin
|
||||||
|
|
||||||
from book.models import Book, Topic, Module
|
from book.models import Book, Topic, Module
|
||||||
|
from book.models.chapter import Chapter
|
||||||
from core.wagtail_utils import wagtail_parent_filter
|
from core.wagtail_utils import wagtail_parent_filter
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -19,3 +20,9 @@ class TopicAdmin(admin.ModelAdmin):
|
||||||
class ModuleAdmin(admin.ModelAdmin):
|
class ModuleAdmin(admin.ModelAdmin):
|
||||||
list_display = ('title', 'slug', 'meta_title', 'teaser')
|
list_display = ('title', 'slug', 'meta_title', 'teaser')
|
||||||
list_filter = (wagtail_parent_filter(Topic, Module),)
|
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),)
|
||||||
|
|
|
||||||
|
|
@ -27,6 +27,6 @@ class ModuleFactory(BasePageFactory):
|
||||||
order = 0
|
order = 0
|
||||||
meta_title = factory.LazyAttribute(lambda x: fake.text(max_nb_chars=20))
|
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)))
|
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)
|
hero_image = factory.SubFactory(DummyImageFactory)
|
||||||
|
|
|
||||||
|
|
@ -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
|
from django.db import migrations, models
|
||||||
import django.db.models.deletion
|
import django.db.models.deletion
|
||||||
|
|
@ -26,13 +26,25 @@ class Migration(migrations.Migration):
|
||||||
},
|
},
|
||||||
bases=('wagtailcore.page',),
|
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(
|
migrations.CreateModel(
|
||||||
name='Module',
|
name='Module',
|
||||||
fields=[
|
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')),
|
('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)),
|
('meta_title', models.CharField(help_text="e.g. 'Intro' or 'Modul 1'", max_length=255)),
|
||||||
('teaser', models.TextField()),
|
('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')),
|
('hero_image', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to='wagtailimages.Image')),
|
||||||
],
|
],
|
||||||
options={
|
options={
|
||||||
|
|
@ -45,6 +57,7 @@ class Migration(migrations.Migration):
|
||||||
name='Topic',
|
name='Topic',
|
||||||
fields=[
|
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')),
|
('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()),
|
('teaser', models.TextField()),
|
||||||
('description', wagtail.core.fields.RichTextField()),
|
('description', wagtail.core.fields.RichTextField()),
|
||||||
],
|
],
|
||||||
|
|
|
||||||
|
|
@ -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,
|
|
||||||
),
|
|
||||||
]
|
|
||||||
|
|
@ -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,
|
|
||||||
),
|
|
||||||
]
|
|
||||||
|
|
@ -18,8 +18,6 @@ class Chapter(Page):
|
||||||
verbose_name = 'Kapitel'
|
verbose_name = 'Kapitel'
|
||||||
verbose_name_plural = 'Kapitel'
|
verbose_name_plural = 'Kapitel'
|
||||||
|
|
||||||
book = models.ForeignKey(Book, blank=False, null=False, on_delete=models.CASCADE)
|
|
||||||
|
|
||||||
content_panels = [
|
content_panels = [
|
||||||
FieldPanel('title', classname="full title"),
|
FieldPanel('title', classname="full title"),
|
||||||
]
|
]
|
||||||
|
|
|
||||||
|
|
@ -11,6 +11,7 @@ from wagtail.core.models import Page
|
||||||
|
|
||||||
from book.factories import BookFactory, TopicFactory, ModuleFactory
|
from book.factories import BookFactory, TopicFactory, ModuleFactory
|
||||||
from core.factories import UserFactory
|
from core.factories import UserFactory
|
||||||
|
from objectives.factories import ObjectiveGroupFactory, ObjectiveFactory
|
||||||
|
|
||||||
data = [
|
data = [
|
||||||
{
|
{
|
||||||
|
|
@ -25,7 +26,28 @@ data = [
|
||||||
'order': 1,
|
'order': 1,
|
||||||
'title': 'Video',
|
'title': 'Video',
|
||||||
'meta_title': 'Intro',
|
'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,
|
'order': 2,
|
||||||
|
|
@ -148,3 +170,15 @@ class Command(BaseCommand):
|
||||||
|
|
||||||
for module_idx, module_data in enumerate(modules_data):
|
for module_idx, module_data in enumerate(modules_data):
|
||||||
module = ModuleFactory.create(parent=topic, **module_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)
|
||||||
|
|
|
||||||
|
|
@ -1,3 +1,21 @@
|
||||||
from django.contrib import admin
|
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')
|
||||||
|
|
|
||||||
|
|
@ -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])
|
||||||
|
|
@ -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',
|
||||||
|
},
|
||||||
|
),
|
||||||
|
]
|
||||||
|
|
@ -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'),
|
||||||
|
),
|
||||||
|
]
|
||||||
|
|
@ -7,11 +7,13 @@ from django_extensions.db.models import TitleDescriptionModel
|
||||||
from book.models import Module
|
from book.models import Module
|
||||||
|
|
||||||
|
|
||||||
class ObjectiveGroup(TitleDescriptionModel):
|
class ObjectiveGroup(models.Model):
|
||||||
class Meta:
|
class Meta:
|
||||||
verbose_name = 'Lernziel Gruppe'
|
verbose_name = 'Lernziel Gruppe'
|
||||||
verbose_name_plural = 'Lernziel Gruppen'
|
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)
|
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)
|
user = models.ForeignKey(get_user_model(), blank=True, null=True, on_delete=models.CASCADE)
|
||||||
# klass = models.ForeignKey(Klass, 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)
|
return 'ObjectiveGroup {}-{}-{}'.format(self.id, self.module, self.title)
|
||||||
|
|
||||||
|
|
||||||
class Objective(TitleDescriptionModel):
|
class Objective(models.Model):
|
||||||
class Meta:
|
class Meta:
|
||||||
verbose_name = 'Lernziel'
|
verbose_name = 'Lernziel'
|
||||||
verbose_name_plural = 'Lernziele'
|
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)
|
group = models.ForeignKey(ObjectiveGroup, blank=False, null=False, on_delete=models.CASCADE)
|
||||||
|
|
||||||
def __str__(self):
|
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:
|
class Meta:
|
||||||
verbose_name = 'Lernzielstatus'
|
verbose_name = 'Lernzielstatus'
|
||||||
verbose_name_plural = 'Lernzielstatus'
|
verbose_name_plural = 'Lernzielstatus'
|
||||||
|
|
||||||
|
done = models.BooleanField('Lernziel erledigt?', default=False)
|
||||||
|
|
||||||
objective = models.ForeignKey(Objective, blank=False, null=False, on_delete=models.CASCADE)
|
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)
|
user = models.ForeignKey(get_user_model(), blank=True, null=True, on_delete=models.CASCADE)
|
||||||
|
|
||||||
def __str__(self):
|
def __str__(self):
|
||||||
return 'Lernzielstatus {}-{}'.format(self.objective, self.title)
|
return 'Lernzielstatus {}-{}'.format(self.objective, self.done)
|
||||||
|
|
|
||||||
|
|
@ -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.models
|
||||||
import django.contrib.auth.validators
|
import django.contrib.auth.validators
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue