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