6
6
from flask import Blueprint , jsonify , redirect , request
7
7
8
8
from conditional .util .ldap import ldap_get_current_students
9
- from conditional .util .ldap import ldap_is_eboard
10
- from conditional .util .ldap import ldap_is_eval_director
11
9
from conditional .util .ldap import ldap_get_active_members
10
+ from conditional .util .ldap import ldap_is_eval_director
11
+ from conditional .util .ldap import ldap_is_eboard
12
+ from conditional .util .ldap import ldap_get_member
12
13
13
14
from conditional .models .models import CurrentCoops
14
15
from conditional .models .models import CommitteeMeeting
31
32
attendance_bp = Blueprint ('attendance_bp' , __name__ )
32
33
33
34
34
- def get_name (m ):
35
- return m ['cn' ][0 ].decode ('utf-8' )
36
-
37
-
38
35
@attendance_bp .route ('/attendance/ts_members' )
39
36
def get_all_members ():
40
37
log = logger .new (user_name = request .headers .get ("x-webauth-user" ),
@@ -51,14 +48,11 @@ def get_all_members():
51
48
} for f in FreshmanAccount .query .filter (
52
49
FreshmanAccount .eval_date > datetime .now ())]
53
50
54
- for m in members :
55
- uid = m ['uid' ][0 ].decode ('utf-8' )
56
- name = "{name} ({uid})" .format (name = get_name (m ), uid = uid )
57
-
51
+ for account in members :
58
52
named_members .append (
59
53
{
60
- 'display' : name ,
61
- 'value' : uid ,
54
+ 'display' : account . displayName ,
55
+ 'value' : account . uid ,
62
56
'freshman' : False
63
57
})
64
58
@@ -71,37 +65,34 @@ def get_non_alumni_non_coop(internal=False):
71
65
request_id = str (uuid .uuid4 ()))
72
66
log .info ('api' , action = 'retrieve house meeting attendance list' )
73
67
74
- # Only Members Who Have Paid Dues Are Required to
75
- # go to house meetings
76
- non_alumni_members = ldap_get_active_members ()
68
+ # Get all active members as a base house meeting attendance.
69
+ active_members = ldap_get_active_members ()
77
70
coop_members = [u .uid for u in CurrentCoops .query .all ()]
78
71
79
- named_members = [
72
+ eligible_members = [
80
73
{
81
74
'display' : f .name ,
82
75
'value' : f .id ,
83
76
'freshman' : True
84
77
} for f in FreshmanAccount .query .filter (
85
78
FreshmanAccount .eval_date > datetime .now ())]
86
79
87
- for m in non_alumni_members :
88
- uid = m ['uid' ][0 ].decode ('utf-8' )
89
-
90
- if uid in coop_members :
91
- continue
92
- name = "{name} ({uid})" .format (name = get_name (m ), uid = uid )
80
+ for account in active_members :
81
+ if account .uid in coop_members :
82
+ # Members who are on co-op don't need to go to house meeting.
83
+ pass
93
84
94
- named_members .append (
85
+ eligible_members .append (
95
86
{
96
- 'display' : name ,
97
- 'value' : uid ,
87
+ 'display' : account . displayName ,
88
+ 'value' : account . uid ,
98
89
'freshman' : False
99
90
})
100
91
101
92
if internal :
102
- return named_members
93
+ return eligible_members
103
94
else :
104
- return jsonify ({'members' : named_members }), 200
95
+ return jsonify ({'members' : eligible_members }), 200
105
96
106
97
107
98
@attendance_bp .route ('/attendance/cm_members' )
@@ -110,27 +101,25 @@ def get_non_alumni():
110
101
request_id = str (uuid .uuid4 ()))
111
102
log .info ('api' , action = 'retrieve committee meeting attendance list' )
112
103
113
- non_alumni_members = ldap_get_current_students ()
104
+ current_students = ldap_get_current_students ()
114
105
115
- named_members = [
106
+ eligible_members = [
116
107
{
117
108
'display' : f .name ,
118
109
'value' : f .id ,
119
110
'freshman' : True
120
111
} for f in FreshmanAccount .query .filter (
121
112
FreshmanAccount .eval_date > datetime .now ())]
122
- for m in non_alumni_members :
123
- uid = m ['uid' ][0 ].decode ('utf-8' )
124
- name = "{name} ({uid})" .format (name = get_name (m ), uid = uid )
125
113
126
- named_members .append (
114
+ for account in current_students :
115
+ eligible_members .append (
127
116
{
128
- 'display' : name ,
129
- 'value' : uid ,
117
+ 'display' : account . displayName ,
118
+ 'value' : account . uid ,
130
119
'freshman' : False
131
120
})
132
121
133
- return jsonify ({'members' : named_members }), 200
122
+ return jsonify ({'members' : eligible_members }), 200
134
123
135
124
136
125
@attendance_bp .route ('/attendance_cm' )
@@ -140,7 +129,8 @@ def display_attendance_cm():
140
129
log .info ('frontend' , action = 'display committee meeting attendance page' )
141
130
142
131
user_name = request .headers .get ('x-webauth-user' )
143
- if not ldap_is_eboard (user_name ):
132
+ account = ldap_get_member (user_name )
133
+ if not ldap_is_eboard (account ):
144
134
return redirect ("/dashboard" )
145
135
146
136
return render_template (request ,
@@ -156,7 +146,8 @@ def display_attendance_ts():
156
146
log .info ('frontend' , action = 'display technical seminar attendance page' )
157
147
158
148
user_name = request .headers .get ('x-webauth-user' )
159
- if not ldap_is_eboard (user_name ):
149
+ account = ldap_get_member (user_name )
150
+ if not ldap_is_eboard (account ):
160
151
return redirect ("/dashboard" )
161
152
162
153
return render_template (request ,
@@ -172,7 +163,8 @@ def display_attendance_hm():
172
163
log .info ('frontend' , action = 'display house meeting attendance page' )
173
164
174
165
user_name = request .headers .get ('x-webauth-user' )
175
- if not ldap_is_eval_director (user_name ):
166
+ account = ldap_get_member (user_name )
167
+ if not ldap_is_eval_director (account ):
176
168
return redirect ("/dashboard" )
177
169
178
170
return render_template (request ,
@@ -189,8 +181,8 @@ def submit_committee_attendance():
189
181
log .info ('api' , action = 'submit committee meeting attendance' )
190
182
191
183
user_name = request .headers .get ('x-webauth-user' )
192
-
193
- if not ldap_is_eboard (user_name ):
184
+ account = ldap_get_member ( user_name )
185
+ if not ldap_is_eboard (account ):
194
186
return "must be eboard" , 403
195
187
196
188
post_data = request .get_json ()
@@ -232,7 +224,8 @@ def submit_seminar_attendance():
232
224
233
225
user_name = request .headers .get ('x-webauth-user' )
234
226
235
- if not ldap_is_eboard (user_name ):
227
+ account = ldap_get_member (user_name )
228
+ if not ldap_is_eboard (account ):
236
229
return "must be eboard" , 403
237
230
238
231
post_data = request .get_json ()
@@ -275,7 +268,8 @@ def submit_house_attendance():
275
268
276
269
user_name = request .headers .get ('x-webauth-user' )
277
270
278
- if not ldap_is_eval_director (user_name ):
271
+ account = ldap_get_member (user_name )
272
+ if not ldap_is_eval_director (account ):
279
273
return "must be evals" , 403
280
274
281
275
post_data = request .get_json ()
@@ -321,7 +315,8 @@ def submit_house_attendance():
321
315
def alter_house_attendance (uid , hid ):
322
316
user_name = request .headers .get ('x-webauth-user' )
323
317
324
- if not ldap_is_eval_director (user_name ):
318
+ account = ldap_get_member (user_name )
319
+ if not ldap_is_eval_director (account ):
325
320
return "must be evals" , 403
326
321
327
322
if not uid .isdigit ():
@@ -351,7 +346,8 @@ def alter_house_excuse(uid, hid):
351
346
352
347
user_name = request .headers .get ('x-webauth-user' )
353
348
354
- if not ldap_is_eval_director (user_name ):
349
+ account = ldap_get_member (user_name )
350
+ if not ldap_is_eval_director (account ):
355
351
return "must be eval director" , 403
356
352
357
353
post_data = request .get_json ()
@@ -381,3 +377,113 @@ def alter_house_excuse(uid, hid):
381
377
db .session .flush ()
382
378
db .session .commit ()
383
379
return jsonify ({"success" : True }), 200
380
+
381
+
382
+ @attendance_bp .route ('/attendance/history' , methods = ['GET' ])
383
+ def attendance_history ():
384
+
385
+
386
+ def get_meeting_attendees (meeting_id ):
387
+ attendees = [ldap_get_member (a .uid ).displayName for a in
388
+ MemberCommitteeAttendance .query .filter (
389
+ MemberCommitteeAttendance .meeting_id == meeting_id ).all ()]
390
+
391
+ for freshman in [a .fid for a in
392
+ FreshmanCommitteeAttendance .query .filter (
393
+ FreshmanCommitteeAttendance .meeting_id == meeting_id ).all ()]:
394
+ attendees .append (FreshmanAccount .query .filter (
395
+ FreshmanAccount .id == freshman ).first ().name )
396
+ return attendees
397
+
398
+ log = logger .new (user_name = request .headers .get ("x-webauth-user" ),
399
+ request_id = str (uuid .uuid4 ()))
400
+
401
+ user_name = request .headers .get ('x-webauth-user' )
402
+ account = ldap_get_member (user_name )
403
+ if not ldap_is_eboard (account ):
404
+ return "must be eboard" , 403
405
+
406
+ if request .method == 'GET' :
407
+ page = request .args .get ('page' , 1 )
408
+ log .info ('api' , action = 'view past attendance submitions' )
409
+ offset = 0 if int (page ) == 1 else ((int (page )- 1 )* 10 )
410
+ limit = int (page )* 10
411
+ all_cm = [{"id" : m .id ,
412
+ "directorship" : m .committee ,
413
+ "dt_obj" : m .timestamp ,
414
+ "date" : m .timestamp .strftime ("%a %m/%d/%Y" ),
415
+ "attendees" : get_meeting_attendees (m .id )
416
+ } for m in CommitteeMeeting .query .all ()]
417
+ c_meetings = sorted (all_cm , key = lambda k : k ['dt_obj' ], reverse = True )[offset :limit ]
418
+ if len (all_cm ) % 10 != 0 :
419
+ total_pages = (int (len (all_cm ) / 10 ) + 1 )
420
+ else :
421
+ total_pages = (int (len (all_cm ) / 10 ))
422
+ return render_template (request ,
423
+ 'attendance_history.html' ,
424
+ username = user_name ,
425
+ history = c_meetings ,
426
+ num_pages = total_pages ,
427
+ current_page = int (page ))
428
+
429
+ @attendance_bp .route ('/attendance/alter/cm/<cid>' , methods = ['POST' ])
430
+ def alter_committee_attendance (cid ):
431
+ log = logger .new (user_name = request .headers .get ("x-webauth-user" ),
432
+ request_id = str (uuid .uuid4 ()))
433
+ log .info ('api' , action = 'edit committee meeting attendance' )
434
+
435
+ user_name = request .headers .get ('x-webauth-user' )
436
+
437
+ account = ldap_get_member (user_name )
438
+ if not ldap_is_eboard (account ):
439
+ return "must be eboard" , 403
440
+
441
+ post_data = request .get_json ()
442
+ meeting_id = cid
443
+ m_attendees = post_data ['members' ]
444
+ f_attendees = post_data ['freshmen' ]
445
+
446
+ FreshmanCommitteeAttendance .query .filter (
447
+ FreshmanCommitteeAttendance .meeting_id == meeting_id ).delete ()
448
+
449
+ MemberCommitteeAttendance .query .filter (
450
+ MemberCommitteeAttendance .meeting_id == meeting_id ).delete ()
451
+
452
+ for m in m_attendees :
453
+ db .session .add (MemberCommitteeAttendance (m , meeting_id ))
454
+
455
+ for f in f_attendees :
456
+ db .session .add (FreshmanCommitteeAttendance (f , meeting_id ))
457
+
458
+ db .session .flush ()
459
+ db .session .commit ()
460
+ return jsonify ({"success" : True }), 200
461
+
462
+ @attendance_bp .route ('/attendance/cm/<cid>' , methods = ['GET' , 'DELETE' ])
463
+ def get_cm_attendees (cid ):
464
+ if request .method == 'GET' :
465
+ attendees = [{"value" : a .uid ,
466
+ "display" : ldap_get_member (a .uid ).displayName
467
+ } for a in
468
+ MemberCommitteeAttendance .query .filter (
469
+ MemberCommitteeAttendance .meeting_id == cid ).all ()]
470
+
471
+ for freshman in [{"value" : a .fid ,
472
+ "display" : FreshmanAccount .query .filter (FreshmanAccount .id == a .fid ).first ().name
473
+ } for a in FreshmanCommitteeAttendance .query .filter (
474
+ FreshmanCommitteeAttendance .meeting_id == cid ).all ()]:
475
+ attendees .append (freshman )
476
+ return jsonify ({"attendees" : attendees }), 200
477
+
478
+ elif request .method == 'DELETE' :
479
+ FreshmanCommitteeAttendance .query .filter (
480
+ FreshmanCommitteeAttendance .meeting_id == cid ).delete ()
481
+ MemberCommitteeAttendance .query .filter (
482
+ MemberCommitteeAttendance .meeting_id == cid ).delete ()
483
+ CommitteeMeeting .query .filter (
484
+ CommitteeMeeting .id == cid ).delete ()
485
+
486
+ db .session .flush ()
487
+ db .session .commit ()
488
+
489
+ return jsonify ({"success" : True }), 200
0 commit comments