Add testdata generation for objectives, optimize imports

This commit is contained in:
Pawel Kowalski 2018-08-14 16:14:04 +02:00
parent fc1b0519c4
commit 1341589f89
21 changed files with 146 additions and 142 deletions

View File

@ -3,9 +3,10 @@ from django.conf import settings
from graphene_django.debug import DjangoDebug from graphene_django.debug import DjangoDebug
from book.schema import ModulesQuery from book.schema import ModulesQuery
from objectives.schema import ObjectivesQuery
class Query(ModulesQuery, graphene.ObjectType): class Query(ObjectivesQuery, ModulesQuery, graphene.ObjectType):
# This class will inherit from multiple Queries # This class will inherit from multiple Queries
if settings.DEBUG: if settings.DEBUG:

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-14 14:08
from django.db import migrations, models from django.db import migrations, models
import django.db.models.deletion import django.db.models.deletion

View File

@ -1,3 +1,3 @@
from .book import *
from .module import * from .module import *
from .topic import * from .topic import *
from .book import *

View File

@ -1,14 +1,8 @@
import logging import logging
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.models import Page from wagtail.core.models import Page
from wagtail.images.edit_handlers import ImageChooserPanel
from book.blocks import DEFAULT_RICH_TEXT_FEATURES
from book.models import Book
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)

View File

@ -1,7 +1,7 @@
import graphene
from graphene import relay from graphene import relay
from graphene_django import DjangoObjectType from graphene_django import DjangoObjectType
from graphene_django.filter import DjangoFilterConnectionField from graphene_django.filter import DjangoFilterConnectionField
import graphene
from .models import Book, Topic, Module from .models import Book, Topic, Module

View File

@ -1,8 +1,8 @@
import os
import random import random
import os
import wagtail_factories
import factory import factory
import wagtail_factories
from django.conf import settings from django.conf import settings
from django.contrib.auth import get_user_model from django.contrib.auth import get_user_model
from factory.django import ImageField, FileField from factory.django import ImageField, FileField

View File

@ -27,27 +27,27 @@ data = [
'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': [ 'objective_groups': [
# { {
# 'title': 'Gesellschaft', 'title': 'Gesellschaft',
# 'objectives': [ 'objectives': [
# {'title': 'Ich kann wichtige personelle und organisatorische Strukturen der Berufsfachschule beschreiben.'}, {'text': 'Ich kann wichtige personelle und organisatorische Strukturen der Berufsfachschule beschreiben.'},
# {'title': 'Ich kenne die Angebote und Regeln meiner Schule.'}, {'text': '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.'}, {'text': 'Ich kenne den Aufbau des Schullehrplans ABU und können das Qualifikationsverfahren des allgemeinbildenden Unterrichts ABU beschreiben.'},
# {'title': 'Ich kann die drei Lernorte unterscheiden.'} {'text': 'Ich kann die drei Lernorte unterscheiden.'}
# ] ]
# }, },
# { {
# 'title': 'Sprache und Kommunikation', 'title': 'Sprache und Kommunikation',
# 'objectives': [ 'objectives': [
# {'title': 'Ich kenne verschiedene Arten von Fragen.'}, {'text': 'Ich kenne verschiedene Arten von Fragen.'},
# {'title': 'Ich kann ein Interview mit geeigneten Fragen vorbereiten.'}, {'text': 'Ich kann ein Interview mit geeigneten Fragen vorbereiten.'},
# {'title': 'Ich kann ein Interview führen und auf interessante oder ausweichende Antworten näher eingehen.'}, {'text': '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.'}, {'text': 'Ich kann ein mündlich geführtes Interview schriftlich in Standardsprache festhalten.'},
# {'title': 'Ich kann mein Arbeitsplatz genau beschreiben.'} {'text': 'Ich kann mein Arbeitsplatz genau beschreiben.'}
# ] ]
# } }
# ] ]
}, },
{ {
'order': 2, 'order': 2,
@ -75,46 +75,46 @@ data = [
} }
] ]
}, },
{ # {
'order': 2, # 'order': 2,
'title': '2. Geld und Kauf' # 'title': '2. Geld und Kauf'
}, # },
{ # {
'order': 3, # 'order': 3,
'title': '3. Risiko und Sicherheit' # 'title': '3. Risiko und Sicherheit'
}, # },
{ # {
'order': 4, # 'order': 4,
'title': '4. Demokratie und Mitgestaltung' # 'title': '4. Demokratie und Mitgestaltung'
}, # },
{ # {
'order': 5, # 'order': 5,
'title': '5. Kultur und Kunst' # 'title': '5. Kultur und Kunst'
}, # },
{ # {
'order': 6, # 'order': 6,
'title': '6. Die Schweiz in Europa und der Welt' # 'title': '6. Die Schweiz in Europa und der Welt'
}, # },
{ # {
'order': 7, # 'order': 7,
'title': '7. Markt und Konsum' # 'title': '7. Markt und Konsum'
}, # },
{ # {
'order': 8, # 'order': 8,
'title': '8. Globale Herausforderungen' # 'title': '8. Globale Herausforderungen'
}, # },
{ # {
'order': 9, # 'order': 9,
'title': '9. Wohnen und Zusammenleben' # 'title': '9. Wohnen und Zusammenleben'
}, # },
{ # {
'order': 10, # 'order': 10,
'title': '10. Arbeit und Zukunft' # 'title': '10. Arbeit und Zukunft'
}, # },
{ # {
'order': 11, # 'order': 11,
'title': '11. Grundsätzliches zum Recht' # 'title': '11. Grundsätzliches zum Recht'
}, # },
] ]
} }
] ]
@ -169,15 +169,18 @@ class Command(BaseCommand):
modules_data = topic_data.get('modules', default_modules) modules_data = topic_data.get('modules', default_modules)
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, **self.filter_data(module_data, 'objective_groups'))
default_objective_groups = [{} for i in range(0, 2)] default_objective_groups = [{} for i in range(0, 2)]
objective_group_data = module_data.get('objective_groups', default_objective_groups) objective_group_data = module_data.get('objective_groups', default_objective_groups)
for objective_group_idx, objective_group_entry in enumerate(objective_group_data): 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')) factory_params = self.filter_data(objective_group_entry, 'objectives')
objective_group = ObjectiveGroupFactory.create(module=module,
user=None,
**factory_params)
default_objectives = [{} for i in range(0, 6)] default_objectives = [{} for i in range(0, 4)]
objectives_data = objective_group_entry.get('objectives', default_objectives) objectives_data = objective_group_entry.get('objectives', default_objectives)
for objective_idx, objective_data in enumerate(objectives_data): for objective_idx, objective_data in enumerate(objectives_data):

View File

@ -1,9 +1,10 @@
from django.conf import settings
from django.http import Http404, HttpResponsePermanentRedirect, HttpResponseRedirect
from django.utils.deprecation import MiddlewareMixin
from django.shortcuts import redirect
import re import re
from django.conf import settings
from django.http import Http404, HttpResponsePermanentRedirect
from django.shortcuts import redirect
from django.utils.deprecation import MiddlewareMixin
try: try:
from threading import local from threading import local
except ImportError: except ImportError:

View File

@ -1,15 +1,14 @@
from django.conf import settings
from django.conf.urls import url, include from django.conf.urls import url, include
from django.urls import re_path from django.conf.urls.static import static
from django.contrib import admin from django.contrib import admin
from django.contrib.staticfiles.urls import staticfiles_urlpatterns from django.urls import re_path
from wagtail.core import urls as wagtail_urls
from wagtail.admin import urls as wagtailadmin_urls from wagtail.admin import urls as wagtailadmin_urls
from wagtail.core import urls as wagtail_urls
from wagtail.documents import urls as wagtaildocs_urls from wagtail.documents import urls as wagtaildocs_urls
from wagtail.search import urls as wagtailsearch_urls from wagtail.search import urls as wagtailsearch_urls
from core import views from core import views
from django.conf import settings
from django.conf.urls.static import static
urlpatterns = [ urlpatterns = [
url(r'^guru/', admin.site.urls), url(r'^guru/', admin.site.urls),

View File

@ -1,11 +1,11 @@
import requests import requests
from django.conf import settings
from django.contrib.auth.decorators import login_required from django.contrib.auth.decorators import login_required
from django.contrib.auth.mixins import LoginRequiredMixin from django.contrib.auth.mixins import LoginRequiredMixin
from django.http.response import HttpResponse from django.http.response import HttpResponse
from django.shortcuts import render from django.shortcuts import render
from django.views.decorators.csrf import ensure_csrf_cookie from django.views.decorators.csrf import ensure_csrf_cookie
from graphene_django.views import GraphQLView from graphene_django.views import GraphQLView
from django.conf import settings
class PrivateGraphQLView(LoginRequiredMixin, GraphQLView): class PrivateGraphQLView(LoginRequiredMixin, GraphQLView):

View File

@ -1,3 +1 @@
from django.contrib import admin
# Register your models here. # Register your models here.

View File

@ -1,3 +1,3 @@
from django.db import models

View File

@ -6,7 +6,7 @@ from objectives.models import ObjectiveGroup, Objective, ObjectiveProgressStatus
@admin.register(ObjectiveGroup) @admin.register(ObjectiveGroup)
class ObjectiveGroupAdmin(admin.ModelAdmin): class ObjectiveGroupAdmin(admin.ModelAdmin):
list_display = ('title', 'module', 'user') list_display = ('title', 'module', 'user')
list_filter = ('module', 'user') list_filter = ('title', 'module', 'user')
@admin.register(Objective) @admin.register(Objective)

View File

@ -4,7 +4,7 @@ import factory
from django.contrib.auth import get_user_model from django.contrib.auth import get_user_model
from book.factories import ModuleFactory from book.factories import ModuleFactory
from core.factories import fake, UserFactory from core.factories import fake
from objectives.models import ObjectiveGroup, Objective from objectives.models import ObjectiveGroup, Objective
@ -12,8 +12,7 @@ class ObjectiveGroupFactory(factory.django.DjangoModelFactory):
class Meta: class Meta:
model = ObjectiveGroup model = ObjectiveGroup
# title = factory.LazyAttribute(lambda x: fake.sentence(nb_words=random.randint(4, 8))) title = factory.Iterator(['Gesellschaft', 'Sprache und Kommunikation'])
title = factory.Sequence(lambda n: 'Title: %s' % n)
module = factory.SubFactory(ModuleFactory) module = factory.SubFactory(ModuleFactory)
user = factory.Iterator(get_user_model().objects.all()) user = factory.Iterator(get_user_model().objects.all())

View File

@ -1,5 +1,6 @@
# Generated by Django 2.0.6 on 2018-08-14 12:41 # Generated by Django 2.0.6 on 2018-08-14 14:08
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
@ -9,6 +10,8 @@ class Migration(migrations.Migration):
initial = True initial = True
dependencies = [ dependencies = [
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
('book', '0001_initial'),
] ]
operations = [ operations = [
@ -28,6 +31,8 @@ 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',
@ -40,10 +45,16 @@ 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

@ -1,39 +0,0 @@
# 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'),
),
]

View File

@ -1,7 +1,5 @@
from django.contrib.auth import get_user_model from django.contrib.auth import get_user_model
from django.db import models from django.db import models
# Create your models here.
from django_extensions.db.models import TitleDescriptionModel from django_extensions.db.models import TitleDescriptionModel
from book.models import Module from book.models import Module
@ -15,8 +13,8 @@ class ObjectiveGroup(models.Model):
title = models.CharField('title', blank=True, null=False, max_length=255) 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)
# a user can define her own objectives, hence this param
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)
def __str__(self): def __str__(self):
return 'ObjectiveGroup {}-{}-{}'.format(self.id, self.module, self.title) return 'ObjectiveGroup {}-{}-{}'.format(self.id, self.module, self.title)

View File

@ -0,0 +1,43 @@
import graphene
from graphene import relay
from graphene_django import DjangoObjectType
from graphene_django.filter import DjangoFilterConnectionField
from objectives.models import ObjectiveGroup, Objective, ObjectiveProgressStatus
class ObjectiveGroupNode(DjangoObjectType):
pk = graphene.Int()
class Meta:
model = ObjectiveGroup
filter_fields = ['title', 'module__slug']
interfaces = (relay.Node,)
def resolve_pk(self, *args, **kwargs):
return self.id
class ObjectiveNode(DjangoObjectType):
pk = graphene.Int()
class Meta:
model = Objective
filter_fields = ['text']
interfaces = (relay.Node,)
class ObjectiveProgressStatusNode(DjangoObjectType):
pk = graphene.Int()
class Meta:
model = ObjectiveProgressStatus
filter_fields = ['objective__text', 'user__username', 'done']
interfaces = (relay.Node,)
def resolve_pk(self, *args, **kwargs):
return self.id
class ObjectivesQuery(object):
user_focus = DjangoFilterConnectionField(ObjectiveGroupNode)

View File

@ -1,3 +1 @@
from django.test import TestCase
# Create your tests here. # Create your tests here.

View File

@ -1,3 +1 @@
from django.shortcuts import render
# Create your views here. # Create your views here.

View File

@ -1,6 +1,6 @@
from django.contrib import admin from django.contrib import admin
from django.contrib.auth.admin import UserAdmin from django.contrib.auth.admin import UserAdmin
from .models import User from .models import User
admin.site.register(User, UserAdmin) admin.site.register(User, UserAdmin)