From 5425c1b22ce6189a8f9633b972f20c1531e203dd Mon Sep 17 00:00:00 2001 From: Daniel Egger Date: Fri, 23 Sep 2022 14:54:20 +0200 Subject: [PATCH] Add content collections with create_default script --- .../media_library/content_blocks.py | 15 +--- .../media_library/create_default_documents.py | 4 +- .../create_default_media_library.py | 13 ++- .../media_library/example_content_from_db.py | 33 ------- .../commands/create_default_media_library.py | 2 +- .../media_library/migrations/0001_initial.py | 8 +- server/vbv_lernwelt/media_library/models.py | 5 +- .../tests/media_library_factories.py | 89 ++++++++----------- .../tests/test_media_library_factories.py | 10 +-- 9 files changed, 62 insertions(+), 117 deletions(-) delete mode 100644 server/vbv_lernwelt/media_library/example_content_from_db.py diff --git a/server/vbv_lernwelt/media_library/content_blocks.py b/server/vbv_lernwelt/media_library/content_blocks.py index 3cbba067..7b39272a 100644 --- a/server/vbv_lernwelt/media_library/content_blocks.py +++ b/server/vbv_lernwelt/media_library/content_blocks.py @@ -1,18 +1,10 @@ from django.db import models -from django.utils.translation import gettext_lazy as _ from wagtail import blocks from wagtail.admin.panels import FieldPanel from wagtail.documents.blocks import DocumentChooserBlock from wagtail.snippets.models import register_snippet -class VisualisationType(models.TextChoices): - LEARNING_MEDIA = 'LearningMedia', _('Lernmedien') - LINK = 'Link', _('Links') - ANKER = 'Anker', _('Verankerung') - CROSSREFERENCE = 'CrossReference', _('Querverweise') - - @register_snippet class MediaLibraryContent(models.Model): title = models.TextField() @@ -53,16 +45,11 @@ class CrossReferenceBlock(blocks.StructBlock): category = blocks.PageChooserBlock(page_type='media_library.MediaCategoryPage') -class ContentCollection(blocks.StructBlock): +class MediaContentCollection(blocks.StructBlock): """ Lernmedien, Links, Querverweise, Verankerung """ title = blocks.TextBlock() - collection_type = blocks.MultipleChoiceBlock( - choices=VisualisationType.choices, - max_length=20, - default=VisualisationType.LEARNING_MEDIA - ) contents = blocks.StreamBlock([ ('Links', LinkBlock()), ('Documents', DocumentChooserBlock()), diff --git a/server/vbv_lernwelt/media_library/create_default_documents.py b/server/vbv_lernwelt/media_library/create_default_documents.py index 2e2d6e3e..3701d1ec 100644 --- a/server/vbv_lernwelt/media_library/create_default_documents.py +++ b/server/vbv_lernwelt/media_library/create_default_documents.py @@ -30,7 +30,7 @@ def create_default_documents(): document = LibraryDocumentFactory( title='V1 C25 ZGB CH', display_text='Schweizerisches Zivilgesetzbuch', - description='Ein wundervolles Dokument, Bachblüten für Leseratten und metaphysisches Wolbefinden für Handyvekäufer.', + description='Ein wundervolles Dokument, Bachblüten für Leseratten und metaphysisches Wohlbefinden für Handyvekäufer.', link_display_text='Dokument laden', file=factory.django.FileField(from_path=os.path.join(path, filename), filename=filename), collection=collection @@ -40,7 +40,7 @@ def create_default_documents(): document = LibraryDocumentFactory( title='V1 C25 ', display_text='Pdf showcase ', - description='Ein wundervolles Dokument, Bachblüten für Leseratten und metaphysisches Wolbefinden für Handyvekäufer.', + description='Ein wundervolles Dokument, Bachblüten für Leseratten und metaphysisches Wohlbefinden für Handyvekäufer.', link_display_text='Dokument laden', file=factory.django.FileField(from_path=os.path.join(path, filename), filename=filename), collection=collection diff --git a/server/vbv_lernwelt/media_library/create_default_media_library.py b/server/vbv_lernwelt/media_library/create_default_media_library.py index 9ad94c3b..618b7022 100644 --- a/server/vbv_lernwelt/media_library/create_default_media_library.py +++ b/server/vbv_lernwelt/media_library/create_default_media_library.py @@ -3,7 +3,7 @@ import json from vbv_lernwelt.course.consts import COURSE_VERSICHERUNGSVERMITTLERIN from vbv_lernwelt.course.models import CoursePage, Course from vbv_lernwelt.media_library.tests.media_library_factories import MediaLibraryPageFactory, MediaCategoryPageFactory, \ - collection_body_dict + create_media_content_link, LinkBlockFactory, create_link_collection, create_document_collection def create_default_media_library(): @@ -22,11 +22,20 @@ def create_default_media_library(): die der Fahrzeugbesitzer und die Fahrzeugbesitzerin in einem grösseren Schadenfall oft nur schwer selbst aufbringen kann. '''.strip() description = 'Supi' + body_data = json.dumps([ + create_document_collection(), + create_link_collection( + links_dict=[ + create_media_content_link(LinkBlockFactory(title='Nationales Versicherungsbüro', url='https://www.vbv.ch/')), + create_media_content_link(LinkBlockFactory(title='Adressen der Strassenverkehrsämter', url='https://www.vbv.ch/')), + ] + ) + ]) media_category = MediaCategoryPageFactory( title=cat.name, course_category=cat, parent=media_lib_page, introduction_text=introduction_text, description=description, - body=json.dumps(collection_body_dict()) + body=body_data, ) diff --git a/server/vbv_lernwelt/media_library/example_content_from_db.py b/server/vbv_lernwelt/media_library/example_content_from_db.py deleted file mode 100644 index ea769f8e..00000000 --- a/server/vbv_lernwelt/media_library/example_content_from_db.py +++ /dev/null @@ -1,33 +0,0 @@ -# -*- coding: utf-8 -*- -# -# Iterativ GmbH -# http://www.iterativ.ch/ -# -# Copyright (c) 2015 Iterativ GmbH. All rights reserved. -# -# Created on 2022-09-14 -# @author: lorenz.padberg@iterativ.ch -[{"id": "a2a7ef07-64d9-444e-8069-4894a1e857ee", - "type": "content_collection", - "value": {"title": "Lernmedien", - "contents": [{ - "id": "5b24aa0b-17d7-4b04-8698-f86d2116d6df", - "type": "Documents", - "value": 2}, { - "id": "e2d43794-037f-4a19-8a71-c7e9d96d8dac", - "type": "Documents", - "value": 1}], - "collection_type": [ - "LearningMedia"]} - }, - {"id": "23d13543-2f37-44b8-b3e2-0ef36f7c5a13", - "type": "content_collection", - "value": {"title": "Links", "contents": [ - {"id": "57e35e12-ceb3-4873-9629-a6c5a3c2f6da", - "type": "Links", - "value": {"url": "http://www.admin.ch", - "title": "Wichtige Webseite", - "description": "interessantes zu versicherungen", - "link_display_text": "Link öffnen"}}], - "collection_type": [ - "LearningMedia"]}}] diff --git a/server/vbv_lernwelt/media_library/management/commands/create_default_media_library.py b/server/vbv_lernwelt/media_library/management/commands/create_default_media_library.py index 8280a35c..705d4767 100644 --- a/server/vbv_lernwelt/media_library/management/commands/create_default_media_library.py +++ b/server/vbv_lernwelt/media_library/management/commands/create_default_media_library.py @@ -6,6 +6,6 @@ from vbv_lernwelt.media_library.create_default_media_library import create_defau @click.command() def command(): - create_default_media_library() create_default_collections() create_default_documents() + create_default_media_library() diff --git a/server/vbv_lernwelt/media_library/migrations/0001_initial.py b/server/vbv_lernwelt/media_library/migrations/0001_initial.py index e28cb588..b1335286 100644 --- a/server/vbv_lernwelt/media_library/migrations/0001_initial.py +++ b/server/vbv_lernwelt/media_library/migrations/0001_initial.py @@ -1,4 +1,4 @@ -# Generated by Django 3.2.13 on 2022-09-19 15:57 +# Generated by Django 3.2.13 on 2022-09-23 12:42 from django.conf import settings from django.db import migrations, models @@ -18,9 +18,9 @@ class Migration(migrations.Migration): dependencies = [ ('course', '0001_initial'), - ('wagtailcore', '0069_log_entry_jsonfield'), - ('taggit', '0004_alter_taggeditem_content_type_alter_taggeditem_tag'), migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('taggit', '0004_alter_taggeditem_content_type_alter_taggeditem_tag'), + ('wagtailcore', '0069_log_entry_jsonfield'), ] operations = [ @@ -49,7 +49,7 @@ class Migration(migrations.Migration): ('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')), ('introduction_text', models.TextField(default='')), ('description', wagtail.fields.RichTextField(default='')), - ('body', wagtail.fields.StreamField([('content_collection', wagtail.blocks.StructBlock([('title', wagtail.blocks.TextBlock()), ('collection_type', wagtail.blocks.MultipleChoiceBlock(choices=[('LearningMedia', 'Lernmedien'), ('Link', 'Links'), ('Anker', 'Verankerung'), ('CrossReference', 'Querverweise')], max_length=20)), ('contents', wagtail.blocks.StreamBlock([('Links', wagtail.blocks.StructBlock([('title', wagtail.blocks.TextBlock(blank=False, null=False)), ('description', wagtail.blocks.TextBlock(default='')), ('link_display_text', wagtail.blocks.CharBlock(default='Link öffnen', max_length=255)), ('url', wagtail.blocks.URLBlock())])), ('Documents', wagtail.documents.blocks.DocumentChooserBlock()), ('Ankers', vbv_lernwelt.media_library.content_blocks.AnchorBlock()), ('CrossReference', wagtail.blocks.StructBlock([('description', wagtail.blocks.TextBlock(default='')), ('link_display_text', wagtail.blocks.CharBlock(default='Link öffnen', max_length=255)), ('category', wagtail.blocks.PageChooserBlock(page_type=['media_library.MediaCategoryPage']))]))]))]))], null=True, use_json_field=True)), + ('body', wagtail.fields.StreamField([('content_collection', wagtail.blocks.StructBlock([('title', wagtail.blocks.TextBlock()), ('contents', wagtail.blocks.StreamBlock([('Links', wagtail.blocks.StructBlock([('title', wagtail.blocks.TextBlock(blank=False, null=False)), ('description', wagtail.blocks.TextBlock(default='')), ('link_display_text', wagtail.blocks.CharBlock(default='Link öffnen', max_length=255)), ('url', wagtail.blocks.URLBlock())])), ('Documents', wagtail.documents.blocks.DocumentChooserBlock()), ('Ankers', vbv_lernwelt.media_library.content_blocks.AnchorBlock()), ('CrossReference', wagtail.blocks.StructBlock([('description', wagtail.blocks.TextBlock(default='')), ('link_display_text', wagtail.blocks.CharBlock(default='Link öffnen', max_length=255)), ('category', wagtail.blocks.PageChooserBlock(page_type=['media_library.MediaCategoryPage']))]))]))]))], null=True, use_json_field=True)), ('course_category', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='course.coursecategory')), ], options={ diff --git a/server/vbv_lernwelt/media_library/models.py b/server/vbv_lernwelt/media_library/models.py index 4c667516..122af5b2 100644 --- a/server/vbv_lernwelt/media_library/models.py +++ b/server/vbv_lernwelt/media_library/models.py @@ -6,7 +6,7 @@ from wagtail.documents.models import AbstractDocument, Document from wagtail.models import Page from vbv_lernwelt.core.model_utils import find_available_slug -from vbv_lernwelt.media_library.content_blocks import ContentCollection +from vbv_lernwelt.media_library.content_blocks import MediaContentCollection class MediaLibraryPage(Page): @@ -22,7 +22,6 @@ class MediaLibraryPage(Page): super(MediaLibraryPage, self).full_clean(*args, **kwargs) -# Todo: use wagtail collections for this... Only applicable for documents, since links etc. dont have collections class MediaCategoryPage(Page): """ Handlungsfeld. zB. Fahrzeug @@ -33,7 +32,7 @@ class MediaCategoryPage(Page): description = fields.RichTextField(default='') body = fields.StreamField( - [('content_collection', ContentCollection())], + [('content_collection', MediaContentCollection())], use_json_field=True, null=True ) diff --git a/server/vbv_lernwelt/media_library/tests/media_library_factories.py b/server/vbv_lernwelt/media_library/tests/media_library_factories.py index 9e5670c3..4f37bfeb 100644 --- a/server/vbv_lernwelt/media_library/tests/media_library_factories.py +++ b/server/vbv_lernwelt/media_library/tests/media_library_factories.py @@ -1,8 +1,9 @@ -import json +import uuid import wagtail_factories -from vbv_lernwelt.media_library.content_blocks import ContentCollection, AnchorBlock, LinkBlock, CrossReferenceBlock +from vbv_lernwelt.media_library.content_blocks import MediaContentCollection, AnchorBlock, LinkBlock, \ + CrossReferenceBlock from vbv_lernwelt.media_library.models import LibraryDocument, MediaLibraryPage, MediaCategoryPage @@ -29,7 +30,7 @@ class AnchorBlockFactory(wagtail_factories.StructBlockFactory): class LinkBlockFactory(wagtail_factories.StructBlockFactory): title = 'Interesting link' description = 'This link is really interesting...' - url = 'www.example.com' + url = 'https://www.vbv.ch/' class Meta: model = LinkBlock @@ -40,7 +41,7 @@ class CrossReferenceBlockFactory(wagtail_factories.StructBlockFactory): model = CrossReferenceBlock -class ContentCollectionFactory(wagtail_factories.StructBlockFactory): +class MediaContentCollectionFactory(wagtail_factories.StructBlockFactory): title = 'Links' contents = wagtail_factories.StreamFieldFactory({ 'Links': LinkBlockFactory, @@ -48,68 +49,52 @@ class ContentCollectionFactory(wagtail_factories.StructBlockFactory): }) class Meta: - model = ContentCollection + model = MediaContentCollection class MediaCategoryPageFactory(wagtail_factories.PageFactory): title = 'Fahrzeug' introduction_text = 'Das Auto ist für viele der grösste Stolz! Es birgt aber ...' description = 'Das erwartet dich in diesem Handlungsfeld' - body = wagtail_factories.StreamFieldFactory({'contents': ContentCollectionFactory}) class Meta: model = MediaCategoryPage -def generate_default_category(): - category = MediaCategoryPageFactory() - category.body = json.dumps(collection_body_dict()) - category.save() - return category - - -def generate_default_content_string( - block_type='Links', - content_idx=0, - content_property='url', - stream_field_name='contents'): - return f'{stream_field_name}__{content_idx}__{block_type}__{content_property}' - - -def generate_default_content2(**contents_dict): - # TODO: hierarchical test, has to be refactored. - stream_field_name = 'contents' - content_idx = 0 - block_type = 'Links' - content_property = 'url' - value = 'iterativ.ch' - contents_dict[ - f'body__content_collection__0__{stream_field_name}__{content_idx}__{block_type}__{content_property}'] = value - return contents_dict - - -def link_dict(link_block=LinkBlockFactory()): - d = { +def create_media_content_link(link_block=None): + if link_block is None: + link_block = LinkBlockFactory() + return { + "id": str(uuid.uuid4()), "type": "Links", - "collection_type": ["LearningMedia"], - "value": block_to_dict(link_block)} - return d - - -def document_dict(document=LibraryDocumentFactory()): - d = { - "type": "Documents", - "id": document.id + "value": dict(link_block.items()) } - return d -def block_to_dict(block): - return dict(block.items()) +def create_link_collection(links_dict=None): + return { + "id": str(uuid.uuid4()), + "type": "content_collection", + "value": { + "title": "Links", + "contents": [link_dict for link_dict in links_dict] + } + } -def collection_body_dict(): - d = [{"type": "content_collection", - "value": {"title": "Links", "contents": [link_dict()], }}, - {"type": "content_collection", - "value": {"title": "Lernmedien", "contents": [document_dict()], }}] +def create_document_collection(document_ids=None): + if document_ids is None: + document_ids = [d.id for d in LibraryDocument.objects.all()] + + return { + "id": str(uuid.uuid4()), + "type": "content_collection", + "value": { + "title": "Lernmedien", + "contents": [{ + "id": str(uuid.uuid4()), + "type": "Documents", + "value": doc_id + } for doc_id in document_ids] + } + } diff --git a/server/vbv_lernwelt/media_library/tests/test_media_library_factories.py b/server/vbv_lernwelt/media_library/tests/test_media_library_factories.py index 82f959f2..82a2198e 100644 --- a/server/vbv_lernwelt/media_library/tests/test_media_library_factories.py +++ b/server/vbv_lernwelt/media_library/tests/test_media_library_factories.py @@ -1,14 +1,12 @@ import json from django.test import TestCase -from wagtail.core.models import Collection from vbv_lernwelt.core.create_default_users import create_default_users from vbv_lernwelt.core.tests.helpers import create_locales_for_wagtail -from vbv_lernwelt.media_library.create_default_documents import create_default_collections, create_default_documents -from vbv_lernwelt.media_library.models import LibraryDocument, MediaCategoryPage -from vbv_lernwelt.media_library.tests.media_library_factories import ContentCollectionFactory, MediaCategoryPageFactory, \ - LinkBlockFactory, generate_default_category, generate_default_content2, collection_body_dict +from vbv_lernwelt.media_library.models import MediaCategoryPage +from vbv_lernwelt.media_library.tests.media_library_factories import MediaContentCollectionFactory, MediaCategoryPageFactory, \ + LinkBlockFactory, generate_default_content2, collection_body_dict class TestMediaLibraryFactories(TestCase): @@ -17,7 +15,7 @@ class TestMediaLibraryFactories(TestCase): create_locales_for_wagtail() def test_content_collection_factory(self): - content_collection = ContentCollectionFactory() + content_collection = MediaContentCollectionFactory() self.assertEqual(content_collection.get('title'), 'Links') self.assertEqual(content_collection.get('collection_type'), 'LearningMedia')