@@ -168,6 +168,45 @@ def get_renderer_context(self):
168168 return context
169169
170170
171+ class CoursePendingSubmissionDataViewSet (CourseSubmissionDataViewSet ):
172+ """
173+ The `pendingsubmissiondata` endpoint returns information in CSV format about the
174+ users' submissions in exercises in the course. Similar to the 'submissiondata' endpoint,
175+ but overrides the serialize_submissions method to include submissions with any status,
176+ such as waiting for grading or error.
177+ """
178+ include_all_submissions = True
179+ def serialize_submissions (
180+ self ,
181+ request : Request ,
182+ queryset : QuerySet [Submission ],
183+ revealed_ids : Set [int ],
184+ best : bool = False
185+ ) -> Response :
186+ submissions = list (queryset .order_by ('exercise_id' , 'id' ))
187+ if best :
188+ submissions = filter_best_submissions (submissions , revealed_ids , self .include_all_submissions )
189+
190+ # Pick out a single field.
191+ field = request .GET .get ('field' )
192+ if field :
193+ def submitted_field (submission , name ):
194+ for key ,val in (submission .submission_data or []):
195+ if key == name :
196+ return val
197+ return ""
198+ vals = [submitted_field (s , field ) for s in submissions ]
199+ return Response ([v for v in vals if v != "" ])
200+ data ,fields = submissions_sheet (request , submissions , revealed_ids )
201+ self .renderer_fields = fields
202+ response = Response (data )
203+ if isinstance (getattr (request , 'accepted_renderer' ), CSVRenderer ):
204+ response ['Content-Disposition' ] = 'attachment; filename="submissions.csv"'
205+ elif isinstance (getattr (request , 'accepted_renderer' ), APlusJSONRenderer ):
206+ response ['Content-Disposition' ] = 'attachment; filename="submissions.json"'
207+ return response
208+
209+
171210class CourseAggregateDataViewSet (NestedViewSetMixin ,
172211 MeUserMixin ,
173212 CourseResourceMixin ,
0 commit comments