11import structlog
22from flask import Blueprint , request
3+ from sqlalchemy import func
34
45from conditional import db , start_of_year , auth
5- from conditional .models .models import HouseMeeting
6- from conditional .models .models import MajorProject
7- from conditional .models .models import MemberHouseMeetingAttendance
8- from conditional .models .models import SpringEval
6+ from conditional .models .models import CommitteeMeeting , HouseMeeting , MemberCommitteeAttendance
7+ from conditional .models .models import MajorProject , MemberHouseMeetingAttendance , SpringEval
98from conditional .util .auth import get_user
109from conditional .util .flask import render_template
1110from conditional .util .ldap import ldap_get_active_members
12- from conditional .util .member import get_cm , get_hm , req_cm
11+ from conditional .util .member import req_cm
1312
1413spring_evals_bp = Blueprint ('spring_evals_bp' , __name__ )
1514
@@ -25,6 +24,52 @@ def display_spring_evals(internal=False, user_dict=None):
2524
2625 active_members = ldap_get_active_members ()
2726
27+ cm_count = dict ([tuple (row ) for row in MemberCommitteeAttendance .query .join (
28+ CommitteeMeeting ,
29+ MemberCommitteeAttendance .meeting_id == CommitteeMeeting .id
30+ ).with_entities (
31+ MemberCommitteeAttendance .uid ,
32+ CommitteeMeeting .timestamp ,
33+ CommitteeMeeting .approved ,
34+ ).filter (
35+ CommitteeMeeting .approved ,
36+ CommitteeMeeting .timestamp >= start_of_year ()
37+ ).with_entities (
38+ MemberCommitteeAttendance .uid ,
39+ func .count (MemberCommitteeAttendance .uid ) #pylint: disable=not-callable
40+ ).group_by (
41+ MemberCommitteeAttendance .uid
42+ ).all ()])
43+
44+ hm_missed = dict ([tuple (row ) for row in MemberHouseMeetingAttendance .query .join (
45+ HouseMeeting ,
46+ MemberHouseMeetingAttendance .meeting_id == HouseMeeting .id
47+ ).filter (
48+ HouseMeeting .date >= start_of_year (),
49+ MemberHouseMeetingAttendance .attendance_status == 'Absent'
50+ ).with_entities (
51+ MemberHouseMeetingAttendance .uid ,
52+ func .count (MemberHouseMeetingAttendance .uid ) #pylint: disable=not-callable
53+ ).group_by (
54+ MemberHouseMeetingAttendance .uid
55+ ).all ()])
56+
57+ major_project_query = MajorProject .query .filter (
58+ MajorProject .date >= start_of_year ()
59+ ).all ()
60+
61+ major_projects = {}
62+
63+ for project in major_project_query :
64+ if not project .uid in major_projects :
65+ major_projects [project .uid ] = []
66+
67+ major_projects .get (project .uid ).append ({
68+ 'name' : project .name ,
69+ 'status' : project .status ,
70+ 'description' : project .description
71+ })
72+
2873 sp_members = []
2974 for account in active_members :
3075 uid = account .uid
@@ -38,64 +83,45 @@ def display_spring_evals(internal=False, user_dict=None):
3883 db .session .add (spring_entry )
3984 db .session .flush ()
4085 db .session .commit ()
41- elif spring_entry .status != " Pending" and internal :
86+ elif spring_entry .status != ' Pending' and internal :
4287 continue
4388
44- eval_data = None
89+ member_missed_hms = []
90+
91+ if hm_missed .get (uid , 0 ) != 0 :
92+ member_missed_hms = MemberHouseMeetingAttendance .query .join (
93+ HouseMeeting ,
94+ MemberHouseMeetingAttendance .meeting_id == HouseMeeting .id
95+ ).filter (
96+ HouseMeeting .date >= start_of_year (),
97+ MemberHouseMeetingAttendance .attendance_status == 'Absent' ,
98+ MemberHouseMeetingAttendance .uid == uid ,
99+ ).with_entities (
100+ func .array_agg (HouseMeeting .date )
101+ ).scalar ()
45102
46- h_meetings = [m .meeting_id for m in get_hm (account , only_absent = True )]
47103 member = {
48104 'name' : account .cn ,
49105 'uid' : uid ,
50106 'status' : spring_entry .status ,
51- 'committee_meetings' : len ( get_cm ( account ) ),
107+ 'committee_meetings' : cm_count . get ( uid , 0 ),
52108 'req_meetings' : req_cm (account ),
53- 'house_meetings_missed' :
54- [
55- {
56- "date" : m .date .strftime ("%Y-%m-%d" ),
57- "reason" :
58- MemberHouseMeetingAttendance .query .filter (
59- MemberHouseMeetingAttendance .uid == uid ).filter (
60- MemberHouseMeetingAttendance .meeting_id == m .id ).first ().excuse
61- }
62- for m in HouseMeeting .query .filter (
63- HouseMeeting .id .in_ (h_meetings )
64- )
65- ],
66- 'major_projects' : [
67- {
68- 'name' : p .name ,
69- 'status' : p .status ,
70- 'description' : p .description
71- } for p in MajorProject .query .filter (
72- MajorProject .date > start_of_year (),
73- MajorProject .uid == uid )]
109+ 'house_meetings_missed' : member_missed_hms ,
110+ 'major_projects' : major_projects .get (uid , [])
74111 }
112+
113+ passed_mps = [project for project in member ['major_projects' ] if project ['status' ] == 'Passed' ]
114+
75115 member ['major_projects_len' ] = len (member ['major_projects' ])
76- member ['major_projects_passed' ] = [
77- {
78- 'name' : p .name ,
79- 'status' : p .status ,
80- 'description' : p .description
81- } for p in MajorProject .query .filter (
82- MajorProject .date > start_of_year (),
83- MajorProject .status == "Passed" ,
84- MajorProject .uid == uid )]
116+ member ['major_projects_passed' ] = passed_mps
85117 member ['major_projects_passed_len' ] = len (member ['major_projects_passed' ])
86- member ['major_project_passed' ] = False
87- for mp in member ['major_projects' ]:
88- if mp ['status' ] == "Passed" :
89- member ['major_project_passed' ] = True
90- break
91-
92- if internal :
93- member ['housing_evals' ] = eval_data
118+ member ['major_project_passed' ] = member ['major_projects_passed_len' ] > 0
119+
94120 sp_members .append (member )
95121
96122 sp_members .sort (key = lambda x : x ['committee_meetings' ], reverse = True )
97123 sp_members .sort (key = lambda x : len (x ['house_meetings_missed' ]))
98- sp_members .sort (key = lambda x : len ([ p for p in x ['major_projects' ] if p [ 'status' ] == "Passed" ]) , reverse = True )
124+ sp_members .sort (key = lambda x : x ['major_projects_passed_len' ] , reverse = True )
99125 # return names in 'first last (username)' format
100126 if internal :
101127 return sp_members
0 commit comments