diff --git a/prepare_server.sh b/prepare_server.sh index b9d2fc36..1a5b1916 100755 --- a/prepare_server.sh +++ b/prepare_server.sh @@ -63,6 +63,7 @@ if [ "$SKIP_SETUP" = false ]; then python3 server/manage.py migrate --settings="$DJANGO_SETTINGS_MODULE" python3 server/manage.py create_default_users --settings="$DJANGO_SETTINGS_MODULE" python3 server/manage.py create_default_learning_path --settings="$DJANGO_SETTINGS_MODULE" + python3 server/manage.py create_default_media_library --settings="$DJANGO_SETTINGS_MODULE" # make django translations (cd server && python3 manage.py compilemessages --settings="$DJANGO_SETTINGS_MODULE") diff --git a/server/config/settings/base.py b/server/config/settings/base.py index 86cc8254..a0a4609e 100644 --- a/server/config/settings/base.py +++ b/server/config/settings/base.py @@ -107,6 +107,7 @@ LOCAL_APPS = [ "vbv_lernwelt.sso", "vbv_lernwelt.learnpath", "vbv_lernwelt.completion", + "vbv_lernwelt.media_library", ] # https://docs.djangoproject.com/en/dev/ref/settings/#installed-apps INSTALLED_APPS = DJANGO_APPS + THIRD_PARTY_APPS + LOCAL_APPS @@ -213,6 +214,8 @@ LANGUAGES = [ ('it-CH', "Swiss Italian") ] +WAGTAILDOCS_DOCUMENT_MODEL = 'media_library.CustomDocument' + WAGTAIL_CONTENT_LANGUAGES = [ ('fr-CH', "Swiss French"), diff --git a/server/vbv_lernwelt/media_library/__init__.py b/server/vbv_lernwelt/media_library/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/server/vbv_lernwelt/media_library/admin.py b/server/vbv_lernwelt/media_library/admin.py new file mode 100644 index 00000000..8c38f3f3 --- /dev/null +++ b/server/vbv_lernwelt/media_library/admin.py @@ -0,0 +1,3 @@ +from django.contrib import admin + +# Register your models here. diff --git a/server/vbv_lernwelt/media_library/apps.py b/server/vbv_lernwelt/media_library/apps.py new file mode 100644 index 00000000..8aa00356 --- /dev/null +++ b/server/vbv_lernwelt/media_library/apps.py @@ -0,0 +1,18 @@ +from django.apps import AppConfig + + +class MediaLibraryConfig(AppConfig): + default_auto_field = 'django.db.models.BigAutoField' + name = 'vbv_lernwelt.media_library' + + + # + # default_auto_field = 'django.db.models.BigAutoField' + # name = 'vbv_lernwelt.learnpath' + # + # def ready(self): + # try: + # # pylint: disable=unused-import,import-outside-toplevel + # import vbv_lernwelt.learnpath.signals # noqa F401 + # except ImportError: + # pass diff --git a/server/vbv_lernwelt/media_library/create_default_documents.py b/server/vbv_lernwelt/media_library/create_default_documents.py new file mode 100644 index 00000000..8646a58d --- /dev/null +++ b/server/vbv_lernwelt/media_library/create_default_documents.py @@ -0,0 +1,16 @@ +from wagtail.core.models import Collection + + +def create_default_collections(): + c = Collection.objects.all().delete() + + root, created = Collection.objects.get_or_create(name='Root', depth=0) + versicherungsvermittler = root.add_child(name='Versicherungsvermittler/in') + handlungsfelder = versicherungsvermittler.add_child(name='Handlungsfelder') + + + handlungsfelder_names = ['Fahrzeug', 'Reisen', 'Einkommensicherung', 'Gesundheit', 'Haushalt', 'Sparen', 'Pensionierung', 'KMU', 'Wohneigentum', 'Rechtsstreitigkeiten', 'Erben / Vererben', 'Selbständigkeit'] + + for handlungsfeld in handlungsfelder_names: + versicherungsvermittler = handlungsfelder.add_child(name=handlungsfeld) + diff --git a/server/vbv_lernwelt/media_library/management/__init__.py b/server/vbv_lernwelt/media_library/management/__init__.py new file mode 100644 index 00000000..2b30a24a --- /dev/null +++ b/server/vbv_lernwelt/media_library/management/__init__.py @@ -0,0 +1,9 @@ +# -*- coding: utf-8 -*- +# +# Iterativ GmbH +# http://www.iterativ.ch/ +# +# Copyright (c) 2015 Iterativ GmbH. All rights reserved. +# +# Created on 2022-08-18 +# @author: lorenz.padberg@iterativ.ch diff --git a/server/vbv_lernwelt/media_library/management/commands/__init__.py b/server/vbv_lernwelt/media_library/management/commands/__init__.py new file mode 100644 index 00000000..2b30a24a --- /dev/null +++ b/server/vbv_lernwelt/media_library/management/commands/__init__.py @@ -0,0 +1,9 @@ +# -*- coding: utf-8 -*- +# +# Iterativ GmbH +# http://www.iterativ.ch/ +# +# Copyright (c) 2015 Iterativ GmbH. All rights reserved. +# +# Created on 2022-08-18 +# @author: lorenz.padberg@iterativ.ch 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 new file mode 100644 index 00000000..a32c2e6d --- /dev/null +++ b/server/vbv_lernwelt/media_library/management/commands/create_default_media_library.py @@ -0,0 +1,8 @@ +import djclick as click + +from vbv_lernwelt.media_library.create_default_documents import create_default_collections + + +@click.command() +def command(): + create_default_collections() diff --git a/server/vbv_lernwelt/media_library/migrations/0001_initial.py b/server/vbv_lernwelt/media_library/migrations/0001_initial.py new file mode 100644 index 00000000..bb2696cd --- /dev/null +++ b/server/vbv_lernwelt/media_library/migrations/0001_initial.py @@ -0,0 +1,46 @@ +# Generated by Django 3.2.13 on 2022-08-16 08:35 + +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion +import taggit.managers +import wagtail.models.collections +import wagtail.search.index + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ('wagtailcore', '0069_log_entry_jsonfield'), + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('taggit', '0004_alter_taggeditem_content_type_alter_taggeditem_tag'), + ] + + operations = [ + migrations.CreateModel( + name='CustomDocument', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('title', models.CharField(max_length=255, verbose_name='title')), + ('file', models.FileField(upload_to='documents', verbose_name='file')), + ('created_at', models.DateTimeField(auto_now_add=True, verbose_name='created at')), + ('file_size', models.PositiveIntegerField(editable=False, null=True)), + ('file_hash', models.CharField(blank=True, editable=False, max_length=40)), + ('display_text', models.CharField(default='', max_length=1024)), + ('description', models.TextField(default='')), + ('link_display_text', models.CharField(default='', max_length=1024)), + ('thumbnail', models.URLField()), + ('collection', models.ForeignKey(default=wagtail.models.collections.get_root_collection_id, on_delete=django.db.models.deletion.CASCADE, related_name='+', to='wagtailcore.collection', verbose_name='collection')), + ('tags', taggit.managers.TaggableManager(blank=True, help_text=None, through='taggit.TaggedItem', to='taggit.Tag', verbose_name='tags')), + ('uploaded_by_user', models.ForeignKey(blank=True, editable=False, null=True, on_delete=django.db.models.deletion.SET_NULL, to=settings.AUTH_USER_MODEL, verbose_name='uploaded by user')), + ], + options={ + 'verbose_name': 'document', + 'verbose_name_plural': 'documents', + 'abstract': False, + }, + bases=(wagtail.search.index.Indexed, models.Model), + ), + ] diff --git a/server/vbv_lernwelt/media_library/migrations/__init__.py b/server/vbv_lernwelt/media_library/migrations/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/server/vbv_lernwelt/media_library/models.py b/server/vbv_lernwelt/media_library/models.py new file mode 100644 index 00000000..f3bd9276 --- /dev/null +++ b/server/vbv_lernwelt/media_library/models.py @@ -0,0 +1,71 @@ +from django.db import models + +# Create your models here. +from wagtail.models import Page +from wagtail.documents.models import AbstractDocument, Document + + +class CustomDocument(AbstractDocument): + # Todo: check https://filepreviews.io/ + + # Custom field example: + display_text = models.CharField(max_length=1024, default='') + description = models.TextField(default='') + link_display_text = models.CharField(max_length=1024, default='') + thumbnail = models.URLField() + + + admin_form_fields = Document.admin_form_fields + ( + 'display_text', 'description', 'link_display_text', 'thumbnail' + ) + + +class TopCategory(Page): + """ + Handlungsfelder + """ + parent_page_types = ['learnpath.LearningPath'] + subpage_types = ['media_library.Category'] + + + +# Todo: use wagtail collections for this... + + +class Category(Page): + """ + Handlungsfeld + """ + + parent_page_types = ['media_library.TopCategory'] + +# +# description +# thumbnail_image +# description_image +# additional_content # Rich text field +# documents = [] +# +# +# class LibraryDocument(CustomDocument): +# """ +# Extension from the standart Wagtail document. +# """ +# pass +# +# +# class LibraryLink(): +# """ +# Custom Link Block +# +# """ +# pass +# +# +# class LearningPathReference(): +# icon +# pass +# +# +# class CrossReference(): +# pass diff --git a/server/vbv_lernwelt/media_library/test_data.py b/server/vbv_lernwelt/media_library/test_data.py new file mode 100644 index 00000000..9e6e0951 --- /dev/null +++ b/server/vbv_lernwelt/media_library/test_data.py @@ -0,0 +1,12 @@ +# -*- coding: utf-8 -*- +# +# Iterativ GmbH +# http://www.iterativ.ch/ +# +# Copyright (c) 2015 Iterativ GmbH. All rights reserved. +# +# Created on 2022-08-16 +# @author: lorenz.padberg@iterativ.ch + + + diff --git a/server/vbv_lernwelt/media_library/tests.py b/server/vbv_lernwelt/media_library/tests.py new file mode 100644 index 00000000..7ce503c2 --- /dev/null +++ b/server/vbv_lernwelt/media_library/tests.py @@ -0,0 +1,3 @@ +from django.test import TestCase + +# Create your tests here. diff --git a/server/vbv_lernwelt/media_library/tests/__init__.py b/server/vbv_lernwelt/media_library/tests/__init__.py new file mode 100644 index 00000000..ae29b5e3 --- /dev/null +++ b/server/vbv_lernwelt/media_library/tests/__init__.py @@ -0,0 +1,9 @@ +# -*- coding: utf-8 -*- +# +# Iterativ GmbH +# http://www.iterativ.ch/ +# +# Copyright (c) 2015 Iterativ GmbH. All rights reserved. +# +# Created on 2022-08-16 +# @author: lorenz.padberg@iterativ.ch diff --git a/server/vbv_lernwelt/media_library/tests/media_library_factories.py b/server/vbv_lernwelt/media_library/tests/media_library_factories.py new file mode 100644 index 00000000..a7a37fd8 --- /dev/null +++ b/server/vbv_lernwelt/media_library/tests/media_library_factories.py @@ -0,0 +1,15 @@ + +import wagtail_factories + +from vbv_lernwelt.learnpath.models import LearningPath, Topic, Circle, LearningSequence, LearningContent, LearningUnit, \ + LearningUnitQuestion +from vbv_lernwelt.media_library.models import CustomDocument + + +class LibraryDocumentFactory(wagtail_factories.PageFactory): + link_display_text = 'Dokument herunter laden' + thumbnail = 'https://d9-wret.s3.us-west-2.amazonaws.com/assets/palladium/production/s3fs-public/thumbnails/image/file.jpg' + + class Meta: + model = CustomDocument + diff --git a/server/vbv_lernwelt/media_library/tests/test_create_default_documents.py b/server/vbv_lernwelt/media_library/tests/test_create_default_documents.py new file mode 100644 index 00000000..eec04ab8 --- /dev/null +++ b/server/vbv_lernwelt/media_library/tests/test_create_default_documents.py @@ -0,0 +1,23 @@ +from django.conf import settings +from django.test import TestCase +from wagtail.core.models import Collection +from wagtail.models import Locale + +from vbv_lernwelt.core.create_default_users import create_default_users +from vbv_lernwelt.media_library.create_default_documents import create_default_collections + + +class TestCreateDefaultDocuments(TestCase): + def setUp(self) -> None: + create_default_users() + create_locales_for_wagtail() + + def test_create_default_collections(self): + create_default_collections() + qs = Collection.objects.filter(name="Versicherungsvermittler/in") + self.assertTrue(qs.exists()) + + +def create_locales_for_wagtail(): + for language in settings.WAGTAIL_CONTENT_LANGUAGES: + Locale.objects.get_or_create(language_code=language[0]) diff --git a/server/vbv_lernwelt/media_library/views.py b/server/vbv_lernwelt/media_library/views.py new file mode 100644 index 00000000..91ea44a2 --- /dev/null +++ b/server/vbv_lernwelt/media_library/views.py @@ -0,0 +1,3 @@ +from django.shortcuts import render + +# Create your views here.