From 321c57b7098e46ff4ec532c5cd1e6612303c36dd Mon Sep 17 00:00:00 2001 From: Daniel Egger Date: Tue, 23 May 2023 17:32:01 +0200 Subject: [PATCH] Make assignment creation more generic --- .../assignment/creators/create_assignments.py | 38 +++++++++++++++---- .../assignment/tests/test_assignment_api.py | 9 +---- .../assignment/tests/test_services.py | 36 ++++++++++-------- .../course/creators/test_course.py | 24 ++++++------ .../creators/versicherungsvermittlerin.py | 2 + .../commands/create_default_courses.py | 15 ++++---- .../management/commands/create_uk_course.py | 17 ++++++++- 7 files changed, 88 insertions(+), 53 deletions(-) diff --git a/server/vbv_lernwelt/assignment/creators/create_assignments.py b/server/vbv_lernwelt/assignment/creators/create_assignments.py index 0b483a0f..2668002a 100644 --- a/server/vbv_lernwelt/assignment/creators/create_assignments.py +++ b/server/vbv_lernwelt/assignment/creators/create_assignments.py @@ -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( """ diff --git a/server/vbv_lernwelt/assignment/tests/test_assignment_api.py b/server/vbv_lernwelt/assignment/tests/test_assignment_api.py index fd0107d9..383ac419 100644 --- a/server/vbv_lernwelt/assignment/tests/test_assignment_api.py +++ b/server/vbv_lernwelt/assignment/tests/test_assignment_api.py @@ -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( diff --git a/server/vbv_lernwelt/assignment/tests/test_services.py b/server/vbv_lernwelt/assignment/tests/test_services.py index 33936a52..64e24d77 100644 --- a/server/vbv_lernwelt/assignment/tests/test_services.py +++ b/server/vbv_lernwelt/assignment/tests/test_services.py @@ -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) diff --git a/server/vbv_lernwelt/course/creators/test_course.py b/server/vbv_lernwelt/course/creators/test_course.py index 07734ccc..a78f63c7 100644 --- a/server/vbv_lernwelt/course/creators/test_course.py +++ b/server/vbv_lernwelt/course/creators/test_course.py @@ -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( """ -

Arbeitsblätter «Vorbereitungsauftrag»

-

Handlungskompetenz d2: Informations-und Beratungsgespräch mit Kunden oder Lieferanten führen

-

Arbeitssituation 4: Kunden beraten und dazugehörige Prozesse abwickeln

-

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.

- +

Arbeitsblätter «Vorbereitungsauftrag»

+

Handlungskompetenz d2: Informations-und Beratungsgespräch mit Kunden oder Lieferanten führen

+

Arbeitssituation 4: Kunden beraten und dazugehörige Prozesse abwickeln

+

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.

+ """ ), ) diff --git a/server/vbv_lernwelt/course/creators/versicherungsvermittlerin.py b/server/vbv_lernwelt/course/creators/versicherungsvermittlerin.py index a87b645f..a0e72b47 100644 --- a/server/vbv_lernwelt/course/creators/versicherungsvermittlerin.py +++ b/server/vbv_lernwelt/course/creators/versicherungsvermittlerin.py @@ -59,3 +59,5 @@ def create_versicherungsvermittlerin_with_categories( ) course.slug = course_page.slug course.save() + + return course diff --git a/server/vbv_lernwelt/course/management/commands/create_default_courses.py b/server/vbv_lernwelt/course/management/commands/create_default_courses.py index 90f689b6..d7e15cf7 100644 --- a/server/vbv_lernwelt/course/management/commands/create_default_courses.py +++ b/server/vbv_lernwelt/course/management/commands/create_default_courses.py @@ -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) diff --git a/server/vbv_lernwelt/course/management/commands/create_uk_course.py b/server/vbv_lernwelt/course/management/commands/create_uk_course.py index 78e49a97..a972e92a 100644 --- a/server/vbv_lernwelt/course/management/commands/create_uk_course.py +++ b/server/vbv_lernwelt/course/management/commands/create_uk_course.py @@ -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( + """ +

Arbeitsblätter «Vorbereitungsauftrag»

+

Handlungskompetenz d2: Informations-und Beratungsgespräch mit Kunden oder Lieferanten führen

+

Arbeitssituation 4: Kunden beraten und dazugehörige Prozesse abwickeln

+

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.

+ + """ + ), ) 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(