+
+
+
+ {{ $t("Trainerunterlagen") }}
+
+
+ {{ $t("cockpit.trainerFilesText") }}
-
-
-
- {{ $t("Anwesenheitskontrolle Präsenzkurse") }}
-
-
- {{
- $t(
- "Hier überprüfst und bestätigst du die Anwesenheit deiner Teilnehmenden."
- )
- }}
-
-
-
-
- {{ $t("Anwesenheit prüfen") }}
-
-
-
-
-
-
-
-
-
{{ $t("cockpit.progress") }}
-
-
-
-
-
+
+
+ {{ $t("a.Unterlagen für Teilnehmenden") }}
+
+
+ {{ $t("a.Stelle deinen Lernenden zusätzliche Inhalte zur Verfügung.") }}
+
+
+
+ {{ courseSessionsStore.circleDocuments.length }} {{ $t("a.Unterlagen") }}
+
+
+
+
+ {{ $t("a.Zum Unterlagen-Upload") }}
+
+
+
+
+
+
+ {{ $t("Anwesenheitskontrolle Präsenzkurse") }}
+
+
+ {{
+ $t(
+ "Hier überprüfst und bestätigst du die Anwesenheit deiner Teilnehmenden."
+ )
+ }}
+
+
+
+
+ {{ $t("Anwesenheit prüfen") }}
+
+
+
+
+
+
+
+
+
+
+
+
+
{{ $t("cockpit.progress") }}
+
+
+
+
+
-
- {{ cockpitStore.selectedCircle.name }}
-
-
-
-
-
- {{ userCountStatusForCircle(csu.user_id).FAIL }}
-
-
-
-
-
-
- {{ userCountStatusForCircle(csu.user_id).SUCCESS }}
-
-
-
-
-
-
- {{ userCountStatusForCircle(csu.user_id).UNKNOWN }}
-
-
+ :show-circle-translation-keys="[
+ cockpitStore.currentCircle.translation_key,
+ ]"
+ diagram-type="singleSmall"
+ class="mr-4"
+ >
+
+ {{ cockpitStore.currentCircle.title }}
+
+
+
+
+
+ {{ userCountStatusForCircle(csu.user_id).FAIL }}
+
+
-
+
+
+ {{ userCountStatusForCircle(csu.user_id).SUCCESS }}
+
+
+
-
+
+
+ {{ userCountStatusForCircle(csu.user_id).UNKNOWN }}
+
+
-
-
-
- {{ $t("general.profileLink") }}
-
-
-
-
-
+
+
+
+
+ {{ $t("general.profileLink") }}
+
+
+
+
-
-
+
+
+
+
{{ $t("a.Kein Circle verfügbar oder ausgewählt.") }}
diff --git a/client/src/pages/cockpit/documentPage/DocumentPage.vue b/client/src/pages/cockpit/documentPage/DocumentPage.vue
new file mode 100644
index 00000000..7e68b5cd
--- /dev/null
+++ b/client/src/pages/cockpit/documentPage/DocumentPage.vue
@@ -0,0 +1,132 @@
+
+
+
+
+
+
+
+
+
{{ t("a.Unterlagen für Teilnehmenden") }}
+
+
+
+
+
+
+
+
+
+ {{ t("circlePage.documents.action") }}
+
+
+
+
+
+
+
+
diff --git a/client/src/pages/learningPath/circlePage/DocumentUploadForm.vue b/client/src/pages/cockpit/documentPage/DocumentUploadForm.vue
similarity index 100%
rename from client/src/pages/learningPath/circlePage/DocumentUploadForm.vue
rename to client/src/pages/cockpit/documentPage/DocumentUploadForm.vue
diff --git a/client/src/pages/learningPath/circlePage/DocumentSection.vue b/client/src/pages/learningPath/circlePage/DocumentSection.vue
index edabf392..03f2fa73 100644
--- a/client/src/pages/learningPath/circlePage/DocumentSection.vue
+++ b/client/src/pages/learningPath/circlePage/DocumentSection.vue
@@ -5,12 +5,7 @@
-
- {{ $t("circlePage.documents.userDescription") }}
-
-
- {{ $t("circlePage.documents.expertDescription") }}
-
+ {{ $t("circlePage.documents.userDescription") }}
-
-
-
-
-
- {{ $t("circlePage.documents.action") }}
-
-
-
-
-
diff --git a/client/src/router/index.ts b/client/src/router/index.ts
index 5267e651..79725d55 100644
--- a/client/src/router/index.ts
+++ b/client/src/router/index.ts
@@ -165,6 +165,11 @@ const router = createRouter({
import("@/pages/cockpit/attendanceCheckPage/AttendanceCheckPage.vue"),
props: true,
},
+ {
+ path: "documents",
+ component: () => import("@/pages/cockpit/documentPage/DocumentPage.vue"),
+ props: true,
+ },
],
},
{
diff --git a/client/src/stores/cockpit.ts b/client/src/stores/cockpit.ts
index 096e7699..a1f72db0 100644
--- a/client/src/stores/cockpit.ts
+++ b/client/src/stores/cockpit.ts
@@ -2,26 +2,18 @@ import { itGetCached } from "@/fetchHelpers";
import type { CourseSessionUser, ExpertSessionUser } from "@/types";
import log from "loglevel";
+import { useCircleStore } from "@/stores/circle";
import { useLearningPathStore } from "@/stores/learningPath";
import { useUserStore } from "@/stores/user";
import { defineStore } from "pinia";
export type CockpitStoreState = {
courseSessionMembers: CourseSessionUser[] | undefined;
- selectedCircle:
- | {
- id: number;
- name: string;
- slug: string;
- translation_key: string;
- }
- | undefined;
circles: {
- id: number;
+ id: string;
name: string;
- slug: string;
- translation_key: string;
}[];
+ currentCourseSlug: string | undefined;
};
export const useCockpitStore = defineStore({
@@ -29,29 +21,38 @@ export const useCockpitStore = defineStore({
state: () => {
return {
courseSessionMembers: undefined,
- selectedCircle: undefined,
circles: [],
+ currentCourseSlug: undefined,
} as CockpitStoreState;
},
actions: {
async loadCircles(courseSlug: string, courseSessionId: number) {
- log.debug("loadCircles called");
+ log.debug("loadCircles called", courseSlug, courseSessionId);
+ this.currentCourseSlug = courseSlug;
- const f = await courseCircles(courseSlug, courseSessionId);
+ const f = await courseCircles(this.currentCourseSlug, courseSessionId);
this.circles = f.map((c) => {
return {
- id: c.id,
+ id: c.slug,
name: c.title,
- slug: c.slug,
- translation_key: c.translation_key,
};
});
if (this.circles.length > 0) {
- this.selectedCircle = this.circles[0];
+ await this.setCurrentCourseCircle(this.circles[0].id);
}
},
+ async setCurrentCourseCircle(circleSlug: string) {
+ if (!this.currentCourseSlug) {
+ throw new Error("currentCourseSlug is undefined");
+ }
+ const circleStore = useCircleStore();
+ await circleStore.loadCircle(this.currentCourseSlug, circleSlug);
+ },
+ async setCurrentCourseCircleFromEvent(event: { id: string }) {
+ await this.setCurrentCourseCircle(event.id);
+ },
async loadCourseSessionMembers(courseSessionId: number, reload = false) {
log.debug("loadCourseSessionMembers called");
const users = (await itGetCached(
@@ -65,6 +66,19 @@ export const useCockpitStore = defineStore({
return this.courseSessionMembers;
},
},
+ getters: {
+ currentCircle: () => {
+ const circleStore = useCircleStore();
+ return circleStore.circle;
+ },
+ selectedCircle: () => {
+ const circleStore = useCircleStore();
+ return {
+ id: circleStore.circle?.id || 0,
+ name: circleStore.circle?.title || "",
+ };
+ },
+ },
});
async function courseCircles(courseSlug: string, courseSessionId: number) {
diff --git a/server/vbv_lernwelt/importer/services.py b/server/vbv_lernwelt/importer/services.py
index 935e6f1d..be64194a 100644
--- a/server/vbv_lernwelt/importer/services.py
+++ b/server/vbv_lernwelt/importer/services.py
@@ -202,6 +202,7 @@ TRANSLATIONS = {
}
T2L_IGNORE_FIELDS = ["Vorname", "Name", "Email", "Sprache", "Durchführungen"]
+EDONIQ_TEST_PERIOD = 14
class DataImportError(Exception):
@@ -487,7 +488,9 @@ def create_or_update_course_session_edoniq_test(
# trigger save to update due date
cset.save()
- cset.deadline.start = timezone.make_aware(start) + timezone.timedelta(days=10)
+ cset.deadline.start = timezone.make_aware(start) + timezone.timedelta(
+ days=EDONIQ_TEST_PERIOD
+ )
cset.deadline.end = None
cset.deadline.save()
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 6112eaa0..9e276392 100644
--- a/server/vbv_lernwelt/importer/tests/test_import_course_sessions.py
+++ b/server/vbv_lernwelt/importer/tests/test_import_course_sessions.py
@@ -309,7 +309,7 @@ class CreateOrUpdateEdoniqTestCase(TestCase):
self._create_or_update_edonqi_test("2023-06-06T11:30:00+00:00")
test = CourseSessionEdoniqTest.objects.first()
- self.assertEqual(test.deadline.start.isoformat(), "2023-06-16T11:30:00+00:00")
+ self.assertEqual(test.deadline.start.isoformat(), "2023-06-20T11:30:00+00:00")
def test_update_course_session(self):
self._create_or_update_edonqi_test("2023-06-06T11:30:00+00:00")
@@ -318,4 +318,4 @@ class CreateOrUpdateEdoniqTestCase(TestCase):
self.assertEqual(duedate_count, DueDate.objects.count())
test = CourseSessionEdoniqTest.objects.first()
- self.assertEqual(test.deadline.start.isoformat(), "2023-07-16T11:30:00+00:00")
+ self.assertEqual(test.deadline.start.isoformat(), "2023-07-20T11:30:00+00:00")