Merged in feature/VBV-698-optional-flag (pull request #364)

Feature/VBV-698 optional flag
This commit is contained in:
Christian Cueni 2024-07-30 05:28:20 +00:00
commit a024a2f244
23 changed files with 253 additions and 65 deletions

View File

@ -1,18 +1,30 @@
<script setup lang="ts"> <script setup lang="ts">
import ItRow from "@/components/ui/ItRow.vue"; import ItRow from "@/components/ui/ItRow.vue";
defineProps<{ export interface Props {
avatarUrl: string; avatarUrl: string;
name: string; name: string;
}>(); extraInfo?: string;
}
const props = withDefaults(defineProps<Props>(), {
extraInfo: "",
});
</script> </script>
<template> <template>
<ItRow> <ItRow>
<template #firstRow> <template #firstRow>
<slot name="leading"></slot> <slot name="leading"></slot>
<img class="mr-2 h-11 w-11 rounded-full" :src="avatarUrl" /> <img class="mr-2 h-11 w-11 rounded-full" :src="props.avatarUrl" />
<p class="text-bold lg:leading-[45px]">{{ name }}</p> <div :class="props.extraInfo ? 'leading-5' : ''">
<p class="text-bold" :class="props.extraInfo ? '' : 'lg:leading-[45px]'">
{{ props.name }}
</p>
<p v-if="props.extraInfo" class="font-normal" data-cy="extra-info">
{{ props.extraInfo }}
</p>
</div>
</template> </template>
<template #center> <template #center>
<slot name="center"></slot> <slot name="center"></slot>

View File

@ -20,7 +20,7 @@ const documents = {
"\n query assignmentCompletionQuery(\n $assignmentId: ID!\n $courseSessionId: ID!\n $learningContentId: ID\n $assignmentUserId: UUID\n ) {\n assignment(id: $assignmentId) {\n assignment_type\n needs_expert_evaluation\n max_points\n content_type\n effort_required\n evaluation_description\n evaluation_document_url\n evaluation_tasks\n id\n intro_text\n performance_objectives\n slug\n tasks\n title\n translation_key\n solution_sample {\n id\n url\n }\n competence_certificate {\n ...CoursePageFields\n }\n }\n assignment_completion(\n assignment_id: $assignmentId\n course_session_id: $courseSessionId\n assignment_user_id: $assignmentUserId\n learning_content_page_id: $learningContentId\n ) {\n id\n completion_status\n submitted_at\n evaluation_submitted_at\n evaluation_user {\n id\n first_name\n last_name\n }\n assignment_user {\n avatar_url\n first_name\n last_name\n id\n }\n evaluation_points\n evaluation_max_points\n evaluation_points_deducted\n evaluation_points_deducted_reason\n evaluation_points_final\n\n evaluation_passed\n edoniq_extended_time_flag\n completion_data\n task_completion_data\n }\n }\n": types.AssignmentCompletionQueryDocument, "\n query assignmentCompletionQuery(\n $assignmentId: ID!\n $courseSessionId: ID!\n $learningContentId: ID\n $assignmentUserId: UUID\n ) {\n assignment(id: $assignmentId) {\n assignment_type\n needs_expert_evaluation\n max_points\n content_type\n effort_required\n evaluation_description\n evaluation_document_url\n evaluation_tasks\n id\n intro_text\n performance_objectives\n slug\n tasks\n title\n translation_key\n solution_sample {\n id\n url\n }\n competence_certificate {\n ...CoursePageFields\n }\n }\n assignment_completion(\n assignment_id: $assignmentId\n course_session_id: $courseSessionId\n assignment_user_id: $assignmentUserId\n learning_content_page_id: $learningContentId\n ) {\n id\n completion_status\n submitted_at\n evaluation_submitted_at\n evaluation_user {\n id\n first_name\n last_name\n }\n assignment_user {\n avatar_url\n first_name\n last_name\n id\n }\n evaluation_points\n evaluation_max_points\n evaluation_points_deducted\n evaluation_points_deducted_reason\n evaluation_points_final\n\n evaluation_passed\n edoniq_extended_time_flag\n completion_data\n task_completion_data\n }\n }\n": types.AssignmentCompletionQueryDocument,
"\n query competenceCertificateQuery($courseSlug: String!, $courseSessionId: ID!) {\n competence_certificate_list(course_slug: $courseSlug) {\n ...CoursePageFields\n competence_certificates {\n ...CoursePageFields\n assignments {\n ...CoursePageFields\n assignment_type\n max_points\n competence_certificate_weight\n completion(course_session_id: $courseSessionId) {\n id\n completion_status\n submitted_at\n evaluation_points\n evaluation_points_deducted\n evaluation_points_final\n evaluation_max_points\n evaluation_passed\n }\n learning_content {\n ...CoursePageFields\n circle {\n id\n title\n slug\n }\n }\n }\n }\n }\n }\n": types.CompetenceCertificateQueryDocument, "\n query competenceCertificateQuery($courseSlug: String!, $courseSessionId: ID!) {\n competence_certificate_list(course_slug: $courseSlug) {\n ...CoursePageFields\n competence_certificates {\n ...CoursePageFields\n assignments {\n ...CoursePageFields\n assignment_type\n max_points\n competence_certificate_weight\n completion(course_session_id: $courseSessionId) {\n id\n completion_status\n submitted_at\n evaluation_points\n evaluation_points_deducted\n evaluation_points_final\n evaluation_max_points\n evaluation_passed\n }\n learning_content {\n ...CoursePageFields\n circle {\n id\n title\n slug\n }\n }\n }\n }\n }\n }\n": types.CompetenceCertificateQueryDocument,
"\n query competenceCertificateForUserQuery(\n $courseSlug: String!\n $courseSessionId: ID!\n $userId: UUID!\n ) {\n competence_certificate_list_for_user(course_slug: $courseSlug, user_id: $userId) {\n ...CoursePageFields\n competence_certificates {\n ...CoursePageFields\n assignments {\n ...CoursePageFields\n assignment_type\n max_points\n competence_certificate_weight\n completion(course_session_id: $courseSessionId) {\n id\n completion_status\n submitted_at\n evaluation_points\n evaluation_points_final\n evaluation_points_deducted\n evaluation_max_points\n evaluation_passed\n }\n learning_content {\n ...CoursePageFields\n circle {\n id\n title\n slug\n }\n }\n }\n }\n }\n }\n": types.CompetenceCertificateForUserQueryDocument, "\n query competenceCertificateForUserQuery(\n $courseSlug: String!\n $courseSessionId: ID!\n $userId: UUID!\n ) {\n competence_certificate_list_for_user(course_slug: $courseSlug, user_id: $userId) {\n ...CoursePageFields\n competence_certificates {\n ...CoursePageFields\n assignments {\n ...CoursePageFields\n assignment_type\n max_points\n competence_certificate_weight\n completion(course_session_id: $courseSessionId) {\n id\n completion_status\n submitted_at\n evaluation_points\n evaluation_points_final\n evaluation_points_deducted\n evaluation_max_points\n evaluation_passed\n }\n learning_content {\n ...CoursePageFields\n circle {\n id\n title\n slug\n }\n }\n }\n }\n }\n }\n": types.CompetenceCertificateForUserQueryDocument,
"\n query courseSessionDetail($courseSessionId: ID!) {\n course_session(id: $courseSessionId) {\n id\n title\n course {\n id\n title\n slug\n configuration {\n id\n enable_circle_documents\n enable_learning_mentor\n enable_competence_certificates\n }\n }\n users {\n id\n user_id\n first_name\n last_name\n email\n avatar_url\n role\n circles {\n id\n title\n slug\n }\n }\n attendance_courses {\n id\n location\n trainer\n due_date {\n id\n start\n end\n }\n learning_content_id\n learning_content {\n id\n title\n circle {\n id\n title\n slug\n }\n }\n }\n assignments {\n id\n submission_deadline {\n id\n start\n }\n evaluation_deadline {\n id\n start\n }\n learning_content {\n id\n title\n content_assignment {\n id\n title\n assignment_type\n }\n }\n }\n edoniq_tests {\n id\n deadline {\n id\n start\n end\n }\n learning_content {\n id\n title\n content_assignment {\n id\n title\n assignment_type\n }\n }\n }\n }\n }\n": types.CourseSessionDetailDocument, "\n query courseSessionDetail($courseSessionId: ID!) {\n course_session(id: $courseSessionId) {\n id\n title\n course {\n id\n title\n slug\n configuration {\n id\n enable_circle_documents\n enable_learning_mentor\n enable_competence_certificates\n }\n }\n users {\n id\n user_id\n first_name\n last_name\n email\n avatar_url\n role\n circles {\n id\n title\n slug\n }\n optional_attendance\n }\n attendance_courses {\n id\n location\n trainer\n due_date {\n id\n start\n end\n }\n learning_content_id\n learning_content {\n id\n title\n circle {\n id\n title\n slug\n }\n }\n }\n assignments {\n id\n submission_deadline {\n id\n start\n }\n evaluation_deadline {\n id\n start\n }\n learning_content {\n id\n title\n content_assignment {\n id\n title\n assignment_type\n }\n }\n }\n edoniq_tests {\n id\n deadline {\n id\n start\n end\n }\n learning_content {\n id\n title\n content_assignment {\n id\n title\n assignment_type\n }\n }\n }\n }\n }\n": types.CourseSessionDetailDocument,
"\n query courseQuery($slug: String!) {\n course(slug: $slug) {\n id\n title\n slug\n category_name\n configuration {\n id\n enable_circle_documents\n enable_learning_mentor\n enable_competence_certificates\n is_uk\n }\n action_competences {\n competence_id\n ...CoursePageFields\n performance_criteria {\n competence_id\n learning_unit {\n id\n slug\n evaluate_url\n }\n ...CoursePageFields\n }\n }\n learning_path {\n ...CoursePageFields\n topics {\n is_visible\n ...CoursePageFields\n circles {\n description\n goals\n ...CoursePageFields\n learning_sequences {\n icon\n ...CoursePageFields\n learning_units {\n evaluate_url\n ...CoursePageFields\n performance_criteria {\n ...CoursePageFields\n }\n learning_contents {\n can_user_self_toggle_course_completion\n content_url\n minutes\n description\n ...CoursePageFields\n ... on LearningContentAssignmentObjectType {\n assignment_type\n content_assignment {\n id\n assignment_type\n }\n competence_certificate {\n ...CoursePageFields\n }\n }\n ... on LearningContentEdoniqTestObjectType {\n checkbox_text\n has_extended_time_test\n content_assignment {\n id\n assignment_type\n }\n competence_certificate {\n ...CoursePageFields\n }\n }\n ... on LearningContentRichTextObjectType {\n text\n }\n }\n }\n }\n }\n }\n }\n }\n }\n": types.CourseQueryDocument, "\n query courseQuery($slug: String!) {\n course(slug: $slug) {\n id\n title\n slug\n category_name\n configuration {\n id\n enable_circle_documents\n enable_learning_mentor\n enable_competence_certificates\n is_uk\n }\n action_competences {\n competence_id\n ...CoursePageFields\n performance_criteria {\n competence_id\n learning_unit {\n id\n slug\n evaluate_url\n }\n ...CoursePageFields\n }\n }\n learning_path {\n ...CoursePageFields\n topics {\n is_visible\n ...CoursePageFields\n circles {\n description\n goals\n ...CoursePageFields\n learning_sequences {\n icon\n ...CoursePageFields\n learning_units {\n evaluate_url\n ...CoursePageFields\n performance_criteria {\n ...CoursePageFields\n }\n learning_contents {\n can_user_self_toggle_course_completion\n content_url\n minutes\n description\n ...CoursePageFields\n ... on LearningContentAssignmentObjectType {\n assignment_type\n content_assignment {\n id\n assignment_type\n }\n competence_certificate {\n ...CoursePageFields\n }\n }\n ... on LearningContentEdoniqTestObjectType {\n checkbox_text\n has_extended_time_test\n content_assignment {\n id\n assignment_type\n }\n competence_certificate {\n ...CoursePageFields\n }\n }\n ... on LearningContentRichTextObjectType {\n text\n }\n }\n }\n }\n }\n }\n }\n }\n }\n": types.CourseQueryDocument,
"\n query dashboardConfig {\n dashboard_config {\n id\n slug\n name\n dashboard_type\n course_configuration {\n id\n enable_circle_documents\n enable_learning_mentor\n enable_competence_certificates\n is_uk\n }\n }\n }\n": types.DashboardConfigDocument, "\n query dashboardConfig {\n dashboard_config {\n id\n slug\n name\n dashboard_type\n course_configuration {\n id\n enable_circle_documents\n enable_learning_mentor\n enable_competence_certificates\n is_uk\n }\n }\n }\n": types.DashboardConfigDocument,
"\n query dashboardProgress($courseId: ID!) {\n course_progress(course_id: $courseId) {\n _id\n course_id\n session_to_continue_id\n competence {\n _id\n total_count\n success_count\n fail_count\n }\n assignment {\n _id\n total_count\n points_max_count\n points_achieved_count\n }\n }\n }\n": types.DashboardProgressDocument, "\n query dashboardProgress($courseId: ID!) {\n course_progress(course_id: $courseId) {\n _id\n course_id\n session_to_continue_id\n competence {\n _id\n total_count\n success_count\n fail_count\n }\n assignment {\n _id\n total_count\n points_max_count\n points_achieved_count\n }\n }\n }\n": types.DashboardProgressDocument,
@ -75,7 +75,7 @@ export function graphql(source: "\n query competenceCertificateForUserQuery(\n
/** /**
* The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients. * The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.
*/ */
export function graphql(source: "\n query courseSessionDetail($courseSessionId: ID!) {\n course_session(id: $courseSessionId) {\n id\n title\n course {\n id\n title\n slug\n configuration {\n id\n enable_circle_documents\n enable_learning_mentor\n enable_competence_certificates\n }\n }\n users {\n id\n user_id\n first_name\n last_name\n email\n avatar_url\n role\n circles {\n id\n title\n slug\n }\n }\n attendance_courses {\n id\n location\n trainer\n due_date {\n id\n start\n end\n }\n learning_content_id\n learning_content {\n id\n title\n circle {\n id\n title\n slug\n }\n }\n }\n assignments {\n id\n submission_deadline {\n id\n start\n }\n evaluation_deadline {\n id\n start\n }\n learning_content {\n id\n title\n content_assignment {\n id\n title\n assignment_type\n }\n }\n }\n edoniq_tests {\n id\n deadline {\n id\n start\n end\n }\n learning_content {\n id\n title\n content_assignment {\n id\n title\n assignment_type\n }\n }\n }\n }\n }\n"): (typeof documents)["\n query courseSessionDetail($courseSessionId: ID!) {\n course_session(id: $courseSessionId) {\n id\n title\n course {\n id\n title\n slug\n configuration {\n id\n enable_circle_documents\n enable_learning_mentor\n enable_competence_certificates\n }\n }\n users {\n id\n user_id\n first_name\n last_name\n email\n avatar_url\n role\n circles {\n id\n title\n slug\n }\n }\n attendance_courses {\n id\n location\n trainer\n due_date {\n id\n start\n end\n }\n learning_content_id\n learning_content {\n id\n title\n circle {\n id\n title\n slug\n }\n }\n }\n assignments {\n id\n submission_deadline {\n id\n start\n }\n evaluation_deadline {\n id\n start\n }\n learning_content {\n id\n title\n content_assignment {\n id\n title\n assignment_type\n }\n }\n }\n edoniq_tests {\n id\n deadline {\n id\n start\n end\n }\n learning_content {\n id\n title\n content_assignment {\n id\n title\n assignment_type\n }\n }\n }\n }\n }\n"]; export function graphql(source: "\n query courseSessionDetail($courseSessionId: ID!) {\n course_session(id: $courseSessionId) {\n id\n title\n course {\n id\n title\n slug\n configuration {\n id\n enable_circle_documents\n enable_learning_mentor\n enable_competence_certificates\n }\n }\n users {\n id\n user_id\n first_name\n last_name\n email\n avatar_url\n role\n circles {\n id\n title\n slug\n }\n optional_attendance\n }\n attendance_courses {\n id\n location\n trainer\n due_date {\n id\n start\n end\n }\n learning_content_id\n learning_content {\n id\n title\n circle {\n id\n title\n slug\n }\n }\n }\n assignments {\n id\n submission_deadline {\n id\n start\n }\n evaluation_deadline {\n id\n start\n }\n learning_content {\n id\n title\n content_assignment {\n id\n title\n assignment_type\n }\n }\n }\n edoniq_tests {\n id\n deadline {\n id\n start\n end\n }\n learning_content {\n id\n title\n content_assignment {\n id\n title\n assignment_type\n }\n }\n }\n }\n }\n"): (typeof documents)["\n query courseSessionDetail($courseSessionId: ID!) {\n course_session(id: $courseSessionId) {\n id\n title\n course {\n id\n title\n slug\n configuration {\n id\n enable_circle_documents\n enable_learning_mentor\n enable_competence_certificates\n }\n }\n users {\n id\n user_id\n first_name\n last_name\n email\n avatar_url\n role\n circles {\n id\n title\n slug\n }\n optional_attendance\n }\n attendance_courses {\n id\n location\n trainer\n due_date {\n id\n start\n end\n }\n learning_content_id\n learning_content {\n id\n title\n circle {\n id\n title\n slug\n }\n }\n }\n assignments {\n id\n submission_deadline {\n id\n start\n }\n evaluation_deadline {\n id\n start\n }\n learning_content {\n id\n title\n content_assignment {\n id\n title\n assignment_type\n }\n }\n }\n edoniq_tests {\n id\n deadline {\n id\n start\n end\n }\n learning_content {\n id\n title\n content_assignment {\n id\n title\n assignment_type\n }\n }\n }\n }\n }\n"];
/** /**
* The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients. * The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.
*/ */

File diff suppressed because one or more lines are too long

View File

@ -713,6 +713,7 @@ type CourseSessionUserObjectsType {
avatar_url: String! avatar_url: String!
role: String! role: String!
circles: [CourseSessionUserExpertCircleType!]! circles: [CourseSessionUserExpertCircleType!]!
optional_attendance: Boolean
} }
type CourseSessionUserExpertCircleType { type CourseSessionUserExpertCircleType {

View File

@ -192,6 +192,7 @@ export const COURSE_SESSION_DETAIL_QUERY = graphql(`
title title
slug slug
} }
optional_attendance
} }
attendance_courses { attendance_courses {
id id

View File

@ -224,6 +224,9 @@ watch(
:name="`${csu.first_name} ${csu.last_name}`" :name="`${csu.first_name} ${csu.last_name}`"
:avatar-url="csu.avatar_url" :avatar-url="csu.avatar_url"
:class="0 === index ? 'border-none' : ''" :class="0 === index ? 'border-none' : ''"
:extra-info="
csu.optional_attendance ? `${$t('a.Optionale Anwesenheit')}` : ''
"
> >
<template #leading> <template #leading>
<ItCheckbox <ItCheckbox

View File

@ -53,7 +53,17 @@ onMounted(() => {
<div class="flex flex-col"> <div class="flex flex-col">
<h2 class="mb-2">{{ user.first_name }} {{ user.last_name }}</h2> <h2 class="mb-2">{{ user.first_name }} {{ user.last_name }}</h2>
<p class="mb-2">{{ user.email }}</p> <p class="mb-2">{{ user.email }}</p>
<p class="text-gray-800">{{ $t("a.Teilnehmer") }}</p> <p class="text-gray-800">
{{ $t("a.Teilnehmer") }}
<span
v-if="
user.optional_attendance.some((id: string) => id === courseSession.id)
"
data-cy="optional-attendance"
>
{{ $t("a.Optionale Anwesenheit") }}
</span>
</p>
</div> </div>
</div> </div>
</div> </div>

View File

@ -0,0 +1,11 @@
import { login } from "../helpers";
describe("cockpitAttendaceCheck.cy.js", () => {
it("will display optional participants", () => {
cy.manageCommand("cypress_reset --set-optional-attendance-flag");
login("test-trainer1@example.com", "test");
cy.visit("/course/test-lehrgang/cockpit/attendance");
cy.get('[data-cy="extra-info"]').should("contain", "Optionale Anwesenheit");
});
});

View File

@ -0,0 +1,17 @@
import { login } from "../helpers";
import { TEST_STUDENT1_USER_ID } from "../../consts";
describe("publicProfileAttendance.cy.js", () => {
it("will display optional attendance", () => {
cy.manageCommand("cypress_reset --set-optional-attendance-flag");
login("test-trainer1@example.com", "test");
cy.visit(
`course/test-lehrgang/profile/${TEST_STUDENT1_USER_ID}/learning-path`,
);
cy.get('[data-cy="optional-attendance"]').should(
"contain",
"Optionale Anwesenheit",
);
});
});

View File

@ -8,7 +8,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: PACKAGE VERSION\n" "Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2024-06-18 15:24+0200\n" "POT-Creation-Date: 2024-07-27 20:59+0200\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n" "Language-Team: LANGUAGE <LL@li.org>\n"
@ -38,32 +38,32 @@ msgstr ""
msgid "Nicht bestanden" msgid "Nicht bestanden"
msgstr "" msgstr ""
#: vbv_lernwelt/assignment/export.py:203 vbv_lernwelt/assignment/export.py:206 #: vbv_lernwelt/assignment/export.py:204 vbv_lernwelt/assignment/export.py:208
#: vbv_lernwelt/assignment/export.py:207 #: vbv_lernwelt/assignment/export.py:209
msgid "Keine Daten" msgid "Keine Daten"
msgstr "" msgstr ""
#: vbv_lernwelt/core/admin.py:32 #: vbv_lernwelt/core/admin.py:38 vbv_lernwelt/sso/admin.py:83
msgid "Personal info" msgid "Personal info"
msgstr "" msgstr ""
#: vbv_lernwelt/core/admin.py:34 #: vbv_lernwelt/core/admin.py:40
msgid "Permissions" msgid "Permissions"
msgstr "" msgstr ""
#: vbv_lernwelt/core/admin.py:45 #: vbv_lernwelt/core/admin.py:51
msgid "Important dates" msgid "Important dates"
msgstr "" msgstr ""
#: vbv_lernwelt/core/admin.py:47 #: vbv_lernwelt/core/admin.py:53
msgid "Profile" msgid "Profile"
msgstr "" msgstr ""
#: vbv_lernwelt/core/admin.py:62 #: vbv_lernwelt/core/admin.py:70
msgid "Organisation" msgid "Organisation"
msgstr "" msgstr ""
#: vbv_lernwelt/core/admin.py:75 #: vbv_lernwelt/core/admin.py:83 vbv_lernwelt/sso/admin.py:86
msgid "Additional data" msgid "Additional data"
msgstr "" msgstr ""
@ -87,31 +87,31 @@ msgstr ""
msgid "Lehrgang-Seite" msgid "Lehrgang-Seite"
msgstr "" msgstr ""
#: vbv_lernwelt/course/models.py:272 #: vbv_lernwelt/course/models.py:278
msgid "Teilnehmer" msgid "Teilnehmer"
msgstr "" msgstr ""
#: vbv_lernwelt/course/models.py:273 #: vbv_lernwelt/course/models.py:279
msgid "Experte/Trainer" msgid "Experte/Trainer"
msgstr "" msgstr ""
#: vbv_lernwelt/course/models.py:332 #: vbv_lernwelt/course/models.py:339
msgid "Dokumente im Circle ein/aus" msgid "Dokumente im Circle ein/aus"
msgstr "" msgstr ""
#: vbv_lernwelt/course/models.py:336 #: vbv_lernwelt/course/models.py:343
msgid "Lernmentor-Funktion ein/aus" msgid "Lernmentor-Funktion ein/aus"
msgstr "" msgstr ""
#: vbv_lernwelt/course/models.py:340 #: vbv_lernwelt/course/models.py:347
msgid "Kompetenzweise ein/aus" msgid "Kompetenzweise ein/aus"
msgstr "" msgstr ""
#: vbv_lernwelt/course/models.py:343 #: vbv_lernwelt/course/models.py:350
msgid "Versicherungsvermittler-Lehrgang" msgid "Versicherungsvermittler-Lehrgang"
msgstr "" msgstr ""
#: vbv_lernwelt/course/models.py:344 #: vbv_lernwelt/course/models.py:351
msgid "ÜK-Lehrgang" msgid "ÜK-Lehrgang"
msgstr "" msgstr ""
@ -119,31 +119,43 @@ msgstr ""
msgid "export_anwesenheit" msgid "export_anwesenheit"
msgstr "" msgstr ""
#: vbv_lernwelt/course_session/services/export_attendance.py:92 #: vbv_lernwelt/course_session/services/export_attendance.py:86
msgid "Optionale Anwesenheit"
msgstr ""
#: vbv_lernwelt/course_session/services/export_attendance.py:96
msgid "Anwesenheit" msgid "Anwesenheit"
msgstr "" msgstr ""
#: vbv_lernwelt/course_session/services/export_attendance.py:116 #: vbv_lernwelt/course_session/services/export_attendance.py:119
msgid "Ja"
msgstr ""
#: vbv_lernwelt/course_session/services/export_attendance.py:119
msgid "Nein"
msgstr ""
#: vbv_lernwelt/course_session/services/export_attendance.py:128
msgid "Anwesend" msgid "Anwesend"
msgstr "" msgstr ""
#: vbv_lernwelt/course_session/services/export_attendance.py:116 #: vbv_lernwelt/course_session/services/export_attendance.py:128
msgid "Nicht anwesend" msgid "Nicht anwesend"
msgstr "" msgstr ""
#: vbv_lernwelt/course_session/services/export_attendance.py:123 #: vbv_lernwelt/course_session/services/export_attendance.py:135
msgid "Vorname" msgid "Vorname"
msgstr "" msgstr ""
#: vbv_lernwelt/course_session/services/export_attendance.py:124 #: vbv_lernwelt/course_session/services/export_attendance.py:136
msgid "Nachname" msgid "Nachname"
msgstr "" msgstr ""
#: vbv_lernwelt/course_session/services/export_attendance.py:125 #: vbv_lernwelt/course_session/services/export_attendance.py:137
msgid "Email" msgid "Email"
msgstr "Email" msgstr "Email"
#: vbv_lernwelt/course_session/services/export_attendance.py:126 #: vbv_lernwelt/course_session/services/export_attendance.py:138
msgid "Lehrvertragsnummer" msgid "Lehrvertragsnummer"
msgstr "" msgstr ""

View File

@ -8,7 +8,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: PACKAGE VERSION\n" "Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2024-07-12 09:37+0200\n" "POT-Creation-Date: 2024-07-27 20:59+0200\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n" "Language-Team: LANGUAGE <LL@li.org>\n"
@ -95,23 +95,23 @@ msgstr ""
msgid "Experte/Trainer" msgid "Experte/Trainer"
msgstr "" msgstr ""
#: vbv_lernwelt/course/models.py:338 #: vbv_lernwelt/course/models.py:339
msgid "Dokumente im Circle ein/aus" msgid "Dokumente im Circle ein/aus"
msgstr "" msgstr ""
#: vbv_lernwelt/course/models.py:342 #: vbv_lernwelt/course/models.py:343
msgid "Lernmentor-Funktion ein/aus" msgid "Lernmentor-Funktion ein/aus"
msgstr "" msgstr ""
#: vbv_lernwelt/course/models.py:346 #: vbv_lernwelt/course/models.py:347
msgid "Kompetenzweise ein/aus" msgid "Kompetenzweise ein/aus"
msgstr "" msgstr ""
#: vbv_lernwelt/course/models.py:349 #: vbv_lernwelt/course/models.py:350
msgid "Versicherungsvermittler-Lehrgang" msgid "Versicherungsvermittler-Lehrgang"
msgstr "" msgstr ""
#: vbv_lernwelt/course/models.py:350 #: vbv_lernwelt/course/models.py:351
msgid "ÜK-Lehrgang" msgid "ÜK-Lehrgang"
msgstr "" msgstr ""
@ -119,31 +119,44 @@ msgstr ""
msgid "export_anwesenheit" msgid "export_anwesenheit"
msgstr "export_presence" msgstr "export_presence"
#: vbv_lernwelt/course_session/services/export_attendance.py:92 #: vbv_lernwelt/course_session/services/export_attendance.py:86
#| msgid "Anwesenheit"
msgid "Optionale Anwesenheit"
msgstr "Présence facultative"
#: vbv_lernwelt/course_session/services/export_attendance.py:96
msgid "Anwesenheit" msgid "Anwesenheit"
msgstr "Présence" msgstr "Présence"
#: vbv_lernwelt/course_session/services/export_attendance.py:117 #: vbv_lernwelt/course_session/services/export_attendance.py:119
msgid "Ja"
msgstr "Oui"
#: vbv_lernwelt/course_session/services/export_attendance.py:119
msgid "Nein"
msgstr "Non"
#: vbv_lernwelt/course_session/services/export_attendance.py:128
msgid "Anwesend" msgid "Anwesend"
msgstr "Présent" msgstr "Présent"
#: vbv_lernwelt/course_session/services/export_attendance.py:117 #: vbv_lernwelt/course_session/services/export_attendance.py:128
msgid "Nicht anwesend" msgid "Nicht anwesend"
msgstr "Pas présent" msgstr "Pas présent"
#: vbv_lernwelt/course_session/services/export_attendance.py:124 #: vbv_lernwelt/course_session/services/export_attendance.py:135
msgid "Vorname" msgid "Vorname"
msgstr "Prénom" msgstr "Prénom"
#: vbv_lernwelt/course_session/services/export_attendance.py:125 #: vbv_lernwelt/course_session/services/export_attendance.py:136
msgid "Nachname" msgid "Nachname"
msgstr "Nom de famille" msgstr "Nom de famille"
#: vbv_lernwelt/course_session/services/export_attendance.py:126 #: vbv_lernwelt/course_session/services/export_attendance.py:137
msgid "Email" msgid "Email"
msgstr "E-mail" msgstr "E-mail"
#: vbv_lernwelt/course_session/services/export_attendance.py:127 #: vbv_lernwelt/course_session/services/export_attendance.py:138
msgid "Lehrvertragsnummer" msgid "Lehrvertragsnummer"
msgstr "Numéro de contrat d'apprentissage" msgstr "Numéro de contrat d'apprentissage"

View File

@ -8,7 +8,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: PACKAGE VERSION\n" "Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2024-07-12 09:36+0200\n" "POT-Creation-Date: 2024-07-27 20:59+0200\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n" "Language-Team: LANGUAGE <LL@li.org>\n"
@ -95,23 +95,23 @@ msgstr ""
msgid "Experte/Trainer" msgid "Experte/Trainer"
msgstr "" msgstr ""
#: vbv_lernwelt/course/models.py:338 #: vbv_lernwelt/course/models.py:339
msgid "Dokumente im Circle ein/aus" msgid "Dokumente im Circle ein/aus"
msgstr "" msgstr ""
#: vbv_lernwelt/course/models.py:342 #: vbv_lernwelt/course/models.py:343
msgid "Lernmentor-Funktion ein/aus" msgid "Lernmentor-Funktion ein/aus"
msgstr "" msgstr ""
#: vbv_lernwelt/course/models.py:346 #: vbv_lernwelt/course/models.py:347
msgid "Kompetenzweise ein/aus" msgid "Kompetenzweise ein/aus"
msgstr "" msgstr ""
#: vbv_lernwelt/course/models.py:349 #: vbv_lernwelt/course/models.py:350
msgid "Versicherungsvermittler-Lehrgang" msgid "Versicherungsvermittler-Lehrgang"
msgstr "" msgstr ""
#: vbv_lernwelt/course/models.py:350 #: vbv_lernwelt/course/models.py:351
msgid "ÜK-Lehrgang" msgid "ÜK-Lehrgang"
msgstr "" msgstr ""
@ -119,31 +119,44 @@ msgstr ""
msgid "export_anwesenheit" msgid "export_anwesenheit"
msgstr "esportazione_presenza" msgstr "esportazione_presenza"
#: vbv_lernwelt/course_session/services/export_attendance.py:92 #: vbv_lernwelt/course_session/services/export_attendance.py:86
#| msgid "Anwesenheit"
msgid "Optionale Anwesenheit"
msgstr "Presenza opzionale"
#: vbv_lernwelt/course_session/services/export_attendance.py:96
msgid "Anwesenheit" msgid "Anwesenheit"
msgstr "Presenza" msgstr "Presenza"
#: vbv_lernwelt/course_session/services/export_attendance.py:117 #: vbv_lernwelt/course_session/services/export_attendance.py:119
msgid "Ja"
msgstr "Sì"
#: vbv_lernwelt/course_session/services/export_attendance.py:119
msgid "Nein"
msgstr "No"
#: vbv_lernwelt/course_session/services/export_attendance.py:128
msgid "Anwesend" msgid "Anwesend"
msgstr "Presente" msgstr "Presente"
#: vbv_lernwelt/course_session/services/export_attendance.py:117 #: vbv_lernwelt/course_session/services/export_attendance.py:128
msgid "Nicht anwesend" msgid "Nicht anwesend"
msgstr "Non presente" msgstr "Non presente"
#: vbv_lernwelt/course_session/services/export_attendance.py:124 #: vbv_lernwelt/course_session/services/export_attendance.py:135
msgid "Vorname" msgid "Vorname"
msgstr "Nome" msgstr "Nome"
#: vbv_lernwelt/course_session/services/export_attendance.py:125 #: vbv_lernwelt/course_session/services/export_attendance.py:136
msgid "Nachname" msgid "Nachname"
msgstr "Cognome" msgstr "Cognome"
#: vbv_lernwelt/course_session/services/export_attendance.py:126 #: vbv_lernwelt/course_session/services/export_attendance.py:137
msgid "Email" msgid "Email"
msgstr "Email" msgstr "Email"
#: vbv_lernwelt/course_session/services/export_attendance.py:127 #: vbv_lernwelt/course_session/services/export_attendance.py:138
msgid "Lehrvertragsnummer" msgid "Lehrvertragsnummer"
msgstr "Numero di contratto di tirocinio" msgstr "Numero di contratto di tirocinio"

View File

@ -71,5 +71,6 @@ class ProfileViewTest(APITestCase):
"organisation_postal_code": "", "organisation_postal_code": "",
"organisation_city": "", "organisation_city": "",
"organisation_country": None, "organisation_country": None,
"optional_attendance": [],
}, },
) )

View File

@ -120,6 +120,11 @@ from vbv_lernwelt.shop.models import CheckoutInformation
default=False, default=False,
help="Will set only the is_vv flag for the test course and enable learning mentors for the course", help="Will set only the is_vv flag for the test course and enable learning mentors for the course",
) )
@click.option(
"--set-optional-attendance-flag/--no-optional-attendance-flag",
default=False,
help="Will set the optional attendance flag for the test-student1@example.com",
)
def command( def command(
create_assignment_completion, create_assignment_completion,
create_assignment_evaluation, create_assignment_evaluation,
@ -133,6 +138,7 @@ def command(
create_learning_mentor, create_learning_mentor,
set_only_is_uk_flag, set_only_is_uk_flag,
set_only_is_vv_flag, set_only_is_vv_flag,
set_optional_attendance_flag,
): ):
print("cypress reset data") print("cypress reset data")
CourseCompletion.objects.all().delete() CourseCompletion.objects.all().delete()
@ -478,4 +484,17 @@ def command(
course.configuration.is_uk = False course.configuration.is_uk = False
course.configuration.enable_learning_mentor = False course.configuration.enable_learning_mentor = False
if set_optional_attendance_flag:
course_session_user = CourseSessionUser.objects.get(
user__id=TEST_STUDENT1_USER_ID
)
course_session_user.optional_attendance = True
course_session_user.save()
else:
course_session_user = CourseSessionUser.objects.get(
user_id=TEST_STUDENT1_USER_ID
)
course_session_user.optional_attendance = False
course_session_user.save()
course.configuration.save() course.configuration.save()

View File

@ -55,6 +55,7 @@ class UserSerializer(serializers.ModelSerializer):
course_session_experts = serializers.SerializerMethodField() course_session_experts = serializers.SerializerMethodField()
country = CountrySerializer() country = CountrySerializer()
organisation_country = CountrySerializer() organisation_country = CountrySerializer()
optional_attendance = serializers.SerializerMethodField()
class Meta: class Meta:
model = User model = User
@ -83,6 +84,7 @@ class UserSerializer(serializers.ModelSerializer):
"organisation_postal_code", "organisation_postal_code",
"organisation_city", "organisation_city",
"organisation_country", "organisation_country",
"optional_attendance",
] ]
read_only_fields = [ read_only_fields = [
"id", "id",
@ -108,6 +110,12 @@ class UserSerializer(serializers.ModelSerializer):
return [str(_id) for _id in (supervisor_in_session_ids | expert_in_session_ids)] return [str(_id) for _id in (supervisor_in_session_ids | expert_in_session_ids)]
def get_optional_attendance(self, obj: User) -> bool:
optional_attendance_ids = CourseSessionUser.objects.filter(
user=obj, optional_attendance=True
).values_list("course_session__id", flat=True)
return [str(id) for id in optional_attendance_ids]
def update(self, instance, validated_data): def update(self, instance, validated_data):
country_data = validated_data.pop("country", None) country_data = validated_data.pop("country", None)
organisation_country_data = validated_data.pop("organisation_country", None) organisation_country_data = validated_data.pop("organisation_country", None)

View File

@ -64,6 +64,7 @@ class CourseSessionUserAdmin(admin.ModelAdmin):
"course_session", "course_session",
"role", "role",
"circles", "circles",
"optional_attendance",
# "created_at", # "created_at",
# "updated_at", # "updated_at",
] ]
@ -76,6 +77,7 @@ class CourseSessionUserAdmin(admin.ModelAdmin):
list_filter = [ list_filter = [
"role", "role",
"course_session", "course_session",
"optional_attendance",
] ]
raw_id_fields = [ raw_id_fields = [
"user", "user",
@ -97,7 +99,7 @@ class CourseSessionUserAdmin(admin.ModelAdmin):
return ", ".join([c.title for c in obj.expert.all()]) return ", ".join([c.title for c in obj.expert.all()])
fieldsets = [ fieldsets = [
(None, {"fields": ("user", "course_session", "role")}), (None, {"fields": ("user", "course_session", "role", "optional_attendance")}),
( (
"Expert/Trainer", "Expert/Trainer",
{ {

View File

@ -151,6 +151,7 @@ class CourseSessionUserObjectsType(ObjectType):
circles = graphene.List( circles = graphene.List(
graphene.NonNull(CourseSessionUserExpertCircleType), required=True graphene.NonNull(CourseSessionUserExpertCircleType), required=True
) )
optional_attendance = graphene.Boolean(required=False)
class CircleDocumentObjectType(DjangoObjectType): class CircleDocumentObjectType(DjangoObjectType):
@ -233,6 +234,7 @@ class CourseSessionObjectType(DjangoObjectType):
) )
for circle in course_session_user.expert.all() # noqa for circle in course_session_user.expert.all() # noqa
], ],
optional_attendance=course_session_user.optional_attendance, # noqa
) )
) )

View File

@ -0,0 +1,32 @@
# Generated by Django 4.2.13 on 2024-07-25 05:47
from django.db import migrations, models
import vbv_lernwelt.course.models
class Migration(migrations.Migration):
dependencies = [
("course", "0008_auto_20240403_1132"),
]
operations = [
migrations.AddField(
model_name="coursesessionuser",
name="optional_attendance",
field=models.BooleanField(default=False),
),
migrations.AlterField(
model_name="coursecompletion",
name="completion_status",
field=models.CharField(
choices=[
("SUCCESS", "Success"),
("FAIL", "Fail"),
("UNKNOWN", "Unknown"),
],
default=vbv_lernwelt.course.models.CourseCompletionStatus["UNKNOWN"],
max_length=255,
),
),
]

View File

@ -283,6 +283,7 @@ class CourseSessionUser(models.Model):
expert = models.ManyToManyField( expert = models.ManyToManyField(
"learnpath.Circle", related_name="expert", blank=True "learnpath.Circle", related_name="expert", blank=True
) )
optional_attendance = models.BooleanField(default=False)
class Meta: class Meta:
constraints = [ constraints = [

View File

@ -82,6 +82,10 @@ def _create_sheet(
# headers # headers
# common user headers..., <attendance_course> <date>, status <attendance_course>, .. # common user headers..., <attendance_course> <date>, status <attendance_course>, ..
col_idx = add_user_headers(sheet) col_idx = add_user_headers(sheet)
sheet.cell(row=1, column=col_idx, value=str(_("Optionale Anwesenheit")))
col_idx += 1
attendance_data = {} attendance_data = {}
for course in attendance_courses: for course in attendance_courses:
@ -110,6 +114,13 @@ def _create_sheet(
def _add_rows(sheet, users: list[CourseSessionUser], attendance_data): def _add_rows(sheet, users: list[CourseSessionUser], attendance_data):
for row_idx, user in enumerate(users, start=2): for row_idx, user in enumerate(users, start=2):
col_idx = add_user_export_data(sheet, user, row_idx) col_idx = add_user_export_data(sheet, user, row_idx)
optional_attendance_text = (
str(_("Ja")) if user.optional_attendance else str(_("Nein"))
)
sheet.cell(row=row_idx, column=col_idx, value=optional_attendance_text)
col_idx += 1
for key, user_dict_map in attendance_data.items(): for key, user_dict_map in attendance_data.items():
user_dict = user_dict_map.get(str(user.user.id), {}) user_dict = user_dict_map.get(str(user.user.id), {})
status = user_dict.get("status", "") if user_dict else "" status = user_dict.get("status", "") if user_dict else ""

View File

@ -8,7 +8,7 @@ from vbv_lernwelt.core.constants import TEST_STUDENT1_USER_ID, TEST_STUDENT2_USE
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.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 CourseSession from vbv_lernwelt.course.models import CourseSession, CourseSessionUser
from vbv_lernwelt.course_session.services.export_attendance import export_attendance from vbv_lernwelt.course_session.services.export_attendance import export_attendance
@ -42,6 +42,11 @@ class AttendanceExportTestCase(ExportBaseTestCase):
self.test_student1 = User.objects.get(id=TEST_STUDENT1_USER_ID) self.test_student1 = User.objects.get(id=TEST_STUDENT1_USER_ID)
self.test_student1.additional_json_data = {"Lehrvertragsnummer": 1234567890} self.test_student1.additional_json_data = {"Lehrvertragsnummer": 1234567890}
self.test_student1.save() self.test_student1.save()
csu1 = CourseSessionUser.objects.get(
user=self.test_student1, course_session=self.course_session_be
)
csu1.optional_attendance = True
csu1.save()
self.test_student2 = User.objects.get(id=TEST_STUDENT2_USER_ID) self.test_student2 = User.objects.get(id=TEST_STUDENT2_USER_ID)
self.test_student2.additional_json_data = {"Lehrvertragsnummer": 1987654321} self.test_student2.additional_json_data = {"Lehrvertragsnummer": 1987654321}
self.test_student2.save() self.test_student2.save()
@ -64,6 +69,7 @@ class AttendanceExportTestCase(ExportBaseTestCase):
self.test_student1.last_name, self.test_student1.last_name,
self.test_student1.email, self.test_student1.email,
self.test_student1.additional_json_data["Lehrvertragsnummer"], self.test_student1.additional_json_data["Lehrvertragsnummer"],
"Ja",
"Anwesend", "Anwesend",
], ],
[ [
@ -71,6 +77,7 @@ class AttendanceExportTestCase(ExportBaseTestCase):
self.test_student2.last_name, self.test_student2.last_name,
self.test_student2.email, self.test_student2.email,
self.test_student2.additional_json_data["Lehrvertragsnummer"], self.test_student2.additional_json_data["Lehrvertragsnummer"],
"Nein",
"Nicht anwesend", "Nicht anwesend",
], ],
[ [
@ -78,6 +85,7 @@ class AttendanceExportTestCase(ExportBaseTestCase):
self.test_student3.last_name, self.test_student3.last_name,
self.test_student3.email, self.test_student3.email,
None, None,
"Nein",
"Nicht anwesend", "Nicht anwesend",
], ],
] ]
@ -95,6 +103,7 @@ class AttendanceExportTestCase(ExportBaseTestCase):
"Nachname", "Nachname",
"Email", "Email",
"Lehrvertragsnummer", "Lehrvertragsnummer",
"Optionale Anwesenheit",
f"Anwesenheit {csac.get_circle().title} {csac.due_date.start.strftime('%d.%m.%Y')}", f"Anwesenheit {csac.get_circle().title} {csac.due_date.start.strftime('%d.%m.%Y')}",
] ]
@ -103,7 +112,7 @@ class AttendanceExportTestCase(ExportBaseTestCase):
self.assertEqual(len(wb.sheetnames), 1) self.assertEqual(len(wb.sheetnames), 1)
self.assertEqual(wb.sheetnames[0], "Test Bern 2022 a") self.assertEqual(wb.sheetnames[0], "Test Bern 2022 a")
self._check_export(wb, self.expected_data_be, 4, 5) self._check_export(wb, self.expected_data_be, 4, 6)
def test_attendance_export_multiple_cs(self): def test_attendance_export_multiple_cs(self):
self.attendance_course_zh.attendance_user_list = [ self.attendance_course_zh.attendance_user_list = [
@ -123,6 +132,7 @@ class AttendanceExportTestCase(ExportBaseTestCase):
self.test_student2.last_name, self.test_student2.last_name,
self.test_student2.email, self.test_student2.email,
self.test_student2.additional_json_data["Lehrvertragsnummer"], self.test_student2.additional_json_data["Lehrvertragsnummer"],
"Nein",
"Anwesend", "Anwesend",
], ],
] ]
@ -136,10 +146,10 @@ class AttendanceExportTestCase(ExportBaseTestCase):
self.assertEqual(wb.sheetnames[0], "Test Bern 2022 a") self.assertEqual(wb.sheetnames[0], "Test Bern 2022 a")
self.assertEqual(wb.sheetnames[1], "Test Zürich 2022 a") self.assertEqual(wb.sheetnames[1], "Test Zürich 2022 a")
self._check_export(wb, self.expected_data_be, 4, 5) self._check_export(wb, self.expected_data_be, 4, 6)
wb.active = wb["Test Zürich 2022 a"] wb.active = wb["Test Zürich 2022 a"]
self._check_export(wb, expected_data_zh, 2, 5) self._check_export(wb, expected_data_zh, 2, 6)
def test_french_export(self): def test_french_export(self):
activate("fr") activate("fr")
@ -150,6 +160,7 @@ class AttendanceExportTestCase(ExportBaseTestCase):
"Nom de famille", "Nom de famille",
"E-mail", "E-mail",
"Numéro de contrat d'apprentissage", "Numéro de contrat d'apprentissage",
"Présence facultative",
f"Présence {self.attendance_course_be.get_circle().title} {self.attendance_course_be.due_date.start.strftime('%d.%m.%Y')}", f"Présence {self.attendance_course_be.get_circle().title} {self.attendance_course_be.due_date.start.strftime('%d.%m.%Y')}",
] ]
@ -160,6 +171,7 @@ class AttendanceExportTestCase(ExportBaseTestCase):
self.test_student1.last_name, self.test_student1.last_name,
self.test_student1.email, self.test_student1.email,
self.test_student1.additional_json_data["Lehrvertragsnummer"], self.test_student1.additional_json_data["Lehrvertragsnummer"],
"Oui",
"Présent", "Présent",
], ],
[ [
@ -167,6 +179,7 @@ class AttendanceExportTestCase(ExportBaseTestCase):
self.test_student2.last_name, self.test_student2.last_name,
self.test_student2.email, self.test_student2.email,
self.test_student2.additional_json_data["Lehrvertragsnummer"], self.test_student2.additional_json_data["Lehrvertragsnummer"],
"Non",
"Pas présent", "Pas présent",
], ],
[ [
@ -174,10 +187,11 @@ class AttendanceExportTestCase(ExportBaseTestCase):
self.test_student3.last_name, self.test_student3.last_name,
self.test_student3.email, self.test_student3.email,
None, None,
"Non",
"Pas présent", "Pas présent",
], ],
] ]
self._check_export(wb, expected_data_be, 4, 5) self._check_export(wb, expected_data_be, 4, 6)
def test_italian_export(self): def test_italian_export(self):
activate("it") activate("it")
@ -188,6 +202,7 @@ class AttendanceExportTestCase(ExportBaseTestCase):
"Cognome", "Cognome",
"Email", "Email",
"Numero di contratto di tirocinio", "Numero di contratto di tirocinio",
"Presenza opzionale",
f"Presenza {self.attendance_course_be.get_circle().title} {self.attendance_course_be.due_date.start.strftime('%d.%m.%Y')}", f"Presenza {self.attendance_course_be.get_circle().title} {self.attendance_course_be.due_date.start.strftime('%d.%m.%Y')}",
] ]
@ -198,6 +213,7 @@ class AttendanceExportTestCase(ExportBaseTestCase):
self.test_student1.last_name, self.test_student1.last_name,
self.test_student1.email, self.test_student1.email,
self.test_student1.additional_json_data["Lehrvertragsnummer"], self.test_student1.additional_json_data["Lehrvertragsnummer"],
"",
"Presente", "Presente",
], ],
[ [
@ -205,6 +221,7 @@ class AttendanceExportTestCase(ExportBaseTestCase):
self.test_student2.last_name, self.test_student2.last_name,
self.test_student2.email, self.test_student2.email,
self.test_student2.additional_json_data["Lehrvertragsnummer"], self.test_student2.additional_json_data["Lehrvertragsnummer"],
"No",
"Non presente", "Non presente",
], ],
[ [
@ -212,7 +229,8 @@ class AttendanceExportTestCase(ExportBaseTestCase):
self.test_student3.last_name, self.test_student3.last_name,
self.test_student3.email, self.test_student3.email,
None, None,
"No",
"Non presente", "Non presente",
], ],
] ]
self._check_export(wb, expected_data_be, 4, 5) self._check_export(wb, expected_data_be, 4, 6)