diff --git a/client/src/gql/graphql.ts b/client/src/gql/graphql.ts index 318ac762..5eaf387d 100644 --- a/client/src/gql/graphql.ts +++ b/client/src/gql/graphql.ts @@ -63,16 +63,18 @@ export type ActionCompetenceObjectType = CoursePageInterface & { /** An enumeration. */ export type AssignmentAssignmentAssignmentTypeChoices = - /** CASEWORK */ - | 'CASEWORK' /** CONDITION_ACCEPTANCE */ | 'CONDITION_ACCEPTANCE' /** EDONIQ_TEST */ | 'EDONIQ_TEST' + /** MANDATORY_CASEWORK */ + | 'MANDATORY_CASEWORK' /** PREP_ASSIGNMENT */ | 'PREP_ASSIGNMENT' /** REFLECTION */ - | 'REFLECTION'; + | 'REFLECTION' + /** VOLUNTARY_CASEWORK */ + | 'VOLUNTARY_CASEWORK'; /** An enumeration. */ export type AssignmentAssignmentCompletionCompletionStatusChoices = @@ -150,7 +152,7 @@ export type AssignmentObjectType = CoursePageInterface & { learning_content?: Maybe; live: Scalars['Boolean']['output']; max_points?: Maybe; - /** Muss der Auftrag durch eine Expertin oder einen Experten beurteilt werden? */ + /** Muss der Auftrag durch eine/n Experten/in oder eine Lernbegleitung beurteilt werden? */ needs_expert_evaluation: Scalars['Boolean']['output']; performance_objectives?: Maybe; slug: Scalars['String']['output']; @@ -764,16 +766,18 @@ export type LearningUnitObjectType = CoursePageInterface & { /** An enumeration. */ export type LearnpathLearningContentAssignmentAssignmentTypeChoices = - /** CASEWORK */ - | 'CASEWORK' /** CONDITION_ACCEPTANCE */ | 'CONDITION_ACCEPTANCE' /** EDONIQ_TEST */ | 'EDONIQ_TEST' + /** MANDATORY_CASEWORK */ + | 'MANDATORY_CASEWORK' /** PREP_ASSIGNMENT */ | 'PREP_ASSIGNMENT' /** REFLECTION */ - | 'REFLECTION'; + | 'REFLECTION' + /** VOLUNTARY_CASEWORK */ + | 'VOLUNTARY_CASEWORK'; export type Mutation = { __typename?: 'Mutation'; diff --git a/client/src/gql/schema.graphql b/client/src/gql/schema.graphql index d7f359b0..96df2a7d 100644 --- a/client/src/gql/schema.graphql +++ b/client/src/gql/schema.graphql @@ -456,7 +456,7 @@ type AssignmentObjectType implements CoursePageInterface { assignment_type: AssignmentAssignmentAssignmentTypeChoices! """ - Muss der Auftrag durch eine Expertin oder einen Experten beurteilt werden? + Muss der Auftrag durch eine/n Experten/in oder eine Lernbegleitung beurteilt werden? """ needs_expert_evaluation: Boolean! competence_certificate: CompetenceCertificateObjectType @@ -490,8 +490,11 @@ type AssignmentObjectType implements CoursePageInterface { """An enumeration.""" enum AssignmentAssignmentAssignmentTypeChoices { - """CASEWORK""" - CASEWORK + """VOLUNTARY_CASEWORK""" + VOLUNTARY_CASEWORK + + """MANDATORY_CASEWORK""" + MANDATORY_CASEWORK """PREP_ASSIGNMENT""" PREP_ASSIGNMENT @@ -604,8 +607,11 @@ scalar JSONString """An enumeration.""" enum LearnpathLearningContentAssignmentAssignmentTypeChoices { - """CASEWORK""" - CASEWORK + """VOLUNTARY_CASEWORK""" + VOLUNTARY_CASEWORK + + """MANDATORY_CASEWORK""" + MANDATORY_CASEWORK """PREP_ASSIGNMENT""" PREP_ASSIGNMENT diff --git a/client/src/pages/cockpit/cockpitPage/AssignmentSubmissionProgress.vue b/client/src/pages/cockpit/cockpitPage/AssignmentSubmissionProgress.vue index 241480c8..6e52aa4a 100644 --- a/client/src/pages/cockpit/cockpitPage/AssignmentSubmissionProgress.vue +++ b/client/src/pages/cockpit/cockpitPage/AssignmentSubmissionProgress.vue @@ -60,7 +60,7 @@ const totalCount = (status: StatusCount) => { const showEvaluationStatus = computed(() => { return ( - props.learningContent.content_assignment.assignment_type === "CASEWORK" || + props.learningContent.content_assignment.assignment_type === "MANDATORY_CASEWORK" || props.learningContent.content_assignment.assignment_type === "EDONIQ_TEST" ); }); diff --git a/client/src/pages/cockpit/cockpitPage/SubmissionsOverview.vue b/client/src/pages/cockpit/cockpitPage/SubmissionsOverview.vue index 93814ea4..59545d61 100644 --- a/client/src/pages/cockpit/cockpitPage/SubmissionsOverview.vue +++ b/client/src/pages/cockpit/cockpitPage/SubmissionsOverview.vue @@ -101,7 +101,7 @@ const getLearningContentType = (lc: LearningContent) => { const getShowDetailsText = (lc: LearningContent) => { if (isAssignment(lc)) { const assignmentType = (lc as LearningContentAssignment).assignment_type; - if (assignmentType === "CASEWORK" || assignmentType === "REFLECTION") { + if (assignmentType === "MANDATORY_CASEWORK" || assignmentType === "REFLECTION") { return t("a.Ergebnisse anschauen"); } else if ( assignmentType === "PREP_ASSIGNMENT" || @@ -131,7 +131,7 @@ const getIconName = (lc: LearningContent) => { const assignmentType = (lc as LearningContentAssignment).assignment_type; if ( assignmentType === "PREP_ASSIGNMENT" || - assignmentType === "CASEWORK" || + assignmentType === "MANDATORY_CASEWORK" || assignmentType === "CONDITION_ACCEPTANCE" ) { return "it-icon-assignment-large"; diff --git a/client/src/pages/learningPath/learningContentPage/assignment/AssignmentSubmissionView.vue b/client/src/pages/learningPath/learningContentPage/assignment/AssignmentSubmissionView.vue index b779ab9a..8142fa60 100644 --- a/client/src/pages/learningPath/learningContentPage/assignment/AssignmentSubmissionView.vue +++ b/client/src/pages/learningPath/learningContentPage/assignment/AssignmentSubmissionView.vue @@ -79,11 +79,13 @@ const completionTaskData = computed(() => { const canSubmit = computed(() => { return ( !state.confirmInput || - (props.assignment.assignment_type === "CASEWORK" && !state.confirmPerson) + (props.assignment.assignment_type === "MANDATORY_CASEWORK" && !state.confirmPerson) ); }); -const isCasework = computed(() => props.assignment.assignment_type === "CASEWORK"); +const isCasework = computed( + () => props.assignment.assignment_type === "MANDATORY_CASEWORK" +); const upsertAssignmentCompletionMutation = useMutation( UPSERT_ASSIGNMENT_COMPLETION_MUTATION diff --git a/client/src/types.ts b/client/src/types.ts index 86053292..9766e8db 100644 --- a/client/src/types.ts +++ b/client/src/types.ts @@ -374,7 +374,7 @@ export type ActionCompetence = Omit< }; export interface CompetenceCertificateAssignment extends BaseCourseWagtailPage { - assignment_type: "CASEWORK" | "EDONIQ_TEST"; + assignment_type: "MANDATORY_CASEWORK" | "EDONIQ_TEST"; max_points: number; learning_content: | (BaseCourseWagtailPage & { diff --git a/client/src/utils/utils.ts b/client/src/utils/utils.ts index 04fc8fba..d384340b 100644 --- a/client/src/utils/utils.ts +++ b/client/src/utils/utils.ts @@ -40,7 +40,7 @@ export function getAssignmentTypeTitle(assignmentType: AssignmentType): string { const { t } = useTranslation(); switch (assignmentType) { - case "CASEWORK": + case "MANDATORY_CASEWORK": return t("learningContentTypes.casework"); case "PREP_ASSIGNMENT": return t("learningContentTypes.prepAssignment"); diff --git a/server/vbv_lernwelt/assignment/models.py b/server/vbv_lernwelt/assignment/models.py index e0de99d1..194926a5 100644 --- a/server/vbv_lernwelt/assignment/models.py +++ b/server/vbv_lernwelt/assignment/models.py @@ -111,7 +111,8 @@ class EvaluationTaskBlock(blocks.StructBlock): class AssignmentType(Enum): - CASEWORK = "CASEWORK" # Geleitete Fallarbeit + VOLUNTARY_CASEWORK = "VOLUNTARY_CASEWORK" # Praxisauftrag + MANDATORY_CASEWORK = "MANDATORY_CASEWORK" # Geleitete Fallarbeit PREP_ASSIGNMENT = "PREP_ASSIGNMENT" # Vorbereitungsauftrag REFLECTION = "REFLECTION" # Reflexion CONDITION_ACCEPTANCE = "CONDITION_ACCEPTANCE" # Bedingungsannahme @@ -138,12 +139,12 @@ class Assignment(CourseBasePage): assignment_type = models.CharField( max_length=50, choices=[(tag.value, tag.value) for tag in AssignmentType], - default=AssignmentType.CASEWORK.value, + default=AssignmentType.MANDATORY_CASEWORK.value, ) needs_expert_evaluation = models.BooleanField( default=False, - help_text="Muss der Auftrag durch eine Expertin oder einen Experten beurteilt werden?", + help_text="Muss der Auftrag durch eine/n Experten/in oder eine Lernbegleitung beurteilt werden?", ) competence_certificate = models.ForeignKey( diff --git a/server/vbv_lernwelt/course_session/models.py b/server/vbv_lernwelt/course_session/models.py index 0f328bad..ee0b6b77 100644 --- a/server/vbv_lernwelt/course_session/models.py +++ b/server/vbv_lernwelt/course_session/models.py @@ -132,7 +132,7 @@ class CourseSessionAssignment(models.Model): ) assignment_type = self.learning_content.assignment_type assignment_type_translation_keys = { - AssignmentType.CASEWORK.value: "learningContentTypes.casework", + AssignmentType.MANDATORY_CASEWORK.value: "learningContentTypes.casework", AssignmentType.PREP_ASSIGNMENT.value: "learningContentTypes.prepAssignment", AssignmentType.REFLECTION.value: "learningContentTypes.reflection", } @@ -140,7 +140,7 @@ class CourseSessionAssignment(models.Model): url_expert = f"/course/{self.course_session.course.slug}/cockpit/assignment/{self.learning_content_id}?courseSessionId={self.course_session.id}" if assignment_type in ( - AssignmentType.CASEWORK.value, + AssignmentType.MANDATORY_CASEWORK.value, AssignmentType.PREP_ASSIGNMENT.value, ): if not self.submission_deadline_id: @@ -162,7 +162,7 @@ class CourseSessionAssignment(models.Model): self.submission_deadline.save() - if assignment_type == AssignmentType.CASEWORK.value: + if assignment_type == AssignmentType.MANDATORY_CASEWORK.value: if not self.evaluation_deadline_id: self.evaluation_deadline = DueDate.objects.create( course_session=self.course_session, diff --git a/server/vbv_lernwelt/dashboard/graphql/types/assignment.py b/server/vbv_lernwelt/dashboard/graphql/types/assignment.py index ebf37dd8..b25f3f32 100644 --- a/server/vbv_lernwelt/dashboard/graphql/types/assignment.py +++ b/server/vbv_lernwelt/dashboard/graphql/types/assignment.py @@ -152,7 +152,7 @@ def assignments( for csa in CourseSessionAssignment.objects.filter( course_session=course_session, learning_content__content_assignment__assignment_type__in=[ - AssignmentType.CASEWORK.value, + AssignmentType.MANDATORY_CASEWORK.value, ], learning_content__content_assignment__competence_certificate__isnull=False, ): diff --git a/server/vbv_lernwelt/dashboard/tests/graphql/test_assignment.py b/server/vbv_lernwelt/dashboard/tests/graphql/test_assignment.py index 35d6b764..1cbcb9a3 100644 --- a/server/vbv_lernwelt/dashboard/tests/graphql/test_assignment.py +++ b/server/vbv_lernwelt/dashboard/tests/graphql/test_assignment.py @@ -99,7 +99,7 @@ class AssignmentTestCase(GraphQLTestCase): def test_dashboard_contains_casework(self): self._test_assignment_type_dashboard_details( - assignment_type=AssignmentType.CASEWORK + assignment_type=AssignmentType.MANDATORY_CASEWORK ) def test_dashboard_contains_edoniq_tests(self): @@ -115,7 +115,7 @@ class AssignmentTestCase(GraphQLTestCase): """ irrelevant_types_for_dashboard = set(AssignmentType) - { - AssignmentType.CASEWORK, + AssignmentType.MANDATORY_CASEWORK, AssignmentType.EDONIQ_TEST, } @@ -196,7 +196,7 @@ class AssignmentTestCase(GraphQLTestCase): # GIVEN assignment_1, _ = mix_assignment_cocktail( deadline_at=datetime(1990, 4, 1), - assignment_type=AssignmentType.CASEWORK, + assignment_type=AssignmentType.MANDATORY_CASEWORK, course_session=self.course_session, circle=self.circle, add_competence_certificate=True, @@ -212,7 +212,7 @@ class AssignmentTestCase(GraphQLTestCase): assignment_3, _ = mix_assignment_cocktail( deadline_at=datetime(2010, 4, 1), - assignment_type=AssignmentType.CASEWORK, + assignment_type=AssignmentType.MANDATORY_CASEWORK, course_session=self.course_session, circle=self.circle, add_competence_certificate=True, diff --git a/server/vbv_lernwelt/dashboard/tests/graphql/test_dashboard.py b/server/vbv_lernwelt/dashboard/tests/graphql/test_dashboard.py index 5a8e0e40..00c4f0d7 100644 --- a/server/vbv_lernwelt/dashboard/tests/graphql/test_dashboard.py +++ b/server/vbv_lernwelt/dashboard/tests/graphql/test_dashboard.py @@ -50,7 +50,7 @@ class DashboardTestCase(GraphQLTestCase): create_assignment_completion( user=member, assignment=create_assignment( - course=course, assignment_type=AssignmentType.CASEWORK + course=course, assignment_type=AssignmentType.MANDATORY_CASEWORK ), course_session=cs_1, has_passed=True, @@ -61,7 +61,7 @@ class DashboardTestCase(GraphQLTestCase): create_assignment_completion( user=member, assignment=create_assignment( - course=course, assignment_type=AssignmentType.CASEWORK + course=course, assignment_type=AssignmentType.MANDATORY_CASEWORK ), course_session=cs_2, has_passed=False, diff --git a/server/vbv_lernwelt/importer/services.py b/server/vbv_lernwelt/importer/services.py index be64194a..8e96ac6e 100644 --- a/server/vbv_lernwelt/importer/services.py +++ b/server/vbv_lernwelt/importer/services.py @@ -459,7 +459,7 @@ def create_or_update_course_session_assignment( csa.submission_deadline.save() elif ( - csa.learning_content.assignment_type == AssignmentType.CASEWORK.value + csa.learning_content.assignment_type == AssignmentType.MANDATORY_CASEWORK.value and start ): csa.submission_deadline.start = timezone.make_aware( diff --git a/server/vbv_lernwelt/importer/tests/test_import_course_sessions.py b/server/vbv_lernwelt/importer/tests/test_import_course_sessions.py index c887ea4f..f425c206 100644 --- a/server/vbv_lernwelt/importer/tests/test_import_course_sessions.py +++ b/server/vbv_lernwelt/importer/tests/test_import_course_sessions.py @@ -99,7 +99,7 @@ class CreateOrUpdateCourseSessionTestCase(TestCase): self.assertEqual(4, DueDate.objects.count()) casework = CourseSessionAssignment.objects.filter( - learning_content__assignment_type=AssignmentType.CASEWORK.value + learning_content__assignment_type=AssignmentType.MANDATORY_CASEWORK.value ).first() self.assertEqual( casework.submission_deadline.start.isoformat(), "2023-07-06T11:30:00+00:00" @@ -183,7 +183,7 @@ class CreateOrUpdateCourseSessionTestCase(TestCase): self.assertEqual(4, DueDate.objects.count()) casework = CourseSessionAssignment.objects.filter( - learning_content__assignment_type=AssignmentType.CASEWORK.value + learning_content__assignment_type=AssignmentType.MANDATORY_CASEWORK.value ).first() self.assertEqual( casework.submission_deadline.start.isoformat(), "2023-07-06T12:30:00+00:00" diff --git a/server/vbv_lernwelt/learnpath/models.py b/server/vbv_lernwelt/learnpath/models.py index da56a8fc..3864bfc7 100644 --- a/server/vbv_lernwelt/learnpath/models.py +++ b/server/vbv_lernwelt/learnpath/models.py @@ -426,7 +426,7 @@ class LearningContentAssignment(LearningContent): assignment_type = models.CharField( max_length=50, choices=[(tag.name, tag.name) for tag in AssignmentType], - default=AssignmentType.CASEWORK.name, + default=AssignmentType.MANDATORY_CASEWORK.name, ) content_panels = [ diff --git a/server/vbv_lernwelt/notify/email/reminders/assigment.py b/server/vbv_lernwelt/notify/email/reminders/assigment.py index 50a030c3..7de3b98a 100644 --- a/server/vbv_lernwelt/notify/email/reminders/assigment.py +++ b/server/vbv_lernwelt/notify/email/reminders/assigment.py @@ -26,7 +26,7 @@ def send_assignment_reminder_notifications(): submission_deadline__start__lte=end, submission_deadline__start__gte=start, learning_content__assignment_type__in=[ - AssignmentType.CASEWORK.value, + AssignmentType.MANDATORY_CASEWORK.value, AssignmentType.PREP_ASSIGNMENT.value, ], ): @@ -60,7 +60,7 @@ def send_assignment_reminder_notifications(): evaluation_deadline__start__lte=end, evaluation_deadline__start__gte=start, learning_content__assignment_type__in=[ - AssignmentType.CASEWORK.value, + AssignmentType.MANDATORY_CASEWORK.value, ], ): for expert in CourseSessionUser.objects.filter( diff --git a/server/vbv_lernwelt/notify/services.py b/server/vbv_lernwelt/notify/services.py index bf792511..03f1d5e1 100644 --- a/server/vbv_lernwelt/notify/services.py +++ b/server/vbv_lernwelt/notify/services.py @@ -156,7 +156,7 @@ class NotificationService: } templates = { - AssignmentType.CASEWORK: EmailTemplate.ASSIGNMENT_REMINDER_CASEWORK_MEMBER, + AssignmentType.MANDATORY_CASEWORK: EmailTemplate.ASSIGNMENT_REMINDER_CASEWORK_MEMBER, AssignmentType.PREP_ASSIGNMENT: EmailTemplate.ASSIGNMENT_REMINDER_PREP_ASSIGNMENT_MEMBER, } diff --git a/server/vbv_lernwelt/notify/tests/test_assigment_reminders.py b/server/vbv_lernwelt/notify/tests/test_assigment_reminders.py index 020baf08..c31b0ead 100644 --- a/server/vbv_lernwelt/notify/tests/test_assigment_reminders.py +++ b/server/vbv_lernwelt/notify/tests/test_assigment_reminders.py @@ -35,12 +35,11 @@ RECIPIENT_STUDENTS = [ "test-student3@example.com", ] - ASSIGNMENT_TYPE_LEARNING_CONTENT_LOOKUP: Dict[AssignmentType, str] = { AssignmentType.CONDITION_ACCEPTANCE: "test-lehrgang-lp-circle-fahrzeug-lc-redlichkeitserklärung", AssignmentType.PREP_ASSIGNMENT: "test-lehrgang-lp-circle-fahrzeug-lc-fahrzeug-mein-erstes-auto", AssignmentType.REFLECTION: "test-lehrgang-lp-circle-fahrzeug-lc-reflexion", - AssignmentType.CASEWORK: "test-lehrgang-lp-circle-fahrzeug-lc-überprüfen-einer-motorfahrzeug-versicherungspolice", + AssignmentType.MANDATORY_CASEWORK: "test-lehrgang-lp-circle-fahrzeug-lc-überprüfen-einer-motorfahrzeug-versicherungspolice", } @@ -140,7 +139,7 @@ class TestAssignmentCourseRemindersTest(TestCase): action_object.learning_content.assignment_type ) - if assignment_type == AssignmentType.CASEWORK: + if assignment_type == AssignmentType.MANDATORY_CASEWORK: self.assertEquals( EmailTemplate.ASSIGNMENT_REMINDER_CASEWORK_MEMBER.name, email_template, @@ -190,7 +189,7 @@ class TestAssignmentCourseRemindersTest(TestCase): def test_notification_casework_for_members(self): # GIVEN casework = create_assignment( - assignment_type=AssignmentType.CASEWORK, + assignment_type=AssignmentType.MANDATORY_CASEWORK, # has a submission deadline within range -> member notification submission_deadline=timezone.make_aware(datetime(2023, 1, 2)), # but no evaluation deadline within range -> no expert notification @@ -199,14 +198,14 @@ class TestAssignmentCourseRemindersTest(TestCase): # ...too early create_assignment( - assignment_type=AssignmentType.CASEWORK, + assignment_type=AssignmentType.MANDATORY_CASEWORK, submission_deadline=timezone.make_aware(datetime(2023, 1, 4)), evaluation_deadline=timezone.make_aware(datetime(2023, 2, 2)), ) # ...too late create_assignment( - assignment_type=AssignmentType.CASEWORK, + assignment_type=AssignmentType.MANDATORY_CASEWORK, submission_deadline=timezone.make_aware(datetime(2022, 1, 1)), evaluation_deadline=timezone.make_aware(datetime(2022, 2, 2)), ) @@ -228,7 +227,7 @@ class TestAssignmentCourseRemindersTest(TestCase): def test_notification_casework_for_experts(self): # GIVEN casework = create_assignment( - assignment_type=AssignmentType.CASEWORK, + assignment_type=AssignmentType.MANDATORY_CASEWORK, submission_deadline=timezone.make_aware(datetime(2022, 12, 12)), evaluation_deadline=timezone.make_aware(datetime(2023, 1, 2)), )