created learnpath factories

This commit is contained in:
Lorenz Padberg 2022-04-05 11:07:03 +02:00
parent 35d26276e1
commit 3496a20489
16 changed files with 344 additions and 98 deletions

16
local-setup-for-tests.sh Executable file
View File

@ -0,0 +1,16 @@
#!/bin/bash
source ./setup-for-tests.sh
export DATABASE_HOST=postgres
export DATABASE_PORT=5432
export DATABASE_URL=postgres://$DATABASE_USER:$PG_PASSWORD@$DATABASE_HOST:$DATABASE_PORT/$DATABASE_NAME
psql -U $DATABASE_USER -h $DATABASE_HOST -c "drop database $DATABASE_NAME"
npm install --prefix client
#npm run "install:cypress" --prefix client
psql -U $DATABASE_USER -h $DATABASE_HOST -c "create database $DATABASE_NAME"
python server/manage.py dummy_data
python server/manage.py runserver &
npm run dev --prefix client &
cd client
/node_modules/.bin/cypress run

View File

@ -1,3 +1,6 @@
export VBV_DATABASE_URL='postgres://vbv_lernwelt@localhost:5432/vbv_lernwelt'
#export VBV_DJANGO_LOGGING_CONF=VBV_DJANGO_LOGGING_CONF_CONSOLE_COLOR
export VBV_DJANGO_DEBUG=True
export PATH=/Applications/Postgres.app/Contents/Versions/14/bin:$PATH

0
server/local.env Normal file
View File

View File

@ -0,0 +1,5 @@
python manage.py migrate
python manage.py createcachetable
python manage.py create_default_users
#python manage.py create_default_learingpath

View File

@ -0,0 +1,33 @@
from django.contrib.auth.hashers import make_password
from django.contrib.auth.models import Group
from models import User
def create_test_users(user_model=User, group_model=Group):
admin_group, created = group_model.objects.get_or_create(name='admin_group')
content_creator_grop, created = group_model.objects.get_or_create(name='content_creator_grop')
student_group, created = group_model.objects.get_or_create(name='student_group')
admin_user, created = _get_or_create_user(user_model=user_model,
username='admin',
password='admin')
admin_user.groups.add(admin_group)
admin_user.save()
student_user, created = _get_or_create_user(user_model=user_model, username='student', password='student')
student_user.groups.add(student_group)
student_user.save()
def _get_or_create_user(user_model, *args, **kwargs):
username = kwargs.get('username', None)
password = kwargs.get('password', None)
created = False
user = user_model.objects.filter(username=username).first()
if not user:
user = user_model.objects.create(username=username, password=make_password(password))
created = True
return user, created

View File

@ -0,0 +1,9 @@
# -*- coding: utf-8 -*-
#
# Iterativ GmbH
# http://www.iterativ.ch/
#
# Copyright (c) 2015 Iterativ GmbH. All rights reserved.
#
# Created on 2022-04-05
# @author: lorenz.padberg@iterativ.ch

View File

@ -0,0 +1,117 @@
import os
import random
import shutil
from uuid import uuid1
import wagtail_factories
from django.conf import settings
from django.core import management
from django.core.management import BaseCommand
from django.db import connection
from wagtail.core.models import Page
from books.factories import BookFactory, TopicFactory, ModuleFactory, ChapterFactory, ContentBlockFactory
from core.factories import UserFactory
from objectives.factories import ObjectiveGroupFactory, ObjectiveFactory
from users.services import create_users, create_student
from .data.module_data import data
from .data.user_data import user_data
class Command(BaseCommand):
def ensure_clean_dir(self, folder):
path = os.path.join(settings.MEDIA_ROOT, folder)
if os.path.exists(path):
shutil.rmtree(path)
if not os.path.exists(path):
os.makedirs(path)
def filter_data(self, input_data, 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:
cursor.execute("DROP SCHEMA IF EXISTS public CASCADE;")
cursor.execute(
"CREATE SCHEMA IF NOT EXISTS public AUTHORIZATION {};".format(settings.DATABASES['default']['USER']))
cursor.execute("GRANT ALL ON SCHEMA public TO {};".format(settings.DATABASES['default']['USER']))
management.call_command('migrate', verbosity=0, interactive=False)
self.ensure_clean_dir('images')
self.ensure_clean_dir('original_images')
self.ensure_clean_dir('documents')
site = wagtail_factories.SiteFactory.create(is_default_site=True)
Page.objects.get(title='Root').delete()
UserFactory(
username='test',
is_staff=True,
is_superuser=True,
first_name='Nicol',
last_name='Bolas',
onboarding_visited=True
)
create_users(user_data)
# create student without class
create_student(
username='hansli',
first_name='Hansli',
last_name='Alleini'
)
for book_idx, book_data in enumerate(data):
book = BookFactory.create(parent=site.root_page, **self.filter_data(book_data, 'topics'))
default_topics = [{} for _ in range(0, random.randint(5, 8))]
topics_data = book_data.get('topics', default_topics)
for topic_idx, topic_data in enumerate(topics_data):
topic = TopicFactory.create(parent=book, **self.filter_data(topic_data, 'modules'))
default_modules = [{} for _ in range(0, random.randint(3, 6))]
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', 'chapters']))
default_objective_groups = [{} for _ 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):
factory_params = self.filter_data(objective_group_entry, 'objectives')
objective_group = ObjectiveGroupFactory.create(module=module,
**factory_params)
default_objectives = [{} for _ in range(0, 4)]
objectives_data = objective_group_entry.get('objectives', default_objectives)
for objective_idx, objective_data in enumerate(objectives_data):
ObjectiveFactory.create(group=objective_group, **objective_data)
default_chapters = [{} for _ 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 _ 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, 'contents'))
ContentBlockFactory.create(parent=chapter, module=module, slug=f'{uuid1()}', **content_block_data)
# now create all and rooms
management.call_command('dummy_rooms', verbosity=0)
management.call_command('dummy_news', verbosity=0)

View File

@ -0,0 +1,11 @@
# pylint: disable=import-outside-toplevel
import djclick as click
from django.contrib.auth import get_user_model
from vbv_lernwelt.learnpath.tests.create_default_learning_path import create_default_learning_path, \
delete_default_learning_path
def command():
delete_default_learning_path()

View File

@ -0,0 +1,11 @@
# pylint: disable=import-outside-toplevel
import djclick as click
from django.contrib.auth import get_user_model
from vbv_lernwelt.learnpath.tests.create_default_learning_path import create_default_learning_path
@click.command()
def command():
create_default_learning_path()

View File

@ -0,0 +1,14 @@
# pylint: disable=import-outside-toplevel
import djclick as click
from django.contrib.auth import get_user_model
from vbv_lernwelt.learnpath.tests.create_default_learning_path import create_default_learning_path, \
delete_default_learning_path
import djclick as click
@click.command()
def command():
delete_default_learning_path()

View File

@ -1,4 +1,4 @@
# Generated by Django 3.2.12 on 2022-03-29 09:21
# Generated by Django 3.2.12 on 2022-04-04 14:52
from django.db import migrations, models
import django.db.models.deletion
@ -14,66 +14,55 @@ class Migration(migrations.Migration):
operations = [
migrations.CreateModel(
name='LearnBlock',
name='Circle',
fields=[
('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')),
('internal_name', models.CharField(max_length=255)),
('description', models.TextField(default='')),
],
options={
'abstract': False,
'verbose_name': 'Circle',
},
bases=('wagtailcore.page',),
),
migrations.CreateModel(
name='Circle',
name='LearningPath',
fields=[
('learnblock_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='learnpath.learnblock')),
('description', models.TextField(default='')),
('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')),
],
options={
'abstract': False,
'verbose_name': 'Learning Path',
},
bases=('learnpath.learnblock',),
bases=('wagtailcore.page',),
),
migrations.CreateModel(
name='LearnPath',
name='LearningSequence',
fields=[
('learnblock_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='learnpath.learnblock')),
('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')),
],
options={
'abstract': False,
'verbose_name': 'homepage',
},
bases=('learnpath.learnblock',),
bases=('wagtailcore.page',),
),
migrations.CreateModel(
name='LearnSequence',
name='LearningUnit',
fields=[
('learnblock_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='learnpath.learnblock')),
('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')),
],
options={
'abstract': False,
'verbose_name': 'Learning Unig',
},
bases=('learnpath.learnblock',),
),
migrations.CreateModel(
name='LearnUnit',
fields=[
('learnblock_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='learnpath.learnblock')),
],
options={
'abstract': False,
},
bases=('learnpath.learnblock',),
bases=('wagtailcore.page',),
),
migrations.CreateModel(
name='Topic',
fields=[
('learnblock_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='learnpath.learnblock')),
('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')),
('is_visible', models.BooleanField(default=True)),
],
options={
'abstract': False,
'verbose_name': 'Topic',
},
bases=('learnpath.learnblock',),
bases=('wagtailcore.page',),
),
]

View File

@ -0,0 +1,18 @@
# Generated by Django 3.2.12 on 2022-04-04 15:46
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('learnpath', '0001_initial'),
]
operations = [
migrations.AlterField(
model_name='circle',
name='description',
field=models.TextField(blank=True, default=''),
),
]

View File

@ -1,55 +0,0 @@
# Generated by Django 3.2.12 on 2022-03-29 13:06
from django.conf import settings
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('wagtailcore', '0066_collection_management_permissions'),
('wagtailredirects', '0007_add_autocreate_fields'),
('contenttypes', '0002_remove_content_type_name'),
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
('wagtailforms', '0004_add_verbose_name_plural'),
('learnpath', '0001_initial'),
]
operations = [
migrations.RenameModel(
old_name='LearnPath',
new_name='LearningPath',
),
migrations.RenameModel(
old_name='LearnSequence',
new_name='LearningSequence',
),
migrations.RenameModel(
old_name='LearnUnit',
new_name='LearningUnit',
),
migrations.AlterModelOptions(
name='circle',
options={'verbose_name': 'Circle'},
),
migrations.AlterModelOptions(
name='learningpath',
options={'verbose_name': 'Learning Path'},
),
migrations.AlterModelOptions(
name='learningsequence',
options={'verbose_name': 'homepage'},
),
migrations.AlterModelOptions(
name='learningunit',
options={'verbose_name': 'Learning Unig'},
),
migrations.AlterModelOptions(
name='topic',
options={'verbose_name': 'Topic'},
),
migrations.RemoveField(
model_name='learnblock',
name='internal_name',
),
]

View File

@ -1,15 +1,18 @@
# Create your models here.
from django.db import models
from wagtail.core.models import Page
from wagtail.admin.edit_handlers import FieldPanel
from wagtail.core.fields import RichTextField
from wagtail.core.models import Page
# class HomePage(Page):
# body = RichTextField(default='', blank=True)
#
#
# class LearnBlock(Page):
# pass
# # id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
#
# content_panels = Page.content_panels + [
# FieldPanel('body', classname="full"),
# ]
class LearningPath(Page):
content_panels = Page.content_panels + [
@ -28,7 +31,6 @@ class LearningPath(Page):
class Topic(Page):
is_visible = models.BooleanField(default=True)
content_panels = Page.content_panels + [
FieldPanel('is_visible', classname="full"),
]
@ -47,7 +49,7 @@ class Topic(Page):
class Circle(Page):
description = models.TextField(default="")
description = models.TextField(default="", blank=True)
parent_page_types = ['learnpath.Topic']
subpage_types = ['learnpath.LearningSequence']

View File

@ -1,6 +1,50 @@
from vbv_lernwelt.learnpath.models import LearningPath
from vbv_lernwelt.learnpath.tests.learningpath_factories import LearningPathFactory
import wagtail_factories
from wagtail.core.models import Site
from vbv_lernwelt.learnpath.models import LearningPath, Topic, Circle, LearningSequence, LearningUnit
from vbv_lernwelt.learnpath.tests.learningpath_factories import LearningPathFactory, TopicFactory, CircleFactory, LearningSequenceFactory, LearningUnitFactory
def create_default_learning_path():
lp = LearningPathFactory()
site = Site.objects.filter(is_default_site=True).first()
if not site:
site = wagtail_factories.SiteFactory.get(is_default_site=True)
lp = LearningPathFactory.create(title="Versicherungsvermittler/in", parent=site.root_page)
tp = TopicFactory.create(title="Basis", is_visible=False, parent=lp)
circle_1 = CircleFactory.create(title="Basis", parent=tp, description="""In diesem Circle erklären wir dir, wie der Lehrgang
Versicherungsvermittler / in " aufgebaut ist. Zudem vermitteln wir dir die wichtigsten Grundlagen,
damit erfolgreich mit deinem Lernpfad starten kannst.""")
ls_1 = LearningSequenceFactory.create(title='Einleitung', parent=circle_1)
lu_1 = LearningUnitFactory.create(title="Herzlich Willkommmen", parent=ls_1)
ls_2 = LearningSequenceFactory.create(title='Grundlagen', parent=circle_1)
lu_1 = LearningUnitFactory.create(title="Herzlich Willkommmen", parent=ls_2)
tp = TopicFactory.create(title="Gewinnen von Kunden", parent=lp)
circle_2 = CircleFactory.create(title="Gewinnen", parent=tp)
tp = TopicFactory.create(title="Beraten der Kunden", parent=lp)
circle_3 = CircleFactory.create(title="Einstieg", parent=tp)
circle_4 = CircleFactory.create(title="Analyse", parent=tp)
circle_5 = CircleFactory.create(title="Lösung", parent=tp)
circle_6 = CircleFactory.create(title="Abschluss", parent=tp)
tp = TopicFactory.create(title="Betreuen und Ausbauen des Kundenstamms", parent=lp)
circle_7 = CircleFactory.create(title="Betreuen", parent=tp)
tp = TopicFactory.create(title="Prüfung", is_visible=False, parent=lp)
circle_7 = CircleFactory.create(title="Prüfungsvorbereitung", parent=tp)
def delete_default_learning_path():
LearningUnit.objects.all().delete()
LearningSequence.objects.all().delete()
Circle.objects.all().delete()
Topic.objects.all().delete()
LearningPath.objects.all().delete()

View File

@ -1,6 +1,6 @@
import wagtail_factories
from vbv_lernwelt.learnpath.models import LearningPath
from vbv_lernwelt.learnpath.models import LearningPath, Topic, Circle, LearningSequence, LearningUnit
class LearningPathFactory(wagtail_factories.PageFactory):
@ -8,3 +8,32 @@ class LearningPathFactory(wagtail_factories.PageFactory):
class Meta:
model = LearningPath
class TopicFactory(wagtail_factories.PageFactory):
title = "Gewinnen von Kunden"
is_visible = True
class Meta:
model = Topic
class CircleFactory(wagtail_factories.PageFactory):
title = "Gewinnen"
class Meta:
model = Circle
class LearningSequenceFactory(wagtail_factories.PageFactory):
title = "Grundlagen"
class Meta:
model = LearningSequence
class LearningUnitFactory(wagtail_factories.PageFactory):
title = "Herzlich Willkommen"
class Meta:
model = LearningUnit