Skip to content

Commit 0cc3bae

Browse files
authored
Merge pull request #46 from ComputerScienceHouse/develop
Packet 3.0.1
2 parents f32edd7 + d027404 commit 0cc3bae

16 files changed

+125
-177
lines changed

frontend/scss/components/buttons.scss

+5-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,8 @@
11
.sign-packet {
22
float: right;
33
text-align: right;
4-
}
4+
}
5+
6+
.sign-button {
7+
float: right;
8+
}
+3
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
.signature-count {
2+
float: right;
3+
}

frontend/scss/packet.scss

+1
Original file line numberDiff line numberDiff line change
@@ -5,3 +5,4 @@ $csh-pink: #b0197e;
55
@import "components/switches";
66
@import "components/datatables";
77
@import "components/buttons";
8+
@import "components/signatures";

package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
{
22
"title": "CSH Packet",
33
"name": "csh-packet",
4-
"version": "3.0.0",
4+
"version": "3.0.1",
55
"description": "A webpacket for CSH",
66
"bugs": {
77
"url": "https://github.com/ComputerScienceHouse/packet/issues",

packet/__init__.py

+4
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@
1010
from flask_pyoidc.flask_pyoidc import OIDCAuthentication
1111
from flask_sqlalchemy import SQLAlchemy
1212

13+
from ._version import __version__
14+
1315
app = Flask(__name__)
1416

1517
# Load default configuration and any environment variable overrides
@@ -19,6 +21,8 @@
1921
if os.path.exists(os.path.join(os.getcwd(), "config.py")):
2022
app.config.from_pyfile(os.path.join(os.getcwd(), "config.py"))
2123

24+
app.config["VERSION"] = __version__
25+
2226
# Initialize the extensions
2327
db = SQLAlchemy(app)
2428
migrate = Migrate(app, db)

packet/_version.py

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
__version__ = "3.0.1"

packet/ldap.py

+17-53
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/member.py

+4-4
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,10 @@
22

33

44
def signed_packets(member):
5-
is_freshman = Freshman.query.filter_by(rit_username=member).first() is not None
6-
if is_freshman:
5+
# Checks whether or not member is a freshman
6+
if Freshman.query.filter_by(rit_username=member).first() is not None:
77
return FreshSignature.query.filter_by(freshman_username=member, signed=True).all()
8-
is_upper = UpperSignature.query.filter_by(member=member).first() is not None
9-
if is_upper:
8+
# Checks whether or not member is an upperclassman
9+
if UpperSignature.query.filter_by(member=member).first() is not None:
1010
return UpperSignature.query.filter_by(member=member, signed=True).all()
1111
return MiscSignature.query.filter_by(member=member).all()

packet/models.py

+3
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

+32-9
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
1+
import copy
2+
from functools import lru_cache
3+
4+
from packet.ldap import ldap_get_member, ldap_is_intromember
15
from .models import Freshman, UpperSignature, FreshSignature, MiscSignature, db
26

37

@@ -9,33 +13,37 @@ def sign(signer_username, freshman_username):
913
if freshman_signed is None:
1014
return False
1115
packet = freshman_signed.current_packet()
12-
if packet is None:
13-
return False
14-
if not packet.is_open():
16+
if packet is None or not packet.is_open():
1517
return False
1618

17-
# Make sure only on floor freshmen can sign packets
18-
freshman_signer = Freshman.query.filter_by(rit_username=signer_username).first()
19-
if freshman_signer:
20-
if not freshman_signer.onfloor:
21-
return False
22-
2319
upper_signature = UpperSignature.query.filter(UpperSignature.member == signer_username,
2420
UpperSignature.packet == packet).first()
2521
fresh_signature = FreshSignature.query.filter(FreshSignature.freshman_username == signer_username,
2622
FreshSignature.packet == packet).first()
2723

2824
if upper_signature:
25+
if ldap_is_intromember(ldap_get_member(signer_username)):
26+
return False
2927
upper_signature.signed = True
3028
elif fresh_signature:
29+
# Make sure only on floor freshmen can sign packets
30+
freshman_signer = Freshman.query.filter_by(rit_username=signer_username).first()
31+
if freshman_signer and not freshman_signer.onfloor:
32+
return False
3133
fresh_signature.signed = True
3234
else:
3335
db.session.add(MiscSignature(packet=packet, member=signer_username))
3436
db.session.commit()
3537

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+
3643
return True
3744

3845

46+
@lru_cache(maxsize=2048)
3947
def get_signatures(freshman_username):
4048
packet = Freshman.query.filter_by(rit_username=freshman_username).first().current_packet()
4149
eboard = UpperSignature.query.filter_by(packet_id=packet.id, eboard=True).order_by(UpperSignature.signed.desc())
@@ -49,9 +57,24 @@ def get_signatures(freshman_username):
4957
'misc': misc_signatures}
5058

5159

60+
@lru_cache(maxsize=2048)
5261
def get_number_signed(freshman_username):
5362
return Freshman.query.filter_by(rit_username=freshman_username).first().current_packet().signatures_received()
5463

5564

65+
@lru_cache(maxsize=4096)
5666
def get_number_required(freshman_username):
5767
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

+14-20
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,35 +14,28 @@
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)
19+
signed_dict = get_number_signed(uid)
1720
required = sum(get_number_required(uid).values())
18-
signed = sum(get_number_signed(uid).values())
19-
20-
upperclassmen_required = get_number_required(uid)
21-
del upperclassmen_required['freshmen']
22-
upperclassmen_required = sum(upperclassmen_required.values())
23-
24-
upperclassmen_signature = get_number_signed(uid)
25-
del upperclassmen_signature['freshmen']
26-
upperclassmen_signature = sum(upperclassmen_signature.values())
27-
28-
upperclassmen_percent = upperclassmen_signature / upperclassmen_required * 100
21+
signed = sum(signed_dict.values())
2922

3023
packet_signed = signed_packet(info['uid'], uid)
3124
return render_template("packet.html", info=info, signatures=signatures, uid=uid, required=required, signed=signed,
32-
freshman=freshman, packet_signed=packet_signed, upperclassmen_percent=upperclassmen_percent)
25+
freshman=freshman, packet_signed=packet_signed, upperclassmen_percent=upperclassmen_percent,
26+
signed_dict=signed_dict)
3327

3428

3529
@app.route("/packets")
3630
@auth.oidc_auth
3731
@before_request
3832
def packets(info=None):
39-
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()
4034

4135
# Add the did_sign flag
4236
if app.config["REALM"] == "csh":
4337
# User is an upperclassman
44-
for packet in packets:
38+
for packet in open_packets:
4539
packet.did_sign = False
4640
packet.total_signatures = sum(packet.signatures_received().values())
4741
packet.required_signatures = sum(packet.signatures_required().values())
@@ -52,7 +46,7 @@ def packets(info=None):
5246
break
5347
else:
5448
# User is a freshman
55-
for packet in packets:
49+
for packet in open_packets:
5650
packet.did_sign = False
5751
packet.total_signatures = sum(packet.signatures_received().values())
5852
packet.required_signatures = sum(packet.signatures_required().values())
@@ -62,7 +56,7 @@ def packets(info=None):
6256
packet.did_sign = True
6357
break
6458

65-
packets.sort(key=lambda x: sum(x.signatures_received().values()), reverse=True)
66-
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)
6761

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

0 commit comments

Comments
 (0)