From dc72dbf11675fedf2117146445c0bf94ce07871d Mon Sep 17 00:00:00 2001 From: Daniel Egger Date: Thu, 19 Sep 2024 15:55:16 +0200 Subject: [PATCH 1/2] VBV-708: in VV limit users in courseSessionDetailQuery --- server/vbv_lernwelt/course/graphql/types.py | 138 ++++++++++++++------ 1 file changed, 98 insertions(+), 40 deletions(-) diff --git a/server/vbv_lernwelt/course/graphql/types.py b/server/vbv_lernwelt/course/graphql/types.py index 4da9db9c..2c243ccd 100644 --- a/server/vbv_lernwelt/course/graphql/types.py +++ b/server/vbv_lernwelt/course/graphql/types.py @@ -30,6 +30,7 @@ from vbv_lernwelt.course_session.models import ( ) from vbv_lernwelt.course_session_group.models import CourseSessionGroup from vbv_lernwelt.iam.permissions import has_course_access +from vbv_lernwelt.learning_mentor.models import AgentParticipantRelation from vbv_lernwelt.learnpath.graphql.types import LearningPathObjectType from vbv_lernwelt.learnpath.models import Circle, CourseProfile @@ -248,13 +249,10 @@ class CourseSessionObjectType(DjangoObjectType): def resolve_edoniq_tests(self, info): return CourseSessionEdoniqTest.objects.filter(course_session=self) - def resolve_users(self, info): + def resolve_users(self: CourseSession, info): course_session_users_resolved: List[CourseSessionUserObjectsType] = [] - # happy path, members and experts - for course_session_user in CourseSessionUser.objects.filter( - course_session_id=self.id - ).distinct(): + def _add_course_session_user(course_session_user): course_session_users_resolved.append( CourseSessionUserObjectsType( id=course_session_user.id, # noqa @@ -276,43 +274,103 @@ class CourseSessionObjectType(DjangoObjectType): ) ) - # workaround for supervisor - # add supervisor to the list of users (as expert) - course_session_id = self.id # noqa - user = info.context.user # noqa + me_csu = CourseSessionUser.objects.filter( + course_session=self, user=info.context.user + ).first() + if me_csu: + _add_course_session_user(me_csu) - if CourseSessionGroup.objects.filter( - course_session=course_session_id, supervisor=user - ).exists(): - if course_session := CourseSession.objects.filter( - id=course_session_id - ).first(): - circles = ( - course_session.course.get_learning_path() - .get_descendants() - .live() - .specific() - .exact_type(Circle) - ) + if self.course.configuration.is_vv: + # VBV-708: only add users, which have a relation with the current user + for rel in AgentParticipantRelation.objects.filter( + participant__course_session=self, agent=info.context.user + ): + if rel.participant_id not in [ + user.id for user in course_session_users_resolved + ]: + _add_course_session_user(rel.participant) - course_session_users_resolved.append( - CourseSessionUserObjectsType( - id=f"{user.id}-as-ephemeral-supervisor", # noqa - user_id=user.id, # noqa - first_name=user.first_name, # noqa - last_name=user.last_name, # noqa - email=user.email, # noqa - avatar_url=user.avatar_url, # noqa - role=CourseSessionUser.Role.EXPERT, # noqa - circles=[ # noqa - CourseSessionUserExpertCircleType( # noqa - id=circle.id, # noqa - title=circle.title, # noqa - slug=circle.slug, # noqa - ) - for circle in circles - ], + if self.course.configuration.is_uk: + # happy path, members and experts + if me_csu: + for course_session_user in CourseSessionUser.objects.filter( + course_session_id=self.id + ).distinct(): + if course_session_user.id not in [ + user.id for user in course_session_users_resolved + ]: + _add_course_session_user(course_session_user) + else: + # VBV-708: user has only "AgentParticipantRole" and is not in the list of users + for rel in AgentParticipantRelation.objects.filter( + participant__course_session=self, agent=info.context.user + ): + if rel.participant_id not in [ + user.id for user in course_session_users_resolved + ]: + _add_course_session_user(rel.participant) + + # workaround for supervisor + # add supervisor to the list of users (as expert) + course_session_id = self.id # noqa + user = info.context.user # noqa + + if CourseSessionGroup.objects.filter( + course_session=course_session_id, supervisor=user + ).exists(): + if course_session := CourseSession.objects.filter( + id=course_session_id + ).first(): + circles = ( + course_session.course.get_learning_path() + .get_descendants() + .live() + .specific() + .exact_type(Circle) + ) + + course_session_users_resolved.append( + CourseSessionUserObjectsType( + id=f"{user.id}-as-ephemeral-supervisor", # noqa + user_id=user.id, # noqa + first_name=user.first_name, # noqa + last_name=user.last_name, # noqa + email=user.email, # noqa + avatar_url=user.avatar_url, # noqa + role=CourseSessionUser.Role.EXPERT, # noqa + circles=[ # noqa + CourseSessionUserExpertCircleType( # noqa + id=circle.id, # noqa + title=circle.title, # noqa + slug=circle.slug, # noqa + ) + for circle in circles + ], + ) ) - ) return course_session_users_resolved + + def _add_course_session_user( + self, course_session_user, course_session_users_resolved + ): + course_session_users_resolved.append( + CourseSessionUserObjectsType( + id=course_session_user.id, # noqa + user_id=course_session_user.user.id, # noqa + first_name=course_session_user.user.first_name, # noqa + last_name=course_session_user.user.last_name, # noqa + email=course_session_user.user.email, # noqa + avatar_url=course_session_user.user.avatar_url, # noqa + role=course_session_user.role, # noqa + circles=[ # noqa + CourseSessionUserExpertCircleType( # noqa + id=circle.id, # noqa + title=circle.title, # noqa + slug=circle.slug, # noqa + ) + for circle in course_session_user.expert.all() # noqa + ], + optional_attendance=course_session_user.optional_attendance, # noqa + ) + ) From 998dca04b037cefd9dc896e59f25a08719e65fb2 Mon Sep 17 00:00:00 2001 From: Daniel Egger Date: Tue, 17 Sep 2024 07:40:59 +0200 Subject: [PATCH 2/2] VBV-734: Do not check for non existing CourseSessionUser --- server/vbv_lernwelt/competence/graphql/queries.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/server/vbv_lernwelt/competence/graphql/queries.py b/server/vbv_lernwelt/competence/graphql/queries.py index fe3f2442..c94e7d6d 100644 --- a/server/vbv_lernwelt/competence/graphql/queries.py +++ b/server/vbv_lernwelt/competence/graphql/queries.py @@ -37,7 +37,9 @@ class CompetenceCertificateQuery(object): course_session_user = CourseSessionUser.objects.filter( user__id=user_id ).first() - if not can_view_profile(info.context.user, course_session_user): + if course_session_user is None or not can_view_profile( + info.context.user, course_session_user + ): return None setattr(info.context, "assignment_user_ids", user_ids) # noqa: B010