Skip to content

Commit b6c500e

Browse files
committed
Fixed the display name lookup caching and refactored the packet view page.
Before this commit /packets/<uid> rendered in 1.3-2.0 seconds. After this commit /packet/<freshman_username>/<packet_id>/ renders in ~10 seconds pre-cache and ~0.5 seconds post-cache.
1 parent d628b73 commit b6c500e

File tree

6 files changed

+140
-90
lines changed

6 files changed

+140
-90
lines changed

packet/__init__.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,8 @@
3636
_ldap = csh_ldap.CSHLDAP(app.config['LDAP_BIND_DN'], app.config['LDAP_BIND_PASS'])
3737

3838
# pylint: disable=wrong-import-position
39+
from . import context_processors
40+
3941
if app.config["REALM"] == "csh":
4042
from .routes import upperclassmen
4143
else:

packet/context_processors.py

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
"""
2+
The context processors used by the jinja templates
3+
"""
4+
from functools import lru_cache
5+
from datetime import datetime
6+
7+
from packet.ldap import ldap_get_member
8+
from packet.models import Freshman
9+
from packet import app
10+
11+
12+
# pylint: disable=bare-except
13+
@lru_cache(maxsize=128)
14+
def get_csh_name(username):
15+
try:
16+
member = ldap_get_member(username)
17+
return member.cn + " (" + member.uid + ")"
18+
except:
19+
return username
20+
21+
22+
# pylint: disable=bare-except
23+
@lru_cache(maxsize=128)
24+
def get_rit_name(username):
25+
try:
26+
freshman = Freshman.query.filter_by(rit_username=username).first()
27+
return freshman.name + " (" + username + ")"
28+
except:
29+
return username
30+
31+
def log_time(label):
32+
"""
33+
Used during debugging to log timestamps while rendering templates
34+
"""
35+
print(label, datetime.now())
36+
37+
@app.context_processor
38+
def utility_processor():
39+
return dict(get_csh_name=get_csh_name, get_rit_name=get_rit_name, log_time=log_time)

packet/debug_utils.py

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@
55
from functools import wraps
66
from datetime import datetime
77

8+
from packet import context_processors
9+
810
def log_time(func):
911
"""
1012
Decorator for logging the execution time of a function
@@ -20,4 +22,11 @@ def wrapped_function(*args, **kwargs):
2022

2123
return result
2224

23-
return wrapped_function
25+
return wrapped_function
26+
27+
def log_cache():
28+
"""
29+
Utility call for logging cache info
30+
"""
31+
print("get_csh_name():", context_processors.get_csh_name.cache_info())
32+
print("get_rit_name():", context_processors.get_rit_name.cache_info())

packet/routes/shared.py

Lines changed: 34 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
1+
from itertools import chain
12
from flask import render_template, redirect
23

3-
from packet import auth, app, ldap
4+
from packet import auth, app
45
from packet.ldap import ldap_is_eboard
56
from packet.member import current_packets
6-
from packet.packet import get_number_required, get_number_signed, signed_packet, get_freshman
7-
from packet.packet import get_signatures, get_upperclassmen_percent
87
from packet.utils import before_request
8+
from packet.models import MiscSignature, Packet
99

1010

1111
@app.route('/logout')
@@ -14,21 +14,39 @@ def logout():
1414
return redirect("/")
1515

1616

17-
@app.route("/packet/<uid>")
17+
@app.route("/packet/<freshman_username>/<packet_id>/")
1818
@auth.oidc_auth
1919
@before_request
20-
def freshman_packet(uid, info=None):
21-
freshman = get_freshman(uid)
22-
upperclassmen_percent = get_upperclassmen_percent(uid)
23-
signatures = get_signatures(uid)
24-
signed_dict = get_number_signed(uid, True)
25-
required = get_number_required()
26-
signed = get_number_signed(uid)
27-
28-
packet_signed = signed_packet(info['uid'], uid)
29-
return render_template("packet.html", info=info, signatures=signatures, uid=uid, required=required, signed=signed,
30-
freshman=freshman, packet_signed=packet_signed, upperclassmen_percent=upperclassmen_percent,
31-
signed_dict=signed_dict)
20+
def freshman_packet(freshman_username, packet_id, info=None):
21+
packet = Packet.query.filter_by(freshman_username=freshman_username, id=packet_id).first()
22+
23+
if packet is None:
24+
return "Invalid packet or freshman", 404
25+
else:
26+
can_sign = False
27+
did_sign = False
28+
29+
if app.config["REALM"] == "csh":
30+
can_sign = packet.is_open()
31+
32+
for sig in filter(lambda sig: sig.member == info["uid"], chain(packet.upper_signatures,
33+
packet.misc_signatures)):
34+
if isinstance(sig, MiscSignature):
35+
did_sign = True
36+
else:
37+
did_sign = sig.signed
38+
39+
break
40+
else:
41+
for sig in filter(lambda sig: sig.freshman_username == info["uid"], packet.fresh_signatures):
42+
can_sign = packet.is_open()
43+
did_sign = sig.signed
44+
break
45+
46+
return render_template("packet.html", info=info, packet=packet, can_sign=can_sign, did_sign=did_sign,
47+
required=packet.signatures_required(), received=packet.signatures_received(),
48+
eboard=filter(lambda sig: sig.eboard, packet.upper_signatures),
49+
upper=filter(lambda sig: not sig.eboard, packet.upper_signatures))
3250

3351

3452
@app.route("/packets")

packet/templates/packet.html

Lines changed: 54 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -1,32 +1,30 @@
11
{% extends "extend/base.html" %}
22

3-
{% set packet_end = freshman.current_packet().end.strftime('%m/%d/%Y') %}
3+
{% set packet_end = packet.end.strftime('%m/%d/%Y') %}
44

55
{% block body %}
66
<div class="container main">
77
<div class="mb-2">
88
<div class="row justify-content-between w-100">
99
<div class="col">
10-
<h3>{{ freshman.name }}</h3>
10+
<h3>{{ packet.freshman.name }}</h3>
1111
</div>
1212
<div class="col">
13-
{% if (info.onfloor and info.uid != freshman.rit_username) or info.realm == "csh" %}
14-
{% if not packet_signed %}
15-
<button class="btn btn-primary sign-button"
16-
data-freshman_uid="{{ freshman.rit_username }}"
17-
data-freshman_name="{{ freshman.name }}">Sign
18-
</button>
19-
{% else %}
20-
<button class="btn btn-primary signed-button" disabled="disabled"><i
21-
class="fa fa-check"></i>&nbsp;Signed
22-
</button>
23-
{% endif %}
13+
{% if can_sign and not did_sign %}
14+
<button class="btn btn-primary sign-button"
15+
data-freshman_uid="{{ freshman.rit_username }}"
16+
data-freshman_name="{{ freshman.name }}">Sign
17+
</button>
18+
{% elif did_sign %}
19+
<button class="btn btn-primary signed-button" disabled="disabled"><i
20+
class="fa fa-check"></i>&nbsp;Signed
21+
</button>
2422
{% endif %}
2523
</div>
2624
</div>
2725
<div class="row justify-content-between">
2826
<div class="col">
29-
<h5>Signatures: {{ signed }}/{{ required }}</h5>
27+
<h5>Signatures: {{ received.total }}/{{ required.total }}</h5>
3028
</div>
3129
<div class="col">
3230
<h5 class="right-align">Packet Ends: {{ packet_end }}</h5>
@@ -35,18 +33,19 @@ <h5 class="right-align">Packet Ends: {{ packet_end }}</h5>
3533
<div class="card card-body">
3634
<div class="row justify-content-between">
3735
<div class="col">
38-
<h5>Total Score - {{ '%0.2f' % (signed/required * 100) }}%</h5>
36+
{% set total_score = received.total / required.total * 100 %}
37+
<h5>Total Score - {{ '%0.2f' % total_score }}%</h5>
3938
<div class="progress">
4039
<div class="progress-bar progress-bar-striped progress-bar-animated" role="progressbar"
41-
aria-valuenow="{{ signed/required * 100 }}" aria-valuemin="0" aria-valuemax="100"
42-
style="width: {{ signed/required * 100 }}%"></div>
40+
aria-valuenow="{{ total_score }}" aria-valuemin="0"
41+
aria-valuemax="100" style="width: {{ total_score }}%"></div>
4342
</div>
44-
<h5>Upperclassmen Score - {{ '%0.2f' % upperclassmen_percent }}%</h5>
43+
{% set upper_score = received.member_total / required.member_total * 100 %}
44+
<h5>Upperclassmen Score - {{ '%0.2f' % upper_score }}%</h5>
4545
<div class="progress">
4646
<div class="progress-bar bg-warning progress-bar-striped progress-bar-animated"
47-
role="progressbar"
48-
aria-valuenow="{{ upperclassmen_percent }}" aria-valuemin="0" aria-valuemax="100"
49-
style="width: {{ upperclassmen_percent }}%"></div>
47+
role="progressbar" aria-valuenow="{{ upper_score }}" aria-valuemin="0"
48+
aria-valuemax="100" style="width: {{ upper_score }}%"></div>
5049
</div>
5150
</div>
5251
</div>
@@ -57,30 +56,30 @@ <h5>Upperclassmen Score - {{ '%0.2f' % upperclassmen_percent }}%</h5>
5756
<div class="card mb-2">
5857
<div class="card-header">
5958
<b>EBoard Signatures</b>
60-
<b class="signature-count">{{ signed_dict.eboard }}/{{ signatures.eboard | count }}</b>
59+
<b class="signature-count">{{ received.eboard }}/{{ required.eboard }}</b>
6160
</div>
6261
<div class="card-body table-fill">
6362
<div class="table-responsive">
6463
<table class="table table-striped no-bottom-margin" data-module="table"
6564
data-searchable="true" data-sort-column="3" data-sort-order="asc"
6665
data-length-changable="true" data-paginated="false">
6766
<tbody>
68-
{% for m in signatures.eboard %}
69-
<tr {% if m.signed %}style="background-color: #4caf505e" {% endif %}>
67+
{% for sig in eboard %}
68+
<tr {% if sig.signed %}style="background-color: #4caf505e" {% endif %}>
7069
<td>
7170
{% if info.realm == "csh" %}
72-
<a href="/member/{{ m.member }}">
71+
<a href="/member/{{ sig.member }}">
7372
{% endif %}
74-
<img class="eval-user-img" alt="{{ m['member'] }}"
75-
src="https://profiles.csh.rit.edu/image/{{ m['member'] }}"
76-
width="25"
77-
height="25"/> {{ get_display_name(m.member) }}
73+
<img class="eval-user-img" alt="{{ sig.member }}"
74+
src="https://profiles.csh.rit.edu/image/{{ sig.member }}"
75+
width="25" height="25"/>
76+
{{ get_csh_name(sig.member) }}
7877
{% if info.realm == "csh" %}
7978
</a>
8079
{% endif %}
8180
</td>
8281
<td width="15%">
83-
{% if m.signed %}
82+
{% if sig.signed %}
8483
<i class="fas fa-check"></i>
8584
{% else %}
8685
<i class="fas fa-times"></i>
@@ -96,30 +95,30 @@ <h5>Upperclassmen Score - {{ '%0.2f' % upperclassmen_percent }}%</h5>
9695
<div class="card mb-2">
9796
<div class="card-header">
9897
<b>On-Floor Upperclassmen Signatures</b>
99-
<b class="signature-count">{{ signed_dict.upperclassmen }}/{{ signatures.upperclassmen | count }}</b>
98+
<b class="signature-count">{{ received.upper }}/{{ required.upper }}</b>
10099
</div>
101100
<div class="card-body table-fill">
102101
<div class="table-responsive">
103102
<table class="table table-striped no-bottom-margin" data-module="table"
104103
data-searchable="true" data-sort-column="3" data-sort-order="asc"
105104
data-length-changable="true" data-paginated="false">
106105
<tbody>
107-
{% for m in signatures.upperclassmen %}
108-
<tr {% if m.signed %}style="background-color: #4caf505e" {% endif %}>
106+
{% for sig in upper %}
107+
<tr {% if sig.signed %}style="background-color: #4caf505e" {% endif %}>
109108
<td>
110109
{% if info.realm == "csh" %}
111-
<a href="/member/{{ m.member }}">
110+
<a href="/member/{{ sig.member }}">
112111
{% endif %}
113-
<img class="eval-user-img" alt="{{ m['member'] }}"
114-
src="https://profiles.csh.rit.edu/image/{{ m['member'] }}"
115-
width="25"
116-
height="25"/> {{ get_display_name(m.member) }}
112+
<img class="eval-user-img" alt="{{ sig.member }}"
113+
src="https://profiles.csh.rit.edu/image/{{ sig.member }}"
114+
width="25" height="25"/>
115+
{{ get_csh_name(sig.member) }}
117116
{% if info.realm == "csh" %}
118117
</a>
119118
{% endif %}
120119
</td>
121120
<td width="15%">
122-
{% if m.signed %}
121+
{% if sig.signed %}
123122
<i class="fas fa-check"></i>
124123
{% else %}
125124
<i class="fas fa-times"></i>
@@ -135,26 +134,24 @@ <h5>Upperclassmen Score - {{ '%0.2f' % upperclassmen_percent }}%</h5>
135134
<div class="card mb-2">
136135
<div class="card-header">
137136
<b>On-Floor Freshmen Signatures</b>
138-
<b class="signature-count">{{ signed_dict.freshmen }}/{{ signatures.freshmen | count }}</b>
137+
<b class="signature-count">{{ received.fresh }}/{{ required.fresh }}</b>
139138
</div>
140139
<div class="card-body table-fill">
141140
<div class="table-responsive">
142141
<table class="table table-striped no-bottom-margin" data-module="table"
143142
data-searchable="true" data-sort-column="3" data-sort-order="asc"
144143
data-length-changable="true" data-paginated="false">
145144
<tbody>
146-
{% for m in signatures.freshmen %}
147-
<tr {% if m.signed %}style="background-color: #4caf505e" {% endif %}>
145+
{% for sig in packet.fresh_signatures %}
146+
<tr {% if sig.signed %}style="background-color: #4caf505e" {% endif %}>
148147
<td>
149-
<a href="/packet/{{ m.freshman_username }}">
150-
<img class="eval-user-img" alt="{{ m.freshman_username }}"
151-
src="https://www.gravatar.com/avatar/freshmen?d=mp&f=y"
152-
width="25"
153-
height="25"/> {{ m.name }} ({{ m.freshman_username }})
154-
</a>
148+
<img class="eval-user-img" alt="{{ sig.freshman_username }}"
149+
src="https://www.gravatar.com/avatar/freshmen?d=mp&f=y"
150+
width="25" height="25"/>
151+
{{ get_rit_name(sig.freshman_username) }}
155152
</td>
156153
<td width="15%">
157-
{% if m.signed %}
154+
{% if sig.signed %}
158155
<i class="fas fa-check"></i>
159156
{% else %}
160157
<i class="fas fa-times"></i>
@@ -170,27 +167,27 @@ <h5>Upperclassmen Score - {{ '%0.2f' % upperclassmen_percent }}%</h5>
170167
<div class="card mb-2">
171168
<div class="card-header">
172169
<b>Off-Floor Upperclassmen/Alumni/Advisor Signatures</b>
173-
<b class="signature-count">{{ signatures.misc | count }}/15</b>
170+
<b class="signature-count">{{ received.misc }}/{{ required.misc }}</b>
174171
</div>
175172
<div class="card-body table-fill">
176173
<div class="table-responsive">
177174
<table class="table table-striped no-bottom-margin" data-module="table"
178175
data-searchable="true" data-sort-column="3" data-sort-order="asc"
179176
data-length-changable="true" data-paginated="false">
180177
<tbody>
181-
{% for m in signatures.misc %}
182-
<tr {% if m.signed %}style="background-color: #4caf505e" {% endif %}>
178+
{% for sig in packet.misc_signatures %}
179+
<tr {% if sig.signed %}style="background-color: #4caf505e" {% endif %}>
183180
<td width="3%">
184181
{{ loop.index }}.
185182
</td>
186183
<td>
187184
{% if info.realm == "csh" %}
188-
<a href="/member/{{ m.member }}">
185+
<a href="/member/{{ sig.member }}">
189186
{% endif %}
190-
<img class="eval-user-img" alt="{{ m['member'] }}"
191-
src="https://profiles.csh.rit.edu/image/{{ m['member'] }}"
192-
width="25"
193-
height="25"/> {{ get_display_name(m.member) }}
187+
<img class="eval-user-img" alt="{{ sig.member }}"
188+
src="https://profiles.csh.rit.edu/image/{{ sig.member }}"
189+
width="25" height="25"/>
190+
{{ get_csh_name(sig.member) }}
194191
{% if info.realm == "csh" %}
195192
</a>
196193
{% endif %}

0 commit comments

Comments
 (0)