@@ -91,13 +91,15 @@ def fork_exercise(self, exercise_id, group_id):
91
91
})
92
92
93
93
def add_exercise_attachments (self , exercise_id , file_ids ):
94
- self .post ("/exercises/{}/attachment-files" .format (exercise_id ), data = {"files" : file_ids })
94
+ self .post ("/exercises/{}/attachment-files" .format (exercise_id ),
95
+ data = {"files" : file_ids })
95
96
96
97
def get_exercise_attachments (self , exercise_id ):
97
98
return self .get ("/exercises/{}/attachment-files" .format (exercise_id ))
98
99
99
100
def add_exercise_files (self , exercise_id , file_ids ):
100
- self .post ("/exercises/{}/supplementary-files" .format (exercise_id ), data = {"files" : file_ids })
101
+ self .post ("/exercises/{}/supplementary-files" .format (exercise_id ),
102
+ data = {"files" : file_ids })
101
103
102
104
def get_exercise_files (self , exercise_id ):
103
105
return self .get ("/exercises/{}/supplementary-files" .format (exercise_id ))
@@ -109,13 +111,16 @@ def update_exercise(self, exercise_id, details):
109
111
self .post ('/exercises/{}' .format (exercise_id ), data = details )
110
112
111
113
def set_exercise_archived (self , exercise_id , archived ):
112
- self .post ('/exercises/{}/archived' .format (exercise_id ), data = {"archived" : archived })
114
+ self .post ('/exercises/{}/archived' .format (exercise_id ),
115
+ data = {"archived" : archived })
113
116
114
117
def set_exercise_author (self , exercise_id , author ):
115
- self .post ('/exercises/{}/author' .format (exercise_id ), data = {"author" : author })
118
+ self .post ('/exercises/{}/author' .format (exercise_id ),
119
+ data = {"author" : author })
116
120
117
121
def set_exercise_admins (self , exercise_id , admins_ids ):
118
- self .post ('/exercises/{}/admins' .format (exercise_id ), data = {"admins" : admins_ids })
122
+ self .post ('/exercises/{}/admins' .format (exercise_id ),
123
+ data = {"admins" : admins_ids })
119
124
120
125
def delete_exercise (self , exercise_id ):
121
126
self .delete ('/exercises/{}' .format (exercise_id ))
@@ -146,10 +151,12 @@ def get_exercise_config(self, exercise_id):
146
151
return self .get ("/exercises/{}/config" .format (exercise_id ))
147
152
148
153
def update_exercise_config (self , exercise_id , config ):
149
- self .post ("/exercises/{}/config" .format (exercise_id ), data = {"config" : config })
154
+ self .post ("/exercises/{}/config" .format (exercise_id ),
155
+ data = {"config" : config })
150
156
151
157
def set_exercise_tests (self , exercise_id , tests ):
152
- self .post ("/exercises/{}/tests" .format (exercise_id ), data = {"tests" : tests })
158
+ self .post ("/exercises/{}/tests" .format (exercise_id ),
159
+ data = {"tests" : tests })
153
160
154
161
def get_exercise_tests (self , exercise_id ):
155
162
return self .get ("/exercises/{}/tests" .format (exercise_id ))
@@ -159,7 +166,8 @@ def update_limits(self, exercise_id, environment_id, hwgroup_id, limits):
159
166
data = {"limits" : limits })
160
167
161
168
def evaluate_reference_solutions (self , exercise_id ):
162
- self .post ("/reference-solutions/exercise/{}/evaluate" .format (exercise_id ), data = {})
169
+ self .post (
170
+ "/reference-solutions/exercise/{}/evaluate" .format (exercise_id ), data = {})
163
171
164
172
def resubmit_reference_solution (self , ref_solution_id , debug = False ):
165
173
return self .post ("/reference-solutions/{}/resubmit" .format (ref_solution_id ), data = {"debug" : debug })
@@ -243,23 +251,35 @@ def get_users_list(self, user_ids):
243
251
def get_all_groups (self , archived = False ):
244
252
return self .get ("/groups?{}" .format ('archived=1' if archived else '' ))
245
253
254
+ def create_group (self , data ):
255
+ return self .post ("/groups/" , data = data )
256
+
246
257
def get_group (self , group_id ):
247
258
return self .get ("/groups/{}" .format (group_id ))
248
259
249
260
def get_group_assignments (self , group_id ):
250
261
return self .get ("/groups/{}/assignments" .format (group_id ))
251
262
263
+ def get_group_shadow_assignments (self , group_id ):
264
+ return self .get ("/groups/{}/shadow-assignments" .format (group_id ))
265
+
252
266
def group_add_student (self , group_id , user_id ):
253
267
return self .post ("/groups/{}/students/{}" .format (group_id , user_id ))
254
268
255
269
def group_remove_student (self , group_id , user_id ):
256
270
return self .delete ("/groups/{}/students/{}" .format (group_id , user_id ))
257
271
258
272
def group_attach_exercise (self , group_id , exercise_id ):
259
- return self .post ("/exercises/{}/groups/{}" .format (exercise_id , group_id ))
273
+ return self .post ("/exercises/{}/groups/{}"
274
+ .format (exercise_id , group_id ))
260
275
261
276
def group_detach_exercise (self , group_id , exercise_id ):
262
- return self .delete ("/exercises/{}/groups/{}" .format (exercise_id , group_id ))
277
+ return self .delete ("/exercises/{}/groups/{}"
278
+ .format (exercise_id , group_id ))
279
+
280
+ def set_group_exam_flag (self , group_id , is_exam = True ):
281
+ return self .post ("/groups/{}/exam" .format (group_id ),
282
+ data = {"value" : is_exam })
263
283
264
284
# Assignments and related stuff...
265
285
@@ -304,18 +324,30 @@ def delete_solution(self, solution_id):
304
324
305
325
# Shadow Assignments
306
326
327
+ def create_shadow_assignment (self , group_id ):
328
+ return self .post ("/shadow-assignments/" , data = {
329
+ 'groupId' : group_id ,
330
+ })
331
+
307
332
def get_shadow_assignment (self , assignment_id ):
308
333
return self .get ("/shadow-assignments/{}" .format (assignment_id ))
309
334
310
- def create_shadow_assignment_points (self , assignment_id , user_id , points , note , awarded_at = None ):
311
- return self .post ("/shadow-assignments/{}/create-points/" .format (assignment_id ), data = {
312
- 'userId' : user_id ,
313
- 'points' : points ,
314
- 'note' : note ,
315
- 'awardedAt' : awarded_at ,
316
- })
317
-
318
- def update_shadow_assignment_points (self , points_id , points , note , awarded_at = None ):
335
+ def update_shadow_assignment (self , assignment_id , data ):
336
+ return self .post ("/shadow-assignments/{}" .format (assignment_id ),
337
+ data = data )
338
+
339
+ def create_shadow_assignment_points (self , assignment_id , user_id , points ,
340
+ note , awarded_at = None ):
341
+ return self .post ("/shadow-assignments/{}/create-points/"
342
+ .format (assignment_id ), data = {
343
+ 'userId' : user_id ,
344
+ 'points' : points ,
345
+ 'note' : note ,
346
+ 'awardedAt' : awarded_at ,
347
+ })
348
+
349
+ def update_shadow_assignment_points (self , points_id , points , note ,
350
+ awarded_at = None ):
319
351
return self .post ("/shadow-assignments/points/{}" .format (points_id ), data = {
320
352
'points' : points ,
321
353
'note' : note ,
@@ -358,11 +390,13 @@ def extract_payload(response):
358
390
try :
359
391
json = response .json ()
360
392
except JSONDecodeError :
361
- logging .error ("Loading JSON response failed, see full response below:" )
393
+ logging .error (
394
+ "Loading JSON response failed, see full response below:" )
362
395
logging .error (response .text )
363
396
raise RuntimeError ("Loading JSON response failed" )
364
397
365
398
if not json ["success" ]:
366
- raise RuntimeError ("Received error from API: " + json ["error" ]["message" ])
399
+ raise RuntimeError ("Received error from API: " +
400
+ json ["error" ]["message" ])
367
401
368
402
return json ["payload" ]
0 commit comments