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