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 ( from vbv_lernwelt.assignment.models import (
AssignmentListPage,
AssignmentType, AssignmentType,
EvaluationSubTaskBlock, EvaluationSubTaskBlock,
TaskContentStreamBlock, TaskContentStreamBlock,
@ -18,9 +15,20 @@ from vbv_lernwelt.assignment.tests.assignment_factories import (
) )
from vbv_lernwelt.core.utils import replace_whitespace from vbv_lernwelt.core.utils import replace_whitespace
from vbv_lernwelt.course.consts import COURSE_UK 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( assignment = AssignmentFactory(
parent=assignment_list_page, parent=assignment_list_page,
title="Überprüfen einer Motorfahrzeugs-Versicherungspolice", title="Überprüfen einer Motorfahrzeugs-Versicherungspolice",
@ -457,7 +465,14 @@ def create_uk_casework(assignment_list_page, course_id=COURSE_UK):
return assignment 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( assignment = AssignmentFactory(
parent=assignment_list_page, parent=assignment_list_page,
assignment_type=AssignmentType.PREP_ASSIGNMENT.name, assignment_type=AssignmentType.PREP_ASSIGNMENT.name,
@ -765,11 +780,18 @@ def create_uk_prep_assignment(assignment_list_page, course_id=COURSE_UK):
return assignment 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( assignment = AssignmentFactory(
parent=assignment_list_page, parent=assignment_list_page,
assignment_type=AssignmentType.REFLECTION.name, assignment_type=AssignmentType.REFLECTION.name,
title="Reflexionsfragen - Fahrzeug", title=f"{circle_title} - Reflexionsfragen",
effort_required="ca. 1 Stunde", effort_required="ca. 1 Stunde",
intro_text=replace_whitespace( intro_text=replace_whitespace(
""" """

View File

@ -8,24 +8,19 @@ from vbv_lernwelt.assignment.models import (
AssignmentCompletion, AssignmentCompletion,
AssignmentCompletionAuditLog, 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.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.utils import find_first from vbv_lernwelt.core.utils import find_first
from vbv_lernwelt.course.consts import COURSE_TEST_ID from vbv_lernwelt.course.consts import COURSE_TEST_ID
from vbv_lernwelt.course.creators.test_course import create_test_course 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): class AssignmentApiTestCase(APITestCase):
def setUp(self) -> None: def setUp(self) -> None:
create_default_users() create_default_users()
create_test_course(include_vv=False) create_test_course(include_vv=False)
course_page = CoursePage.objects.get(course_id=COURSE_TEST_ID) self.assignment = create_uk_casework(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_subtasks = self.assignment.filter_user_subtasks() self.assignment_subtasks = self.assignment.filter_user_subtasks()
self.cs = CourseSession.objects.create( self.cs = CourseSession.objects.create(

View File

@ -4,34 +4,32 @@ from django.test import TestCase
from django.utils import timezone from django.utils import timezone
from rest_framework import serializers from rest_framework import serializers
from vbv_lernwelt.assignment.creators.create_assignments import create_uk_casework
from vbv_lernwelt.assignment.models import ( from vbv_lernwelt.assignment.models import (
Assignment,
AssignmentCompletion, AssignmentCompletion,
AssignmentCompletionAuditLog, AssignmentCompletionAuditLog,
) )
from vbv_lernwelt.assignment.services import update_assignment_completion 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.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.utils import find_first from vbv_lernwelt.core.utils import find_first
from vbv_lernwelt.course.consts import COURSE_TEST_ID 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.course.models import CourseSession
from vbv_lernwelt.learnpath.models import LearningContentAssignment
class UpdateAssignmentCompletionTestCase(TestCase): class UpdateAssignmentCompletionTestCase(TestCase):
def setUp(self): def setUp(self):
create_default_users() create_default_users()
create_locales_for_wagtail() self.course = create_test_course(include_vv=False)
course = CourseFactory( self.assignment = (
id=COURSE_TEST_ID, 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( self.course_session = CourseSession.objects.create(
course_id=COURSE_TEST_ID, course_id=COURSE_TEST_ID,
title="Bern 2022 a", title="Bern 2022 a",
@ -186,19 +184,22 @@ class UpdateAssignmentCompletionTestCase(TestCase):
self.assertEqual(acl.assignment_user_email, "student") self.assertEqual(acl.assignment_user_email, "student")
self.assertEqual( self.assertEqual(
acl.assignment_slug, 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 # AssignmentCompletionAuditLog entry will remain event after deletion of foreign keys
ac.delete() ac.delete()
self.user.delete() self.user.delete()
self.course.coursepage.get_descendants().exact_type(
LearningContentAssignment
).delete()
self.assignment.delete() self.assignment.delete()
acl = AssignmentCompletionAuditLog.objects.get(id=acl.id) acl = AssignmentCompletionAuditLog.objects.get(id=acl.id)
self.assertEqual(acl.created_at.date(), date.today()) self.assertEqual(acl.created_at.date(), date.today())
self.assertEqual(acl.assignment_user_email, "student") self.assertEqual(acl.assignment_user_email, "student")
self.assertEqual( self.assertEqual(
acl.assignment_slug, 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_user)
self.assertIsNone(acl.assignment) self.assertIsNone(acl.assignment)
@ -520,7 +521,7 @@ class UpdateAssignmentCompletionTestCase(TestCase):
self.assertEqual(acl.assignment_user_email, "student") self.assertEqual(acl.assignment_user_email, "student")
self.assertEqual( self.assertEqual(
acl.assignment_slug, 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"]] trainer_input = acl.completion_data[evaluation_task["id"]]
self.assertDictEqual( self.assertDictEqual(
@ -534,13 +535,16 @@ class UpdateAssignmentCompletionTestCase(TestCase):
# AssignmentCompletionAuditLog entry will remain event after deletion of foreign keys # AssignmentCompletionAuditLog entry will remain event after deletion of foreign keys
ac.delete() ac.delete()
self.user.delete() self.user.delete()
self.course.coursepage.get_descendants().exact_type(
LearningContentAssignment
).delete()
self.assignment.delete() self.assignment.delete()
acl = AssignmentCompletionAuditLog.objects.get(id=acl.id) acl = AssignmentCompletionAuditLog.objects.get(id=acl.id)
self.assertEqual(acl.created_at.date(), date.today()) self.assertEqual(acl.created_at.date(), date.today())
self.assertEqual(acl.assignment_user_email, "student") self.assertEqual(acl.assignment_user_email, "student")
self.assertEqual( self.assertEqual(
acl.assignment_slug, 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_user)
self.assertIsNone(acl.assignment) 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() create_test_competence_profile()
if include_uk: if include_uk:
# assignments # assignments create assignments parent page
course_page = CoursePage.objects.get(course_id=COURSE_TEST_ID) course_page = CoursePage.objects.get(course_id=COURSE_TEST_ID)
assignment_list_page = AssignmentListPageFactory( _assignment_list_page = AssignmentListPageFactory(
parent=course_page, parent=course_page,
) )
create_uk_casework(assignment_list_page=assignment_list_page) create_uk_casework(course_id=COURSE_TEST_ID)
create_uk_prep_assignment(assignment_list_page=assignment_list_page) create_uk_prep_assignment(course_id=COURSE_TEST_ID)
create_test_learning_path(include_uk=include_uk, include_vv=include_vv) create_test_learning_path(include_uk=include_uk, include_vv=include_vv)
create_test_media_library() create_test_media_library()

View File

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

View File

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

View File

@ -17,6 +17,7 @@ from vbv_lernwelt.learnpath.tests.learning_path_factories import (
LearningContentFeedbackFactory, LearningContentFeedbackFactory,
LearningContentMediaLibraryFactory, LearningContentMediaLibraryFactory,
LearningContentPlaceholderFactory, LearningContentPlaceholderFactory,
LearningContentRichTextFactory,
LearningPathFactory, LearningPathFactory,
LearningSequenceFactory, LearningSequenceFactory,
LearningUnitFactory, LearningUnitFactory,
@ -230,9 +231,21 @@ damit du erfolgreich mit deinem Lernpfad (durch-)starten kannst.
title="Vorbereitung", parent=circle, icon="it-icon-ls-start" title="Vorbereitung", parent=circle, icon="it-icon-ls-start"
) )
LearningUnitFactory(title="Vorbereitung", parent=circle) LearningUnitFactory(title="Vorbereitung", parent=circle)
LearningContentPlaceholderFactory( LearningContentRichTextFactory(
title="Verschaffe dir einen Überblick", title="Verschaffe dir einen Überblick",
parent=circle, 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( LearningContentMediaLibraryFactory(
title=f"Handlungsfeld «{title}»", title=f"Handlungsfeld «{title}»",
@ -274,7 +287,7 @@ damit du erfolgreich mit deinem Lernpfad (durch-)starten kannst.
assignment_type="REFLECTION", assignment_type="REFLECTION",
parent=circle, parent=circle,
content_assignment=Assignment.objects.get( content_assignment=Assignment.objects.get(
slug__startswith="überbetriebliche-kurse-assignment-reflexionsfragen-fahrzeug" slug__startswith="überbetriebliche-kurse-assignment-fahrzeug-reflexionsfragen"
), ),
), ),
LearningContentAssignmentFactory( LearningContentAssignmentFactory(