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:
parent
d66e392c73
commit
7c00ac1681
|
|
@ -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)]
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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:
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue