@@ -128,14 +128,9 @@ def display_attendance_cm():
128128                     request_id = str (uuid .uuid4 ()))
129129    log .info ('frontend' , action = 'display committee meeting attendance page' )
130130
131-     user_name  =  request .headers .get ('x-webauth-user' )
132-     account  =  ldap_get_member (user_name )
133-     if  not  ldap_is_eboard (account ):
134-         return  redirect ("/dashboard" )
135- 
136131    return  render_template (request ,
137132                           'attendance_cm.html' ,
138-                            username = user_name ,
133+                            username = request . headers . get ( "x-webauth-user" ) ,
139134                           date = datetime .now ().strftime ("%Y-%m-%d" ))
140135
141136
@@ -145,14 +140,9 @@ def display_attendance_ts():
145140                     request_id = str (uuid .uuid4 ()))
146141    log .info ('frontend' , action = 'display technical seminar attendance page' )
147142
148-     user_name  =  request .headers .get ('x-webauth-user' )
149-     account  =  ldap_get_member (user_name )
150-     if  not  ldap_is_eboard (account ):
151-         return  redirect ("/dashboard" )
152- 
153143    return  render_template (request ,
154144                           'attendance_ts.html' ,
155-                            username = user_name ,
145+                            username = request . headers . get ( "x-webauth-user" ) ,
156146                           date = datetime .now ().strftime ("%Y-%m-%d" ))
157147
158148
@@ -182,9 +172,7 @@ def submit_committee_attendance():
182172
183173    user_name  =  request .headers .get ('x-webauth-user' )
184174    account  =  ldap_get_member (user_name )
185-     if  not  ldap_is_eboard (account ):
186-         return  "must be eboard" , 403 
187- 
175+     approved  =  ldap_is_eboard (account )
188176    post_data  =  request .get_json ()
189177
190178    committee  =  post_data ['committee' ]
@@ -193,7 +181,7 @@ def submit_committee_attendance():
193181    timestamp  =  post_data ['timestamp' ]
194182
195183    timestamp  =  datetime .strptime (timestamp , "%Y-%m-%d" )
196-     meeting  =  CommitteeMeeting (committee , timestamp )
184+     meeting  =  CommitteeMeeting (committee , timestamp ,  approved )
197185
198186    db .session .add (meeting )
199187    db .session .flush ()
@@ -225,8 +213,7 @@ def submit_seminar_attendance():
225213    user_name  =  request .headers .get ('x-webauth-user' )
226214
227215    account  =  ldap_get_member (user_name )
228-     if  not  ldap_is_eboard (account ):
229-         return  "must be eboard" , 403 
216+     approved  =  ldap_is_eboard (account )
230217
231218    post_data  =  request .get_json ()
232219
@@ -236,7 +223,7 @@ def submit_seminar_attendance():
236223    timestamp  =  post_data ['timestamp' ]
237224
238225    timestamp  =  datetime .strptime (timestamp , "%Y-%m-%d" )
239-     seminar  =  TechnicalSeminar (seminar_name , timestamp )
226+     seminar  =  TechnicalSeminar (seminar_name , timestamp ,  approved )
240227
241228    db .session .add (seminar )
242229    db .session .flush ()
@@ -395,6 +382,18 @@ def get_meeting_attendees(meeting_id):
395382                             FreshmanAccount .id  ==  freshman ).first ().name )
396383        return  attendees 
397384
385+     def  get_seminar_attendees (meeting_id ):
386+         attendees  =  [ldap_get_member (a .uid ).displayName  for  a  in 
387+                      MemberSeminarAttendance .query .filter (
388+                      MemberSeminarAttendance .seminar_id  ==  meeting_id ).all ()]
389+ 
390+         for  freshman  in  [a .fid  for  a  in 
391+                          FreshmanSeminarAttendance .query .filter (
392+                          FreshmanSeminarAttendance .seminar_id  ==  meeting_id ).all ()]:
393+             attendees .append (FreshmanAccount .query .filter (
394+                              FreshmanAccount .id  ==  freshman ).first ().name )
395+         return  attendees 
396+ 
398397    log  =  logger .new (user_name = request .headers .get ("x-webauth-user" ),
399398                     request_id = str (uuid .uuid4 ()))
400399
@@ -409,20 +408,46 @@ def get_meeting_attendees(meeting_id):
409408        offset  =  0  if  int (page ) ==  1  else  ((int (page )- 1 )* 10 )
410409        limit  =  int (page )* 10 
411410        all_cm  =  [{"id" : m .id ,
412-                    "directorship " : m .committee ,
411+                    "name " : m .committee ,
413412                   "dt_obj" : m .timestamp ,
414413                   "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 ]
414+                    "attendees" : get_meeting_attendees (m .id ),
415+                    "type" : "cm" 
416+                    } for  m  in  CommitteeMeeting .query .filter (
417+                        CommitteeMeeting .approved ).all ()]
418+         all_ts  =  [{"id" : m .id ,
419+                    "name" : m .name ,
420+                    "dt_obj" : m .timestamp ,
421+                    "date" : m .timestamp .strftime ("%a %m/%d/%Y" ),
422+                    "attendees" : get_seminar_attendees (m .id ),
423+                    "type" : "ts" 
424+                    } for  m  in  TechnicalSeminar .query .filter (
425+                        TechnicalSeminar .approved ).all ()]
426+         pend_cm  =  [{"id" : m .id ,
427+                     "name" : m .committee ,
428+                     "dt_obj" : m .timestamp ,
429+                     "date" : m .timestamp .strftime ("%a %m/%d/%Y" ),
430+                     "attendees" : get_meeting_attendees (m .id )
431+                    } for  m  in  CommitteeMeeting .query .filter (
432+                        CommitteeMeeting .approved  ==  False ).all ()] # pylint: disable=singleton-comparison 
433+         pend_ts  =  [{"id" : m .id ,
434+                     "name" : m .name ,
435+                     "dt_obj" : m .timestamp ,
436+                     "date" : m .timestamp .strftime ("%a %m/%d/%Y" ),
437+                     "attendees" : get_seminar_attendees (m .id )
438+                    } for  m  in  TechnicalSeminar .query .filter (
439+                        TechnicalSeminar .approved  ==  False ).all ()] # pylint: disable=singleton-comparison 
440+         all_meetings  =  sorted ((all_cm  +  all_ts ), key = lambda  k : k ['dt_obj' ], reverse = True )[offset :limit ]
418441        if  len (all_cm ) %  10  !=  0 :
419442            total_pages  =  (int (len (all_cm ) /  10 ) +  1 )
420443        else :
421444            total_pages  =  (int (len (all_cm ) /  10 ))
422445        return  render_template (request ,
423446                           'attendance_history.html' ,
424447                           username = user_name ,
425-                            history = c_meetings ,
448+                            history = all_meetings ,
449+                            pending_cm = pend_cm ,
450+                            pending_ts = pend_ts ,
426451                           num_pages = total_pages ,
427452                           current_page = int (page ))
428453
@@ -459,8 +484,83 @@ def alter_committee_attendance(cid):
459484    db .session .commit ()
460485    return  jsonify ({"success" : True }), 200 
461486
487+ 
488+ @attendance_bp .route ('/attendance/alter/ts/<sid>' , methods = ['POST' ]) 
489+ def  alter_seminar_attendance (sid ):
490+     log  =  logger .new (user_name = request .headers .get ("x-webauth-user" ),
491+                      request_id = str (uuid .uuid4 ()))
492+     log .info ('api' , action = 'edit technical seminar attendance' )
493+ 
494+     user_name  =  request .headers .get ('x-webauth-user' )
495+ 
496+     account  =  ldap_get_member (user_name )
497+     if  not  ldap_is_eboard (account ):
498+         return  "must be eboard" , 403 
499+ 
500+     post_data  =  request .get_json ()
501+     meeting_id  =  sid 
502+     m_attendees  =  post_data ['members' ]
503+     f_attendees  =  post_data ['freshmen' ]
504+ 
505+     FreshmanSeminarAttendance .query .filter (
506+         FreshmanSeminarAttendance .seminar_id  ==  meeting_id ).delete ()
507+ 
508+     MemberSeminarAttendance .query .filter (
509+         MemberSeminarAttendance .seminar_id  ==  meeting_id ).delete ()
510+ 
511+     for  m  in  m_attendees :
512+         db .session .add (MemberSeminarAttendance (m , meeting_id ))
513+ 
514+     for  f  in  f_attendees :
515+         db .session .add (FreshmanSeminarAttendance (f , meeting_id ))
516+ 
517+     db .session .flush ()
518+     db .session .commit ()
519+     return  jsonify ({"success" : True }), 200 
520+ 
521+ 
522+ @attendance_bp .route ('/attendance/ts/<sid>' , methods = ['GET' , 'DELETE' ]) 
523+ def  get_cm_attendees (sid ):
524+     if  request .method  ==  'GET' :
525+         attendees  =  [{"value" : a .uid ,
526+                       "display" : ldap_get_member (a .uid ).displayName 
527+                      } for  a  in 
528+                      MemberSeminarAttendance .query .filter (
529+                      MemberSeminarAttendance .seminar_id  ==  sid ).all ()]
530+ 
531+         for  freshman  in  [{"value" : a .fid ,
532+                           "display" : FreshmanAccount .query .filter (FreshmanAccount .id  ==  a .fid ).first ().name 
533+                          } for  a  in  FreshmanSeminarAttendance .query .filter (
534+                          FreshmanSeminarAttendance .seminar_id  ==  sid ).all ()]:
535+             attendees .append (freshman )
536+         return  jsonify ({"attendees" : attendees }), 200 
537+ 
538+     elif  request .method  ==  'DELETE' :
539+         log  =  logger .new (user_name = request .headers .get ("x-webauth-user" ),
540+                      request_id = str (uuid .uuid4 ()))
541+         log .info ('api' , action = 'delete technical seminar' )
542+ 
543+         user_name  =  request .headers .get ('x-webauth-user' )
544+ 
545+         account  =  ldap_get_member (user_name )
546+         if  not  ldap_is_eboard (account ):
547+             return  "must be eboard" , 403 
548+ 
549+         FreshmanSeminarAttendance .query .filter (
550+             FreshmanSeminarAttendance .seminar_id  ==  sid ).delete ()
551+         MemberSeminarAttendance .query .filter (
552+             MemberSeminarAttendance .seminar_id  ==  sid ).delete ()
553+         TechnicalSeminar .query .filter (
554+             TechnicalSeminar .id  ==  sid ).delete ()
555+ 
556+         db .session .flush ()
557+         db .session .commit ()
558+ 
559+         return  jsonify ({"success" : True }), 200 
560+ 
561+ 
462562@attendance_bp .route ('/attendance/cm/<cid>' , methods = ['GET' , 'DELETE' ]) 
463- def  get_cm_attendees (cid ):
563+ def  get_ts_attendees (cid ):
464564    if  request .method  ==  'GET' :
465565        attendees  =  [{"value" : a .uid ,
466566                      "display" : ldap_get_member (a .uid ).displayName 
@@ -476,6 +576,16 @@ def get_cm_attendees(cid):
476576        return  jsonify ({"attendees" : attendees }), 200 
477577
478578    elif  request .method  ==  'DELETE' :
579+         log  =  logger .new (user_name = request .headers .get ("x-webauth-user" ),
580+                      request_id = str (uuid .uuid4 ()))
581+         log .info ('api' , action = 'delete committee meeting' )
582+ 
583+         user_name  =  request .headers .get ('x-webauth-user' )
584+ 
585+         account  =  ldap_get_member (user_name )
586+         if  not  ldap_is_eboard (account ):
587+             return  "must be eboard" , 403 
588+ 
479589        FreshmanCommitteeAttendance .query .filter (
480590            FreshmanCommitteeAttendance .meeting_id  ==  cid ).delete ()
481591        MemberCommitteeAttendance .query .filter (
@@ -487,3 +597,43 @@ def get_cm_attendees(cid):
487597        db .session .commit ()
488598
489599        return  jsonify ({"success" : True }), 200 
600+ 
601+ 
602+ @attendance_bp .route ('/attendance/cm/<cid>/approve' , methods = ['POST' ]) 
603+ def  approve_cm (cid ):
604+     log  =  logger .new (user_name = request .headers .get ("x-webauth-user" ),
605+                      request_id = str (uuid .uuid4 ()))
606+     log .info ('api' , action = 'approve committee meeting attendance' )
607+ 
608+     user_name  =  request .headers .get ('x-webauth-user' )
609+ 
610+     account  =  ldap_get_member (user_name )
611+     if  not  ldap_is_eboard (account ):
612+         return  "must be eboard" , 403 
613+ 
614+     CommitteeMeeting .query .filter (
615+         CommitteeMeeting .id  ==  cid ).first ().approved  =  True 
616+     db .session .flush ()
617+     db .session .commit ()
618+ 
619+     return  jsonify ({"success" : True }), 200 
620+ 
621+ 
622+ @attendance_bp .route ('/attendance/ts/<sid>/approve' , methods = ['POST' ]) 
623+ def  approve_ts (sid ):
624+     log  =  logger .new (user_name = request .headers .get ("x-webauth-user" ),
625+                      request_id = str (uuid .uuid4 ()))
626+     log .info ('api' , action = 'approve committee meeting attendance' )
627+ 
628+     user_name  =  request .headers .get ('x-webauth-user' )
629+ 
630+     account  =  ldap_get_member (user_name )
631+     if  not  ldap_is_eboard (account ):
632+         return  "must be eboard" , 403 
633+ 
634+     TechnicalSeminar .query .filter (
635+         TechnicalSeminar .id  ==  sid ).first ().approved  =  True 
636+     db .session .flush ()
637+     db .session .commit ()
638+ 
639+     return  jsonify ({"success" : True }), 200 
0 commit comments