From 993c9bb536b37d0c3d01f516ee89cab5f8eca485 Mon Sep 17 00:00:00 2001 From: Christian Cueni Date: Wed, 2 Oct 2024 07:41:15 +0200 Subject: [PATCH] Hide edit buttons based on role --- .../cockpit/documentPage/DocumentPage.vue | 32 +++++++++-- server/vbv_lernwelt/iam/permissions.py | 14 ++--- .../iam/tests/test_permissions.py | 54 ++++++++++++++----- 3 files changed, 75 insertions(+), 25 deletions(-) diff --git a/client/src/pages/cockpit/documentPage/DocumentPage.vue b/client/src/pages/cockpit/documentPage/DocumentPage.vue index 249d8902..ad3c1a9d 100644 --- a/client/src/pages/cockpit/documentPage/DocumentPage.vue +++ b/client/src/pages/cockpit/documentPage/DocumentPage.vue @@ -2,7 +2,11 @@ import DocumentListItem from "@/components/circle/DocumentListItem.vue"; import ItDropdownSelect from "@/components/ui/ItDropdownSelect.vue"; import ItModal from "@/components/ui/ItModal.vue"; -import { useCourseData, useCurrentCourseSession } from "@/composables"; +import { + useCourseData, + useCourseSessionDetailQuery, + useCurrentCourseSession, +} from "@/composables"; import { useExpertCockpitPageData } from "@/pages/cockpit/cockpitPage/composables"; import DocumentUploadForm from "@/pages/cockpit/documentPage/DocumentUploadForm.vue"; import { @@ -12,6 +16,7 @@ import { } from "@/services/files"; import { useCourseSessionsStore } from "@/stores/courseSessions"; import { useExpertCockpitStore } from "@/stores/expertCockpit"; +import { useUserStore } from "@/stores/user"; import type { CircleDocument, DocumentUploadData } from "@/types"; import dialog from "@/utils/confirm-dialog"; import { useTranslation } from "i18next-vue"; @@ -21,6 +26,9 @@ import { computed, onMounted, ref, watch } from "vue"; const cockpitStore = useExpertCockpitStore(); const courseSession = useCurrentCourseSession(); const courseSessionsStore = useCourseSessionsStore(); +const courseSessionDetailResult = useCourseSessionDetailQuery(); +const userStore = useUserStore(); + const courseData = useCourseData(courseSession.value?.course.slug); const { t } = useTranslation(); @@ -71,6 +79,17 @@ const circleDocuments = computed(() => { ); }); +const canEditDocuments = computed(() => { + const circleExperts = courseSessionDetailResult.filterCircleExperts( + cockpitStore.currentCircle?.slug || "" + ); + return circleExperts.some( + (expert) => + expert.user_id === userStore.id && + expert.id.indexOf("as-ephemeral-supervisor") === -1 + ); +}); + const deleteDocument = async (doc: CircleDocument) => { const options = { title: t("circlePage.documents.deleteModalTitle"), @@ -134,18 +153,21 @@ async function uploadDocument(data: DocumentUploadData) { @update:model-value="cockpitStore.setCurrentCourseCircleFromEvent" > -
- -