@@ -252,6 +252,84 @@ def report(info):
252
252
return 'Success: ' + get_rit_name (info ['uid' ]) + ' sent a report'
253
253
254
254
255
+ @app .route ('/api/v1/stats/packet/<packet_id>' )
256
+ @packet_auth
257
+ def packet_stats (packet_id ):
258
+ packet = Packet .by_id (packet_id )
259
+
260
+ dates = [packet .start .date () + timedelta (days = x ) for x in range (0 , (packet .end - packet .start ).days + 1 )]
261
+
262
+ print (dates )
263
+
264
+ upper_stats = {date : list () for date in dates }
265
+ for uid , date in map (lambda sig : (sig .member , sig .updated ),
266
+ filter (lambda sig : sig .signed , packet .upper_signatures )):
267
+ upper_stats [date .date ()].append (uid )
268
+
269
+ fresh_stats = {date : list () for date in dates }
270
+ for username , date in map (lambda sig : (sig .freshman_username , sig .updated ),
271
+ filter (lambda sig : sig .signed , packet .fresh_signatures )):
272
+ fresh_stats [date .date ()].append (username )
273
+
274
+ misc_stats = {date : list () for date in dates }
275
+ for uid , date in map (lambda sig : (sig .member , sig .updated ), packet .misc_signatures ):
276
+ misc_stats [date .date ()].append (uid )
277
+
278
+ total_stats = dict ()
279
+ for date in dates :
280
+ total_stats [date .isoformat ()] = {
281
+ 'upper' : upper_stats [date ],
282
+ 'fresh' : fresh_stats [date ],
283
+ 'misc' : misc_stats [date ],
284
+ }
285
+
286
+ return {
287
+ 'packet_id' : packet_id ,
288
+ 'dates' : total_stats ,
289
+ }
290
+
291
+
292
+ def sig2dict (sig ):
293
+ """
294
+ A utility function for upperclassman stats.
295
+ Converts an UpperSignature to a dictionary with the date and the packet.
296
+ """
297
+ packet = Packet .by_id (sig .packet_id )
298
+ return {
299
+ 'date' : sig .updated .date (),
300
+ 'packet' : {
301
+ 'id' : packet .id ,
302
+ 'freshman_username' : packet .freshman_username ,
303
+ },
304
+ }
305
+
306
+
307
+ @app .route ('/api/v1/stats/upperclassman/<uid>' )
308
+ @packet_auth
309
+ def upperclassman_stats (uid ):
310
+
311
+ sigs = UpperSignature .query .filter (
312
+ UpperSignature .signed ,
313
+ UpperSignature .member == uid
314
+ ).all () + MiscSignature .query .filter (MiscSignature .member == uid ).all ()
315
+
316
+ sig_dicts = list (map (sig2dict , sigs ))
317
+
318
+ dates = set (map (lambda sd : sd ['date' ], sig_dicts ))
319
+
320
+ return {
321
+ 'member' : uid ,
322
+ 'signatures' : {
323
+ date .isoformat () : list (
324
+ map (lambda sd : sd ['packet' ],
325
+ filter (lambda sig , d = date : sig ['date' ] == d ,
326
+ sig_dicts
327
+ )
328
+ )
329
+ ) for date in dates
330
+ }
331
+ }
332
+
255
333
def commit_sig (packet , was_100 , uid ):
256
334
packet_signed_notification (packet , uid )
257
335
db .session .commit ()
0 commit comments