From 47770bde908b8efbd46a3daa0151c440d3d19751 Mon Sep 17 00:00:00 2001 From: Daniel Egger Date: Mon, 9 Jan 2023 17:57:54 +0100 Subject: [PATCH] Refactor course expert serializer --- client/src/stores/courseSessions.ts | 5 ++--- client/src/stores/user.ts | 4 ++++ server/vbv_lernwelt/core/serializers.py | 12 ++++++++++++ server/vbv_lernwelt/course/serializers.py | 24 ----------------------- 4 files changed, 18 insertions(+), 27 deletions(-) diff --git a/client/src/stores/courseSessions.ts b/client/src/stores/courseSessions.ts index 13fb111c..bded671c 100644 --- a/client/src/stores/courseSessions.ts +++ b/client/src/stores/courseSessions.ts @@ -75,9 +75,8 @@ export const useCourseSessionsStore = defineStore("courseSessions", () => { if (courseSessionForRoute.value) { const userStore = useUserStore(); return ( - courseSessionForRoute.value.experts.filter( - (expert) => expert.user_id === userStore.id - ).length > 0 + userStore.course_session_experts.includes(courseSessionForRoute.value.id) || + userStore.is_superuser ); } diff --git a/client/src/stores/user.ts b/client/src/stores/user.ts index f84c0abc..8ae318e9 100644 --- a/client/src/stores/user.ts +++ b/client/src/stores/user.ts @@ -14,6 +14,8 @@ export type UserState = { email: string; username: string; avatar_url: string; + is_superuser: boolean; + course_session_experts: number[]; loggedIn: boolean; }; @@ -24,6 +26,8 @@ const initialUserState: UserState = { last_name: "", username: "", avatar_url: "", + is_superuser: false, + course_session_experts: [], loggedIn: false, }; diff --git a/server/vbv_lernwelt/core/serializers.py b/server/vbv_lernwelt/core/serializers.py index f6dfe04b..0d6ef107 100644 --- a/server/vbv_lernwelt/core/serializers.py +++ b/server/vbv_lernwelt/core/serializers.py @@ -1,9 +1,12 @@ from rest_framework import serializers from vbv_lernwelt.core.models import User +from vbv_lernwelt.course.models import CourseSessionUser class UserSerializer(serializers.ModelSerializer): + course_session_experts = serializers.SerializerMethodField() + class Meta: model = User fields = [ @@ -13,4 +16,13 @@ class UserSerializer(serializers.ModelSerializer): "email", "username", "avatar_url", + "is_superuser", + "course_session_experts", ] + + def get_course_session_experts(self, obj): + qs = CourseSessionUser.objects.filter( + role=CourseSessionUser.Role.EXPERT, user=obj + ) + + return [csu.course_session.id for csu in qs] diff --git a/server/vbv_lernwelt/course/serializers.py b/server/vbv_lernwelt/course/serializers.py index 312f2c21..a9d64805 100644 --- a/server/vbv_lernwelt/course/serializers.py +++ b/server/vbv_lernwelt/course/serializers.py @@ -6,9 +6,7 @@ from vbv_lernwelt.course.models import ( CourseCategory, CourseCompletion, CourseSession, - CourseSessionUser, ) -from vbv_lernwelt.learnpath.models import Circle class CourseSerializer(serializers.ModelSerializer): @@ -50,7 +48,6 @@ class CourseSessionSerializer(serializers.ModelSerializer): learning_path_url = serializers.SerializerMethodField() competence_url = serializers.SerializerMethodField() media_library_url = serializers.SerializerMethodField() - experts = serializers.SerializerMethodField() documents = serializers.SerializerMethodField() def get_course(self, obj): @@ -68,26 +65,6 @@ class CourseSessionSerializer(serializers.ModelSerializer): def get_competence_url(self, obj): return obj.course.get_competence_url() - def get_experts(self, obj): - expert_relations = CourseSessionUser.objects.filter( - expert__in=Circle.objects.descendant_of(obj.course.coursepage) - ).distinct() - expert_result = [] - for er in expert_relations: - for circle in er.expert.all(): - expert_result.append( - { - "user_id": er.user.id, - "user_email": er.user.email, - "user_first_name": er.user.first_name, - "user_last_name": er.user.last_name, - "circle_id": circle.id, - "circle_slug": circle.slug, - "circle_translation_key": circle.translation_key, - } - ) - return expert_result - def get_documents(self, obj): documents = CircleDocument.objects.filter( course_session=obj, file__upload_finished_at__isnull=False @@ -109,7 +86,6 @@ class CourseSessionSerializer(serializers.ModelSerializer): "competence_url", "media_library_url", "course_url", - "experts", "documents", ]