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 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
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
import django.db.models.deletion

View File

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

View File

@ -1,14 +1,8 @@
import logging
from django.db import models
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 book.models import Book
logger = logging.getLogger(__name__)

View File

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

View File

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

View File

@ -27,27 +27,27 @@ data = [
'title': 'Video',
'meta_title': 'Intro',
'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.'}
# ]
# }
# ]
'objective_groups': [
{
'title': 'Gesellschaft',
'objectives': [
{'text': 'Ich kann wichtige personelle und organisatorische Strukturen der Berufsfachschule beschreiben.'},
{'text': 'Ich kenne die Angebote und Regeln meiner Schule.'},
{'text': 'Ich kenne den Aufbau des Schullehrplans ABU und können das Qualifikationsverfahren des allgemeinbildenden Unterrichts ABU beschreiben.'},
{'text': 'Ich kann die drei Lernorte unterscheiden.'}
]
},
{
'title': 'Sprache und Kommunikation',
'objectives': [
{'text': 'Ich kenne verschiedene Arten von Fragen.'},
{'text': 'Ich kann ein Interview mit geeigneten Fragen vorbereiten.'},
{'text': 'Ich kann ein Interview führen und auf interessante oder ausweichende Antworten näher eingehen.'},
{'text': 'Ich kann ein mündlich geführtes Interview schriftlich in Standardsprache festhalten.'},
{'text': 'Ich kann mein Arbeitsplatz genau beschreiben.'}
]
}
]
},
{
'order': 2,
@ -75,46 +75,46 @@ data = [
}
]
},
{
'order': 2,
'title': '2. Geld und Kauf'
},
{
'order': 3,
'title': '3. Risiko und Sicherheit'
},
{
'order': 4,
'title': '4. Demokratie und Mitgestaltung'
},
{
'order': 5,
'title': '5. Kultur und Kunst'
},
{
'order': 6,
'title': '6. Die Schweiz in Europa und der Welt'
},
{
'order': 7,
'title': '7. Markt und Konsum'
},
{
'order': 8,
'title': '8. Globale Herausforderungen'
},
{
'order': 9,
'title': '9. Wohnen und Zusammenleben'
},
{
'order': 10,
'title': '10. Arbeit und Zukunft'
},
{
'order': 11,
'title': '11. Grundsätzliches zum Recht'
},
# {
# 'order': 2,
# 'title': '2. Geld und Kauf'
# },
# {
# 'order': 3,
# 'title': '3. Risiko und Sicherheit'
# },
# {
# 'order': 4,
# 'title': '4. Demokratie und Mitgestaltung'
# },
# {
# 'order': 5,
# 'title': '5. Kultur und Kunst'
# },
# {
# 'order': 6,
# 'title': '6. Die Schweiz in Europa und der Welt'
# },
# {
# 'order': 7,
# 'title': '7. Markt und Konsum'
# },
# {
# 'order': 8,
# 'title': '8. Globale Herausforderungen'
# },
# {
# 'order': 9,
# 'title': '9. Wohnen und Zusammenleben'
# },
# {
# 'order': 10,
# 'title': '10. Arbeit und Zukunft'
# },
# {
# 'order': 11,
# 'title': '11. Grundsätzliches zum Recht'
# },
]
}
]
@ -169,15 +169,18 @@ class Command(BaseCommand):
modules_data = topic_data.get('modules', default_modules)
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)]
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'))
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)
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
from django.conf import settings
from django.http import Http404, HttpResponsePermanentRedirect
from django.shortcuts import redirect
from django.utils.deprecation import MiddlewareMixin
try:
from threading import local
except ImportError:

View File

@ -1,15 +1,14 @@
from django.conf import settings
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.staticfiles.urls import staticfiles_urlpatterns
from wagtail.core import urls as wagtail_urls
from django.urls import re_path
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.search import urls as wagtailsearch_urls
from core import views
from django.conf import settings
from django.conf.urls.static import static
urlpatterns = [
url(r'^guru/', admin.site.urls),

View File

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

View File

@ -1,3 +1 @@
from django.contrib import admin
# 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)
class ObjectiveGroupAdmin(admin.ModelAdmin):
list_display = ('title', 'module', 'user')
list_filter = ('module', 'user')
list_filter = ('title', 'module', 'user')
@admin.register(Objective)

View File

@ -4,7 +4,7 @@ import factory
from django.contrib.auth import get_user_model
from book.factories import ModuleFactory
from core.factories import fake, UserFactory
from core.factories import fake
from objectives.models import ObjectiveGroup, Objective
@ -12,8 +12,7 @@ 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)
title = factory.Iterator(['Gesellschaft', 'Sprache und Kommunikation'])
module = factory.SubFactory(ModuleFactory)
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
import django.db.models.deletion
@ -9,6 +10,8 @@ class Migration(migrations.Migration):
initial = True
dependencies = [
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
('book', '0001_initial'),
]
operations = [
@ -28,6 +31,8 @@ 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',
@ -40,10 +45,16 @@ 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'),
),
]

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.db import models
# Create your models here.
from django_extensions.db.models import TitleDescriptionModel
from book.models import Module
@ -15,8 +13,8 @@ class ObjectiveGroup(models.Model):
title = models.CharField('title', blank=True, null=False, max_length=255)
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)
# klass = models.ForeignKey(Klass, null=True, on_delete=models.CASCADE)
def __str__(self):
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.

View File

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

View File

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