@@ -252,6 +252,84 @@ def report(info):
252252 return 'Success: ' + get_rit_name (info ['uid' ]) + ' sent a report'
253253
254254
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+
255333def commit_sig (packet , was_100 , uid ):
256334 packet_signed_notification (packet , uid )
257335 db .session .commit ()
0 commit comments