hack: extremely hack to make supervisor dashboard navigation to cockpit semi-work

not sure how this could be done nicer :-/
This commit is contained in:
Livio Bieri 2023-10-26 18:30:36 +02:00
parent d66e392c73
commit 7c00ac1681
3 changed files with 45 additions and 9 deletions

View File

@ -1,8 +1,11 @@
from typing import List
from rest_framework import serializers from rest_framework import serializers
from rest_framework.renderers import JSONRenderer from rest_framework.renderers import JSONRenderer
from vbv_lernwelt.core.models import User from vbv_lernwelt.core.models import User
from vbv_lernwelt.course.models import CourseSessionUser from vbv_lernwelt.course.models import CourseSessionUser
from vbv_lernwelt.course_session_group.models import CourseSessionGroup
def create_json_from_objects(objects, serializer_class, many=True) -> str: def create_json_from_objects(objects, serializer_class, many=True) -> str:
@ -35,9 +38,17 @@ class UserSerializer(serializers.ModelSerializer):
"username", "username",
] ]
def get_course_session_experts(self, obj): def get_course_session_experts(self, obj: User) -> List[str]:
qs = CourseSessionUser.objects.filter( supervisor_in_session_ids = set(
role=CourseSessionUser.Role.EXPERT, user=obj CourseSessionGroup.objects.filter(supervisor=obj).values_list(
"course_session__id", flat=True
)
) )
return [str(csu.course_session.id) for csu in qs] expert_in_session_ids = set(
CourseSessionUser.objects.filter(
role=CourseSessionUser.Role.EXPERT, user=obj
).values_list("course_session__id", flat=True)
)
return [str(_id) for _id in (supervisor_in_session_ids | expert_in_session_ids)]

View File

@ -14,6 +14,7 @@ from vbv_lernwelt.course.serializers import (
DocumentUploadStartInputSerializer, DocumentUploadStartInputSerializer,
) )
from vbv_lernwelt.course.services import mark_course_completion from vbv_lernwelt.course.services import mark_course_completion
from vbv_lernwelt.course_session_group.models import CourseSessionGroup
from vbv_lernwelt.files.models import UploadFile from vbv_lernwelt.files.models import UploadFile
from vbv_lernwelt.files.services import FileDirectUploadService from vbv_lernwelt.files.services import FileDirectUploadService
from vbv_lernwelt.iam.permissions import ( from vbv_lernwelt.iam.permissions import (
@ -129,11 +130,24 @@ def mark_course_completion_view(request):
@api_view(["GET"]) @api_view(["GET"])
def get_course_sessions(request): def get_course_sessions(request):
try: try:
course_sessions = course_sessions_for_user_qs(request.user).prefetch_related( # participant/member/expert course sessions
"course" regular_course_sessions = course_sessions_for_user_qs(
) request.user
).prefetch_related("course")
# enrich with supervisor course sessions
supervisor_course_sessions = CourseSession.objects.filter(
id__in=CourseSessionGroup.objects.filter(
supervisor=request.user
).values_list("course_session", flat=True)
).prefetch_related("course")
all_to_serialize = (
regular_course_sessions | supervisor_course_sessions
).distinct()
return Response( return Response(
status=200, data=CourseSessionSerializer(course_sessions, many=True).data status=200, data=CourseSessionSerializer(all_to_serialize, many=True).data
) )
except PermissionDenied as e: except PermissionDenied as e:
raise e raise e

View File

@ -12,6 +12,11 @@ def has_course_access(user, course_id):
if user.is_superuser: if user.is_superuser:
return True return True
if CourseSessionGroup.objects.filter(
course_session__course_id=course_id, supervisor=user
).exists():
return True
return CourseSessionUser.objects.filter( return CourseSessionUser.objects.filter(
course_session__course_id=course_id, user=user course_session__course_id=course_id, user=user
).exists() ).exists()
@ -30,12 +35,18 @@ def is_course_session_expert(user, course_session_id: int):
if user.is_superuser: if user.is_superuser:
return True return True
return CourseSessionUser.objects.filter( is_supervisor = CourseSessionGroup.objects.filter(
supervisor=user, course_session__id=course_session_id
).exists()
is_expert = CourseSessionUser.objects.filter(
course_session_id=course_session_id, course_session_id=course_session_id,
user=user, user=user,
role=CourseSessionUser.Role.EXPERT, role=CourseSessionUser.Role.EXPERT,
).exists() ).exists()
return is_supervisor or is_expert
def course_sessions_for_user_qs(user): def course_sessions_for_user_qs(user):
if user.is_superuser: if user.is_superuser: