14
14
15
15
from .permissions import IsTeacher , IsAdmin , IsStudent
16
16
from .models import Course , AccountRoles
17
- from .serializers import CustomTokenSerializer , CreateUserSerializer , UserSerializer , CourseCreateSerializer , CourseSerializer
17
+ from .serializers import CustomTokenSerializer , CreateUserSerializer , MassEnrollSerializer , UserSerializer , CourseCreateSerializer , CourseSerializer
18
18
19
19
import pdb
20
20
@@ -162,51 +162,66 @@ class CreateCourseView(generics.CreateAPIView):
162
162
class UpdateCourseView (generics .UpdateAPIView ):
163
163
authentication_classes = [JWTAuthentication ]
164
164
permission_classes = [IsTeacher ]
165
- lookup_field = 'course_id '
165
+ lookup_field = 'pk '
166
166
167
167
queryset = Course .objects .all ()
168
168
serializer_class = CourseSerializer
169
169
170
170
class DestroyCourseView (generics .DestroyAPIView ):
171
171
authentication_classes = [JWTAuthentication ]
172
172
permission_classes = [IsTeacher ]
173
- lookup_field = 'course_id '
173
+ lookup_field = 'pk '
174
174
175
175
queryset = Course .objects .all ()
176
176
serializer_class = CourseSerializer
177
177
178
- # TODO: fix which username is enrolled
179
178
class EnrollCourseView (generics .GenericAPIView ):
180
179
authentication_classes = [JWTAuthentication ]
181
180
permission_classes = [IsStudent ]
182
- lookup_field = 'course_id '
181
+ lookup_field = 'pk '
183
182
184
183
queryset = Course .objects .all ()
185
184
serializer_class = CourseSerializer
186
185
187
186
def post (self , request , * args , ** kwargs ):
188
- req = request .data
189
- username = request .user .username
190
- if "username" not in req or req ["username" ] == "" :
191
- return Response ({"error" , "username is required" }, status = status .HTTP_400_BAD_REQUEST )
187
+ if request .user .role == AccountRoles .ADMIN :
188
+ return Response ({"error" : f"cannot enroll an admin account into a course" }, status = status .HTTP_400_BAD_REQUEST )
192
189
193
- if request .user .role != "admin" and username != req ["username" ]:
194
- return Response ({"error" , "user does not have permissions for this action" }, status = status .HTTP_401_UNAUTHORIZED )
195
-
196
- obj = self .get_object ()
197
- key , target_list = ("enrolled_students" , obj .enrolled_students ) if request .user .role == "student" else ("teachers" , obj .teachers )
198
-
199
- if req ["username" ] in target_list :
200
- return Response ({"error" , f"user '{ req .username } ' is already part of '{ obj .course_id } '" }, status = status .HTTP_400_BAD_REQUEST )
190
+ obj : Course = self .get_object ()
191
+ user = request .user
192
+ username = user .username
201
193
202
- data = { key : target_list + [ req [ "username" ]]}
203
- serializer = self . get_serializer ( obj , data = data , partial = True )
204
- serializer . is_valid ( raise_exception = True )
205
- serializer . save ( )
194
+ if obj . is_user_enrolled ( request . user ):
195
+ return Response ({ "error" : f" { username } is already enrolled in { obj . course_name } " }, status = status . HTTP_400_BAD_REQUEST )
196
+
197
+ obj . add_user_to_course ( user )
206
198
207
199
if getattr (obj , '_prefetched_objects_cache' , None ):
208
200
obj ._prefetched_objects_cache = {}
209
- return Response (serializer .data )
201
+
202
+ return Response ({"ok" : f"succesfully enrolled { username } in { obj .course_name } " }, status = status .HTTP_200_OK )
203
+
204
+ class MassEnrollCourseView (generics .GenericAPIView ):
205
+ authentication_classes = [JWTAuthentication ]
206
+ permission_classes = [IsAdmin ]
207
+ lookup_field = 'pk'
208
+
209
+ queryset = Course .objects .all ()
210
+ serializer_class = CourseSerializer
211
+
212
+ # Mass enroll students through admin accounts
213
+ def post (self , request , * args , ** kwargs ):
214
+ course : Course = self .get_object ()
215
+ result = MassEnrollSerializer (data = request .data , context = { "course" : course })
216
+ result .is_valid (raise_exception = True )
217
+
218
+ queryset = User .objects .all ()
219
+ usernames = result .data ["usernames" ]
220
+ for username in usernames :
221
+ user = queryset .filter (username = username )[0 ]
222
+ course .add_user_to_course (user )
223
+
224
+ return Response ({"ok" : f"succesfully enrolled { len (usernames )} students" }, status = status .HTTP_200_OK )
210
225
211
226
class GetCourseByName (generics .RetrieveAPIView ):
212
227
authentication_classes = [JWTAuthentication ]
@@ -215,11 +230,11 @@ class GetCourseByName(generics.RetrieveAPIView):
215
230
queryset = Course .objects .all ()
216
231
serializer_class = CourseSerializer
217
232
218
- def get (self , _ , course_id ):
219
- queryset = self .get_queryset ().filter (course_id = course_id )
233
+ def get (self , _ , pk ):
234
+ queryset = self .get_queryset ().filter (pk = pk )
220
235
serializer = self .serializer_class (queryset , many = True )
221
236
if len (serializer .data ) == 0 :
222
- return Response ({"error" : f"course ' { course_id } ' not found" }, status = status .HTTP_404_NOT_FOUND )
237
+ return Response ({"error" : f"course id ' { pk } ' not found" }, status = status .HTTP_404_NOT_FOUND )
223
238
else :
224
239
return Response (serializer .data , status = status .HTTP_200_OK )
225
240
0 commit comments