11import  csv 
22import  io 
3+ import  re 
34
45from  datetime  import  datetime 
56
67import  structlog 
78
8- from  flask  import  Blueprint , request , jsonify , abort 
9+ from  flask  import  Blueprint , request , jsonify , abort ,  make_response 
910
1011from  conditional .models .models  import  FreshmanAccount 
1112from  conditional .models .models  import  FreshmanEvalData 
@@ -88,9 +89,11 @@ def display_member_management():
8889    if  settings :
8990        lockdown  =  settings .site_lockdown 
9091        intro_form  =  settings .intro_form_active 
92+         accept_dues_until  =  settings .accept_dues_until 
9193    else :
9294        lockdown  =  False 
9395        intro_form  =  False 
96+         accept_dues_until  =  datetime .now ()
9497
9598    return  render_template (request , "member_management.html" ,
9699                           username = username ,
@@ -102,6 +105,7 @@ def display_member_management():
102105                           freshmen = freshmen_list ,
103106                           co_op = co_op_list ,
104107                           site_lockdown = lockdown ,
108+                            accept_dues_until = accept_dues_until ,
105109                           intro_form = intro_form )
106110
107111
@@ -136,6 +140,31 @@ def member_management_eval():
136140    return  jsonify ({"success" : True }), 200 
137141
138142
143+ @member_management_bp .route ('/manage/accept_dues_until' , methods = ['PUT' ]) 
144+ def  member_management_financial ():
145+     log  =  logger .new (request = request )
146+ 
147+     username  =  request .headers .get ('x-webauth-user' )
148+     account  =  ldap_get_member (username )
149+ 
150+     if  not  ldap_is_financial_director (account ):
151+         return  "must be financial director" , 403 
152+ 
153+     post_data  =  request .get_json ()
154+ 
155+     if  'acceptDuesUntil'  in  post_data :
156+         date  =  datetime .strptime (post_data ['acceptDuesUntil' ], "%Y-%m-%d" )
157+         log .info ('Changed Dues Accepted Until: {}' .format (date ))
158+         EvalSettings .query .update (
159+             {
160+                 'accept_dues_until' : date 
161+             })
162+ 
163+     db .session .flush ()
164+     db .session .commit ()
165+     return  jsonify ({"success" : True }), 200 
166+ 
167+ 
139168@member_management_bp .route ('/manage/user' , methods = ['POST' ]) 
140169def  member_management_adduser ():
141170    log  =  logger .new (request = request )
@@ -496,13 +525,11 @@ def member_management_upgrade_user():
496525def  member_management_make_user_active ():
497526    log  =  logger .new (request = request )
498527
499-     post_data  =  request .get_json ()
500- 
501-     uid  =  post_data ['uid' ]
528+     uid  =  request .headers .get ('x-webauth-user' )
502529    account  =  ldap_get_member (uid )
503530
504531    if  not  ldap_is_current_student (account ) or  ldap_is_active (account ):
505-         return  jsonify ({ "success" :  False }) , 403 
532+         return  "must be current student and not active" , 403 
506533
507534    ldap_set_active (account )
508535    log .info ("Make user {} active" .format (uid ))
@@ -603,6 +630,31 @@ def clear_active_members():
603630    return  jsonify ({"success" : True }), 200 
604631
605632
633+ @member_management_bp .route ('/manage/export_active_list' , methods = ['GET' ]) 
634+ def  export_active_list ():
635+     sio  =  io .StringIO ()
636+     csvw  =  csv .writer (sio )
637+ 
638+     active_list  =  [["Full Name" , "RIT Username" , "Amount to Charge" ]]
639+     for  member  in  ldap_get_active_members ():
640+         full_name  =  member .cn 
641+         rit_username  =  re .search (".*uid=(\\ w*)" , member .ritDn ).group (1 )
642+         will_coop  =  CurrentCoops .query .filter (
643+             CurrentCoops .date_created  >  start_of_year (),
644+             CurrentCoops .uid  ==  member .uid ).first ()
645+         if  will_coop :
646+             dues  =  80 
647+         else :
648+             dues  =  160 
649+         active_list .append ([full_name , rit_username , dues ])
650+ 
651+     csvw .writerows (active_list )
652+     output  =  make_response (sio .getvalue ())
653+     output .headers ["Content-Disposition" ] =  "attachment; filename=csh_active_list.csv" 
654+     output .headers ["Content-type" ] =  "text/csv" 
655+     return  output 
656+ 
657+ 
606658@member_management_bp .route ('/manage/current/<uid>' , methods = ['POST' , 'DELETE' ]) 
607659def  remove_current_student (uid ):
608660    log  =  logger .new (request = request )
0 commit comments