66from flask import Blueprint , jsonify , redirect , request
77
88from 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
119from 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
1213
1314from conditional .models .models import CurrentCoops
1415from conditional .models .models import CommitteeMeeting
3132attendance_bp = Blueprint ('attendance_bp' , __name__ )
3233
3334
34- def get_name (m ):
35- return m ['cn' ][0 ].decode ('utf-8' )
36-
37-
3835@attendance_bp .route ('/attendance/ts_members' )
3936def get_all_members ():
4037 log = logger .new (user_name = request .headers .get ("x-webauth-user" ),
@@ -51,14 +48,11 @@ def get_all_members():
5148 } for f in FreshmanAccount .query .filter (
5249 FreshmanAccount .eval_date > datetime .now ())]
5350
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 :
5852 named_members .append (
5953 {
60- 'display' : name ,
61- 'value' : uid ,
54+ 'display' : account . displayName ,
55+ 'value' : account . uid ,
6256 'freshman' : False
6357 })
6458
@@ -71,37 +65,34 @@ def get_non_alumni_non_coop(internal=False):
7165 request_id = str (uuid .uuid4 ()))
7266 log .info ('api' , action = 'retrieve house meeting attendance list' )
7367
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 ()
7770 coop_members = [u .uid for u in CurrentCoops .query .all ()]
7871
79- named_members = [
72+ eligible_members = [
8073 {
8174 'display' : f .name ,
8275 'value' : f .id ,
8376 'freshman' : True
8477 } for f in FreshmanAccount .query .filter (
8578 FreshmanAccount .eval_date > datetime .now ())]
8679
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
9384
94- named_members .append (
85+ eligible_members .append (
9586 {
96- 'display' : name ,
97- 'value' : uid ,
87+ 'display' : account . displayName ,
88+ 'value' : account . uid ,
9889 'freshman' : False
9990 })
10091
10192 if internal :
102- return named_members
93+ return eligible_members
10394 else :
104- return jsonify ({'members' : named_members }), 200
95+ return jsonify ({'members' : eligible_members }), 200
10596
10697
10798@attendance_bp .route ('/attendance/cm_members' )
@@ -110,27 +101,25 @@ def get_non_alumni():
110101 request_id = str (uuid .uuid4 ()))
111102 log .info ('api' , action = 'retrieve committee meeting attendance list' )
112103
113- non_alumni_members = ldap_get_current_students ()
104+ current_students = ldap_get_current_students ()
114105
115- named_members = [
106+ eligible_members = [
116107 {
117108 'display' : f .name ,
118109 'value' : f .id ,
119110 'freshman' : True
120111 } for f in FreshmanAccount .query .filter (
121112 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 )
125113
126- named_members .append (
114+ for account in current_students :
115+ eligible_members .append (
127116 {
128- 'display' : name ,
129- 'value' : uid ,
117+ 'display' : account . displayName ,
118+ 'value' : account . uid ,
130119 'freshman' : False
131120 })
132121
133- return jsonify ({'members' : named_members }), 200
122+ return jsonify ({'members' : eligible_members }), 200
134123
135124
136125@attendance_bp .route ('/attendance_cm' )
@@ -140,7 +129,8 @@ def display_attendance_cm():
140129 log .info ('frontend' , action = 'display committee meeting attendance page' )
141130
142131 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 ):
144134 return redirect ("/dashboard" )
145135
146136 return render_template (request ,
@@ -156,7 +146,8 @@ def display_attendance_ts():
156146 log .info ('frontend' , action = 'display technical seminar attendance page' )
157147
158148 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 ):
160151 return redirect ("/dashboard" )
161152
162153 return render_template (request ,
@@ -172,7 +163,8 @@ def display_attendance_hm():
172163 log .info ('frontend' , action = 'display house meeting attendance page' )
173164
174165 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 ):
176168 return redirect ("/dashboard" )
177169
178170 return render_template (request ,
@@ -189,8 +181,8 @@ def submit_committee_attendance():
189181 log .info ('api' , action = 'submit committee meeting attendance' )
190182
191183 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 ):
194186 return "must be eboard" , 403
195187
196188 post_data = request .get_json ()
@@ -232,7 +224,8 @@ def submit_seminar_attendance():
232224
233225 user_name = request .headers .get ('x-webauth-user' )
234226
235- if not ldap_is_eboard (user_name ):
227+ account = ldap_get_member (user_name )
228+ if not ldap_is_eboard (account ):
236229 return "must be eboard" , 403
237230
238231 post_data = request .get_json ()
@@ -275,7 +268,8 @@ def submit_house_attendance():
275268
276269 user_name = request .headers .get ('x-webauth-user' )
277270
278- if not ldap_is_eval_director (user_name ):
271+ account = ldap_get_member (user_name )
272+ if not ldap_is_eval_director (account ):
279273 return "must be evals" , 403
280274
281275 post_data = request .get_json ()
@@ -321,7 +315,8 @@ def submit_house_attendance():
321315def alter_house_attendance (uid , hid ):
322316 user_name = request .headers .get ('x-webauth-user' )
323317
324- if not ldap_is_eval_director (user_name ):
318+ account = ldap_get_member (user_name )
319+ if not ldap_is_eval_director (account ):
325320 return "must be evals" , 403
326321
327322 if not uid .isdigit ():
@@ -351,7 +346,8 @@ def alter_house_excuse(uid, hid):
351346
352347 user_name = request .headers .get ('x-webauth-user' )
353348
354- if not ldap_is_eval_director (user_name ):
349+ account = ldap_get_member (user_name )
350+ if not ldap_is_eval_director (account ):
355351 return "must be eval director" , 403
356352
357353 post_data = request .get_json ()
@@ -381,3 +377,113 @@ def alter_house_excuse(uid, hid):
381377 db .session .flush ()
382378 db .session .commit ()
383379 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