feat: cockpit type

This commit is contained in:
Reto Aebersold 2023-12-11 16:51:33 +01:00
parent 3e2cededc7
commit e2c32b7fb6
7 changed files with 106 additions and 1 deletions

View File

@ -11,6 +11,7 @@ from django.views.decorators.csrf import csrf_exempt
from django_ratelimit.exceptions import Ratelimited
from graphene_django.views import GraphQLView
from vbv_lernwelt.api.user import get_cockpit_type
from vbv_lernwelt.assignment.views import request_assignment_completion_status
from vbv_lernwelt.core.middleware.auth import django_view_authentication_exempt
from vbv_lernwelt.core.schema import schema
@ -124,6 +125,9 @@ urlpatterns = [
path(r"api/course/completion/<signed_int:course_session_id>/<uuid:user_id>/",
request_course_completion_for_user,
name="request_course_completion_for_user"),
path(r"api/course/<int:course_id>/cockpit/",
get_cockpit_type,
name="get_cockpit_type"),
path("api/mentor/<signed_int:course_session_id>/", include("vbv_lernwelt.learning_mentor.urls")),

View File

View File

@ -0,0 +1,59 @@
from django.urls import reverse
from rest_framework import status
from rest_framework.test import APITestCase
from vbv_lernwelt.course.creators.test_utils import (
create_course,
create_course_session,
create_user,
)
from vbv_lernwelt.course.models import CourseSessionUser
from vbv_lernwelt.learning_mentor.models import LearningMentor
class MeUserViewTest(APITestCase):
def setUp(self) -> None:
self.course, _ = create_course("Test Course")
self.user = create_user("tester")
self.url = reverse("get_cockpit_type", kwargs={"course_id": self.course.id})
def test_no_cockpit(self) -> None:
# GIVEN
self.client.force_login(self.user)
# WHEN
response = self.client.get(self.url)
# THEN
self.assertEqual(response.status_code, status.HTTP_200_OK)
self.assertEquals(response.data["type"], None)
def test_mentor_cockpit(self) -> None:
# GIVEN
self.client.force_login(self.user)
LearningMentor.objects.create(mentor=self.user, course=self.course)
# WHEN
response = self.client.get(self.url)
# THEN
self.assertEqual(response.status_code, status.HTTP_200_OK)
self.assertEquals(response.data["type"], "mentor")
def test_trainer_cockpit(self) -> None:
# GIVEN
self.client.force_login(self.user)
course_session = create_course_session(course=self.course, title="Test Session")
CourseSessionUser.objects.create(
user=self.user,
course_session=course_session,
role=CourseSessionUser.Role.EXPERT,
)
# WHEN
response = self.client.get(self.url)
# THEN
self.assertEqual(response.status_code, status.HTTP_200_OK)
self.assertEquals(response.data["type"], "trainer")

View File

@ -0,0 +1,27 @@
from django.shortcuts import get_object_or_404
from rest_framework.decorators import api_view, permission_classes
from rest_framework.generics import get_object_or_404
from rest_framework.permissions import IsAuthenticated
from rest_framework.response import Response
from vbv_lernwelt.course.models import Course, CourseSessionUser
from vbv_lernwelt.learning_mentor.models import LearningMentor
@api_view(["GET"])
@permission_classes([IsAuthenticated])
def get_cockpit_type(request, course_id: int):
course = get_object_or_404(Course, id=course_id)
cockpit_type = None
if LearningMentor.objects.filter(mentor=request.user, course=course).exists():
cockpit_type = "mentor"
elif CourseSessionUser.objects.filter(
user=request.user,
course_session__course=course,
role=CourseSessionUser.Role.EXPERT,
).exists():
cockpit_type = "trainer"
return Response({"type": cockpit_type})

View File

@ -269,7 +269,6 @@ class CourseSessionUser(models.Model):
class Role(models.TextChoices):
MEMBER = "MEMBER", _("Teilnehmer")
EXPERT = "EXPERT", _("Experte/Trainer")
TUTOR = "TUTOR", _("Lernbegleitung")
role = models.CharField(choices=Role.choices, max_length=255, default=Role.MEMBER)

View File

@ -153,4 +153,20 @@ def remove_self_from_mentor(request, course_session_id: int, mentor_id: int):
@api_view(["POST"])
@permission_classes([IsAuthenticated])
def accept_invitation(request, course_session_id: int):
course_session = get_object_or_404(CourseSession, id=course_session_id)
invitation = get_object_or_404(
MentorInvitation, id=request.data.get("invitation_id")
)
if invitation.participant.course_session != course_session:
return Response(
data={"message": "Invalid invitation"}, status=status.HTTP_400_BAD_REQUEST
)
mentor, _ = LearningMentor.objects.get_or_create(
mentor=request.user, course=course_session.course
)
mentor.participants.add(invitation.participant)
return Response({})