Merged develop into feature/rename-caching-middleware

This commit is contained in:
Christian Cueni 2024-09-23 13:02:23 +00:00
commit 519bf71cbb
2 changed files with 101 additions and 41 deletions

View File

@ -37,7 +37,9 @@ class CompetenceCertificateQuery(object):
course_session_user = CourseSessionUser.objects.filter( course_session_user = CourseSessionUser.objects.filter(
user__id=user_id user__id=user_id
).first() ).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 return None
setattr(info.context, "assignment_user_ids", user_ids) # noqa: B010 setattr(info.context, "assignment_user_ids", user_ids) # noqa: B010

View File

@ -30,6 +30,7 @@ from vbv_lernwelt.course_session.models import (
) )
from vbv_lernwelt.course_session_group.models import CourseSessionGroup from vbv_lernwelt.course_session_group.models import CourseSessionGroup
from vbv_lernwelt.iam.permissions import has_course_access 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.graphql.types import LearningPathObjectType
from vbv_lernwelt.learnpath.models import Circle, CourseProfile from vbv_lernwelt.learnpath.models import Circle, CourseProfile
@ -248,13 +249,10 @@ class CourseSessionObjectType(DjangoObjectType):
def resolve_edoniq_tests(self, info): def resolve_edoniq_tests(self, info):
return CourseSessionEdoniqTest.objects.filter(course_session=self) return CourseSessionEdoniqTest.objects.filter(course_session=self)
def resolve_users(self, info): def resolve_users(self: CourseSession, info):
course_session_users_resolved: List[CourseSessionUserObjectsType] = [] course_session_users_resolved: List[CourseSessionUserObjectsType] = []
# happy path, members and experts def _add_course_session_user(course_session_user):
for course_session_user in CourseSessionUser.objects.filter(
course_session_id=self.id
).distinct():
course_session_users_resolved.append( course_session_users_resolved.append(
CourseSessionUserObjectsType( CourseSessionUserObjectsType(
id=course_session_user.id, # noqa id=course_session_user.id, # noqa
@ -276,43 +274,103 @@ class CourseSessionObjectType(DjangoObjectType):
) )
) )
# workaround for supervisor me_csu = CourseSessionUser.objects.filter(
# add supervisor to the list of users (as expert) course_session=self, user=info.context.user
course_session_id = self.id # noqa ).first()
user = info.context.user # noqa if me_csu:
_add_course_session_user(me_csu)
if CourseSessionGroup.objects.filter( if self.course.configuration.is_vv:
course_session=course_session_id, supervisor=user # VBV-708: only add users, which have a relation with the current user
).exists(): for rel in AgentParticipantRelation.objects.filter(
if course_session := CourseSession.objects.filter( participant__course_session=self, agent=info.context.user
id=course_session_id ):
).first(): if rel.participant_id not in [
circles = ( user.id for user in course_session_users_resolved
course_session.course.get_learning_path() ]:
.get_descendants() _add_course_session_user(rel.participant)
.live()
.specific()
.exact_type(Circle)
)
course_session_users_resolved.append( if self.course.configuration.is_uk:
CourseSessionUserObjectsType( # happy path, members and experts
id=f"{user.id}-as-ephemeral-supervisor", # noqa if me_csu:
user_id=user.id, # noqa for course_session_user in CourseSessionUser.objects.filter(
first_name=user.first_name, # noqa course_session_id=self.id
last_name=user.last_name, # noqa ).distinct():
email=user.email, # noqa if course_session_user.id not in [
avatar_url=user.avatar_url, # noqa user.id for user in course_session_users_resolved
role=CourseSessionUser.Role.EXPERT, # noqa ]:
circles=[ # noqa _add_course_session_user(course_session_user)
CourseSessionUserExpertCircleType( # noqa else:
id=circle.id, # noqa # VBV-708: user has only "AgentParticipantRole" and is not in the list of users
title=circle.title, # noqa for rel in AgentParticipantRelation.objects.filter(
slug=circle.slug, # noqa participant__course_session=self, agent=info.context.user
) ):
for circle in circles 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 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
)
)