Skip to content

Commit ea86b2e

Browse files
authored
Merge pull request #25 from DevOps-Cloud-Team5/SCRUM-90-Course-info
allow disenrollment from course
2 parents 7039be3 + 91592f7 commit ea86b2e

File tree

3 files changed

+33
-2
lines changed

3 files changed

+33
-2
lines changed

api/models.py

+5
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,11 @@ def get_lectures_week(self, year : int, week : int):
8282
def is_user_enrolled(self, user : User):
8383
return bool(UserCourse.objects.filter(user=user, course=self))
8484

85+
def remove_user_from_course(self, user : User):
86+
queryset = UserCourse.objects.filter(user=user, course=self)
87+
if not queryset: return
88+
queryset[0].delete()
89+
8590
def add_user_to_course(self, user: User):
8691
UserCourse.objects.create(user=user, course=self).save()
8792

api/urls.py

+2
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
from django_rest_passwordreset.views import ResetPasswordConfirm, ResetPasswordValidateToken
2020
from .views import (
2121
AddLectureView,
22+
DisenrollCourseView,
2223
GetCourseLecturesView,
2324
GetFullCoursePage,
2425
GetLectureView,
@@ -75,6 +76,7 @@
7576
path('course/update/<pk>', UpdateCourseView.as_view(), name='course_update'),
7677
path('course/delete/<pk>', DestroyCourseView.as_view(), name='course_delete'),
7778
path('course/enroll/<pk>', EnrollCourseView.as_view(), name='course_enroll'),
79+
path('course/disenroll/<pk>', DisenrollCourseView.as_view(), name='course_enroll'),
7880
path('course/mass_enroll/<pk>', MassEnrollCourseView.as_view(), name='course_mass_enroll'),
7981
path('course/get/<pk>', GetFullCoursePage.as_view(), name='course_get'),
8082
path('course/getall/', GetCoursesAll.as_view(), name='course_getall'),

api/views.py

+26-2
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
from .permissions import IsTeacher, IsAdmin, IsStudent
1818
from .models import Course, AccountRoles, CourseLecture
1919

20-
from .serializers import AddLectureSerializer, CourseUserSerializer, CustomTokenSerializer, CreateUserSerializer, LectureSerializer, MassEnrollSerializer, SetAttendenceTeacherSerializer, UserSerializer, CourseCreateSerializer, CourseSerializer
20+
from .serializers import AddLectureSerializer, CourseUserSerializer, CustomTokenSerializer, CreateUserSerializer, LectureSerializer, MailTestSerializer, MassEnrollSerializer, SetAttendenceTeacherSerializer, UserSerializer, CourseCreateSerializer, CourseSerializer
2121

2222

2323

@@ -242,6 +242,7 @@ def get(self, request, pk):
242242
if not queryset:
243243
return Response({"error": f"course id '{pk}' not found"}, status=status.HTTP_404_NOT_FOUND)
244244

245+
user = User.objects.all().filter(username=request.user.username)[0]
245246
course : Course = queryset[0]
246247
teachers = course.get_teachers()
247248
students = course.get_enrolled_students()
@@ -251,11 +252,11 @@ def get(self, request, pk):
251252
response_data["course_name"] = course.course_name
252253
response_data["num_teachers"] = len(teachers)
253254
response_data["num_students"] = len(students)
255+
response_data["enrolled"] = course.is_user_enrolled(user=user)
254256
response_data["attended"] = -1
255257
response_data["missed"] = -1
256258
response_data["users"] = CourseUserSerializer((teachers + students), many=True).data
257259

258-
user = User.objects.all().filter(username=request.user.username)[0]
259260
if user.role == AccountRoles.STUDENT:
260261
response_data |= self.get_attendence_stats(course, user)
261262

@@ -305,6 +306,29 @@ def post(self, request, *args, **kwargs):
305306

306307
return Response({"ok": f"succesfully enrolled {username} in {obj.course_name}"}, status=status.HTTP_200_OK)
307308

309+
class DisenrollCourseView(generics.GenericAPIView):
310+
authentication_classes = [JWTAuthentication]
311+
permission_classes = [IsStudent]
312+
lookup_field = 'pk'
313+
314+
queryset = Course.objects.all()
315+
serializer_class = CourseSerializer
316+
317+
def post(self, request, *args, **kwargs):
318+
obj : Course = self.get_object()
319+
user = request.user
320+
username = user.username
321+
322+
if not obj.is_user_enrolled(request.user):
323+
return Response({"error": f"{username} is not enrolled in {obj.course_name}"}, status=status.HTTP_400_BAD_REQUEST)
324+
325+
obj.remove_user_from_course(user)
326+
327+
if getattr(obj, '_prefetched_objects_cache', None):
328+
obj._prefetched_objects_cache = {}
329+
330+
return Response({"ok": f"succesfully disenrolled {username} from {obj.course_name}"}, status=status.HTTP_200_OK)
331+
308332
class MassEnrollCourseView(generics.GenericAPIView):
309333
authentication_classes = [JWTAuthentication]
310334
permission_classes = [IsAdmin]

0 commit comments

Comments
 (0)