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
10+
11+ from conditional import app
912
1013from conditional .models .models import FreshmanAccount
1114from conditional .models .models import FreshmanEvalData
2831from conditional .util .ldap import ldap_is_financial_director
2932from conditional .util .ldap import ldap_is_active
3033from conditional .util .ldap import ldap_is_onfloor
34+ from conditional .util .ldap import ldap_is_current_student
3135from conditional .util .ldap import ldap_set_roomnumber
3236from conditional .util .ldap import ldap_set_active
3337from conditional .util .ldap import ldap_set_inactive
@@ -87,9 +91,11 @@ def display_member_management():
8791 if settings :
8892 lockdown = settings .site_lockdown
8993 intro_form = settings .intro_form_active
94+ accept_dues_until = settings .accept_dues_until
9095 else :
9196 lockdown = False
9297 intro_form = False
98+ accept_dues_until = datetime .now ()
9399
94100 return render_template (request , "member_management.html" ,
95101 username = username ,
@@ -101,6 +107,7 @@ def display_member_management():
101107 freshmen = freshmen_list ,
102108 co_op = co_op_list ,
103109 site_lockdown = lockdown ,
110+ accept_dues_until = accept_dues_until ,
104111 intro_form = intro_form )
105112
106113
@@ -135,6 +142,31 @@ def member_management_eval():
135142 return jsonify ({"success" : True }), 200
136143
137144
145+ @member_management_bp .route ('/manage/accept_dues_until' , methods = ['PUT' ])
146+ def member_management_financial ():
147+ log = logger .new (request = request )
148+
149+ username = request .headers .get ('x-webauth-user' )
150+ account = ldap_get_member (username )
151+
152+ if not ldap_is_financial_director (account ):
153+ return "must be financial director" , 403
154+
155+ post_data = request .get_json ()
156+
157+ if 'acceptDuesUntil' in post_data :
158+ date = datetime .strptime (post_data ['acceptDuesUntil' ], "%Y-%m-%d" )
159+ log .info ('Changed Dues Accepted Until: {}' .format (date ))
160+ EvalSettings .query .update (
161+ {
162+ 'accept_dues_until' : date
163+ })
164+
165+ db .session .flush ()
166+ db .session .commit ()
167+ return jsonify ({"success" : True }), 200
168+
169+
138170@member_management_bp .route ('/manage/user' , methods = ['POST' ])
139171def member_management_adduser ():
140172 log = logger .new (request = request )
@@ -491,6 +523,23 @@ def member_management_upgrade_user():
491523 return jsonify ({"success" : True }), 200
492524
493525
526+ @member_management_bp .route ('/manage/make_user_active' , methods = ['POST' ])
527+ def member_management_make_user_active ():
528+ log = logger .new (request = request )
529+
530+ uid = request .headers .get ('x-webauth-user' )
531+ account = ldap_get_member (uid )
532+
533+ if not ldap_is_current_student (account ) or ldap_is_active (account ):
534+ return "must be current student and not active" , 403
535+
536+ ldap_set_active (account )
537+ log .info ("Make user {} active" .format (uid ))
538+
539+ clear_members_cache ()
540+ return jsonify ({"success" : True }), 200
541+
542+
494543@member_management_bp .route ('/manage/intro_project' , methods = ['GET' ])
495544def introductory_project ():
496545 log = logger .new (request = request )
@@ -583,6 +632,32 @@ def clear_active_members():
583632 return jsonify ({"success" : True }), 200
584633
585634
635+ @member_management_bp .route ('/manage/export_active_list' , methods = ['GET' ])
636+ def export_active_list ():
637+ sio = io .StringIO ()
638+ csvw = csv .writer (sio )
639+
640+ active_list = [["Full Name" , "RIT Username" , "Amount to Charge" ]]
641+ for member in ldap_get_active_members ():
642+ full_name = member .cn
643+ rit_username = re .search (".*uid=(\\ w*)" , member .ritDn ).group (1 )
644+ will_coop = CurrentCoops .query .filter (
645+ CurrentCoops .date_created > start_of_year (),
646+ CurrentCoops .uid == member .uid ).first ()
647+ dues_per_semester = app .config ['DUES_PER_SEMESTER' ]
648+ if will_coop :
649+ dues = dues_per_semester
650+ else :
651+ dues = 2 * dues_per_semester
652+ active_list .append ([full_name , rit_username , dues ])
653+
654+ csvw .writerows (active_list )
655+ output = make_response (sio .getvalue ())
656+ output .headers ["Content-Disposition" ] = "attachment; filename=csh_active_list.csv"
657+ output .headers ["Content-type" ] = "text/csv"
658+ return output
659+
660+
586661@member_management_bp .route ('/manage/current/<uid>' , methods = ['POST' , 'DELETE' ])
587662def remove_current_student (uid ):
588663 log = logger .new (request = request )
0 commit comments