Make assignment creation more generic

This commit is contained in:
Daniel Egger 2023-05-23 17:32:01 +02:00
parent 0f0d1632a7
commit 321c57b709
7 changed files with 88 additions and 53 deletions

View File

@ -1,8 +1,5 @@
from wagtail.blocks import StreamValue
from wagtail.blocks.list_block import ListBlock, ListValue
from wagtail.rich_text import RichText
from vbv_lernwelt.assignment.models import (
AssignmentListPage,
AssignmentType,
EvaluationSubTaskBlock,
TaskContentStreamBlock,
@ -18,9 +15,20 @@ from vbv_lernwelt.assignment.tests.assignment_factories import (
)
from vbv_lernwelt.core.utils import replace_whitespace
from vbv_lernwelt.course.consts import COURSE_UK
from vbv_lernwelt.course.models import CoursePage
from wagtail.blocks import StreamValue
from wagtail.blocks.list_block import ListBlock, ListValue
from wagtail.rich_text import RichText
def create_uk_casework(assignment_list_page, course_id=COURSE_UK):
def create_uk_casework(course_id=COURSE_UK):
assignment_list_page = (
CoursePage.objects.get(course_id=course_id)
.get_children()
.exact_type(AssignmentListPage)
.first()
)
assignment = AssignmentFactory(
parent=assignment_list_page,
title="Überprüfen einer Motorfahrzeugs-Versicherungspolice",
@ -457,7 +465,14 @@ def create_uk_casework(assignment_list_page, course_id=COURSE_UK):
return assignment
def create_uk_prep_assignment(assignment_list_page, course_id=COURSE_UK):
def create_uk_prep_assignment(course_id=COURSE_UK):
assignment_list_page = (
CoursePage.objects.get(course_id=course_id)
.get_children()
.exact_type(AssignmentListPage)
.first()
)
assignment = AssignmentFactory(
parent=assignment_list_page,
assignment_type=AssignmentType.PREP_ASSIGNMENT.name,
@ -765,11 +780,18 @@ def create_uk_prep_assignment(assignment_list_page, course_id=COURSE_UK):
return assignment
def create_uk_reflection(assignment_list_page, course_id=COURSE_UK):
def create_uk_reflection(course_id=COURSE_UK, circle_title="Fahrzeug"):
assignment_list_page = (
CoursePage.objects.get(course_id=course_id)
.get_children()
.exact_type(AssignmentListPage)
.first()
)
assignment = AssignmentFactory(
parent=assignment_list_page,
assignment_type=AssignmentType.REFLECTION.name,
title="Reflexionsfragen - Fahrzeug",
title=f"{circle_title} - Reflexionsfragen",
effort_required="ca. 1 Stunde",
intro_text=replace_whitespace(
"""

View File

@ -8,24 +8,19 @@ from vbv_lernwelt.assignment.models import (
AssignmentCompletion,
AssignmentCompletionAuditLog,
)
from vbv_lernwelt.assignment.tests.assignment_factories import AssignmentListPageFactory
from vbv_lernwelt.core.create_default_users import create_default_users
from vbv_lernwelt.core.models import User
from vbv_lernwelt.core.utils import find_first
from vbv_lernwelt.course.consts import COURSE_TEST_ID
from vbv_lernwelt.course.creators.test_course import create_test_course
from vbv_lernwelt.course.models import CoursePage, CourseSession, CourseSessionUser
from vbv_lernwelt.course.models import CourseSession, CourseSessionUser
class AssignmentApiTestCase(APITestCase):
def setUp(self) -> None:
create_default_users()
create_test_course(include_vv=False)
course_page = CoursePage.objects.get(course_id=COURSE_TEST_ID)
assignment_list_page = AssignmentListPageFactory(
parent=course_page,
)
self.assignment = create_uk_casework(assignment_list_page=assignment_list_page)
self.assignment = create_uk_casework(course_id=COURSE_TEST_ID)
self.assignment_subtasks = self.assignment.filter_user_subtasks()
self.cs = CourseSession.objects.create(

View File

@ -4,34 +4,32 @@ from django.test import TestCase
from django.utils import timezone
from rest_framework import serializers
from vbv_lernwelt.assignment.creators.create_assignments import create_uk_casework
from vbv_lernwelt.assignment.models import (
Assignment,
AssignmentCompletion,
AssignmentCompletionAuditLog,
)
from vbv_lernwelt.assignment.services import update_assignment_completion
from vbv_lernwelt.assignment.tests.assignment_factories import AssignmentListPageFactory
from vbv_lernwelt.core.create_default_users import create_default_users
from vbv_lernwelt.core.models import User
from vbv_lernwelt.core.tests.helpers import create_locales_for_wagtail
from vbv_lernwelt.core.utils import find_first
from vbv_lernwelt.course.consts import COURSE_TEST_ID
from vbv_lernwelt.course.factories import CourseFactory, CoursePageFactory
from vbv_lernwelt.course.creators.test_course import create_test_course
from vbv_lernwelt.course.models import CourseSession
from vbv_lernwelt.learnpath.models import LearningContentAssignment
class UpdateAssignmentCompletionTestCase(TestCase):
def setUp(self):
create_default_users()
create_locales_for_wagtail()
course = CourseFactory(
id=COURSE_TEST_ID,
self.course = create_test_course(include_vv=False)
self.assignment = (
self.course.coursepage.get_descendants()
.exact_type(Assignment)
.filter(assignment__assignment_type="CASEWORK")
.first()
.specific
)
course_page = CoursePageFactory(course=course)
assignment_list_page = AssignmentListPageFactory(
parent=course_page,
)
self.assignment = create_uk_casework(assignment_list_page=assignment_list_page)
self.course_session = CourseSession.objects.create(
course_id=COURSE_TEST_ID,
title="Bern 2022 a",
@ -186,19 +184,22 @@ class UpdateAssignmentCompletionTestCase(TestCase):
self.assertEqual(acl.assignment_user_email, "student")
self.assertEqual(
acl.assignment_slug,
"versicherungsvermittler-in-assignment-überprüfen-einer-motorfahrzeugs-versicherungspolice",
"test-lehrgang-assignment-überprüfen-einer-motorfahrzeugs-versicherungspolice",
)
# AssignmentCompletionAuditLog entry will remain event after deletion of foreign keys
ac.delete()
self.user.delete()
self.course.coursepage.get_descendants().exact_type(
LearningContentAssignment
).delete()
self.assignment.delete()
acl = AssignmentCompletionAuditLog.objects.get(id=acl.id)
self.assertEqual(acl.created_at.date(), date.today())
self.assertEqual(acl.assignment_user_email, "student")
self.assertEqual(
acl.assignment_slug,
"versicherungsvermittler-in-assignment-überprüfen-einer-motorfahrzeugs-versicherungspolice",
"test-lehrgang-assignment-überprüfen-einer-motorfahrzeugs-versicherungspolice",
)
self.assertIsNone(acl.assignment_user)
self.assertIsNone(acl.assignment)
@ -520,7 +521,7 @@ class UpdateAssignmentCompletionTestCase(TestCase):
self.assertEqual(acl.assignment_user_email, "student")
self.assertEqual(
acl.assignment_slug,
"versicherungsvermittler-in-assignment-überprüfen-einer-motorfahrzeugs-versicherungspolice",
"test-lehrgang-assignment-überprüfen-einer-motorfahrzeugs-versicherungspolice",
)
trainer_input = acl.completion_data[evaluation_task["id"]]
self.assertDictEqual(
@ -534,13 +535,16 @@ class UpdateAssignmentCompletionTestCase(TestCase):
# AssignmentCompletionAuditLog entry will remain event after deletion of foreign keys
ac.delete()
self.user.delete()
self.course.coursepage.get_descendants().exact_type(
LearningContentAssignment
).delete()
self.assignment.delete()
acl = AssignmentCompletionAuditLog.objects.get(id=acl.id)
self.assertEqual(acl.created_at.date(), date.today())
self.assertEqual(acl.assignment_user_email, "student")
self.assertEqual(
acl.assignment_slug,
"versicherungsvermittler-in-assignment-überprüfen-einer-motorfahrzeugs-versicherungspolice",
"test-lehrgang-assignment-überprüfen-einer-motorfahrzeugs-versicherungspolice",
)
self.assertIsNone(acl.assignment_user)
self.assertIsNone(acl.assignment)

View File

@ -67,13 +67,13 @@ def create_test_course(include_uk=True, include_vv=True, with_sessions=False):
create_test_competence_profile()
if include_uk:
# assignments
# assignments create assignments parent page
course_page = CoursePage.objects.get(course_id=COURSE_TEST_ID)
assignment_list_page = AssignmentListPageFactory(
_assignment_list_page = AssignmentListPageFactory(
parent=course_page,
)
create_uk_casework(assignment_list_page=assignment_list_page)
create_uk_prep_assignment(assignment_list_page=assignment_list_page)
create_uk_casework(course_id=COURSE_TEST_ID)
create_uk_prep_assignment(course_id=COURSE_TEST_ID)
create_test_learning_path(include_uk=include_uk, include_vv=include_vv)
create_test_media_library()
@ -215,14 +215,14 @@ damit du erfolgreich mit deinem Lernpfad (durch-)starten kannst.
parent=circle,
text=RichText(
"""
<h3>Arbeitsblätter «Vorbereitungsauftrag»</h3>
<p>Handlungskompetenz d2: Informations-und Beratungsgespräch mit Kunden oder Lieferanten führen</p>
<p>Arbeitssituation 4: Kunden beraten und dazugehörige Prozesse abwickeln</p>
<p>Die Kaufleute führen Bedarfserhebungen für Kunden durch und schlagen ihnen angemessene Versicherungslösungen vor. Sie führen Beratungs-und Verkaufsgespräche und erteilen Auskünfte. Sieführen Kundenaufträge aus und behandeln Beschwerden. Sie formulieren Aufträge an relevante Anspruchsgruppen und unterstützen den Aussendient in verkaufsrelevanten Belangen.</p>
<ul>
<li>d2.pv.ük3: Sie erläutern die Leistungen und Produkte im Versicherungsbereich. (K2)</li>
<li>d2pv.ük4: Sie erläutern die Prozesse und Abläufe im privaten Versicherungsbereich. (K2)</li>
</ul>
<h3>Arbeitsblätter «Vorbereitungsauftrag»</h3>
<p>Handlungskompetenz d2: Informations-und Beratungsgespräch mit Kunden oder Lieferanten führen</p>
<p>Arbeitssituation 4: Kunden beraten und dazugehörige Prozesse abwickeln</p>
<p>Die Kaufleute führen Bedarfserhebungen für Kunden durch und schlagen ihnen angemessene Versicherungslösungen vor. Sie führen Beratungs-und Verkaufsgespräche und erteilen Auskünfte. Sieführen Kundenaufträge aus und behandeln Beschwerden. Sie formulieren Aufträge an relevante Anspruchsgruppen und unterstützen den Aussendient in verkaufsrelevanten Belangen.</p>
<ul>
<li>d2.pv.ük3: Sie erläutern die Leistungen und Produkte im Versicherungsbereich. (K2)</li>
<li>d2pv.ük4: Sie erläutern die Prozesse und Abläufe im privaten Versicherungsbereich. (K2)</li>
</ul>
"""
),
)

View File

@ -59,3 +59,5 @@ def create_versicherungsvermittlerin_with_categories(
)
course.slug = course_page.slug
course.save()
return course

View File

@ -150,18 +150,17 @@ def create_versicherungsvermittlerin_course():
def create_course_uk_de():
# Überbetriebliche Kurse DE
create_versicherungsvermittlerin_with_categories(
course = create_versicherungsvermittlerin_with_categories(
course_id=COURSE_UK, title="Überbetriebliche Kurse"
)
# assignments
course_page = CoursePage.objects.get(course_id=COURSE_UK)
assignment_list_page = AssignmentListPageFactory(
parent=course_page,
# assignments create assignments parent page
_assignment_list_page = AssignmentListPageFactory(
parent=course.coursepage,
)
create_uk_casework(assignment_list_page, course_id=COURSE_UK)
create_uk_prep_assignment(assignment_list_page, course_id=COURSE_UK)
create_uk_reflection(assignment_list_page, course_id=COURSE_UK)
create_uk_casework(course_id=COURSE_UK)
create_uk_prep_assignment(course_id=COURSE_UK)
create_uk_reflection(course_id=COURSE_UK)
# learning path
create_uk_learning_path(course_id=COURSE_UK)

View File

@ -17,6 +17,7 @@ from vbv_lernwelt.learnpath.tests.learning_path_factories import (
LearningContentFeedbackFactory,
LearningContentMediaLibraryFactory,
LearningContentPlaceholderFactory,
LearningContentRichTextFactory,
LearningPathFactory,
LearningSequenceFactory,
LearningUnitFactory,
@ -230,9 +231,21 @@ damit du erfolgreich mit deinem Lernpfad (durch-)starten kannst.
title="Vorbereitung", parent=circle, icon="it-icon-ls-start"
)
LearningUnitFactory(title="Vorbereitung", parent=circle)
LearningContentPlaceholderFactory(
LearningContentRichTextFactory(
title="Verschaffe dir einen Überblick",
parent=circle,
text=RichText(
"""
<h3>Arbeitsblätter «Vorbereitungsauftrag»</h3>
<p>Handlungskompetenz d2: Informations-und Beratungsgespräch mit Kunden oder Lieferanten führen</p>
<p>Arbeitssituation 4: Kunden beraten und dazugehörige Prozesse abwickeln</p>
<p>Die Kaufleute führen Bedarfserhebungen für Kunden durch und schlagen ihnen angemessene Versicherungslösungen vor. Sie führen Beratungs-und Verkaufsgespräche und erteilen Auskünfte. Sieführen Kundenaufträge aus und behandeln Beschwerden. Sie formulieren Aufträge an relevante Anspruchsgruppen und unterstützen den Aussendient in verkaufsrelevanten Belangen.</p>
<ul>
<li>d2.pv.ük3: Sie erläutern die Leistungen und Produkte im Versicherungsbereich. (K2)</li>
<li>d2pv.ük4: Sie erläutern die Prozesse und Abläufe im privaten Versicherungsbereich. (K2)</li>
</ul>
"""
),
)
LearningContentMediaLibraryFactory(
title=f"Handlungsfeld «{title}»",
@ -274,7 +287,7 @@ damit du erfolgreich mit deinem Lernpfad (durch-)starten kannst.
assignment_type="REFLECTION",
parent=circle,
content_assignment=Assignment.objects.get(
slug__startswith="überbetriebliche-kurse-assignment-reflexionsfragen-fahrzeug"
slug__startswith="überbetriebliche-kurse-assignment-fahrzeug-reflexionsfragen"
),
),
LearningContentAssignmentFactory(