Advertisement
themaleem

api_views.py

Jul 17th, 2023
24
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.57 KB | None | 0 0
  1. from django.db import transaction
  2. from rest_framework import serializers
  3. from django.contrib.auth.models import Group
  4. from rest_framework.response import Response
  5. from rest_framework import generics, permissions
  6. from rest_framework import permissions, viewsets, status
  7.  
  8. from users.models import Student
  9. from studentregistration.models import Module, Group, Registration
  10. from .serializers import (
  11. StudentSerializer,
  12. UserSerializer,
  13. ModuleSerializer,
  14. CourseSerializer,
  15. RegistrationSerializer,
  16. )
  17. from registrationapps.permissions import IsAdminUserOrReadOnly, IsOwnerOrAdmin
  18.  
  19.  
  20. class StudentViewSet(viewsets.ModelViewSet):
  21. """
  22. A viewset that provides default `create()`, `list()`, and `retrieve()` actions.
  23. """
  24.  
  25. queryset = Student.objects.all()
  26. serializer_class = StudentSerializer
  27. name = "student-list"
  28. permission_classes = [IsOwnerOrAdmin]
  29.  
  30. def create(self, request, *args, **kwargs):
  31. course_name = request.data.get("course")
  32. course = Group.objects.get(name=course_name)
  33.  
  34. user_data = request.data.get("user")
  35. student_data = request.data.copy()
  36. student_data.pop("user", None)
  37. student_data["course"] = course
  38.  
  39. user_serializer = UserSerializer(data=user_data)
  40.  
  41. # initialize a user object
  42. user = None
  43. if user_serializer.is_valid():
  44. try:
  45. with transaction.atomic():
  46. user = user_serializer.save()
  47. student_serializer = StudentSerializer(data=student_data)
  48. if student_serializer.is_valid():
  49. student = Student.objects.create(
  50. user=user, **student_data, course=course
  51. )
  52. response_serializer = StudentSerializer(student)
  53. return Response(
  54. response_serializer.data, status=status.HTTP_201_CREATED
  55. )
  56. else:
  57. raise serializers.ValidationError(student_serializer.errors)
  58. except Exception as e:
  59. # delete use object if any error occurs
  60. user.delete()
  61. raise e
  62. else:
  63. return Response(user_serializer.errors, status=status.HTTP_400_BAD_REQUEST)
  64.  
  65.  
  66. class StudentDetail(generics.RetrieveUpdateDestroyAPIView):
  67. queryset = Student.objects.all()
  68. serializer_class = StudentSerializer
  69. lookup_field = "user__username"
  70. lookup_url_kwarg = "username"
  71. name = "student-detail"
  72. permission_classes = [IsOwnerOrAdmin]
  73.  
  74.  
  75. class ModuleViewSet(viewsets.ModelViewSet):
  76. queryset = Module.objects.all()
  77. serializer_class = ModuleSerializer
  78. name = "module"
  79. permission_classes = [IsAdminUserOrReadOnly]
  80.  
  81. def create(self, request, *args, **kwargs):
  82. courses_data = request.data.pop("courses", [])
  83. serializer = self.get_serializer(data=request.data)
  84. serializer.is_valid(raise_exception=True)
  85.  
  86. module = serializer.save()
  87.  
  88. if courses_data:
  89. courses = Group.objects.filter(name__in=courses_data)
  90. module.courses.set(courses)
  91.  
  92. response_serializer = self.get_serializer(module)
  93. return Response(response_serializer.data, status=status.HTTP_201_CREATED)
  94.  
  95.  
  96. class ModuleDetail(generics.RetrieveUpdateDestroyAPIView):
  97. queryset = Module.objects.all()
  98. serializer_class = ModuleSerializer
  99. lookup_field = "code"
  100. name = "module-detail"
  101. permission_classes = [IsAdminUserOrReadOnly]
  102.  
  103.  
  104. class CourseViewSet(viewsets.ModelViewSet):
  105. queryset = Group.objects.all()
  106. serializer_class = CourseSerializer
  107. name = "course"
  108. permission_classes = [IsAdminUserOrReadOnly]
  109.  
  110.  
  111. # @note we might use this for course details lookup by course name
  112. # class CourseDetail(generics.RetrieveUpdateDestroyAPIView):
  113. # queryset = Group.objects.all()
  114. # serializer_class = CourseSerializer
  115. # lookup_field = "name"
  116. # name = "course-detail"
  117. # permission_classes = [IsAdminUserOrReadOnly]
  118.  
  119.  
  120. # @todo review permissions
  121. class RegistrationViewSet(viewsets.ModelViewSet):
  122. queryset = Registration.objects.all()
  123. serializer_class = RegistrationSerializer
  124. name = "registration"
  125. permission_classes = [permissions.IsAuthenticated]
  126.  
  127.  
  128. class RegistrationDetail(generics.RetrieveUpdateDestroyAPIView):
  129. queryset = Registration.objects.all()
  130. serializer_class = RegistrationSerializer
  131. name = "module-detail"
  132. permission_classes = [IsOwnerOrAdmin]
  133.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement