1
1
import csv
2
2
import io
3
+ import re
3
4
4
5
from datetime import datetime
5
6
6
7
import structlog
7
8
8
- from flask import Blueprint , request , jsonify , abort
9
+ from flask import Blueprint , request , jsonify , abort , make_response
10
+
11
+ from conditional import app
9
12
10
13
from conditional .models .models import FreshmanAccount
11
14
from conditional .models .models import FreshmanEvalData
28
31
from conditional .util .ldap import ldap_is_financial_director
29
32
from conditional .util .ldap import ldap_is_active
30
33
from conditional .util .ldap import ldap_is_onfloor
34
+ from conditional .util .ldap import ldap_is_current_student
31
35
from conditional .util .ldap import ldap_set_roomnumber
32
36
from conditional .util .ldap import ldap_set_active
33
37
from conditional .util .ldap import ldap_set_inactive
@@ -87,9 +91,11 @@ def display_member_management():
87
91
if settings :
88
92
lockdown = settings .site_lockdown
89
93
intro_form = settings .intro_form_active
94
+ accept_dues_until = settings .accept_dues_until
90
95
else :
91
96
lockdown = False
92
97
intro_form = False
98
+ accept_dues_until = datetime .now ()
93
99
94
100
return render_template (request , "member_management.html" ,
95
101
username = username ,
@@ -101,6 +107,7 @@ def display_member_management():
101
107
freshmen = freshmen_list ,
102
108
co_op = co_op_list ,
103
109
site_lockdown = lockdown ,
110
+ accept_dues_until = accept_dues_until ,
104
111
intro_form = intro_form )
105
112
106
113
@@ -135,6 +142,31 @@ def member_management_eval():
135
142
return jsonify ({"success" : True }), 200
136
143
137
144
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
+
138
170
@member_management_bp .route ('/manage/user' , methods = ['POST' ])
139
171
def member_management_adduser ():
140
172
log = logger .new (request = request )
@@ -491,6 +523,23 @@ def member_management_upgrade_user():
491
523
return jsonify ({"success" : True }), 200
492
524
493
525
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
+
494
543
@member_management_bp .route ('/manage/intro_project' , methods = ['GET' ])
495
544
def introductory_project ():
496
545
log = logger .new (request = request )
@@ -583,6 +632,32 @@ def clear_active_members():
583
632
return jsonify ({"success" : True }), 200
584
633
585
634
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
+
586
661
@member_management_bp .route ('/manage/current/<uid>' , methods = ['POST' , 'DELETE' ])
587
662
def remove_current_student (uid ):
588
663
log = logger .new (request = request )
0 commit comments