Skip to content

Commit 2111455

Browse files
committed
speedup spring evals page
1 parent 98a8317 commit 2111455

File tree

3 files changed

+85
-60
lines changed

3 files changed

+85
-60
lines changed

conditional/blueprints/spring_evals.py

Lines changed: 74 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,14 @@
11
import structlog
22
from flask import Blueprint, request
3+
from sqlalchemy import func
34

45
from 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
98
from conditional.util.auth import get_user
109
from conditional.util.flask import render_template
1110
from 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

1413
spring_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

conditional/templates/spring_evals.html

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -114,8 +114,8 @@ <h4>Missed House Meetings</h4>
114114
<tbody>
115115
{% for hm_missed in m['house_meetings_missed'] %}
116116
<tr>
117-
<td>{{hm_missed['date']}}</td>
118-
<td>{{hm_missed['reason']}}</td>
117+
<td>{{hm_missed}}</td>
118+
<td></td>
119119
</tr>
120120
{% endfor %}
121121
</tbody>

conditional/util/member.py

Lines changed: 9 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -90,19 +90,18 @@ def get_onfloor_members():
9090

9191

9292
def get_cm(member):
93-
9493
query_result = CommitteeMeeting.query.join(
9594
MemberCommitteeAttendance,
9695
MemberCommitteeAttendance.meeting_id == CommitteeMeeting.id
97-
).with_entities(
98-
MemberCommitteeAttendance.uid,
99-
CommitteeMeeting.timestamp,
100-
CommitteeMeeting.committee
101-
).filter(
102-
CommitteeMeeting.timestamp > start_of_year(),
103-
MemberCommitteeAttendance.uid == member.uid,
104-
CommitteeMeeting.approved == True # pylint: disable=singleton-comparison
105-
).all()
96+
).with_entities(
97+
MemberCommitteeAttendance.uid,
98+
CommitteeMeeting.timestamp,
99+
CommitteeMeeting.committee
100+
).filter(
101+
CommitteeMeeting.timestamp > start_of_year(),
102+
MemberCommitteeAttendance.uid == member.uid,
103+
CommitteeMeeting.approved
104+
).all()
106105

107106
c_meetings = [{
108107
"uid": cm.uid,

0 commit comments

Comments
 (0)