|
3 | 3 | """ |
4 | 4 |
|
5 | 5 | from datetime import datetime |
6 | | -from functools import lru_cache |
7 | 6 |
|
8 | 7 | from sqlalchemy import Column, Integer, String, Text, ForeignKey, DateTime, Boolean |
9 | 8 | from sqlalchemy.orm import relationship |
|
14 | 13 | REQUIRED_MISC_SIGNATURES = 15 |
15 | 14 |
|
16 | 15 |
|
| 16 | +class SigCounts: |
| 17 | + """ |
| 18 | + Utility class for returning counts of signatures broken out by type |
| 19 | + """ |
| 20 | + def __init__(self, eboard, upper, fresh, misc): |
| 21 | + self.eboard = eboard |
| 22 | + self.upper = upper # Upperclassmen excluding eboard |
| 23 | + self.fresh = fresh |
| 24 | + self.misc = misc |
| 25 | + self.member_total = eboard + upper + misc |
| 26 | + self.total = eboard + upper + fresh + misc |
| 27 | + |
| 28 | + |
17 | 29 | class Freshman(db.Model): |
18 | 30 | __tablename__ = "freshman" |
19 | 31 | rit_username = Column(String(10), primary_key=True) |
@@ -49,51 +61,26 @@ class Packet(db.Model): |
49 | 61 | def is_open(self): |
50 | 62 | return self.start < datetime.now() < self.end |
51 | 63 |
|
52 | | - @lru_cache(maxsize=1024) |
53 | | - def signatures_required(self, total=False): |
54 | | - if total: |
55 | | - return len(self.upper_signatures) + len(self.fresh_signatures) + REQUIRED_MISC_SIGNATURES |
56 | | - eboard = UpperSignature.query.with_parent(self).filter_by(eboard=True).count() |
57 | | - return {'eboard': eboard, |
58 | | - 'upperclassmen': len(self.upper_signatures) - eboard, |
59 | | - 'freshmen': len(self.fresh_signatures), |
60 | | - 'miscellaneous': REQUIRED_MISC_SIGNATURES} |
61 | | - |
62 | | - def signatures_received(self, total=False): |
| 64 | + def signatures_required(self): |
| 65 | + eboard = sum(map(lambda sig: 1 if sig.eboard else 0, self.upper_signatures)) |
| 66 | + upper = len(self.upper_signatures) - eboard |
| 67 | + fresh = len(self.fresh_signatures) |
| 68 | + |
| 69 | + return SigCounts(eboard, upper, fresh, REQUIRED_MISC_SIGNATURES) |
| 70 | + |
| 71 | + def signatures_received(self): |
63 | 72 | """ |
64 | 73 | Result capped so it will never be greater than that of signatures_required() |
65 | 74 | """ |
66 | | - misc_count = len(self.misc_signatures) |
67 | | - |
68 | | - if misc_count > REQUIRED_MISC_SIGNATURES: |
69 | | - misc_count = REQUIRED_MISC_SIGNATURES |
70 | | - |
71 | | - eboard_count = db.session.query(UpperSignature.member) \ |
72 | | - .select_from(Packet).join(UpperSignature) \ |
73 | | - .filter(Packet.freshman_username == self.freshman_username, |
74 | | - UpperSignature.signed, UpperSignature.eboard) \ |
75 | | - .distinct().count() |
76 | | - |
77 | | - upper_count = db.session.query(UpperSignature.member) \ |
78 | | - .select_from(Packet).join(UpperSignature) \ |
79 | | - .filter(Packet.freshman_username == self.freshman_username, |
80 | | - UpperSignature.signed, |
81 | | - UpperSignature.eboard.isnot(True)) \ |
82 | | - .distinct().count() |
83 | | - |
84 | | - fresh_count = db.session.query(FreshSignature.freshman_username) \ |
85 | | - .select_from(Packet).join(FreshSignature) \ |
86 | | - .filter(Packet.freshman_username == self.freshman_username, |
87 | | - FreshSignature.signed) \ |
88 | | - .distinct().count() |
89 | | - |
90 | | - if total: |
91 | | - return eboard_count + upper_count + fresh_count + misc_count |
92 | | - |
93 | | - return {'eboard': eboard_count, |
94 | | - 'upperclassmen': upper_count, |
95 | | - 'freshmen': fresh_count, |
96 | | - 'miscellaneous': misc_count} |
| 75 | + eboard = sum(map(lambda sig: 1 if sig.eboard and sig.signed else 0, self.upper_signatures)) |
| 76 | + upper = sum(map(lambda sig: 1 if not sig.eboard and sig.signed else 0, self.upper_signatures)) |
| 77 | + fresh = sum(map(lambda sig: 1 if sig.signed else 0, self.fresh_signatures)) |
| 78 | + |
| 79 | + misc = len(self.misc_signatures) |
| 80 | + if misc > REQUIRED_MISC_SIGNATURES: |
| 81 | + misc = REQUIRED_MISC_SIGNATURES |
| 82 | + |
| 83 | + return SigCounts(eboard, upper, fresh, misc) |
97 | 84 |
|
98 | 85 |
|
99 | 86 | class UpperSignature(db.Model): |
|
0 commit comments