Fix test lerngang
This commit is contained in:
parent
d5e484a6c7
commit
b5804c2696
|
|
@ -63,9 +63,6 @@ if [ "$SKIP_SETUP" = false ]; then
|
||||||
python3 server/manage.py migrate --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_users --settings="$DJANGO_SETTINGS_MODULE"
|
||||||
python3 server/manage.py create_default_courses --settings="$DJANGO_SETTINGS_MODULE"
|
python3 server/manage.py create_default_courses --settings="$DJANGO_SETTINGS_MODULE"
|
||||||
python3 server/manage.py create_default_learning_path --settings="$DJANGO_SETTINGS_MODULE"
|
|
||||||
python3 server/manage.py create_default_competence_profile --settings="$DJANGO_SETTINGS_MODULE"
|
|
||||||
python3 server/manage.py create_default_media_library --settings="$DJANGO_SETTINGS_MODULE"
|
|
||||||
|
|
||||||
# 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")
|
||||||
|
|
|
||||||
|
|
@ -107,7 +107,6 @@ LOCAL_APPS = [
|
||||||
"vbv_lernwelt.learnpath",
|
"vbv_lernwelt.learnpath",
|
||||||
"vbv_lernwelt.competence",
|
"vbv_lernwelt.competence",
|
||||||
"vbv_lernwelt.media_library",
|
"vbv_lernwelt.media_library",
|
||||||
"vbv_lernwelt.completion",
|
|
||||||
]
|
]
|
||||||
# https://docs.djangoproject.com/en/dev/ref/settings/#installed-apps
|
# https://docs.djangoproject.com/en/dev/ref/settings/#installed-apps
|
||||||
INSTALLED_APPS = DJANGO_APPS + THIRD_PARTY_APPS + LOCAL_APPS
|
INSTALLED_APPS = DJANGO_APPS + THIRD_PARTY_APPS + LOCAL_APPS
|
||||||
|
|
|
||||||
|
|
@ -10,8 +10,6 @@ from wagtail import urls as wagtail_urls
|
||||||
from wagtail.admin import urls as wagtailadmin_urls
|
from wagtail.admin import urls as wagtailadmin_urls
|
||||||
from wagtail.documents import urls as wagtaildocs_urls
|
from wagtail.documents import urls as wagtaildocs_urls
|
||||||
|
|
||||||
from vbv_lernwelt.completion.views import request_learning_path_completion, request_circle_completion, \
|
|
||||||
mark_circle_completion
|
|
||||||
from vbv_lernwelt.core.middleware.auth import django_view_authentication_exempt
|
from vbv_lernwelt.core.middleware.auth import django_view_authentication_exempt
|
||||||
from vbv_lernwelt.core.views import (
|
from vbv_lernwelt.core.views import (
|
||||||
rate_limit_exceeded_view,
|
rate_limit_exceeded_view,
|
||||||
|
|
@ -51,9 +49,9 @@ urlpatterns = [
|
||||||
path(r"api/course/page/<slug:slug>/", page_api_view, name="page_api_view"),
|
path(r"api/course/page/<slug:slug>/", page_api_view, name="page_api_view"),
|
||||||
|
|
||||||
# completion
|
# completion
|
||||||
path(r"api/completion/circle/<uuid:circle_key>/", request_circle_completion, name="request_circle_completion"),
|
# path(r"api/completion/circle/<uuid:circle_key>/", request_circle_completion, name="request_circle_completion"),
|
||||||
path(r"api/completion/learning_path/<uuid:learning_path_key>/", request_learning_path_completion, name="request_learning_path_completion"),
|
# path(r"api/completion/learning_path/<uuid:learning_path_key>/", request_learning_path_completion, name="request_learning_path_completion"),
|
||||||
path(r"api/completion/circle/mark/", mark_circle_completion, name="mark_circle_completion"),
|
# path(r"api/completion/circle/mark/", mark_circle_completion, name="mark_circle_completion"),
|
||||||
|
|
||||||
# testing and debug
|
# testing and debug
|
||||||
path('server/raise_error/', user_passes_test(lambda u: u.is_superuser, login_url='/login/')(raise_example_error), ),
|
path('server/raise_error/', user_passes_test(lambda u: u.is_superuser, login_url='/login/')(raise_example_error), ),
|
||||||
|
|
|
||||||
|
|
@ -1,14 +1,14 @@
|
||||||
from vbv_lernwelt.competence.factories import CompetenceProfilePageFactory, PerformanceCriteriaFactory, \
|
from vbv_lernwelt.competence.factories import CompetenceProfilePageFactory, PerformanceCriteriaFactory, \
|
||||||
CompetencePageFactory
|
CompetencePageFactory
|
||||||
from vbv_lernwelt.competence.models import CompetencePage
|
from vbv_lernwelt.competence.models import CompetencePage
|
||||||
from vbv_lernwelt.course.consts import COURSE_VERSICHERUNGSVERMITTLERIN
|
from vbv_lernwelt.course.consts import COURSE_VERSICHERUNGSVERMITTLERIN_ID
|
||||||
from vbv_lernwelt.course.models import CoursePage, Course
|
from vbv_lernwelt.course.models import CoursePage, Course
|
||||||
from vbv_lernwelt.learnpath.models import LearningUnit
|
from vbv_lernwelt.learnpath.models import LearningUnit
|
||||||
|
|
||||||
|
|
||||||
def create_default_competence_profile():
|
def create_default_competence_profile():
|
||||||
course = Course.objects.get(id=COURSE_VERSICHERUNGSVERMITTLERIN)
|
course = Course.objects.get(id=COURSE_VERSICHERUNGSVERMITTLERIN_ID)
|
||||||
course_page = CoursePage.objects.get(course_id=COURSE_VERSICHERUNGSVERMITTLERIN)
|
course_page = CoursePage.objects.get(course_id=COURSE_VERSICHERUNGSVERMITTLERIN_ID)
|
||||||
|
|
||||||
competence_profile_page = CompetenceProfilePageFactory(
|
competence_profile_page = CompetenceProfilePageFactory(
|
||||||
title='Kompetenzprofil',
|
title='Kompetenzprofil',
|
||||||
|
|
|
||||||
|
|
@ -1,8 +0,0 @@
|
||||||
import djclick as click
|
|
||||||
|
|
||||||
from vbv_lernwelt.competence.create_default_competence_profile import create_default_competence_profile
|
|
||||||
|
|
||||||
|
|
||||||
@click.command()
|
|
||||||
def command():
|
|
||||||
create_default_competence_profile()
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
# Generated by Django 3.2.13 on 2022-09-28 10:46
|
# Generated by Django 3.2.13 on 2022-09-28 12:51
|
||||||
|
|
||||||
from django.db import migrations, models
|
from django.db import migrations, models
|
||||||
import django.db.models.deletion
|
import django.db.models.deletion
|
||||||
|
|
@ -12,7 +12,6 @@ class Migration(migrations.Migration):
|
||||||
|
|
||||||
dependencies = [
|
dependencies = [
|
||||||
('wagtailcore', '0069_log_entry_jsonfield'),
|
('wagtailcore', '0069_log_entry_jsonfield'),
|
||||||
('learnpath', '0001_initial'),
|
|
||||||
]
|
]
|
||||||
|
|
||||||
operations = [
|
operations = [
|
||||||
|
|
@ -43,7 +42,6 @@ class Migration(migrations.Migration):
|
||||||
fields=[
|
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')),
|
('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')),
|
||||||
('competence_id', models.TextField(default='A1.1')),
|
('competence_id', models.TextField(default='A1.1')),
|
||||||
('learning_unit', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='learnpath.learningunit')),
|
|
||||||
],
|
],
|
||||||
options={
|
options={
|
||||||
'abstract': False,
|
'abstract': False,
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,22 @@
|
||||||
|
# Generated by Django 3.2.13 on 2022-09-28 12:51
|
||||||
|
|
||||||
|
from django.db import migrations, models
|
||||||
|
import django.db.models.deletion
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
initial = True
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('learnpath', '0001_initial'),
|
||||||
|
('competence', '0001_initial'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='performancecriteria',
|
||||||
|
name='learning_unit',
|
||||||
|
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='learnpath.learningunit'),
|
||||||
|
),
|
||||||
|
]
|
||||||
|
|
@ -1,3 +0,0 @@
|
||||||
from django.contrib import admin
|
|
||||||
|
|
||||||
# Register your models here.
|
|
||||||
|
|
@ -1,6 +0,0 @@
|
||||||
from django.apps import AppConfig
|
|
||||||
|
|
||||||
|
|
||||||
class CompletionConfig(AppConfig):
|
|
||||||
default_auto_field = 'django.db.models.BigAutoField'
|
|
||||||
name = 'vbv_lernwelt.completion'
|
|
||||||
|
|
@ -1,36 +0,0 @@
|
||||||
# Generated by Django 3.2.13 on 2022-09-19 14:37
|
|
||||||
|
|
||||||
from django.conf import settings
|
|
||||||
from django.db import migrations, models
|
|
||||||
import django.db.models.deletion
|
|
||||||
|
|
||||||
|
|
||||||
class Migration(migrations.Migration):
|
|
||||||
|
|
||||||
initial = True
|
|
||||||
|
|
||||||
dependencies = [
|
|
||||||
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
|
|
||||||
]
|
|
||||||
|
|
||||||
operations = [
|
|
||||||
migrations.CreateModel(
|
|
||||||
name='CircleCompletion',
|
|
||||||
fields=[
|
|
||||||
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
|
||||||
('created_at', models.DateTimeField(auto_now_add=True)),
|
|
||||||
('updated_at', models.DateTimeField(auto_now=True)),
|
|
||||||
('page_key', models.UUIDField()),
|
|
||||||
('page_type', models.CharField(blank=True, default='', max_length=255)),
|
|
||||||
('circle_key', models.UUIDField(blank=True, default='')),
|
|
||||||
('learning_path_key', models.UUIDField(blank=True, default='')),
|
|
||||||
('completed', models.BooleanField(default=False)),
|
|
||||||
('json_data', models.JSONField(blank=True, default=dict)),
|
|
||||||
('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
migrations.AddConstraint(
|
|
||||||
model_name='circlecompletion',
|
|
||||||
constraint=models.UniqueConstraint(fields=('user', 'page_key'), name='unique_user_page_key'),
|
|
||||||
),
|
|
||||||
]
|
|
||||||
|
|
@ -1,29 +0,0 @@
|
||||||
from django.db import models
|
|
||||||
from django.db.models import UniqueConstraint
|
|
||||||
|
|
||||||
from vbv_lernwelt.core.models import User
|
|
||||||
|
|
||||||
|
|
||||||
class CircleCompletion(models.Model):
|
|
||||||
# Page can either be a LearningContent or a LearningUnitQuestion for now
|
|
||||||
created_at = models.DateTimeField(auto_now_add=True)
|
|
||||||
updated_at = models.DateTimeField(auto_now=True)
|
|
||||||
|
|
||||||
user = models.ForeignKey(User, on_delete=models.CASCADE)
|
|
||||||
|
|
||||||
# Page can either be a LearningContent or a LearningUnitQuestion for now
|
|
||||||
page_key = models.UUIDField()
|
|
||||||
page_type = models.CharField(max_length=255, default='', blank=True)
|
|
||||||
circle_key = models.UUIDField(blank=True, default='')
|
|
||||||
learning_path_key = models.UUIDField(blank=True, default='')
|
|
||||||
|
|
||||||
completed = models.BooleanField(default=False)
|
|
||||||
json_data = models.JSONField(default=dict, blank=True)
|
|
||||||
|
|
||||||
class Meta:
|
|
||||||
constraints = [
|
|
||||||
UniqueConstraint(
|
|
||||||
fields=['user', 'page_key', ],
|
|
||||||
name='unique_user_page_key'
|
|
||||||
)
|
|
||||||
]
|
|
||||||
|
|
@ -1,13 +0,0 @@
|
||||||
from rest_framework import serializers
|
|
||||||
|
|
||||||
from vbv_lernwelt.completion.models import CircleCompletion
|
|
||||||
|
|
||||||
|
|
||||||
class CircleCompletionSerializer(serializers.ModelSerializer):
|
|
||||||
class Meta:
|
|
||||||
model = CircleCompletion
|
|
||||||
fields = [
|
|
||||||
'id', 'created_at', 'updated_at', 'user', 'page_key', 'page_type', 'circle_key',
|
|
||||||
'learning_path_key', 'completed', 'json_data',
|
|
||||||
]
|
|
||||||
|
|
||||||
|
|
@ -1,70 +0,0 @@
|
||||||
import structlog
|
|
||||||
from rest_framework.decorators import api_view
|
|
||||||
from rest_framework.response import Response
|
|
||||||
from wagtail.models import Page
|
|
||||||
|
|
||||||
from vbv_lernwelt.completion.models import CircleCompletion
|
|
||||||
from vbv_lernwelt.completion.serializers import CircleCompletionSerializer
|
|
||||||
from vbv_lernwelt.learnpath.models import Circle, LearningPath
|
|
||||||
from vbv_lernwelt.learnpath.utils import get_wagtail_type
|
|
||||||
|
|
||||||
logger = structlog.get_logger(__name__)
|
|
||||||
|
|
||||||
|
|
||||||
@api_view(['GET'])
|
|
||||||
def request_circle_completion(request, circle_key):
|
|
||||||
response_data = CircleCompletionSerializer(
|
|
||||||
CircleCompletion.objects.filter(user=request.user, circle_key=circle_key),
|
|
||||||
many=True,
|
|
||||||
).data
|
|
||||||
|
|
||||||
return Response(status=200, data=response_data)
|
|
||||||
|
|
||||||
|
|
||||||
@api_view(['GET'])
|
|
||||||
def request_learning_path_completion(request, learning_path_key):
|
|
||||||
response_data = CircleCompletionSerializer(
|
|
||||||
CircleCompletion.objects.filter(user=request.user, learning_path_key=learning_path_key),
|
|
||||||
many=True,
|
|
||||||
).data
|
|
||||||
|
|
||||||
return Response(status=200, data=response_data)
|
|
||||||
|
|
||||||
|
|
||||||
@api_view(['POST'])
|
|
||||||
def mark_circle_completion(request):
|
|
||||||
page_key = request.data.get('page_key')
|
|
||||||
completed = request.data.get('completed', True)
|
|
||||||
|
|
||||||
page = Page.objects.get(translation_key=page_key, locale__language_code='de-CH')
|
|
||||||
page_type = get_wagtail_type(page.specific)
|
|
||||||
circle = Circle.objects.ancestor_of(page).first()
|
|
||||||
learning_path = LearningPath.objects.ancestor_of(page).first()
|
|
||||||
|
|
||||||
cc, created = CircleCompletion.objects.get_or_create(
|
|
||||||
user=request.user,
|
|
||||||
page_key=page_key,
|
|
||||||
circle_key=circle.translation_key,
|
|
||||||
learning_path_key=learning_path.translation_key,
|
|
||||||
)
|
|
||||||
cc.page_type = page_type
|
|
||||||
cc.completed = completed
|
|
||||||
cc.save()
|
|
||||||
|
|
||||||
response_data = CircleCompletionSerializer(
|
|
||||||
CircleCompletion.objects.filter(user=request.user, circle_key=circle.translation_key),
|
|
||||||
many=True,
|
|
||||||
).data
|
|
||||||
|
|
||||||
logger.debug(
|
|
||||||
'page completed',
|
|
||||||
label='completion_api',
|
|
||||||
circle_key=circle.translation_key,
|
|
||||||
circle_title=circle.title,
|
|
||||||
page_key=page_key,
|
|
||||||
page_type=page_type,
|
|
||||||
page_title=page.title,
|
|
||||||
user_id=request.user.id,
|
|
||||||
)
|
|
||||||
|
|
||||||
return Response(status=200, data=response_data)
|
|
||||||
|
|
@ -1,17 +1,10 @@
|
||||||
import djclick as click
|
import djclick as click
|
||||||
|
|
||||||
from vbv_lernwelt.completion.models import CircleCompletion
|
from vbv_lernwelt.course.models import CourseCompletion
|
||||||
from vbv_lernwelt.learnpath.create_default_learning_path import create_default_learning_path, \
|
|
||||||
delete_default_learning_path
|
|
||||||
|
|
||||||
|
|
||||||
@click.command()
|
@click.command()
|
||||||
@click.option('--reset-learning-path', default=False)
|
def command():
|
||||||
def command(reset_learning_path):
|
|
||||||
print("cypress reset data")
|
print("cypress reset data")
|
||||||
|
|
||||||
if reset_learning_path:
|
CourseCompletion.objects.all().delete()
|
||||||
delete_default_learning_path()
|
|
||||||
create_default_learning_path(skip_locales=True)
|
|
||||||
|
|
||||||
CircleCompletion.objects.all().delete()
|
|
||||||
|
|
|
||||||
|
|
@ -1 +1,2 @@
|
||||||
COURSE_VERSICHERUNGSVERMITTLERIN = -1
|
COURSE_TEST_ID = -1
|
||||||
|
COURSE_VERSICHERUNGSVERMITTLERIN_ID = -2
|
||||||
|
|
|
||||||
|
|
@ -1,21 +1,97 @@
|
||||||
import wagtail_factories
|
import wagtail_factories
|
||||||
from django.conf import settings
|
from django.conf import settings
|
||||||
from wagtail.models import Site, Page
|
from wagtail.models import Site
|
||||||
|
|
||||||
from vbv_lernwelt.core.admin import User
|
from vbv_lernwelt.core.create_default_users import create_default_users
|
||||||
from vbv_lernwelt.learnpath.tests.learning_path_factories import LearningPathFactory, TopicFactory, CircleFactory, \
|
from vbv_lernwelt.core.tests.helpers import create_locales_for_wagtail
|
||||||
LearningSequenceFactory, LearningContentFactory, \
|
from vbv_lernwelt.course.consts import COURSE_TEST_ID
|
||||||
ExerciseBlockFactory, LearningUnitFactory, DocumentBlockFactory, TestBlockFactory, OnlineTrainingBlockFactory
|
from vbv_lernwelt.course.factories import CoursePageFactory
|
||||||
|
from vbv_lernwelt.course.models import CoursePage, CourseCategory
|
||||||
|
from vbv_lernwelt.learnpath.tests.learning_path_factories import CircleFactory, LearningSequenceFactory, \
|
||||||
|
LearningContentFactory, DocumentBlockFactory, LearningUnitFactory, TestBlockFactory, ExerciseBlockFactory, \
|
||||||
|
LearningPathFactory, TopicFactory, OnlineTrainingBlockFactory
|
||||||
|
|
||||||
|
|
||||||
def create_circle(title, learning_path):
|
def create_test_course():
|
||||||
return CircleFactory(
|
create_locales_for_wagtail()
|
||||||
title=title,
|
create_test_course_with_categories()
|
||||||
parent=learning_path,
|
create_test_learning_path()
|
||||||
|
|
||||||
|
|
||||||
|
def create_test_course_with_categories(apps=None, schema_editor=None):
|
||||||
|
if apps is not None:
|
||||||
|
Course = apps.get_model('course', 'Course')
|
||||||
|
CourseCategory = apps.get_model('course', 'CourseCategory')
|
||||||
|
else:
|
||||||
|
# pylint: disable=import-outside-toplevel
|
||||||
|
from vbv_lernwelt.course.models import Course, CourseCategory
|
||||||
|
|
||||||
|
course, _ = Course.objects.get_or_create(
|
||||||
|
id=COURSE_TEST_ID,
|
||||||
|
title='Test Lerngang',
|
||||||
|
category_name='Handlungsfeld'
|
||||||
|
)
|
||||||
|
|
||||||
|
CourseCategory.objects.get_or_create(course=course, title='Allgemein', general=True)
|
||||||
|
|
||||||
|
for cat in [
|
||||||
|
'Fahrzeug', 'Reisen',
|
||||||
|
]:
|
||||||
|
CourseCategory.objects.get_or_create(course=course, title=cat)
|
||||||
|
|
||||||
|
# create default course page
|
||||||
|
site = Site.objects.filter(is_default_site=True).first()
|
||||||
|
if not site:
|
||||||
|
site = wagtail_factories.SiteFactory(is_default_site=True)
|
||||||
|
|
||||||
|
if settings.APP_ENVIRONMENT == 'development':
|
||||||
|
site.port = 8000
|
||||||
|
site.save()
|
||||||
|
|
||||||
|
course_page = CoursePageFactory(
|
||||||
|
title="Test Lehrgang",
|
||||||
|
parent=site.root_page,
|
||||||
|
course=course,
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
def create_test_learning_path(user=None, skip_locales=True):
|
||||||
|
course_page = CoursePage.objects.get(course_id=COURSE_TEST_ID)
|
||||||
|
lp = LearningPathFactory(
|
||||||
|
title="Test Lernpfad", parent=course_page
|
||||||
|
)
|
||||||
|
|
||||||
|
TopicFactory(title="Basis", is_visible=False, parent=lp)
|
||||||
|
|
||||||
|
circle_basis = CircleFactory(
|
||||||
|
title="Basis",
|
||||||
|
parent=lp,
|
||||||
|
description="Basis",
|
||||||
|
)
|
||||||
|
LearningSequenceFactory(title='Starten', parent=circle_basis, icon='it-icon-ls-start')
|
||||||
|
LearningContentFactory(
|
||||||
|
title='Einführung',
|
||||||
|
parent=circle_basis,
|
||||||
|
minutes=15,
|
||||||
|
contents=[('document', DocumentBlockFactory())]
|
||||||
|
)
|
||||||
|
LearningSequenceFactory(title='Beenden', parent=circle_basis, icon='it-icon-ls-end')
|
||||||
|
LearningContentFactory(
|
||||||
|
title='Jetzt kann es losgehen!',
|
||||||
|
parent=circle_basis,
|
||||||
|
minutes=30,
|
||||||
|
contents=[('document', DocumentBlockFactory())]
|
||||||
|
)
|
||||||
|
|
||||||
|
TopicFactory(title="Beraten der Kunden", parent=lp)
|
||||||
|
|
||||||
|
circle = CircleFactory(
|
||||||
|
title="Analyse",
|
||||||
|
parent=lp,
|
||||||
description="Unit-Test Circle",
|
description="Unit-Test Circle",
|
||||||
job_situations=[
|
job_situations=[
|
||||||
('job_situation', 'Absicherung der Familie'),
|
('job_situation', 'Autoversicherung'),
|
||||||
('job_situation', 'Reisen'),
|
('job_situation', 'Autokauf'),
|
||||||
],
|
],
|
||||||
goals=[
|
goals=[
|
||||||
('goal', '... die heutige Versicherungssituation von Privat- oder Geschäftskunden einzuschätzen.'),
|
('goal', '... die heutige Versicherungssituation von Privat- oder Geschäftskunden einzuschätzen.'),
|
||||||
|
|
@ -26,11 +102,9 @@ def create_circle(title, learning_path):
|
||||||
]
|
]
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
def create_circle_children(circle, title):
|
|
||||||
LearningSequenceFactory(title='Starten', parent=circle, icon='it-icon-ls-start')
|
LearningSequenceFactory(title='Starten', parent=circle, icon='it-icon-ls-start')
|
||||||
LearningContentFactory(
|
LearningContentFactory(
|
||||||
title=f'Einleitung Circle "{title}"',
|
title=f'Einleitung Circle "Analyse"',
|
||||||
parent=circle,
|
parent=circle,
|
||||||
minutes=15,
|
minutes=15,
|
||||||
contents=[('document', DocumentBlockFactory())]
|
contents=[('document', DocumentBlockFactory())]
|
||||||
|
|
@ -38,11 +112,12 @@ def create_circle_children(circle, title):
|
||||||
|
|
||||||
LearningSequenceFactory(title='Beobachten', parent=circle, icon='it-icon-ls-watch')
|
LearningSequenceFactory(title='Beobachten', parent=circle, icon='it-icon-ls-watch')
|
||||||
lu = LearningUnitFactory(
|
lu = LearningUnitFactory(
|
||||||
title='Absicherung der Familie',
|
title='Fahrzeug',
|
||||||
parent=circle,
|
parent=circle,
|
||||||
|
course_category=CourseCategory.objects.get(course_id=COURSE_TEST_ID, title='Fahrzeug'),
|
||||||
)
|
)
|
||||||
LearningContentFactory(
|
LearningContentFactory(
|
||||||
title='Ermittlung des Kundenbedarfs',
|
title='Rafael Fasel wechselt sein Auto',
|
||||||
parent=circle,
|
parent=circle,
|
||||||
minutes=30,
|
minutes=30,
|
||||||
contents=[('online_training', OnlineTrainingBlockFactory(
|
contents=[('online_training', OnlineTrainingBlockFactory(
|
||||||
|
|
@ -51,21 +126,17 @@ def create_circle_children(circle, title):
|
||||||
))]
|
))]
|
||||||
)
|
)
|
||||||
LearningContentFactory(
|
LearningContentFactory(
|
||||||
title='Kundenbedürfnisse erkennen',
|
title='Fachcheck Fahrzeug',
|
||||||
parent=circle,
|
parent=circle,
|
||||||
minutes=30,
|
minutes=30,
|
||||||
contents=[('test', TestBlockFactory())]
|
contents=[('test', TestBlockFactory())]
|
||||||
)
|
)
|
||||||
LearningContentFactory(
|
|
||||||
title='Was braucht eine Familie?',
|
lu = LearningUnitFactory(
|
||||||
|
title='Reisen',
|
||||||
parent=circle,
|
parent=circle,
|
||||||
minutes=60,
|
course_category=CourseCategory.objects.get(course_id=COURSE_TEST_ID, title='Reisen'),
|
||||||
contents=[('exercise', ExerciseBlockFactory(url='/static/media/web_based_trainings/story-01-a-01-patrizia-marco-sichern-sich-ab-einstieg/scormcontent/index.html'
|
|
||||||
))]
|
|
||||||
|
|
||||||
)
|
)
|
||||||
|
|
||||||
lu = LearningUnitFactory(title='Reisen', parent=circle)
|
|
||||||
LearningContentFactory(
|
LearningContentFactory(
|
||||||
title='Reiseversicherung',
|
title='Reiseversicherung',
|
||||||
parent=circle,
|
parent=circle,
|
||||||
|
|
@ -73,7 +144,7 @@ def create_circle_children(circle, title):
|
||||||
contents=[('exercise', ExerciseBlockFactory())]
|
contents=[('exercise', ExerciseBlockFactory())]
|
||||||
)
|
)
|
||||||
LearningContentFactory(
|
LearningContentFactory(
|
||||||
title='Sorgenfrei reisen',
|
title='Emma und Ayla campen durch Amerika',
|
||||||
parent=circle,
|
parent=circle,
|
||||||
minutes=120,
|
minutes=120,
|
||||||
contents=[('exercise', ExerciseBlockFactory(
|
contents=[('exercise', ExerciseBlockFactory(
|
||||||
|
|
@ -94,69 +165,3 @@ def create_circle_children(circle, title):
|
||||||
contents=[('document', DocumentBlockFactory())]
|
contents=[('document', DocumentBlockFactory())]
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
def create_simple_test_learning_path(user=None, skip_locales=True):
|
|
||||||
if user is None:
|
|
||||||
user = User.objects.get(username='info@iterativ.ch')
|
|
||||||
|
|
||||||
site = Site.objects.filter(is_default_site=True).first()
|
|
||||||
|
|
||||||
if not site:
|
|
||||||
site = wagtail_factories.SiteFactory(is_default_site=True)
|
|
||||||
|
|
||||||
if settings.APP_ENVIRONMENT == 'development':
|
|
||||||
site.port = 8000
|
|
||||||
site.save()
|
|
||||||
|
|
||||||
lp = LearningPathFactory(title="Unit-Test Lernpfad", parent=site.root_page)
|
|
||||||
|
|
||||||
TopicFactory(title="Basis", is_visible=False, parent=lp)
|
|
||||||
|
|
||||||
circle_basis = CircleFactory(
|
|
||||||
title="Basis",
|
|
||||||
parent=lp,
|
|
||||||
description="Basis von Unit-Test Lernpfad",
|
|
||||||
)
|
|
||||||
LearningSequenceFactory(title='Starten', parent=circle_basis, icon='it-icon-ls-start')
|
|
||||||
LearningContentFactory(
|
|
||||||
title='Einleitung Circle "Basis"',
|
|
||||||
parent=circle_basis,
|
|
||||||
minutes=15,
|
|
||||||
contents=[('document', DocumentBlockFactory())]
|
|
||||||
)
|
|
||||||
LearningSequenceFactory(title='Beenden', parent=circle_basis, icon='it-icon-ls-end')
|
|
||||||
LearningContentFactory(
|
|
||||||
title='Kompetenzprofil anschauen',
|
|
||||||
parent=circle_basis,
|
|
||||||
minutes=30,
|
|
||||||
contents=[('document', DocumentBlockFactory())]
|
|
||||||
)
|
|
||||||
LearningContentFactory(
|
|
||||||
title='Circle "Analyse" abschliessen',
|
|
||||||
parent=circle_basis,
|
|
||||||
minutes=30,
|
|
||||||
contents=[('document', DocumentBlockFactory())]
|
|
||||||
)
|
|
||||||
|
|
||||||
TopicFactory(title="Gewinnen von Kunden", parent=lp)
|
|
||||||
|
|
||||||
circle_analyse = create_circle('Unit-Test Circle', lp)
|
|
||||||
create_circle_children(circle_analyse, 'Unit-Test Circle')
|
|
||||||
|
|
||||||
# locales
|
|
||||||
# if not skip_locales:
|
|
||||||
# locale_de = Locale.objects.get(language_code='de-CH')
|
|
||||||
# locale_fr, _ = Locale.objects.get_or_create(language_code='fr-CH')
|
|
||||||
# LocaleSynchronization.objects.get_or_create(
|
|
||||||
# locale_id=locale_fr.id,
|
|
||||||
# sync_from_id=locale_de.id
|
|
||||||
# )
|
|
||||||
# locale_it, _ = Locale.objects.get_or_create(language_code='it-CH')
|
|
||||||
# LocaleSynchronization.objects.get_or_create(
|
|
||||||
# locale_id=locale_it.id,
|
|
||||||
# sync_from_id=locale_de.id
|
|
||||||
# )
|
|
||||||
# call_command('sync_locale_trees')
|
|
||||||
|
|
||||||
# all pages belong to 'admin' by default
|
|
||||||
Page.objects.update(owner=user)
|
|
||||||
|
|
@ -2,7 +2,7 @@ import wagtail_factories
|
||||||
from django.conf import settings
|
from django.conf import settings
|
||||||
from wagtail.models import Site
|
from wagtail.models import Site
|
||||||
|
|
||||||
from vbv_lernwelt.course.consts import COURSE_VERSICHERUNGSVERMITTLERIN
|
from vbv_lernwelt.course.consts import COURSE_VERSICHERUNGSVERMITTLERIN_ID
|
||||||
from vbv_lernwelt.course.factories import CoursePageFactory
|
from vbv_lernwelt.course.factories import CoursePageFactory
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -15,7 +15,7 @@ def create_versicherungsvermittlerin_with_categories(apps=None, schema_editor=No
|
||||||
from vbv_lernwelt.course.models import Course, CourseCategory
|
from vbv_lernwelt.course.models import Course, CourseCategory
|
||||||
|
|
||||||
course, _ = Course.objects.get_or_create(
|
course, _ = Course.objects.get_or_create(
|
||||||
id=COURSE_VERSICHERUNGSVERMITTLERIN,
|
id=COURSE_VERSICHERUNGSVERMITTLERIN_ID,
|
||||||
title='Versicherungsvermittler/in',
|
title='Versicherungsvermittler/in',
|
||||||
category_name='Handlungsfeld'
|
category_name='Handlungsfeld'
|
||||||
)
|
)
|
||||||
|
|
@ -1,8 +1,21 @@
|
||||||
import djclick as click
|
import djclick as click
|
||||||
|
|
||||||
from vbv_lernwelt.course.creators import create_versicherungsvermittlerin_with_categories
|
from vbv_lernwelt.competence.create_default_competence_profile import create_default_competence_profile
|
||||||
|
from vbv_lernwelt.course.creators.versicherungsvermittlerin import create_versicherungsvermittlerin_with_categories
|
||||||
|
from vbv_lernwelt.learnpath.create_default_learning_path import create_default_learning_path
|
||||||
|
from vbv_lernwelt.media_library.create_default_documents import create_default_collections, create_default_documents
|
||||||
|
from vbv_lernwelt.media_library.create_default_media_library import create_default_media_library
|
||||||
|
|
||||||
|
|
||||||
@click.command()
|
@click.command()
|
||||||
def command():
|
def command():
|
||||||
create_versicherungsvermittlerin_with_categories()
|
create_versicherungsvermittlerin_with_categories()
|
||||||
|
|
||||||
|
create_default_learning_path()
|
||||||
|
|
||||||
|
create_default_competence_profile()
|
||||||
|
|
||||||
|
# media library
|
||||||
|
create_default_collections()
|
||||||
|
create_default_documents()
|
||||||
|
create_default_media_library()
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,6 @@
|
||||||
# Generated by Django 3.2.13 on 2022-09-27 14:26
|
# Generated by Django 3.2.13 on 2022-09-28 12:51
|
||||||
|
|
||||||
|
from django.conf import settings
|
||||||
from django.db import migrations, models
|
from django.db import migrations, models
|
||||||
import django.db.models.deletion
|
import django.db.models.deletion
|
||||||
|
|
||||||
|
|
@ -9,6 +10,7 @@ class Migration(migrations.Migration):
|
||||||
initial = True
|
initial = True
|
||||||
|
|
||||||
dependencies = [
|
dependencies = [
|
||||||
|
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
|
||||||
('wagtailcore', '0069_log_entry_jsonfield'),
|
('wagtailcore', '0069_log_entry_jsonfield'),
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|
@ -28,13 +30,28 @@ class Migration(migrations.Migration):
|
||||||
name='CoursePage',
|
name='CoursePage',
|
||||||
fields=[
|
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')),
|
('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')),
|
||||||
('course', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='course.course')),
|
('course', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='course.course')),
|
||||||
],
|
],
|
||||||
options={
|
options={
|
||||||
'verbose_name': 'Lerngang-Seite',
|
'verbose_name': 'Lerngang-Seite',
|
||||||
},
|
},
|
||||||
bases=('wagtailcore.page',),
|
bases=('wagtailcore.page',),
|
||||||
),
|
),
|
||||||
|
migrations.CreateModel(
|
||||||
|
name='CourseCompletion',
|
||||||
|
fields=[
|
||||||
|
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||||
|
('created_at', models.DateTimeField(auto_now_add=True)),
|
||||||
|
('updated_at', models.DateTimeField(auto_now=True)),
|
||||||
|
('page_key', models.UUIDField()),
|
||||||
|
('page_type', models.CharField(blank=True, default='', max_length=255)),
|
||||||
|
('page_slug', models.CharField(blank=True, default='', max_length=255)),
|
||||||
|
('completion_status', models.CharField(choices=[('unknown', 'unknown'), ('success', 'success'), ('fail', 'fail')], default='unknown', max_length=255)),
|
||||||
|
('additional_json_data', models.JSONField(default=dict)),
|
||||||
|
('course', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='course.course')),
|
||||||
|
('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)),
|
||||||
|
],
|
||||||
|
),
|
||||||
migrations.CreateModel(
|
migrations.CreateModel(
|
||||||
name='CourseCategory',
|
name='CourseCategory',
|
||||||
fields=[
|
fields=[
|
||||||
|
|
@ -44,4 +61,8 @@ class Migration(migrations.Migration):
|
||||||
('course', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='course.course')),
|
('course', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='course.course')),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
|
migrations.AddConstraint(
|
||||||
|
model_name='coursecompletion',
|
||||||
|
constraint=models.UniqueConstraint(fields=('user', 'page_key'), name='course_completion_unique_user_page_key'),
|
||||||
|
),
|
||||||
]
|
]
|
||||||
|
|
|
||||||
|
|
@ -1,9 +1,11 @@
|
||||||
from django.db import models
|
from django.db import models
|
||||||
|
from django.db.models import UniqueConstraint
|
||||||
from django.utils.text import slugify
|
from django.utils.text import slugify
|
||||||
from django.utils.translation import gettext_lazy as _
|
from django.utils.translation import gettext_lazy as _
|
||||||
from wagtail.models import Page
|
from wagtail.models import Page
|
||||||
|
|
||||||
from vbv_lernwelt.core.model_utils import find_available_slug
|
from vbv_lernwelt.core.model_utils import find_available_slug
|
||||||
|
from vbv_lernwelt.core.models import User
|
||||||
|
|
||||||
|
|
||||||
class Course(models.Model):
|
class Course(models.Model):
|
||||||
|
|
@ -30,7 +32,7 @@ class CourseCategory(models.Model):
|
||||||
class CoursePage(Page):
|
class CoursePage(Page):
|
||||||
content_panels = Page.content_panels
|
content_panels = Page.content_panels
|
||||||
subpage_types = ['learnpath.LearningPath', 'media_library.MediaLibraryPage']
|
subpage_types = ['learnpath.LearningPath', 'media_library.MediaLibraryPage']
|
||||||
course = models.ForeignKey('course.Course', on_delete=models.CASCADE)
|
course = models.ForeignKey('course.Course', on_delete=models.PROTECT)
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
verbose_name = _("Lerngang-Seite")
|
verbose_name = _("Lerngang-Seite")
|
||||||
|
|
@ -41,3 +43,36 @@ class CoursePage(Page):
|
||||||
|
|
||||||
def __str__(self):
|
def __str__(self):
|
||||||
return f"{self.title}"
|
return f"{self.title}"
|
||||||
|
|
||||||
|
|
||||||
|
class CourseCompletion(models.Model):
|
||||||
|
created_at = models.DateTimeField(auto_now_add=True)
|
||||||
|
updated_at = models.DateTimeField(auto_now=True)
|
||||||
|
|
||||||
|
user = models.ForeignKey(User, on_delete=models.CASCADE)
|
||||||
|
|
||||||
|
# page can logically be a LearningContent or a PerformanceCriteria for now
|
||||||
|
page_key = models.UUIDField()
|
||||||
|
page_type = models.CharField(max_length=255, default='', blank=True)
|
||||||
|
page_slug = models.CharField(max_length=255, default='', blank=True)
|
||||||
|
|
||||||
|
course = models.ForeignKey('course.Course', on_delete=models.CASCADE)
|
||||||
|
|
||||||
|
completion_status = models.CharField(
|
||||||
|
max_length=255,
|
||||||
|
choices=[
|
||||||
|
('unknown', 'unknown'),
|
||||||
|
('success', 'success'),
|
||||||
|
('fail', 'fail'),
|
||||||
|
],
|
||||||
|
default='unknown',
|
||||||
|
)
|
||||||
|
additional_json_data = models.JSONField(default=dict)
|
||||||
|
|
||||||
|
class Meta:
|
||||||
|
constraints = [
|
||||||
|
UniqueConstraint(
|
||||||
|
fields=['user', 'page_key', ],
|
||||||
|
name='course_completion_unique_user_page_key'
|
||||||
|
)
|
||||||
|
]
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
from rest_framework import serializers
|
from rest_framework import serializers
|
||||||
|
|
||||||
from vbv_lernwelt.course.models import CourseCategory, Course
|
from vbv_lernwelt.course.models import CourseCategory, Course, CourseCompletion
|
||||||
|
|
||||||
|
|
||||||
class CourseSerializer(serializers.ModelSerializer):
|
class CourseSerializer(serializers.ModelSerializer):
|
||||||
|
|
@ -13,3 +13,13 @@ class CourseCategorySerializer(serializers.ModelSerializer):
|
||||||
class Meta:
|
class Meta:
|
||||||
model = CourseCategory
|
model = CourseCategory
|
||||||
fields = ['id', 'title', 'general',]
|
fields = ['id', 'title', 'general',]
|
||||||
|
|
||||||
|
|
||||||
|
class CourseCompletionSerializer(serializers.ModelSerializer):
|
||||||
|
class Meta:
|
||||||
|
model = CourseCompletion
|
||||||
|
fields = [
|
||||||
|
'id', 'created_at', 'updated_at', 'user',
|
||||||
|
'page_key', 'page_type', 'page_slug',
|
||||||
|
'course', 'completion_status', 'additional_json_data',
|
||||||
|
]
|
||||||
|
|
|
||||||
|
|
@ -6,10 +6,9 @@ from vbv_lernwelt.core.create_default_users import create_default_users
|
||||||
from vbv_lernwelt.core.models import User
|
from vbv_lernwelt.core.models import User
|
||||||
from vbv_lernwelt.core.tests.helpers import create_locales_for_wagtail
|
from vbv_lernwelt.core.tests.helpers import create_locales_for_wagtail
|
||||||
from vbv_lernwelt.learnpath.models import LearningContent
|
from vbv_lernwelt.learnpath.models import LearningContent
|
||||||
from vbv_lernwelt.learnpath.tests.create_simple_test_learning_path import create_simple_test_learning_path
|
|
||||||
|
|
||||||
|
|
||||||
class CompletionApiTestCase(APITestCase):
|
class CourseCompletionApiTestCase(APITestCase):
|
||||||
def setUp(self) -> None:
|
def setUp(self) -> None:
|
||||||
create_locales_for_wagtail()
|
create_locales_for_wagtail()
|
||||||
create_default_users()
|
create_default_users()
|
||||||
|
|
@ -3,6 +3,10 @@ from rest_framework.decorators import api_view
|
||||||
from rest_framework.response import Response
|
from rest_framework.response import Response
|
||||||
from wagtail.models import Page
|
from wagtail.models import Page
|
||||||
|
|
||||||
|
from vbv_lernwelt.course.models import CourseCompletion, CoursePage
|
||||||
|
from vbv_lernwelt.course.serializers import CourseCompletionSerializer
|
||||||
|
from vbv_lernwelt.learnpath.utils import get_wagtail_type
|
||||||
|
|
||||||
logger = structlog.get_logger(__name__)
|
logger = structlog.get_logger(__name__)
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -16,3 +20,52 @@ def page_api_view(request, slug):
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
logger.error(e)
|
logger.error(e)
|
||||||
return Response({"error": str(e)}, status=404)
|
return Response({"error": str(e)}, status=404)
|
||||||
|
|
||||||
|
|
||||||
|
@api_view(['GET'])
|
||||||
|
def request_course_completion(request, course_id):
|
||||||
|
response_data = CourseCompletionSerializer(
|
||||||
|
CourseCompletion.objects.filter(user=request.user, circle_id=course_id),
|
||||||
|
many=True,
|
||||||
|
).data
|
||||||
|
|
||||||
|
return Response(status=200, data=response_data)
|
||||||
|
|
||||||
|
|
||||||
|
@api_view(['POST'])
|
||||||
|
def mark_course_completion(request):
|
||||||
|
page_key = request.data.get('page_key')
|
||||||
|
completion_status = request.data.get('completion_status', 'success')
|
||||||
|
|
||||||
|
page = Page.objects.get(translation_key=page_key, locale__language_code='de-CH')
|
||||||
|
page_type = get_wagtail_type(page.specific)
|
||||||
|
course = CoursePage.objects.ancestor_of(page).first().specific.course
|
||||||
|
|
||||||
|
cc, created = CourseCompletion.objects.get_or_create(
|
||||||
|
user=request.user,
|
||||||
|
page_key=page_key,
|
||||||
|
course_id=course.id,
|
||||||
|
)
|
||||||
|
cc.page_slug = page.slug
|
||||||
|
cc.page_type = page_type
|
||||||
|
cc.completion_status = completion_status
|
||||||
|
cc.save()
|
||||||
|
|
||||||
|
response_data = CourseCompletionSerializer(
|
||||||
|
CourseCompletion.objects.filter(user=request.user, circle_id=course_id),
|
||||||
|
many=True,
|
||||||
|
).data
|
||||||
|
|
||||||
|
logger.debug(
|
||||||
|
'mark_course_completion successful',
|
||||||
|
label='completion_api',
|
||||||
|
page_key=page_key,
|
||||||
|
page_type=page_type,
|
||||||
|
page_slug=page.slug,
|
||||||
|
page_title=page.title,
|
||||||
|
user_id=request.user.id,
|
||||||
|
course_id=course.id,
|
||||||
|
completion_status=completion_status,
|
||||||
|
)
|
||||||
|
|
||||||
|
return Response(status=200, data=response_data)
|
||||||
|
|
|
||||||
|
|
@ -5,9 +5,8 @@ from wagtail.models import Site, Page, Locale
|
||||||
from wagtail_localize.models import LocaleSynchronization
|
from wagtail_localize.models import LocaleSynchronization
|
||||||
|
|
||||||
from vbv_lernwelt.core.admin import User
|
from vbv_lernwelt.core.admin import User
|
||||||
from vbv_lernwelt.course.consts import COURSE_VERSICHERUNGSVERMITTLERIN
|
from vbv_lernwelt.course.consts import COURSE_VERSICHERUNGSVERMITTLERIN_ID
|
||||||
from vbv_lernwelt.course.models import CoursePage, CourseCategory
|
from vbv_lernwelt.course.models import CoursePage, CourseCategory
|
||||||
from vbv_lernwelt.learnpath.models import LearningPath, Topic, Circle, LearningSequence, LearningContent, LearningUnit
|
|
||||||
from vbv_lernwelt.learnpath.tests.learning_path_factories import LearningPathFactory, TopicFactory, CircleFactory, \
|
from vbv_lernwelt.learnpath.tests.learning_path_factories import LearningPathFactory, TopicFactory, CircleFactory, \
|
||||||
LearningSequenceFactory, LearningContentFactory, VideoBlockFactory, ResourceBlockFactory, \
|
LearningSequenceFactory, LearningContentFactory, VideoBlockFactory, ResourceBlockFactory, \
|
||||||
ExerciseBlockFactory, DocumentBlockFactory, LearningUnitFactory, AssignmentBlockFactory, BookBlockFactory, \
|
ExerciseBlockFactory, DocumentBlockFactory, LearningUnitFactory, AssignmentBlockFactory, BookBlockFactory, \
|
||||||
|
|
@ -62,7 +61,7 @@ def create_circle_children(circle, title):
|
||||||
lu = LearningUnitFactory(
|
lu = LearningUnitFactory(
|
||||||
title='Absicherung der Familie',
|
title='Absicherung der Familie',
|
||||||
parent=circle,
|
parent=circle,
|
||||||
course_category=CourseCategory.objects.get(course_id=COURSE_VERSICHERUNGSVERMITTLERIN, title='Einkommenssicherung')
|
course_category=CourseCategory.objects.get(course_id=COURSE_VERSICHERUNGSVERMITTLERIN_ID, title='Einkommenssicherung')
|
||||||
)
|
)
|
||||||
LearningContentFactory(
|
LearningContentFactory(
|
||||||
title='Ermittlung des Kundenbedarfs',
|
title='Ermittlung des Kundenbedarfs',
|
||||||
|
|
@ -134,7 +133,7 @@ def create_circle_children(circle, title):
|
||||||
lu = LearningUnitFactory(
|
lu = LearningUnitFactory(
|
||||||
title='Sich selbständig machen',
|
title='Sich selbständig machen',
|
||||||
parent=circle,
|
parent=circle,
|
||||||
course_category=CourseCategory.objects.get(course_id=COURSE_VERSICHERUNGSVERMITTLERIN, title='Selbständigkeit')
|
course_category=CourseCategory.objects.get(course_id=COURSE_VERSICHERUNGSVERMITTLERIN_ID, title='Selbständigkeit')
|
||||||
)
|
)
|
||||||
LearningContentFactory(
|
LearningContentFactory(
|
||||||
title='GmbH oder AG',
|
title='GmbH oder AG',
|
||||||
|
|
@ -152,7 +151,7 @@ def create_circle_children(circle, title):
|
||||||
lu = LearningUnitFactory(
|
lu = LearningUnitFactory(
|
||||||
title='Auto verkaufen',
|
title='Auto verkaufen',
|
||||||
parent=circle,
|
parent=circle,
|
||||||
course_category=CourseCategory.objects.get(course_id=COURSE_VERSICHERUNGSVERMITTLERIN, title='Fahrzeug')
|
course_category=CourseCategory.objects.get(course_id=COURSE_VERSICHERUNGSVERMITTLERIN_ID, title='Fahrzeug')
|
||||||
)
|
)
|
||||||
LearningContentFactory(
|
LearningContentFactory(
|
||||||
title='Motorfahrzeugversicherung',
|
title='Motorfahrzeugversicherung',
|
||||||
|
|
@ -182,7 +181,7 @@ def create_circle_children(circle, title):
|
||||||
lu = LearningUnitFactory(
|
lu = LearningUnitFactory(
|
||||||
title='Pensionierung',
|
title='Pensionierung',
|
||||||
parent=circle,
|
parent=circle,
|
||||||
course_category=CourseCategory.objects.get(course_id=COURSE_VERSICHERUNGSVERMITTLERIN, title='Pensionierung')
|
course_category=CourseCategory.objects.get(course_id=COURSE_VERSICHERUNGSVERMITTLERIN_ID, title='Pensionierung')
|
||||||
)
|
)
|
||||||
LearningContentFactory(
|
LearningContentFactory(
|
||||||
title='3-Säulen-Prinzip',
|
title='3-Säulen-Prinzip',
|
||||||
|
|
@ -212,7 +211,7 @@ def create_circle_children(circle, title):
|
||||||
lu = LearningUnitFactory(
|
lu = LearningUnitFactory(
|
||||||
title='Reisen',
|
title='Reisen',
|
||||||
parent=circle,
|
parent=circle,
|
||||||
course_category=CourseCategory.objects.get(course_id=COURSE_VERSICHERUNGSVERMITTLERIN, title='Reisen')
|
course_category=CourseCategory.objects.get(course_id=COURSE_VERSICHERUNGSVERMITTLERIN_ID, title='Reisen')
|
||||||
)
|
)
|
||||||
LearningContentFactory(
|
LearningContentFactory(
|
||||||
title='Reiseversicherung',
|
title='Reiseversicherung',
|
||||||
|
|
@ -231,7 +230,7 @@ def create_circle_children(circle, title):
|
||||||
lu = LearningUnitFactory(
|
lu = LearningUnitFactory(
|
||||||
title='Haushalt',
|
title='Haushalt',
|
||||||
parent=circle,
|
parent=circle,
|
||||||
course_category=CourseCategory.objects.get(course_id=COURSE_VERSICHERUNGSVERMITTLERIN, title='Haushalt')
|
course_category=CourseCategory.objects.get(course_id=COURSE_VERSICHERUNGSVERMITTLERIN_ID, title='Haushalt')
|
||||||
)
|
)
|
||||||
LearningContentFactory(
|
LearningContentFactory(
|
||||||
title='Privathaftpflicht',
|
title='Privathaftpflicht',
|
||||||
|
|
@ -256,7 +255,7 @@ def create_circle_children(circle, title):
|
||||||
lu = LearningUnitFactory(
|
lu = LearningUnitFactory(
|
||||||
title='Kind zieht von zu Hause aus',
|
title='Kind zieht von zu Hause aus',
|
||||||
parent=circle,
|
parent=circle,
|
||||||
course_category=CourseCategory.objects.get(course_id=COURSE_VERSICHERUNGSVERMITTLERIN, title='Einkommenssicherung')
|
course_category=CourseCategory.objects.get(course_id=COURSE_VERSICHERUNGSVERMITTLERIN_ID, title='Einkommenssicherung')
|
||||||
)
|
)
|
||||||
LearningContentFactory(
|
LearningContentFactory(
|
||||||
title='Hausrat',
|
title='Hausrat',
|
||||||
|
|
@ -281,7 +280,7 @@ def create_circle_children(circle, title):
|
||||||
lu = LearningUnitFactory(
|
lu = LearningUnitFactory(
|
||||||
title='Kind zieht von zu Hause aus "Testen"',
|
title='Kind zieht von zu Hause aus "Testen"',
|
||||||
parent=circle,
|
parent=circle,
|
||||||
course_category=CourseCategory.objects.get(course_id=COURSE_VERSICHERUNGSVERMITTLERIN, title='Einkommenssicherung')
|
course_category=CourseCategory.objects.get(course_id=COURSE_VERSICHERUNGSVERMITTLERIN_ID, title='Einkommenssicherung')
|
||||||
)
|
)
|
||||||
LearningContentFactory(
|
LearningContentFactory(
|
||||||
title='Das erwartet dich im Test',
|
title='Das erwartet dich im Test',
|
||||||
|
|
@ -334,7 +333,7 @@ def create_default_learning_path(user=None, skip_locales=True):
|
||||||
|
|
||||||
# create_default_competences()
|
# create_default_competences()
|
||||||
|
|
||||||
course_page = CoursePage.objects.get(course_id=COURSE_VERSICHERUNGSVERMITTLERIN)
|
course_page = CoursePage.objects.get(course_id=COURSE_VERSICHERUNGSVERMITTLERIN_ID)
|
||||||
lp = LearningPathFactory(
|
lp = LearningPathFactory(
|
||||||
title="Lernpfad",
|
title="Lernpfad",
|
||||||
parent=course_page,
|
parent=course_page,
|
||||||
|
|
@ -443,12 +442,3 @@ Neukundinnen und -kunden.""",
|
||||||
|
|
||||||
# all pages belong to 'admin' by default
|
# all pages belong to 'admin' by default
|
||||||
Page.objects.update(owner=user)
|
Page.objects.update(owner=user)
|
||||||
|
|
||||||
|
|
||||||
def delete_default_learning_path():
|
|
||||||
LearningContent.objects.all().delete()
|
|
||||||
LearningUnit.objects.all().delete()
|
|
||||||
LearningSequence.objects.all().delete()
|
|
||||||
Circle.objects.all().delete()
|
|
||||||
Topic.objects.all().delete()
|
|
||||||
LearningPath.objects.all().delete()
|
|
||||||
|
|
|
||||||
|
|
@ -1,10 +0,0 @@
|
||||||
import djclick as click
|
|
||||||
|
|
||||||
from vbv_lernwelt.learnpath.create_default_learning_path import create_default_learning_path
|
|
||||||
|
|
||||||
|
|
||||||
@click.command()
|
|
||||||
def command():
|
|
||||||
create_default_learning_path(skip_locales=True)
|
|
||||||
# FIXME: readd
|
|
||||||
# create_simple_test_learning_path(skip_locales=True)
|
|
||||||
|
|
@ -1,8 +0,0 @@
|
||||||
import djclick as click
|
|
||||||
|
|
||||||
from vbv_lernwelt.learnpath.create_default_learning_path import delete_default_learning_path
|
|
||||||
|
|
||||||
|
|
||||||
@click.command()
|
|
||||||
def command():
|
|
||||||
delete_default_learning_path()
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
# Generated by Django 3.2.13 on 2022-09-28 10:30
|
# Generated by Django 3.2.13 on 2022-09-28 12:51
|
||||||
|
|
||||||
from django.db import migrations, models
|
from django.db import migrations, models
|
||||||
import django.db.models.deletion
|
import django.db.models.deletion
|
||||||
|
|
|
||||||
|
|
@ -2,30 +2,27 @@ from rest_framework.test import APITestCase
|
||||||
|
|
||||||
from vbv_lernwelt.core.admin import User
|
from vbv_lernwelt.core.admin import User
|
||||||
from vbv_lernwelt.core.create_default_users import create_default_users
|
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.course.creators.test_course import create_test_course
|
||||||
from vbv_lernwelt.learnpath.models import LearningPath
|
from vbv_lernwelt.learnpath.models import LearningPath
|
||||||
from vbv_lernwelt.learnpath.tests.create_simple_test_learning_path import create_simple_test_learning_path
|
|
||||||
|
|
||||||
|
|
||||||
class TestRetrieveLearingPathContents(APITestCase):
|
class TestRetrieveLearingPathContents(APITestCase):
|
||||||
def setUp(self) -> None:
|
def setUp(self) -> None:
|
||||||
create_locales_for_wagtail()
|
|
||||||
create_default_users()
|
create_default_users()
|
||||||
create_simple_test_learning_path()
|
create_test_course()
|
||||||
|
|
||||||
self.user = User.objects.get(username='student')
|
self.user = User.objects.get(username='student')
|
||||||
self.client.login(username='student', password='test')
|
self.client.login(username='student', password='test')
|
||||||
|
|
||||||
def test_get_learnpathPage(self):
|
def test_get_learnpathPage(self):
|
||||||
learning_path = LearningPath.objects.get(slug='unit-test-lernpfad')
|
slug = 'test-lehrgang-lp'
|
||||||
response = self.client.get('/api/course/page/unit-test-lernpfad/')
|
learning_path = LearningPath.objects.get(slug=slug)
|
||||||
print(response)
|
response = self.client.get(f'/api/course/page/{slug}/')
|
||||||
|
|
||||||
self.assertEqual(response.status_code, 200)
|
self.assertEqual(response.status_code, 200)
|
||||||
data = response.json()
|
data = response.json()
|
||||||
# print(data)
|
|
||||||
|
|
||||||
self.assertEqual(learning_path.title, data['title'])
|
self.assertEqual(learning_path.title, data['title'])
|
||||||
# topic and circle
|
# topics and circles
|
||||||
self.assertEqual(4, len(data['children']))
|
self.assertEqual(4, len(data['children']))
|
||||||
# circle "unit-test-circle" contents
|
# circle "analyse" contents
|
||||||
self.assertEqual(13, len(data['children'][3]['children']))
|
self.assertEqual(12, len(data['children'][3]['children']))
|
||||||
|
|
|
||||||
|
|
@ -1,14 +1,14 @@
|
||||||
import json
|
import json
|
||||||
|
|
||||||
from vbv_lernwelt.course.consts import COURSE_VERSICHERUNGSVERMITTLERIN
|
from vbv_lernwelt.course.consts import COURSE_VERSICHERUNGSVERMITTLERIN_ID
|
||||||
from vbv_lernwelt.course.models import CoursePage, Course
|
from vbv_lernwelt.course.models import CoursePage, Course
|
||||||
from vbv_lernwelt.media_library.tests.media_library_factories import MediaLibraryPageFactory, MediaCategoryPageFactory, \
|
from vbv_lernwelt.media_library.tests.media_library_factories import MediaLibraryPageFactory, MediaCategoryPageFactory, \
|
||||||
create_media_content_link, LinkBlockFactory, create_link_collection, create_document_collection
|
create_media_content_link, LinkBlockFactory, create_link_collection, create_document_collection
|
||||||
|
|
||||||
|
|
||||||
def create_default_media_library():
|
def create_default_media_library():
|
||||||
course = Course.objects.get(id=COURSE_VERSICHERUNGSVERMITTLERIN)
|
course = Course.objects.get(id=COURSE_VERSICHERUNGSVERMITTLERIN_ID)
|
||||||
course_page = CoursePage.objects.get(course_id=COURSE_VERSICHERUNGSVERMITTLERIN)
|
course_page = CoursePage.objects.get(course_id=COURSE_VERSICHERUNGSVERMITTLERIN_ID)
|
||||||
|
|
||||||
media_lib_page = MediaLibraryPageFactory(
|
media_lib_page = MediaLibraryPageFactory(
|
||||||
title='Mediathek',
|
title='Mediathek',
|
||||||
|
|
|
||||||
|
|
@ -1,11 +0,0 @@
|
||||||
import djclick as click
|
|
||||||
|
|
||||||
from vbv_lernwelt.media_library.create_default_documents import create_default_collections, create_default_documents
|
|
||||||
from vbv_lernwelt.media_library.create_default_media_library import create_default_media_library
|
|
||||||
|
|
||||||
|
|
||||||
@click.command()
|
|
||||||
def command():
|
|
||||||
create_default_collections()
|
|
||||||
create_default_documents()
|
|
||||||
create_default_media_library()
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
# Generated by Django 3.2.13 on 2022-09-28 10:30
|
# Generated by Django 3.2.13 on 2022-09-28 12:51
|
||||||
|
|
||||||
from django.conf import settings
|
from django.conf import settings
|
||||||
from django.db import migrations, models
|
from django.db import migrations, models
|
||||||
|
|
@ -18,8 +18,8 @@ class Migration(migrations.Migration):
|
||||||
|
|
||||||
dependencies = [
|
dependencies = [
|
||||||
('course', '0001_initial'),
|
('course', '0001_initial'),
|
||||||
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
|
|
||||||
('wagtailcore', '0069_log_entry_jsonfield'),
|
('wagtailcore', '0069_log_entry_jsonfield'),
|
||||||
|
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
|
||||||
('taggit', '0004_alter_taggeditem_content_type_alter_taggeditem_tag'),
|
('taggit', '0004_alter_taggeditem_content_type_alter_taggeditem_tag'),
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue