Skip to content

Commit 2150eff

Browse files
authored
Merge pull request #42 from devinmatte/performance
Aggressive Caching
2 parents 8d8830b + 2ddcb1d commit 2150eff

File tree

8 files changed

+60
-116
lines changed

8 files changed

+60
-116
lines changed

packet/ldap.py

Lines changed: 17 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,14 @@
11
from functools import lru_cache
22

3-
import ldap
4-
53
from packet import _ldap
64

75

6+
@lru_cache(maxsize=1024)
87
def _ldap_get_group_members(group):
98
return _ldap.get_group(group).get_members()
109

1110

11+
@lru_cache(maxsize=2048)
1212
def _ldap_is_member_of_group(member, group):
1313
group_list = member.get("memberOf")
1414
for group_dn in group_list:
@@ -48,16 +48,6 @@ def ldap_get_onfloor_members():
4848
return _ldap_get_group_members("onfloor")
4949

5050

51-
@lru_cache(maxsize=1024)
52-
def ldap_get_current_students():
53-
return _ldap_get_group_members("current_student")
54-
55-
56-
@lru_cache(maxsize=1024)
57-
def ldap_get_all_members():
58-
return _ldap_get_group_members("member")
59-
60-
6151
@lru_cache(maxsize=1024)
6252
def ldap_get_groups(account):
6353
group_list = account.get("memberOf")
@@ -68,17 +58,6 @@ def ldap_get_groups(account):
6858
return groups
6959

7060

71-
@lru_cache(maxsize=1024)
72-
def ldap_get_group_desc(group):
73-
con = _ldap.get_con()
74-
results = con.search_s(
75-
"cn=groups,cn=accounts,dc=csh,dc=rit,dc=edu",
76-
ldap.SCOPE_SUBTREE,
77-
"(cn=%s)" % group,
78-
['description'])
79-
return results[0][1]['description'][0].decode('utf-8')
80-
81-
8261
@lru_cache(maxsize=1024)
8362
def ldap_get_eboard():
8463
members = _ldap_get_group_members("eboard-chairman") + _ldap_get_group_members("eboard-evaluations"
@@ -90,6 +69,7 @@ def ldap_get_eboard():
9069
return members
9170

9271

72+
@lru_cache(maxsize=2048)
9373
def ldap_get_live_onfloor():
9474
"""
9575
:return: All upperclassmen who live on floor and are not eboard
@@ -101,67 +81,51 @@ def ldap_get_live_onfloor():
10181
members.append(member)
10282
return members
10383

84+
10485
# Status checkers
10586

87+
@lru_cache(maxsize=1024)
88+
def ldap_is_eval_director(account):
89+
return _ldap_is_member_of_directorship(account, 'evaluations')
90+
91+
92+
@lru_cache(maxsize=1024)
10693
def ldap_is_active(account):
10794
return _ldap_is_member_of_group(account, 'active')
10895

10996

97+
@lru_cache(maxsize=1024)
11098
def ldap_is_alumni(account):
11199
# If the user is not active, they are an alumni.
112100
return not _ldap_is_member_of_group(account, 'active')
113101

114102

103+
@lru_cache(maxsize=1024)
115104
def ldap_is_eboard(account):
116105
return _ldap_is_member_of_group(account, 'eboard')
117106

118107

108+
@lru_cache(maxsize=1024)
119109
def ldap_is_rtp(account):
120110
return _ldap_is_member_of_group(account, 'rtp')
121111

122112

113+
@lru_cache(maxsize=1024)
123114
def ldap_is_intromember(account):
124115
return _ldap_is_member_of_group(account, 'intromembers')
125116

126117

118+
@lru_cache(maxsize=1024)
127119
def ldap_is_onfloor(account):
128120
return _ldap_is_member_of_group(account, 'onfloor')
129121

130122

123+
@lru_cache(maxsize=1024)
131124
def ldap_is_current_student(account):
132125
return _ldap_is_member_of_group(account, 'current_student')
133126

134127

135-
# Directorships
136-
137-
def ldap_is_financial_director(account):
138-
return _ldap_is_member_of_directorship(account, 'financial')
139-
140-
141-
def ldap_is_eval_director(account):
142-
return _ldap_is_member_of_directorship(account, 'evaluations')
143-
144-
145-
def ldap_is_chairman(account):
146-
return _ldap_is_member_of_directorship(account, 'chairman')
147-
148-
149-
def ldap_is_history(account):
150-
return _ldap_is_member_of_directorship(account, 'history')
151-
152-
153-
def ldap_is_imps(account):
154-
return _ldap_is_member_of_directorship(account, 'imps')
155-
156-
157-
def ldap_is_social(account):
158-
return _ldap_is_member_of_directorship(account, 'Social')
159-
160-
161-
def ldap_is_rd(account):
162-
return _ldap_is_member_of_directorship(account, 'research')
163-
164-
128+
@lru_cache(maxsize=1024)
165129
def ldap_get_roomnumber(account):
166130
try:
167131
return account.roomNumber

packet/models.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33
"""
44

55
from datetime import datetime
6+
from functools import lru_cache
7+
68
from sqlalchemy import Column, Integer, String, Text, ForeignKey, DateTime, Boolean
79
from sqlalchemy.orm import relationship
810

@@ -47,6 +49,7 @@ class Packet(db.Model):
4749
def is_open(self):
4850
return self.start < datetime.now() < self.end
4951

52+
@lru_cache(maxsize=1024)
5053
def signatures_required(self):
5154
eboard = UpperSignature.query.filter_by(eboard=True).count()
5255
return {'eboard': eboard,

packet/packet.py

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,6 @@
1+
import copy
2+
from functools import lru_cache
3+
14
from packet.ldap import ldap_get_member, ldap_is_intromember
25
from .models import Freshman, UpperSignature, FreshSignature, MiscSignature, db
36

@@ -32,9 +35,15 @@ def sign(signer_username, freshman_username):
3235
db.session.add(MiscSignature(packet=packet, member=signer_username))
3336
db.session.commit()
3437

38+
# Clear functions that read signatures cache
39+
get_number_signed.cache_clear()
40+
get_signatures.cache_clear()
41+
get_upperclassmen_percent.cache_clear()
42+
3543
return True
3644

3745

46+
@lru_cache(maxsize=2048)
3847
def get_signatures(freshman_username):
3948
packet = Freshman.query.filter_by(rit_username=freshman_username).first().current_packet()
4049
eboard = UpperSignature.query.filter_by(packet_id=packet.id, eboard=True).order_by(UpperSignature.signed.desc())
@@ -48,9 +57,24 @@ def get_signatures(freshman_username):
4857
'misc': misc_signatures}
4958

5059

60+
@lru_cache(maxsize=2048)
5161
def get_number_signed(freshman_username):
5262
return Freshman.query.filter_by(rit_username=freshman_username).first().current_packet().signatures_received()
5363

5464

65+
@lru_cache(maxsize=4096)
5566
def get_number_required(freshman_username):
5667
return Freshman.query.filter_by(rit_username=freshman_username).first().current_packet().signatures_required()
68+
69+
70+
@lru_cache(maxsize=2048)
71+
def get_upperclassmen_percent(uid):
72+
upperclassmen_required = copy.deepcopy(get_number_required(uid))
73+
del upperclassmen_required['freshmen']
74+
upperclassmen_required = sum(upperclassmen_required.values())
75+
76+
upperclassmen_signature = copy.deepcopy(get_number_signed(uid))
77+
del upperclassmen_signature['freshmen']
78+
upperclassmen_signature = sum(upperclassmen_signature.values())
79+
80+
return upperclassmen_signature / upperclassmen_required * 100

packet/routes/shared.py

Lines changed: 10 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
1-
from flask import render_template
21
from datetime import datetime
32
from itertools import chain
43

4+
from flask import render_template
5+
56
from packet import auth, app
67
from packet.models import Freshman, Packet
7-
from packet.packet import get_signatures, get_number_required, get_number_signed
8+
from packet.packet import get_signatures, get_number_required, get_number_signed, get_upperclassmen_percent
89
from packet.utils import before_request, signed_packet
910

1011

@@ -13,21 +14,12 @@
1314
@before_request
1415
def freshman_packet(uid, info=None):
1516
freshman = Freshman.query.filter_by(rit_username=uid).first()
17+
upperclassmen_percent = get_upperclassmen_percent(uid)
1618
signatures = get_signatures(uid)
1719
signed_dict = get_number_signed(uid)
1820
required = sum(get_number_required(uid).values())
1921
signed = sum(signed_dict.values())
2022

21-
upperclassmen_required = get_number_required(uid)
22-
del upperclassmen_required['freshmen']
23-
upperclassmen_required = sum(upperclassmen_required.values())
24-
25-
upperclassmen_signature = get_number_signed(uid)
26-
del upperclassmen_signature['freshmen']
27-
upperclassmen_signature = sum(upperclassmen_signature.values())
28-
29-
upperclassmen_percent = upperclassmen_signature / upperclassmen_required * 100
30-
3123
packet_signed = signed_packet(info['uid'], uid)
3224
return render_template("packet.html", info=info, signatures=signatures, uid=uid, required=required, signed=signed,
3325
freshman=freshman, packet_signed=packet_signed, upperclassmen_percent=upperclassmen_percent,
@@ -38,12 +30,12 @@ def freshman_packet(uid, info=None):
3830
@auth.oidc_auth
3931
@before_request
4032
def packets(info=None):
41-
packets = Packet.query.filter(Packet.end > datetime.now()).filter(Packet.start < datetime.now()).all()
33+
open_packets = Packet.query.filter(Packet.end > datetime.now()).filter(Packet.start < datetime.now()).all()
4234

4335
# Add the did_sign flag
4436
if app.config["REALM"] == "csh":
4537
# User is an upperclassman
46-
for packet in packets:
38+
for packet in open_packets:
4739
packet.did_sign = False
4840
packet.total_signatures = sum(packet.signatures_received().values())
4941
packet.required_signatures = sum(packet.signatures_required().values())
@@ -54,7 +46,7 @@ def packets(info=None):
5446
break
5547
else:
5648
# User is a freshman
57-
for packet in packets:
49+
for packet in open_packets:
5850
packet.did_sign = False
5951
packet.total_signatures = sum(packet.signatures_received().values())
6052
packet.required_signatures = sum(packet.signatures_required().values())
@@ -64,7 +56,7 @@ def packets(info=None):
6456
packet.did_sign = True
6557
break
6658

67-
packets.sort(key=lambda x: sum(x.signatures_received().values()), reverse=True)
68-
packets.sort(key=lambda x: x.did_sign, reverse=True)
59+
open_packets.sort(key=lambda x: sum(x.signatures_received().values()), reverse=True)
60+
open_packets.sort(key=lambda x: x.did_sign, reverse=True)
6961

70-
return render_template("active_packets.html", info=info, packets=packets)
62+
return render_template("active_packets.html", info=info, packets=open_packets)

packet/templates/active_packets.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ <h3 class="page-title">Active Packets</h3>
3333
alt="{{ packet.freshman.name }}"
3434
src="https://www.gravatar.com/avatar/freshmen?d=mp&f=y"
3535
width="25"
36-
height="25"/> {{ get_freshman_name(packet.freshman.rit_username) }}
36+
height="25"/> {{ packet.freshman.name }} ({{ packet.freshman.rit_username }})
3737
</a>
3838
</td>
3939
<td>

packet/templates/packet.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -166,7 +166,7 @@ <h5>Upperclassmen Score</h5>
166166
<img class="eval-user-img" alt="{{ m.freshman.rit_username }}"
167167
src="https://www.gravatar.com/avatar/freshmen?d=mp&f=y"
168168
width="25"
169-
height="25"/> {{ get_freshman_name(m.freshman.rit_username) }}
169+
height="25"/> {{ m.freshman.name }} ({{ m.freshman.rit_username }})
170170
</a>
171171
</td>
172172
<td width="15%">

packet/templates/upperclassman.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ <h3 class="page-title">{{ get_display_name(member) }}</h3>
3232
alt="{{ m.packet.freshman.name }}"
3333
src="https://profiles.csh.rit.edu/image/{{ m.packet.freshman.rit_username }}"
3434
width="25"
35-
height="25"/> {{ get_freshman_name(m.packet.freshman.name) }}
35+
height="25"/> {{ m.packet.freshman.name }} ({{ m.packet.freshman.rit_username }})
3636
</a>
3737
</td>
3838
<td width="15%">

packet/utils.py

Lines changed: 3 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -45,55 +45,22 @@ def wrapped_function(*args, **kwargs):
4545
return wrapped_function
4646

4747

48+
@lru_cache(maxsize=2048)
4849
def get_member_info(uid):
4950
account = ldap_get_member(uid)
5051

5152
member_info = {
5253
"user_obj": account,
5354
"group_list": ldap_get_groups(account),
5455
"uid": account.uid,
55-
"ritUid": parse_rit_uid(account.ritDn),
5656
"name": account.cn,
5757
"active": ldap_is_active(account),
5858
"onfloor": ldap_is_onfloor(account),
5959
"room": ldap_get_roomnumber(account),
60-
"hp": account.housingPoints,
61-
"plex": account.plex,
62-
"rn": ldap_get_roomnumber(account),
63-
"birthday": parse_date(account.birthday),
64-
"memberSince": parse_date(account.memberSince),
65-
"lastlogin": parse_date(account.krblastsuccessfulauth),
66-
"year": parse_account_year(account.memberSince)
6760
}
6861
return member_info
6962

7063

71-
def parse_date(date):
72-
if date:
73-
year = date[0:4]
74-
month = date[4:6]
75-
day = date[6:8]
76-
return month + "-" + day + "-" + year
77-
return False
78-
79-
80-
def parse_rit_uid(dn):
81-
if dn:
82-
return dn.split(",")[0][4:]
83-
84-
return None
85-
86-
87-
def parse_account_year(date):
88-
if date:
89-
year = int(date[0:4])
90-
month = int(date[4:6])
91-
if month <= 8:
92-
year = year - 1
93-
return year
94-
return None
95-
96-
9764
@lru_cache(maxsize=2048)
9865
def is_on_floor(uid):
9966
return (Freshman.query.filter_by(rit_username=uid)).first().onfloor
@@ -118,18 +85,12 @@ def signed_packet(signer, freshman):
11885
@app.context_processor
11986
def utility_processor():
12087
# pylint: disable=bare-except
88+
@lru_cache(maxsize=4096)
12189
def get_display_name(username):
12290
try:
12391
member = ldap_get_member(username)
12492
return member.cn + " (" + member.uid + ")"
12593
except:
12694
return username
12795

128-
def get_freshman_name(username):
129-
try:
130-
freshman = Freshman.query.filter_by(rit_username=username).first()
131-
return freshman.name + " (" + freshman.rit_username + ")"
132-
except:
133-
return username
134-
135-
return dict(get_display_name=get_display_name, get_freshman_name=get_freshman_name)
96+
return dict(get_display_name=get_display_name)

0 commit comments

Comments
 (0)