@@ -278,10 +278,8 @@ def to_django_model(self, course_id: int) -> Course:
278278
279279
280280class InstructorResponse (BaseModel ):
281- id : int
282- email : str
283-
284- model_config = ConfigDict (from_attributes = True )
281+ display_name : str
282+ photo : Optional [str ] = None
285283
286284
287285class CourseResponse (BaseModel ):
@@ -335,7 +333,11 @@ def from_django_model(
335333 "is_public" : course .is_public ,
336334 "instructors" : [
337335 InstructorResponse (
338- id = instructor .org_user .id , email = instructor .org_user .user .email
336+ display_name = instructor .org_user .display_name
337+ or instructor .org_user .user .email ,
338+ photo = instructor .org_user .photo .name
339+ if instructor .org_user .photo
340+ else None ,
339341 )
340342 for instructor in course .instructors .all ()
341343 ],
@@ -806,6 +808,11 @@ class ReviewResult(enum.StrEnum):
806808 REQUESTING_CHANGES = "requesting_changes"
807809
808810
811+ class ReviewRquest (BaseModel ):
812+ review_result : ReviewResult
813+ comment : Optional [str ] = None
814+
815+
809816class DeactivatedEvent (BaseModel ):
810817 type : Literal [EventType .DEACTIVATED ] = Field (
811818 default = EventType .DEACTIVATED , exclude = True
@@ -1195,3 +1202,84 @@ def serialize_waiting_period(self, waiting_period: int) -> dict:
11951202
11961203class ReorderCourseContentsRequest (BaseModel ):
11971204 ordered_content_ids : list [int ] = Field (min_length = 2 , examples = [[3 , 1 , 2 ]])
1205+
1206+
1207+ class FeedbackResponse (BaseModel ):
1208+ comment : str
1209+ provided_by : InstructorResponse
1210+ provided_at : datetime
1211+
1212+
1213+ class AssignmentSubmissionResponse (BaseModel ):
1214+ id : int
1215+ assignment_title : str
1216+ submitted_at : datetime
1217+ status : AssignmentSubmission .SubmissionStatus
1218+ reviewed_at : Optional [datetime ] = None
1219+ reviewed_by : Optional [InstructorResponse ] = None
1220+ file_submission : Optional [str ] = None
1221+ text_submission : Optional [str ] = None
1222+ feedbacks : list [FeedbackResponse ] = []
1223+
1224+ @staticmethod
1225+ def from_django_model (
1226+ submission : AssignmentSubmission ,
1227+ request : Any ,
1228+ ) -> "AssignmentSubmissionResponse" :
1229+ return AssignmentSubmissionResponse (
1230+ id = submission .id ,
1231+ assignment_title = submission .delivery .course_content .assignment .title , # type: ignore[union-attr]
1232+ submitted_at = submission .submitted_at ,
1233+ status = AssignmentSubmission .SubmissionStatus (submission .status ),
1234+ reviewed_at = submission .reviewed_at ,
1235+ reviewed_by = InstructorResponse (
1236+ display_name = submission .reviewer .display_name
1237+ or submission .reviewer .user .email , # type: ignore[union-attr]
1238+ photo = request .build_absolute_uri (submission .reviewer .photo .url )
1239+ if submission .reviewer .photo
1240+ else None ,
1241+ )
1242+ if submission .reviewer
1243+ else None , # type: ignore[union-attr]
1244+ file_submission = submission .private_file_url (),
1245+ text_submission = submission .text_submission ,
1246+ feedbacks = [
1247+ FeedbackResponse (
1248+ comment = feedback .comment ,
1249+ provided_by = InstructorResponse (
1250+ display_name = feedback .provided_by .display_name # type: ignore[union-attr]
1251+ or feedback .provided_by .user .email , # type: ignore[union-attr]
1252+ photo = request .build_absolute_uri (feedback .provided_by .photo .url )
1253+ if feedback .provided_by .photo
1254+ else None ,
1255+ ),
1256+ provided_at = feedback .provided_at ,
1257+ )
1258+ for feedback in submission .feedbacks .all ()
1259+ if feedback .provided_by # type: ignore[union-attr]
1260+ ],
1261+ )
1262+
1263+
1264+ class AssignmentSubmissionSummaryResponse (BaseModel ):
1265+ id : int
1266+ assignment_title : str
1267+ submitted_at : datetime
1268+ status : AssignmentSubmission .SubmissionStatus
1269+ reviewed_at : Optional [datetime ] = None
1270+ reviewed_by : Optional [str ] = None
1271+
1272+ @staticmethod
1273+ def from_django_model (
1274+ submission : AssignmentSubmission ,
1275+ ) -> "AssignmentSubmissionSummaryResponse" :
1276+ return AssignmentSubmissionSummaryResponse (
1277+ id = submission .id ,
1278+ assignment_title = submission .delivery .course_content .assignment .title , # type: ignore[union-attr]
1279+ submitted_at = submission .submitted_at ,
1280+ status = AssignmentSubmission .SubmissionStatus (submission .status ),
1281+ reviewed_at = submission .reviewed_at ,
1282+ reviewed_by = submission .reviewer .display_name
1283+ if submission .reviewer
1284+ else None , # type: ignore[union-attr]
1285+ )
0 commit comments