from dataclasses import dataclass from typing import List, Set from rest_framework.decorators import api_view from rest_framework.exceptions import PermissionDenied from rest_framework.response import Response from vbv_lernwelt.core.models import User from vbv_lernwelt.course.models import CourseSession, CourseSessionUser from vbv_lernwelt.course.serializers import CourseSessionSerializer from vbv_lernwelt.course.views import logger from vbv_lernwelt.course_session_group.models import CourseSessionGroup from vbv_lernwelt.learning_mentor.models import LearningMentor @dataclass(frozen=True) class CourseSessionWithRoles: _original: CourseSession roles: Set[str] def __getattr__(self, name: str): # Delegate attribute access to the _original CourseSession object return getattr(self._original, name) def save(self, *args, **kwargs): raise NotImplementedError("This proxy object cannot be saved.") def get_course_sessions_with_roles_for_user(user: User) -> List[CourseSessionWithRoles]: result_course_sessions = {} # participant/member/expert course sessions csu_qs = CourseSessionUser.objects.filter(user=user).prefetch_related( "course_session", "course_session__course" ) for csu in csu_qs: cs = csu.course_session # member/expert is mutually exclusive... cs.roles = {csu.role} result_course_sessions[cs.id] = cs # enrich with supervisor course sessions csg_qs = CourseSessionGroup.objects.filter(supervisor=user).prefetch_related( "course_session", "course_session__course" ) for csg in csg_qs: for cs in csg.course_session.all(): cs.roles = set() cs = result_course_sessions.get(cs.id, cs) cs.roles.add("SUPERVISOR") result_course_sessions[cs.id] = cs # enrich with mentor course sessions lm_qs = LearningMentor.objects.filter(mentor=user).prefetch_related( "course_session", "course_session__course" ) for lm in lm_qs: cs = lm.course_session cs.roles = set() cs = result_course_sessions.get(cs.id, cs) cs.roles.add("LEARNING_MENTOR") result_course_sessions[cs.id] = cs return [ CourseSessionWithRoles(cs, cs.roles) for cs in result_course_sessions.values() ] @api_view(["GET"]) def get_dashboard_persons(request): try: course_sessions = get_course_sessions_with_roles_for_user(request.user) all_to_serialize = course_sessions return Response( status=200, data=CourseSessionSerializer( all_to_serialize, many=True, context={"user": request.user} ).data, ) except PermissionDenied as e: raise e except Exception as e: logger.error(e, exc_info=True) return Response({"error": str(e)}, status=404)