diff --git a/client/package.json b/client/package.json index 834f22db..76aca2fc 100644 --- a/client/package.json +++ b/client/package.json @@ -13,6 +13,7 @@ "dependencies": { "apollo-cache-inmemory": "^1.2.2", "apollo-client": "^2.3.2", + "apollo-link": "^1.2.2", "apollo-link-http": "^1.5.4", "appolo": "^6.0.19", "autoprefixer": "^7.1.2", diff --git a/client/src/graphql/client.js b/client/src/graphql/client.js index 15f06dfc..c34528fb 100644 --- a/client/src/graphql/client.js +++ b/client/src/graphql/client.js @@ -1,6 +1,7 @@ import {InMemoryCache} from 'apollo-cache-inmemory/lib/index' import {HttpLink} from 'apollo-link-http/lib/index' import {ApolloClient} from 'apollo-client/index' +import {ApolloLink} from 'apollo-link' import fetch from 'unfetch' const httpLink = new HttpLink({ @@ -12,9 +13,19 @@ const httpLink = new HttpLink({ } }) +const consoleLink = new ApolloLink((operation, forward) => { + console.log(`starting request for ${operation.operationName}`); + return forward(operation).map((data) => { + console.log(`ending request for ${operation.operationName}`); + return data; + }) +}) + +const composedLink = ApolloLink.from([consoleLink, httpLink]); + // Create the apollo client export default new ApolloClient({ - link: httpLink, + link: composedLink, cache: new InMemoryCache(), connectToDevTools: true }) diff --git a/server/book/factories.py b/server/book/factories.py index a67f9061..03b7dbeb 100644 --- a/server/book/factories.py +++ b/server/book/factories.py @@ -2,7 +2,7 @@ import random import factory -from book.models import Book, Topic, Module +from book.models import Book, Topic, Module, Chapter, ContentBlock from core.factories import BasePageFactory, fake, DummyImageFactory @@ -30,3 +30,15 @@ class ModuleFactory(BasePageFactory): intro = factory.LazyAttribute(lambda x: fake.text(max_nb_chars=200)) hero_image = factory.SubFactory(DummyImageFactory) + + +class ChapterFactory(BasePageFactory): + class Meta: + model = Chapter + + +class ContentBlockFactory(BasePageFactory): + class Meta: + model = ContentBlock + + type = factory.LazyAttribute(lambda x: random.choice(['plain', 'yellow', 'green', 'blue'])) diff --git a/server/core/management/commands/dummy_data.py b/server/core/management/commands/dummy_data.py index 9fad9df6..9768b536 100644 --- a/server/core/management/commands/dummy_data.py +++ b/server/core/management/commands/dummy_data.py @@ -9,7 +9,7 @@ from django.core.management import BaseCommand from django.db import connection from wagtail.core.models import Page -from book.factories import BookFactory, TopicFactory, ModuleFactory +from book.factories import BookFactory, TopicFactory, ModuleFactory, ChapterFactory, ContentBlockFactory from core.factories import UserFactory from objectives.factories import ObjectiveGroupFactory, ObjectiveFactory @@ -29,7 +29,6 @@ data = [ 'teaser': 'Die Berufsbildung ist ein neuer Lebensabschnit', 'intro': """

Sie stehen am Anfang eines neuen Lebensabschnitts. In Ihrer Rolle als Berufslernende oder Berufslernender haben Sie Verantwortung übernommen.

-

Wie erging es Ihnen am ersten Arbeits- und Schultag?

""", 'objective_groups': [ @@ -52,6 +51,24 @@ data = [ {'text': 'Ich kann mein Arbeitsplatz genau beschreiben.'} ] } + ], + 'chapters': [ + { + 'title': '1.1 Lehrbeginn', + 'content_blocks': [ + {'type': 'plain', 'title': 'Auftrag 1', 'content': 'Sie haben diesen Sommer ihre Lehre begonnen. Was bedeutet dieser neue Abschnitt für Sie?'}, + {'type': 'yellow', 'title': 'Auftrag 2', 'content': 'Sie haben diesen Sommer ihre Lehre begonnen. Was bedeutet dieser neue Abschnitt für Sie?'}, + {'type': 'plain', 'title': 'Auftrag 3', 'content': 'Sie haben diesen Sommer ihre Lehre begonnen. Was bedeutet dieser neue Abschnitt für Sie?'} + ] + }, + { + 'title': '1.2 Die drei Lernorte', + 'content_blocks': [ + {'type': 'plain', 'title': 'Auftrag 1', 'content': 'Sie haben diesen Sommer ihre Lehre begonnen. Was bedeutet dieser neue Abschnitt für Sie?'}, + {'type': 'yellow', 'title': 'Auftrag 2', 'content': 'Sie haben diesen Sommer ihre Lehre begonnen. Was bedeutet dieser neue Abschnitt für Sie?'}, + {'type': 'blue', 'title': 'Auftrag 3', 'content': 'Sie haben diesen Sommer ihre Lehre begonnen. Was bedeutet dieser neue Abschnitt für Sie?'} + ] + } ] }, { @@ -135,7 +152,8 @@ class Command(BaseCommand): os.makedirs(path) def filter_data(self, input_data, filter_keyword): - return {k: v for (k, v) in input_data.items() if not (k == filter_keyword)} + filters = [filter_keyword] if not isinstance(filter_keyword, list) else filter_keyword + return {k: v for (k, v) in input_data.items() if not (k in filters)} def handle(self, *args, **options): with connection.cursor() as cursor: @@ -174,7 +192,7 @@ 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, **self.filter_data(module_data, 'objective_groups')) + module = ModuleFactory.create(parent=topic, **self.filter_data(module_data, ['objective_groups', 'chapters'])) default_objective_groups = [{} for i in range(0, 2)] objective_group_data = module_data.get('objective_groups', default_objective_groups) @@ -190,3 +208,15 @@ class Command(BaseCommand): for objective_idx, objective_data in enumerate(objectives_data): objective = ObjectiveFactory.create(group=objective_group, **objective_data) + + default_chapters = [{} for i in range(0, 2)] + chapters_data = module_data.get('chapters', default_chapters) + + for chapter_idx, chapter_data in enumerate(chapters_data): + chapter = ChapterFactory.create(parent=module, **self.filter_data(chapter_data, 'content_blocks')) + + default_content_blocks = [{} for i in range(0, 4)] + content_blocks_data = chapter_data.get('content_blocks', default_content_blocks) + + for content_block_idx, content_block_data in enumerate(content_blocks_data): + ContentBlockFactory.create(parent=chapter, **self.filter_data(content_block_data, 'content'))