Added function to create testdata and DB

This commit is contained in:
Lorenz Padberg 2022-04-12 14:53:50 +02:00
parent 3496a20489
commit cd4276a7a5
14 changed files with 174 additions and 163 deletions

Binary file not shown.

View File

@ -1,16 +1,45 @@
#!/bin/bash #!/bin/bash
source ./setup-for-tests.sh
export DATABASE_HOST=postgres #export DATABASE_HOST=postgres
export DATABASE_PORT=5432 #export DATABASE_PORT=5432
export DATABASE_URL=postgres://$DATABASE_USER:$PG_PASSWORD@$DATABASE_HOST:$DATABASE_PORT/$DATABASE_NAME #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" #
#echo $DATABASE_URL
#DJANGO_SETTINGS_MODULE=config.settings.base
#DATABASE_NAME=vbv_lernwelt
SKIP_SETUP=false
##
echo "Setting up VBV Project for Local usage"
if [ "$SKIP_SETUP" = false ]; then
if [ -z "$PG_PORT" ]; then # if the port is set in the env, use iterg
DB_PORT="";
else
DB_PORT="-p $PG_PORT";
fi
if [ -z "$PG_USER" ]; then # if the user is set in the env, use it
DB_USER="";
else
DB_USER="-U $PG_USER";
fi
echo "psql -h localhost --port=$DB_PORT --username=$DB_USER -c 'drop database if exists' $DATABASE_NAME;"
echo "Drop all connections to the database"
psql -h localhost --port=$DB_PORT --username=$DB_USER -c "SELECT pg_terminate_backend(pg_stat_activity.pid) FROM pg_stat_activity WHERE pg_stat_activity.datname = '$DATABASE_NAME' AND pid <> pg_backend_pid();"
echo "Drop database: $DATABASE_NAME"
psql -h localhost --port=$DB_PORT --username=$DB_USER -c "drop database if exists $DATABASE_NAME;"
echo "Create database: $DATABASE_NAME"
psql -h localhost --port=$DB_PORT --username=$DB_USER -c "create database $DATABASE_NAME;"
# reset data
python3 server/manage.py createcachetable --settings="$DJANGO_SETTINGS_MODULE"
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_learningpath --settings="$DJANGO_SETTINGS_MODULE"
#
# # make django translations
(cd server && python3 manage.py compilemessages --settings="$DJANGO_SETTINGS_MODULE")
fi
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

@ -43,7 +43,7 @@ DJANGO_SETTINGS_MODULE=config.settings.test_cypress
CYPRESS_DB=vbv_lernwelt_cypress CYPRESS_DB=vbv_lernwelt_cypress
if [ "$SKIP_SETUP" = false ]; then if [ "$SKIP_SETUP" = false ]; then
if [ -z "$PG_PORT" ]; then # if the port is set in the env, use it if [ -z "$PG_PORT" ]; then # if the port is set in the env, use iterg
DB_PORT=""; DB_PORT="";
else else
DB_PORT="-p $PG_PORT"; DB_PORT="-p $PG_PORT";
@ -66,12 +66,7 @@ if [ "$SKIP_SETUP" = false ]; then
# make django translations # make django translations
(cd server && python3 manage.py compilemessages --settings="$DJANGO_SETTINGS_MODULE") (cd server && python3 manage.py compilemessages --settings="$DJANGO_SETTINGS_MODULE")
# python3 src/manage.py constance --settings="$DJANGO_SETTINGS_MODULE" set API_WFM_BACKEND_ENABLED true
# python3 src/manage.py constance --settings="$DJANGO_SETTINGS_MODULE" set TIBCO_SOAP_CUSTOMER_INTERACTION_CLIENT_ENABLED true
# python3 src/manage.py constance --settings="$DJANGO_SETTINGS_MODULE" set API_EMAIL_MESSAGING_ENABLED true
# python3 src/manage.py constance --settings="$DJANGO_SETTINGS_MODULE" set C4_NOTIFICATIONS_ENABLED true
# python3 src/manage.py constance --settings="$DJANGO_SETTINGS_MODULE" set SFTP_POSTFINANCE_ENABLED true
# python3 src/manage.py constance --settings="$DJANGO_SETTINGS_MODULE" set EASY_INSURANCE_AGENT_CAN_CREATE true
else else
echo "else" echo "else"
# python3 src/manage.py recreate_customer_data_for_integration_tests --settings="$DJANGO_SETTINGS_MODULE" # python3 src/manage.py recreate_customer_data_for_integration_tests --settings="$DJANGO_SETTINGS_MODULE"

View File

@ -0,0 +1,42 @@
# pylint: disable=unused-wildcard-import,wildcard-import,wrong-import-position
import getpass
import os
from .base import * # noqa
from .base import env
# GENERAL
# ------------------------------------------------------------------------------
# https://docs.djangoproject.com/en/dev/ref/settings/#secret-key
SECRET_KEY = env(
"VBV_DJANGO_SECRET_KEY",
default="1NpUCSvAKLpDZL9e3tqDaUesdfsadfasdfasdfMD3UjB72ZS",
)
# https://docs.djangoproject.com/en/dev/ref/settings/#test-runner
TEST_RUNNER = "django.test.runner.DiscoverRunner"
# PASSWORDS
# ------------------------------------------------------------------------------
# https://docs.djangoproject.com/en/dev/ref/settings/#password-hashers
PASSWORD_HASHERS = ["django.contrib.auth.hashers.MD5PasswordHasher"]
# EMAIL
# ------------------------------------------------------------------------------
# https://docs.djangoproject.com/en/dev/ref/settings/#email-backend
EMAIL_BACKEND = "django.core.mail.backends.locmem.EmailBackend"
class DisableMigrations(dict):
def __contains__(self, item):
return True
def __getitem__(self, item):
return None
#MIGRATION_MODULES = DisableMigrations()
# Your stuff...
# ------------------------------------------------------------------------------

View File

@ -1,10 +1,10 @@
from django.contrib.auth.hashers import make_password from django.contrib.auth.hashers import make_password
from django.contrib.auth.models import Group from django.contrib.auth.models import Group
from models import User from vbv_lernwelt.core.models import User
def create_test_users(user_model=User, group_model=Group): def create_default_users(user_model=User, group_model=Group):
admin_group, created = group_model.objects.get_or_create(name='admin_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') 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') student_group, created = group_model.objects.get_or_create(name='student_group')
@ -12,9 +12,10 @@ def create_test_users(user_model=User, group_model=Group):
admin_user, created = _get_or_create_user(user_model=user_model, admin_user, created = _get_or_create_user(user_model=user_model,
username='admin', username='admin',
password='admin') password='admin')
admin_user.is_superuser=True
admin_user.groups.add(admin_group) admin_user.groups.add(admin_group)
admin_user.save()
admin_user.save()
student_user, created = _get_or_create_user(user_model=user_model, username='student', password='student') student_user, created = _get_or_create_user(user_model=user_model, username='student', password='student')
student_user.groups.add(student_group) student_user.groups.add(student_group)
student_user.save() student_user.save()

View File

@ -1,9 +1,10 @@
# -*- coding: utf-8 -*- from vbv_lernwelt.core.create_default_users import create_default_users
#
# Iterativ GmbH
# http://www.iterativ.ch/ import djclick as click
#
# Copyright (c) 2015 Iterativ GmbH. All rights reserved.
# @click.command()
# Created on 2022-04-05 def command():
# @author: lorenz.padberg@iterativ.ch print("Creating default users.")
create_default_users()

View File

@ -1,117 +0,0 @@
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

@ -1,11 +1,9 @@
# pylint: disable=import-outside-toplevel
import djclick as click import djclick as click
from django.contrib.auth import get_user_model from django.conf import settings
from wagtail.core.models import Locale
from vbv_lernwelt.learnpath.tests.create_default_learning_path import create_default_learning_path, \
delete_default_learning_path
@click.command()
def command(): def command():
delete_default_learning_path() for language in settings.WAGTAIL_CONTENT_LANGUAGES:
Locale.objects.create(language_code=language[0])

View File

@ -4,7 +4,7 @@ import structlog
from django.conf import settings from django.conf import settings
from rest_framework.throttling import UserRateThrottle from rest_framework.throttling import UserRateThrottle
from structlog.types import EventDict from structlog.types import EventDict
#from .models import User
def structlog_add_app_info( def structlog_add_app_info(
logger: logging.Logger, method_name: str, event_dict: EventDict logger: logging.Logger, method_name: str, event_dict: EventDict

View File

@ -0,0 +1,18 @@
# Generated by Django 3.2.12 on 2022-04-12 12:48
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('learnpath', '0002_alter_circle_description'),
]
operations = [
migrations.AddField(
model_name='circle',
name='goals',
field=models.TextField(blank=True, default=''),
),
]

View File

@ -50,10 +50,16 @@ class Topic(Page):
class Circle(Page): class Circle(Page):
description = models.TextField(default="", blank=True) description = models.TextField(default="", blank=True)
goals = models.TextField(default="", blank=True)
parent_page_types = ['learnpath.Topic'] parent_page_types = ['learnpath.Topic']
subpage_types = ['learnpath.LearningSequence'] subpage_types = ['learnpath.LearningSequence']
content_panels = Page.content_panels + [
FieldPanel('description'),
FieldPanel('goals'),
]
class Meta: class Meta:
verbose_name = "Circle" verbose_name = "Circle"

View File

@ -2,7 +2,8 @@ import wagtail_factories
from wagtail.core.models import Site from wagtail.core.models import Site
from vbv_lernwelt.learnpath.models import LearningPath, Topic, Circle, LearningSequence, LearningUnit from vbv_lernwelt.learnpath.models import LearningPath, Topic, Circle, LearningSequence, LearningUnit
from vbv_lernwelt.learnpath.tests.learningpath_factories import LearningPathFactory, TopicFactory, CircleFactory, LearningSequenceFactory, LearningUnitFactory from vbv_lernwelt.learnpath.tests.learningpath_factories import LearningPathFactory, TopicFactory, CircleFactory, \
LearningSequenceFactory, LearningUnitFactory
def create_default_learning_path(): def create_default_learning_path():
@ -26,13 +27,51 @@ def create_default_learning_path():
lu_1 = LearningUnitFactory.create(title="Herzlich Willkommmen", parent=ls_2) lu_1 = LearningUnitFactory.create(title="Herzlich Willkommmen", parent=ls_2)
tp = TopicFactory.create(title="Gewinnen von Kunden", parent=lp) tp = TopicFactory.create(title="Gewinnen von Kunden", parent=lp)
circle_2 = CircleFactory.create(title="Gewinnen", parent=tp) circle_2 = CircleFactory.create(title="Gewinnen", parent=tp, description="""Versicherungsvermittlerinnen und -vermittler verfügen über
ein starkes Netzwerk, das sie gezielt pflegen und ausbauen. Sie beraten und betreuen ihre bestehenden Kundinnen und Kunden professionell und gewinnen so ihr Vertrauen. Dadurch schaffen sie die Basis für das Gewinnen
von neuen Kundinnen und Kunden. Versicherungsvermittlerinnen und -vermittler sprechen ihre bestehenden Kundinnen
und Kunden auf Weiterempfehlung an. So nutzen sie ihre
bestehenden Kontakte geschickt für das Anwerben von
Neukundinnen und -kunden.
""", goals=""" Bestehende Kunden so zu beraten, dass
sie von diesen weiterempfohlen werden
Geeignete Personen wie z.B. Garagisten, Architekten, Treuhänder auf die
Vermittlung/Zusammenarbeit anzusprechen
Verschiedene Datenquellen wie Internet, Telefonbuch, Handelszeitung, Baugesuche etc. Gezielt für die Gewinnung
von Neukunden zu benützen
Ein beliebiges Gespräch resp. Einen bestehenden Kontakt in die Richtung
«Versicherung» zu lenken
Das Thema Risiko und Sicherheit in einem Gespräch gezielt und auf die Situation des jeweiligen Gesprächspartners bezogen einfliessen zu lassen
Im täglichen Kontakt potenzielle Kundinnen und Kunden zu erkennen""")
tp = TopicFactory.create(title="Beraten der Kunden", parent=lp) tp = TopicFactory.create(title="Beraten der Kunden", parent=lp)
circle_3 = CircleFactory.create(title="Einstieg", parent=tp) circle_3 = CircleFactory.create(title="Einstieg", parent=tp)
circle_4 = CircleFactory.create(title="Analyse", parent=tp) circle_4 = CircleFactory.create(title="Analyse", parent=tp,
circle_5 = CircleFactory.create(title="Lösung", parent=tp) description="""Nach dem Gespräch werten sie die Analyse aus und erstellen mit den
circle_6 = CircleFactory.create(title="Abschluss", parent=tp) zur Verfügung stehenden Systemen formal korrekte Lösungsvorschläge bzw.
Ausschreibungen. Je nach Komplexität der Situation ziehen sie die nötigen
Fachspezialisten bei.""",
goals="""
Aus dem IST-Zustand (aus der durchgeführten Analyse) individuelle, risikogewichtete und finanzierbare Lösungsvorschläge zu erarbeiten
Eine Unterversicherung, eine Doppeloder Überversicherung oder einen fehlenden Versicherungsschutz festzustellen
Mögliches Optimierungspotential unter Berücksichtigung der finanziellen
Situation des Kunden zu erkennen
Lösungsvorschläge zu skizzieren und
zu visualisieren""")
circle_5 = CircleFactory.create(title="Lösung",
parent=tp,
goals="""— Die Daten des Kunden korrekt in die notwendigen Systeme einzutragen
Fachspezialisten beizuziehen, falls dies angezeigt ist
Mit den zur Verfügung stehenden Systemen korrekte Lösungsvorschläge
(z.B. Offerten oder Ausschreibungen) zu verfassen
Falls nötig die Lösungsvorschläge dem Underwriting weiterzuleiten und
Unklarheiten zu bereinigen """)
circle_6 = CircleFactory.create(title="Abschluss",
parent=tp,
goals="""— Je nach Komplexität der Lösungsvorschläge (z.B. Offerten oder Offertvergleich) einen Fachspezialisten aufzubieten
Sich kundenorientiert auf das Gespräch vorzubereiten und sich passend zu präsentieren""")
tp = TopicFactory.create(title="Betreuen und Ausbauen des Kundenstamms", parent=lp) tp = TopicFactory.create(title="Betreuen und Ausbauen des Kundenstamms", parent=lp)
circle_7 = CircleFactory.create(title="Betreuen", parent=tp) circle_7 = CircleFactory.create(title="Betreuen", parent=tp)
@ -47,4 +86,3 @@ def delete_default_learning_path():
Circle.objects.all().delete() Circle.objects.all().delete()
Topic.objects.all().delete() Topic.objects.all().delete()
LearningPath.objects.all().delete() LearningPath.objects.all().delete()