From 050d0a6e7228fa1612b7fbdbb1a2d389018fc7a6 Mon Sep 17 00:00:00 2001 From: Livio Bieri Date: Wed, 13 Mar 2024 10:36:55 +0100 Subject: [PATCH] fix: prepare router / routing --- .../components/header/MainNavigationBar.vue | 35 +++++++- client/src/components/header/MobileMenu.vue | 10 +++ client/src/pages/dashboard/MentorPage.vue | 5 +- .../learningMentor/mentor/MentorIndexPage.vue | 8 +- .../mentor/MentorOverviewPage.vue | 87 ++++++++++--------- .../mentor/MentorParticipantsPage.vue | 53 +++++------ client/src/utils/route.ts | 2 +- client/src/utils/utils.ts | 9 +- server/vbv_lernwelt/iam/permissions.py | 52 +++++++++-- 9 files changed, 173 insertions(+), 88 deletions(-) diff --git a/client/src/components/header/MainNavigationBar.vue b/client/src/components/header/MainNavigationBar.vue index 17e15ef7..03f405ce 100644 --- a/client/src/components/header/MainNavigationBar.vue +++ b/client/src/components/header/MainNavigationBar.vue @@ -19,6 +19,7 @@ import { getCockpitUrl, getCompetenceNaviUrl, getLearningMentorManagementUrl, + getLearningMentorUrl, getLearningPathUrl, getMediaCenterUrl, } from "@/utils/utils"; @@ -109,7 +110,8 @@ const hasNotificationsMenu = computed(() => { return userStore.loggedIn; }); -const hasLearningMentor = computed(() => { +// FIXME: Will be removed -> WIP +const hasDeprecatedLearningMentor = computed(() => { if (!inCourse()) { return false; } @@ -125,9 +127,21 @@ const hasLearningMentor = computed(() => { return false; } - // FIXME: Use learning-mentor action instead of deprecated-mentor once we have moved everything from cockpit! return courseSession.actions.includes("deprecated-mentor"); }); + +const hasLearningMentor = computed(() => { + if (!inCourse()) { + return false; + } + + if (!courseSessionsStore.currentCourseSession) { + return false; + } + + const courseSession = courseSessionsStore.currentCourseSession; + return courseSession.actions.includes("learning-mentor"); +}); diff --git a/client/src/components/header/MobileMenu.vue b/client/src/components/header/MobileMenu.vue index 4ff2d0f1..4e82fdc3 100644 --- a/client/src/components/header/MobileMenu.vue +++ b/client/src/components/header/MobileMenu.vue @@ -6,6 +6,7 @@ import { useRouter } from "vue-router"; import { getCockpitUrl, getCompetenceNaviUrl, + getLearningMentorUrl, getLearningPathUrl, getMediaCenterUrl, } from "@/utils/utils"; @@ -91,6 +92,15 @@ const clickLink = (to: string | undefined) => { {{ $t("competences.title") }} +
  • + +
  • +
  • diff --git a/client/src/pages/learningMentor/mentor/MentorOverviewPage.vue b/client/src/pages/learningMentor/mentor/MentorOverviewPage.vue index d7f512ee..271f404e 100644 --- a/client/src/pages/learningMentor/mentor/MentorOverviewPage.vue +++ b/client/src/pages/learningMentor/mentor/MentorOverviewPage.vue @@ -14,11 +14,11 @@ const courseSession = useCurrentCourseSession(); const learningMentees = useLearningMentees(courseSession.value.id); const summary = learningMentees.summary; -const statusFilterValue = ref({ name: t("Alle"), id: "_all" }); +const statusFilterValue = ref({ name: t("a.Zu erledigen"), id: "_todo" }); const statusFilter = ref([ { name: t("Alle"), id: "_all" }, - { name: t("a.Zu erledigen"), id: "todo" }, + { name: t("a.Zu erledigen"), id: "_todo" }, ]); const circleFilterValue = ref({ name: t("a.AlleCircle"), id: "_all" }); @@ -55,42 +55,51 @@ const filteredAssignments: Ref = computed(() => { diff --git a/client/src/pages/learningMentor/mentor/MentorParticipantsPage.vue b/client/src/pages/learningMentor/mentor/MentorParticipantsPage.vue index e8ba2348..dac287c1 100644 --- a/client/src/pages/learningMentor/mentor/MentorParticipantsPage.vue +++ b/client/src/pages/learningMentor/mentor/MentorParticipantsPage.vue @@ -7,32 +7,35 @@ const { summary } = useLearningMentees(courseSession.value.id); diff --git a/client/src/utils/route.ts b/client/src/utils/route.ts index fcc8ddf6..0b0c9e26 100644 --- a/client/src/utils/route.ts +++ b/client/src/utils/route.ts @@ -23,7 +23,7 @@ export function useRouteLookups() { } function inLearningMentor() { - const regex = new RegExp("/course/[^/]+/mentor($|/)"); + const regex = new RegExp("/course/[^/]+/learning-mentor($|/)"); return regex.test(route.path); } diff --git a/client/src/utils/utils.ts b/client/src/utils/utils.ts index 272cac03..de32b6ea 100644 --- a/client/src/utils/utils.ts +++ b/client/src/utils/utils.ts @@ -14,10 +14,7 @@ function createCourseUrl(courseSlug: string | undefined, specificSub: string): s return "/"; } - if (["learn", "media", "competence", "cockpit", "mentor"].includes(specificSub)) { - return `/course/${courseSlug}/${specificSub}`; - } - return `/course/${courseSlug}`; + return `/course/${courseSlug}/${specificSub}`; } export function getCompetenceNaviUrl(courseSlug: string | undefined): string { @@ -32,6 +29,10 @@ export function getLearningPathUrl(courseSlug: string | undefined): string { return createCourseUrl(courseSlug, "learn"); } +export function getLearningMentorUrl(courseSlug: string | undefined): string { + return createCourseUrl(courseSlug, "learning-mentor"); +} + export function getCockpitUrl(courseSlug: string | undefined): string { return createCourseUrl(courseSlug, "cockpit"); } diff --git a/server/vbv_lernwelt/iam/permissions.py b/server/vbv_lernwelt/iam/permissions.py index ae94342f..0d09f538 100644 --- a/server/vbv_lernwelt/iam/permissions.py +++ b/server/vbv_lernwelt/iam/permissions.py @@ -51,13 +51,6 @@ def has_course_session_preview(user, course_session_id: int): ) -def has_expert_cockpit(user, course_session_id: int): - # FIXME: is_learning_mentor is just here WHILE we move cockpit -> learning-mentor THEN remove this! - return is_learning_mentor(user, course_session_id) or is_course_session_expert( - user, course_session_id - ) - - def has_media_library(user, course_session_id: int): if user.is_superuser: return True @@ -247,6 +240,40 @@ def has_appointments(user: User, course_session_id: int) -> bool: return CourseSessionUser.objects.filter(course_session=course_session_id).exists() +def has_learning_mentor(user: User, course_session_id: int) -> bool: + course_session = CourseSession.objects.get(id=course_session_id) + + if course_session is None: + return False + + if not course_session.course.configuration.enable_learning_mentor: + return False + + if is_learning_mentor(user, course_session_id): + return True + + if is_course_session_member(user, course_session_id): + return True + + return False + + +def can_have_learning_mentors(user: User, course_session_id: int) -> bool: + if not has_learning_mentor(user, course_session_id): + return False + + # limit further, since has_learning_mentor is too broad + return is_course_session_member(user, course_session_id) + + +def can_feedback_mentees(user: User, course_session_id: int) -> bool: + if not has_learning_mentor(user, course_session_id): + return False + + # limit further, since has_learning_mentor is too broad + return is_learning_mentor(user, course_session_id) + + def can_view_profile(user: User, profile_user: CourseSessionUser) -> bool: if user.is_superuser: return True @@ -291,11 +318,18 @@ def course_session_permissions(user: User, course_session_id: int) -> list[str]: { # FIXME: Just here WHILE we move cockpit -> learning-mentor THEN remove this! "deprecated-mentor": is_course_session_member(user, course_session_id), - "learning-mentor": is_learning_mentor(user, course_session_id), + # has learning mentor "tab" access? + "learning-mentor": has_learning_mentor(user, course_session_id), + "learning-mentor::edit-mentors": can_have_learning_mentors( + user, course_session_id + ), + "learning-mentor::feedback-mentees": can_feedback_mentees( + user, course_session_id + ), "preview": has_course_session_preview(user, course_session_id), "media-library": has_media_library(user, course_session_id), "appointments": has_appointments(user, course_session_id), - "expert-cockpit": has_expert_cockpit(user, course_session_id), + "expert-cockpit": is_course_session_expert(user, course_session_id), "learning-path": is_course_session_member(user, course_session_id), "competence-navi": is_course_session_member(user, course_session_id), "complete-learning-content": can_complete_learning_content(