Merged in feature/VBV-698-optional-flag (pull request #364)
Feature/VBV-698 optional flag
This commit is contained in:
commit
a024a2f244
|
|
@ -1,18 +1,30 @@
|
|||
<script setup lang="ts">
|
||||
import ItRow from "@/components/ui/ItRow.vue";
|
||||
|
||||
defineProps<{
|
||||
export interface Props {
|
||||
avatarUrl: string;
|
||||
name: string;
|
||||
}>();
|
||||
extraInfo?: string;
|
||||
}
|
||||
|
||||
const props = withDefaults(defineProps<Props>(), {
|
||||
extraInfo: "",
|
||||
});
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<ItRow>
|
||||
<template #firstRow>
|
||||
<slot name="leading"></slot>
|
||||
<img class="mr-2 h-11 w-11 rounded-full" :src="avatarUrl" />
|
||||
<p class="text-bold lg:leading-[45px]">{{ name }}</p>
|
||||
<img class="mr-2 h-11 w-11 rounded-full" :src="props.avatarUrl" />
|
||||
<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 #center>
|
||||
<slot name="center"></slot>
|
||||
|
|
|
|||
|
|
@ -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 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 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 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,
|
||||
|
|
@ -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.
|
||||
*/
|
||||
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.
|
||||
*/
|
||||
|
|
|
|||
File diff suppressed because one or more lines are too long
|
|
@ -713,6 +713,7 @@ type CourseSessionUserObjectsType {
|
|||
avatar_url: String!
|
||||
role: String!
|
||||
circles: [CourseSessionUserExpertCircleType!]!
|
||||
optional_attendance: Boolean
|
||||
}
|
||||
|
||||
type CourseSessionUserExpertCircleType {
|
||||
|
|
|
|||
|
|
@ -192,6 +192,7 @@ export const COURSE_SESSION_DETAIL_QUERY = graphql(`
|
|||
title
|
||||
slug
|
||||
}
|
||||
optional_attendance
|
||||
}
|
||||
attendance_courses {
|
||||
id
|
||||
|
|
|
|||
|
|
@ -224,6 +224,9 @@ watch(
|
|||
:name="`${csu.first_name} ${csu.last_name}`"
|
||||
:avatar-url="csu.avatar_url"
|
||||
:class="0 === index ? 'border-none' : ''"
|
||||
:extra-info="
|
||||
csu.optional_attendance ? `${$t('a.Optionale Anwesenheit')}` : ''
|
||||
"
|
||||
>
|
||||
<template #leading>
|
||||
<ItCheckbox
|
||||
|
|
|
|||
|
|
@ -53,7 +53,17 @@ onMounted(() => {
|
|||
<div class="flex flex-col">
|
||||
<h2 class="mb-2">{{ user.first_name }} {{ user.last_name }}</h2>
|
||||
<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>
|
||||
|
|
|
|||
|
|
@ -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");
|
||||
});
|
||||
});
|
||||
|
|
@ -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",
|
||||
);
|
||||
});
|
||||
});
|
||||
|
|
@ -8,7 +8,7 @@ msgid ""
|
|||
msgstr ""
|
||||
"Project-Id-Version: PACKAGE VERSION\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"
|
||||
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"Language-Team: LANGUAGE <LL@li.org>\n"
|
||||
|
|
@ -38,32 +38,32 @@ msgstr ""
|
|||
msgid "Nicht bestanden"
|
||||
msgstr ""
|
||||
|
||||
#: vbv_lernwelt/assignment/export.py:203 vbv_lernwelt/assignment/export.py:206
|
||||
#: vbv_lernwelt/assignment/export.py:207
|
||||
#: vbv_lernwelt/assignment/export.py:204 vbv_lernwelt/assignment/export.py:208
|
||||
#: vbv_lernwelt/assignment/export.py:209
|
||||
msgid "Keine Daten"
|
||||
msgstr ""
|
||||
|
||||
#: vbv_lernwelt/core/admin.py:32
|
||||
#: vbv_lernwelt/core/admin.py:38 vbv_lernwelt/sso/admin.py:83
|
||||
msgid "Personal info"
|
||||
msgstr ""
|
||||
|
||||
#: vbv_lernwelt/core/admin.py:34
|
||||
#: vbv_lernwelt/core/admin.py:40
|
||||
msgid "Permissions"
|
||||
msgstr ""
|
||||
|
||||
#: vbv_lernwelt/core/admin.py:45
|
||||
#: vbv_lernwelt/core/admin.py:51
|
||||
msgid "Important dates"
|
||||
msgstr ""
|
||||
|
||||
#: vbv_lernwelt/core/admin.py:47
|
||||
#: vbv_lernwelt/core/admin.py:53
|
||||
msgid "Profile"
|
||||
msgstr ""
|
||||
|
||||
#: vbv_lernwelt/core/admin.py:62
|
||||
#: vbv_lernwelt/core/admin.py:70
|
||||
msgid "Organisation"
|
||||
msgstr ""
|
||||
|
||||
#: vbv_lernwelt/core/admin.py:75
|
||||
#: vbv_lernwelt/core/admin.py:83 vbv_lernwelt/sso/admin.py:86
|
||||
msgid "Additional data"
|
||||
msgstr ""
|
||||
|
||||
|
|
@ -87,31 +87,31 @@ msgstr ""
|
|||
msgid "Lehrgang-Seite"
|
||||
msgstr ""
|
||||
|
||||
#: vbv_lernwelt/course/models.py:272
|
||||
#: vbv_lernwelt/course/models.py:278
|
||||
msgid "Teilnehmer"
|
||||
msgstr ""
|
||||
|
||||
#: vbv_lernwelt/course/models.py:273
|
||||
#: vbv_lernwelt/course/models.py:279
|
||||
msgid "Experte/Trainer"
|
||||
msgstr ""
|
||||
|
||||
#: vbv_lernwelt/course/models.py:332
|
||||
#: vbv_lernwelt/course/models.py:339
|
||||
msgid "Dokumente im Circle ein/aus"
|
||||
msgstr ""
|
||||
|
||||
#: vbv_lernwelt/course/models.py:336
|
||||
#: vbv_lernwelt/course/models.py:343
|
||||
msgid "Lernmentor-Funktion ein/aus"
|
||||
msgstr ""
|
||||
|
||||
#: vbv_lernwelt/course/models.py:340
|
||||
#: vbv_lernwelt/course/models.py:347
|
||||
msgid "Kompetenzweise ein/aus"
|
||||
msgstr ""
|
||||
|
||||
#: vbv_lernwelt/course/models.py:343
|
||||
#: vbv_lernwelt/course/models.py:350
|
||||
msgid "Versicherungsvermittler-Lehrgang"
|
||||
msgstr ""
|
||||
|
||||
#: vbv_lernwelt/course/models.py:344
|
||||
#: vbv_lernwelt/course/models.py:351
|
||||
msgid "ÜK-Lehrgang"
|
||||
msgstr ""
|
||||
|
||||
|
|
@ -119,31 +119,43 @@ msgstr ""
|
|||
msgid "export_anwesenheit"
|
||||
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"
|
||||
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"
|
||||
msgstr ""
|
||||
|
||||
#: vbv_lernwelt/course_session/services/export_attendance.py:116
|
||||
#: vbv_lernwelt/course_session/services/export_attendance.py:128
|
||||
msgid "Nicht anwesend"
|
||||
msgstr ""
|
||||
|
||||
#: vbv_lernwelt/course_session/services/export_attendance.py:123
|
||||
#: vbv_lernwelt/course_session/services/export_attendance.py:135
|
||||
msgid "Vorname"
|
||||
msgstr ""
|
||||
|
||||
#: vbv_lernwelt/course_session/services/export_attendance.py:124
|
||||
#: vbv_lernwelt/course_session/services/export_attendance.py:136
|
||||
msgid "Nachname"
|
||||
msgstr ""
|
||||
|
||||
#: vbv_lernwelt/course_session/services/export_attendance.py:125
|
||||
#: vbv_lernwelt/course_session/services/export_attendance.py:137
|
||||
msgid "Email"
|
||||
msgstr "Email"
|
||||
|
||||
#: vbv_lernwelt/course_session/services/export_attendance.py:126
|
||||
#: vbv_lernwelt/course_session/services/export_attendance.py:138
|
||||
msgid "Lehrvertragsnummer"
|
||||
msgstr ""
|
||||
|
||||
|
|
|
|||
Binary file not shown.
|
|
@ -8,7 +8,7 @@ msgid ""
|
|||
msgstr ""
|
||||
"Project-Id-Version: PACKAGE VERSION\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"
|
||||
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"Language-Team: LANGUAGE <LL@li.org>\n"
|
||||
|
|
@ -95,23 +95,23 @@ msgstr ""
|
|||
msgid "Experte/Trainer"
|
||||
msgstr ""
|
||||
|
||||
#: vbv_lernwelt/course/models.py:338
|
||||
#: vbv_lernwelt/course/models.py:339
|
||||
msgid "Dokumente im Circle ein/aus"
|
||||
msgstr ""
|
||||
|
||||
#: vbv_lernwelt/course/models.py:342
|
||||
#: vbv_lernwelt/course/models.py:343
|
||||
msgid "Lernmentor-Funktion ein/aus"
|
||||
msgstr ""
|
||||
|
||||
#: vbv_lernwelt/course/models.py:346
|
||||
#: vbv_lernwelt/course/models.py:347
|
||||
msgid "Kompetenzweise ein/aus"
|
||||
msgstr ""
|
||||
|
||||
#: vbv_lernwelt/course/models.py:349
|
||||
#: vbv_lernwelt/course/models.py:350
|
||||
msgid "Versicherungsvermittler-Lehrgang"
|
||||
msgstr ""
|
||||
|
||||
#: vbv_lernwelt/course/models.py:350
|
||||
#: vbv_lernwelt/course/models.py:351
|
||||
msgid "ÜK-Lehrgang"
|
||||
msgstr ""
|
||||
|
||||
|
|
@ -119,31 +119,44 @@ msgstr ""
|
|||
msgid "export_anwesenheit"
|
||||
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"
|
||||
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"
|
||||
msgstr "Présent"
|
||||
|
||||
#: vbv_lernwelt/course_session/services/export_attendance.py:117
|
||||
#: vbv_lernwelt/course_session/services/export_attendance.py:128
|
||||
msgid "Nicht anwesend"
|
||||
msgstr "Pas présent"
|
||||
|
||||
#: vbv_lernwelt/course_session/services/export_attendance.py:124
|
||||
#: vbv_lernwelt/course_session/services/export_attendance.py:135
|
||||
msgid "Vorname"
|
||||
msgstr "Prénom"
|
||||
|
||||
#: vbv_lernwelt/course_session/services/export_attendance.py:125
|
||||
#: vbv_lernwelt/course_session/services/export_attendance.py:136
|
||||
msgid "Nachname"
|
||||
msgstr "Nom de famille"
|
||||
|
||||
#: vbv_lernwelt/course_session/services/export_attendance.py:126
|
||||
#: vbv_lernwelt/course_session/services/export_attendance.py:137
|
||||
msgid "Email"
|
||||
msgstr "E-mail"
|
||||
|
||||
#: vbv_lernwelt/course_session/services/export_attendance.py:127
|
||||
#: vbv_lernwelt/course_session/services/export_attendance.py:138
|
||||
msgid "Lehrvertragsnummer"
|
||||
msgstr "Numéro de contrat d'apprentissage"
|
||||
|
||||
|
|
|
|||
Binary file not shown.
|
|
@ -8,7 +8,7 @@ msgid ""
|
|||
msgstr ""
|
||||
"Project-Id-Version: PACKAGE VERSION\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"
|
||||
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"Language-Team: LANGUAGE <LL@li.org>\n"
|
||||
|
|
@ -95,23 +95,23 @@ msgstr ""
|
|||
msgid "Experte/Trainer"
|
||||
msgstr ""
|
||||
|
||||
#: vbv_lernwelt/course/models.py:338
|
||||
#: vbv_lernwelt/course/models.py:339
|
||||
msgid "Dokumente im Circle ein/aus"
|
||||
msgstr ""
|
||||
|
||||
#: vbv_lernwelt/course/models.py:342
|
||||
#: vbv_lernwelt/course/models.py:343
|
||||
msgid "Lernmentor-Funktion ein/aus"
|
||||
msgstr ""
|
||||
|
||||
#: vbv_lernwelt/course/models.py:346
|
||||
#: vbv_lernwelt/course/models.py:347
|
||||
msgid "Kompetenzweise ein/aus"
|
||||
msgstr ""
|
||||
|
||||
#: vbv_lernwelt/course/models.py:349
|
||||
#: vbv_lernwelt/course/models.py:350
|
||||
msgid "Versicherungsvermittler-Lehrgang"
|
||||
msgstr ""
|
||||
|
||||
#: vbv_lernwelt/course/models.py:350
|
||||
#: vbv_lernwelt/course/models.py:351
|
||||
msgid "ÜK-Lehrgang"
|
||||
msgstr ""
|
||||
|
||||
|
|
@ -119,31 +119,44 @@ msgstr ""
|
|||
msgid "export_anwesenheit"
|
||||
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"
|
||||
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"
|
||||
msgstr "Presente"
|
||||
|
||||
#: vbv_lernwelt/course_session/services/export_attendance.py:117
|
||||
#: vbv_lernwelt/course_session/services/export_attendance.py:128
|
||||
msgid "Nicht anwesend"
|
||||
msgstr "Non presente"
|
||||
|
||||
#: vbv_lernwelt/course_session/services/export_attendance.py:124
|
||||
#: vbv_lernwelt/course_session/services/export_attendance.py:135
|
||||
msgid "Vorname"
|
||||
msgstr "Nome"
|
||||
|
||||
#: vbv_lernwelt/course_session/services/export_attendance.py:125
|
||||
#: vbv_lernwelt/course_session/services/export_attendance.py:136
|
||||
msgid "Nachname"
|
||||
msgstr "Cognome"
|
||||
|
||||
#: vbv_lernwelt/course_session/services/export_attendance.py:126
|
||||
#: vbv_lernwelt/course_session/services/export_attendance.py:137
|
||||
msgid "Email"
|
||||
msgstr "Email"
|
||||
|
||||
#: vbv_lernwelt/course_session/services/export_attendance.py:127
|
||||
#: vbv_lernwelt/course_session/services/export_attendance.py:138
|
||||
msgid "Lehrvertragsnummer"
|
||||
msgstr "Numero di contratto di tirocinio"
|
||||
|
||||
|
|
|
|||
|
|
@ -71,5 +71,6 @@ class ProfileViewTest(APITestCase):
|
|||
"organisation_postal_code": "",
|
||||
"organisation_city": "",
|
||||
"organisation_country": None,
|
||||
"optional_attendance": [],
|
||||
},
|
||||
)
|
||||
|
|
|
|||
|
|
@ -120,6 +120,11 @@ from vbv_lernwelt.shop.models import CheckoutInformation
|
|||
default=False,
|
||||
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(
|
||||
create_assignment_completion,
|
||||
create_assignment_evaluation,
|
||||
|
|
@ -133,6 +138,7 @@ def command(
|
|||
create_learning_mentor,
|
||||
set_only_is_uk_flag,
|
||||
set_only_is_vv_flag,
|
||||
set_optional_attendance_flag,
|
||||
):
|
||||
print("cypress reset data")
|
||||
CourseCompletion.objects.all().delete()
|
||||
|
|
@ -478,4 +484,17 @@ def command(
|
|||
course.configuration.is_uk = 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()
|
||||
|
|
|
|||
|
|
@ -55,6 +55,7 @@ class UserSerializer(serializers.ModelSerializer):
|
|||
course_session_experts = serializers.SerializerMethodField()
|
||||
country = CountrySerializer()
|
||||
organisation_country = CountrySerializer()
|
||||
optional_attendance = serializers.SerializerMethodField()
|
||||
|
||||
class Meta:
|
||||
model = User
|
||||
|
|
@ -83,6 +84,7 @@ class UserSerializer(serializers.ModelSerializer):
|
|||
"organisation_postal_code",
|
||||
"organisation_city",
|
||||
"organisation_country",
|
||||
"optional_attendance",
|
||||
]
|
||||
read_only_fields = [
|
||||
"id",
|
||||
|
|
@ -108,6 +110,12 @@ class UserSerializer(serializers.ModelSerializer):
|
|||
|
||||
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):
|
||||
country_data = validated_data.pop("country", None)
|
||||
organisation_country_data = validated_data.pop("organisation_country", None)
|
||||
|
|
|
|||
|
|
@ -64,6 +64,7 @@ class CourseSessionUserAdmin(admin.ModelAdmin):
|
|||
"course_session",
|
||||
"role",
|
||||
"circles",
|
||||
"optional_attendance",
|
||||
# "created_at",
|
||||
# "updated_at",
|
||||
]
|
||||
|
|
@ -76,6 +77,7 @@ class CourseSessionUserAdmin(admin.ModelAdmin):
|
|||
list_filter = [
|
||||
"role",
|
||||
"course_session",
|
||||
"optional_attendance",
|
||||
]
|
||||
raw_id_fields = [
|
||||
"user",
|
||||
|
|
@ -97,7 +99,7 @@ class CourseSessionUserAdmin(admin.ModelAdmin):
|
|||
return ", ".join([c.title for c in obj.expert.all()])
|
||||
|
||||
fieldsets = [
|
||||
(None, {"fields": ("user", "course_session", "role")}),
|
||||
(None, {"fields": ("user", "course_session", "role", "optional_attendance")}),
|
||||
(
|
||||
"Expert/Trainer",
|
||||
{
|
||||
|
|
|
|||
|
|
@ -151,6 +151,7 @@ class CourseSessionUserObjectsType(ObjectType):
|
|||
circles = graphene.List(
|
||||
graphene.NonNull(CourseSessionUserExpertCircleType), required=True
|
||||
)
|
||||
optional_attendance = graphene.Boolean(required=False)
|
||||
|
||||
|
||||
class CircleDocumentObjectType(DjangoObjectType):
|
||||
|
|
@ -233,6 +234,7 @@ class CourseSessionObjectType(DjangoObjectType):
|
|||
)
|
||||
for circle in course_session_user.expert.all() # noqa
|
||||
],
|
||||
optional_attendance=course_session_user.optional_attendance, # noqa
|
||||
)
|
||||
)
|
||||
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
),
|
||||
),
|
||||
]
|
||||
|
|
@ -283,6 +283,7 @@ class CourseSessionUser(models.Model):
|
|||
expert = models.ManyToManyField(
|
||||
"learnpath.Circle", related_name="expert", blank=True
|
||||
)
|
||||
optional_attendance = models.BooleanField(default=False)
|
||||
|
||||
class Meta:
|
||||
constraints = [
|
||||
|
|
|
|||
|
|
@ -82,6 +82,10 @@ def _create_sheet(
|
|||
# headers
|
||||
# common user headers..., <attendance_course> <date>, status <attendance_course>, ..
|
||||
col_idx = add_user_headers(sheet)
|
||||
|
||||
sheet.cell(row=1, column=col_idx, value=str(_("Optionale Anwesenheit")))
|
||||
col_idx += 1
|
||||
|
||||
attendance_data = {}
|
||||
|
||||
for course in attendance_courses:
|
||||
|
|
@ -110,6 +114,13 @@ def _create_sheet(
|
|||
def _add_rows(sheet, users: list[CourseSessionUser], attendance_data):
|
||||
for row_idx, user in enumerate(users, start=2):
|
||||
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():
|
||||
user_dict = user_dict_map.get(str(user.user.id), {})
|
||||
status = user_dict.get("status", "") if user_dict else ""
|
||||
|
|
|
|||
|
|
@ -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.models import User
|
||||
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
|
||||
|
||||
|
||||
|
|
@ -42,6 +42,11 @@ class AttendanceExportTestCase(ExportBaseTestCase):
|
|||
self.test_student1 = User.objects.get(id=TEST_STUDENT1_USER_ID)
|
||||
self.test_student1.additional_json_data = {"Lehrvertragsnummer": 1234567890}
|
||||
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.additional_json_data = {"Lehrvertragsnummer": 1987654321}
|
||||
self.test_student2.save()
|
||||
|
|
@ -64,6 +69,7 @@ class AttendanceExportTestCase(ExportBaseTestCase):
|
|||
self.test_student1.last_name,
|
||||
self.test_student1.email,
|
||||
self.test_student1.additional_json_data["Lehrvertragsnummer"],
|
||||
"Ja",
|
||||
"Anwesend",
|
||||
],
|
||||
[
|
||||
|
|
@ -71,6 +77,7 @@ class AttendanceExportTestCase(ExportBaseTestCase):
|
|||
self.test_student2.last_name,
|
||||
self.test_student2.email,
|
||||
self.test_student2.additional_json_data["Lehrvertragsnummer"],
|
||||
"Nein",
|
||||
"Nicht anwesend",
|
||||
],
|
||||
[
|
||||
|
|
@ -78,6 +85,7 @@ class AttendanceExportTestCase(ExportBaseTestCase):
|
|||
self.test_student3.last_name,
|
||||
self.test_student3.email,
|
||||
None,
|
||||
"Nein",
|
||||
"Nicht anwesend",
|
||||
],
|
||||
]
|
||||
|
|
@ -95,6 +103,7 @@ class AttendanceExportTestCase(ExportBaseTestCase):
|
|||
"Nachname",
|
||||
"Email",
|
||||
"Lehrvertragsnummer",
|
||||
"Optionale Anwesenheit",
|
||||
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(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):
|
||||
self.attendance_course_zh.attendance_user_list = [
|
||||
|
|
@ -123,6 +132,7 @@ class AttendanceExportTestCase(ExportBaseTestCase):
|
|||
self.test_student2.last_name,
|
||||
self.test_student2.email,
|
||||
self.test_student2.additional_json_data["Lehrvertragsnummer"],
|
||||
"Nein",
|
||||
"Anwesend",
|
||||
],
|
||||
]
|
||||
|
|
@ -136,10 +146,10 @@ class AttendanceExportTestCase(ExportBaseTestCase):
|
|||
self.assertEqual(wb.sheetnames[0], "Test Bern 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"]
|
||||
self._check_export(wb, expected_data_zh, 2, 5)
|
||||
self._check_export(wb, expected_data_zh, 2, 6)
|
||||
|
||||
def test_french_export(self):
|
||||
activate("fr")
|
||||
|
|
@ -150,6 +160,7 @@ class AttendanceExportTestCase(ExportBaseTestCase):
|
|||
"Nom de famille",
|
||||
"E-mail",
|
||||
"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')}",
|
||||
]
|
||||
|
||||
|
|
@ -160,6 +171,7 @@ class AttendanceExportTestCase(ExportBaseTestCase):
|
|||
self.test_student1.last_name,
|
||||
self.test_student1.email,
|
||||
self.test_student1.additional_json_data["Lehrvertragsnummer"],
|
||||
"Oui",
|
||||
"Présent",
|
||||
],
|
||||
[
|
||||
|
|
@ -167,6 +179,7 @@ class AttendanceExportTestCase(ExportBaseTestCase):
|
|||
self.test_student2.last_name,
|
||||
self.test_student2.email,
|
||||
self.test_student2.additional_json_data["Lehrvertragsnummer"],
|
||||
"Non",
|
||||
"Pas présent",
|
||||
],
|
||||
[
|
||||
|
|
@ -174,10 +187,11 @@ class AttendanceExportTestCase(ExportBaseTestCase):
|
|||
self.test_student3.last_name,
|
||||
self.test_student3.email,
|
||||
None,
|
||||
"Non",
|
||||
"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):
|
||||
activate("it")
|
||||
|
|
@ -188,6 +202,7 @@ class AttendanceExportTestCase(ExportBaseTestCase):
|
|||
"Cognome",
|
||||
"Email",
|
||||
"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')}",
|
||||
]
|
||||
|
||||
|
|
@ -198,6 +213,7 @@ class AttendanceExportTestCase(ExportBaseTestCase):
|
|||
self.test_student1.last_name,
|
||||
self.test_student1.email,
|
||||
self.test_student1.additional_json_data["Lehrvertragsnummer"],
|
||||
"Sì",
|
||||
"Presente",
|
||||
],
|
||||
[
|
||||
|
|
@ -205,6 +221,7 @@ class AttendanceExportTestCase(ExportBaseTestCase):
|
|||
self.test_student2.last_name,
|
||||
self.test_student2.email,
|
||||
self.test_student2.additional_json_data["Lehrvertragsnummer"],
|
||||
"No",
|
||||
"Non presente",
|
||||
],
|
||||
[
|
||||
|
|
@ -212,7 +229,8 @@ class AttendanceExportTestCase(ExportBaseTestCase):
|
|||
self.test_student3.last_name,
|
||||
self.test_student3.email,
|
||||
None,
|
||||
"No",
|
||||
"Non presente",
|
||||
],
|
||||
]
|
||||
self._check_export(wb, expected_data_be, 4, 5)
|
||||
self._check_export(wb, expected_data_be, 4, 6)
|
||||
|
|
|
|||
Loading…
Reference in New Issue