Skip to content

Commit 8342957

Browse files
authored
Merge pull request #408 from shaeespring/feature/vote_role
gatekeep
2 parents b8fd20c + af307ee commit 8342957

File tree

4 files changed

+123
-14
lines changed

4 files changed

+123
-14
lines changed

conditional/__init__.py

Lines changed: 100 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33

44
import structlog
55
from csh_ldap import CSHLDAP
6-
from flask import Flask, redirect, render_template, g
6+
from flask import Flask, redirect, render_template, request, g
77
from flask_migrate import Migrate
88
from flask_gzip import Gzip
99
from flask_pyoidc.flask_pyoidc import OIDCAuthentication
@@ -56,7 +56,17 @@ def start_of_year():
5656

5757

5858
# pylint: disable=C0413
59-
from .models.models import UserLog
59+
from .models.models import (
60+
CommitteeMeeting,
61+
CurrentCoops,
62+
FreshmanEvalData,
63+
HouseMeeting,
64+
MemberCommitteeAttendance,
65+
MemberHouseMeetingAttendance,
66+
MemberSeminarAttendance,
67+
TechnicalSeminar,
68+
UserLog,
69+
)
6070

6171

6272
# Configure Logging
@@ -130,7 +140,7 @@ def database_processor(logger, log_method, event_dict): # pylint: disable=unuse
130140
app.register_blueprint(co_op_bp)
131141
app.register_blueprint(log_bp)
132142

133-
from .util.ldap import ldap_get_member
143+
from .util.ldap import ldap_get_member, ldap_is_active, ldap_is_intromember
134144

135145

136146
@app.route('/<path:path>')
@@ -159,6 +169,93 @@ def health():
159169
return {'status': 'ok'}
160170

161171

172+
@app.route("/gatekeep/<username>")
173+
def gatekeep_status(username):
174+
token = request.headers.get("X-VOTE-TOKEN", "")
175+
if token != app.config["VOTE_TOKEN"]:
176+
return "Users cannot access this page", 403
177+
178+
if datetime.today() < datetime(start_of_year().year, 12, 31):
179+
semester = "Fall"
180+
semester_start = datetime(start_of_year().year,6,1)
181+
else:
182+
semester = "Spring"
183+
semester_start = datetime(start_of_year().year + 1,1,1)
184+
185+
# groups
186+
ldap_member = ldap_get_member(username)
187+
is_intro_member = ldap_is_intromember(ldap_member)
188+
is_active_member = ldap_is_active(ldap_member) and not is_intro_member
189+
190+
is_on_coop = (
191+
CurrentCoops.query.filter(
192+
CurrentCoops.date_created > start_of_year(),
193+
CurrentCoops.semester == semester,
194+
CurrentCoops.uid == username,
195+
).first()
196+
is not None
197+
)
198+
199+
passed_fall = (
200+
FreshmanEvalData.query.filter(
201+
FreshmanEvalData.freshman_eval_result == "Passed",
202+
FreshmanEvalData.eval_date > start_of_year(),
203+
FreshmanEvalData.uid == username,
204+
).first()
205+
is not None
206+
)
207+
eligibility_of_groups = (is_active_member and not is_on_coop) or passed_fall
208+
209+
# number of directorship meetings attended in the current semester
210+
d_meetings = (
211+
MemberCommitteeAttendance.query.join(
212+
CommitteeMeeting,
213+
MemberCommitteeAttendance.meeting_id == CommitteeMeeting.id,
214+
)
215+
.filter(
216+
MemberCommitteeAttendance.uid == username,
217+
CommitteeMeeting.approved is True,
218+
CommitteeMeeting.date >= semester_start,
219+
)
220+
.count()
221+
)
222+
# number of technical seminars attended in the current semester
223+
t_seminars = (
224+
MemberSeminarAttendance.query.join(
225+
TechnicalSeminar,
226+
MemberSeminarAttendance.meeting_id == TechnicalSeminar.id,
227+
)
228+
.filter(
229+
MemberSeminarAttendance.uid == username,
230+
TechnicalSeminar.approved is True,
231+
TechnicalSeminar.date >= semester_start,
232+
)
233+
.count()
234+
)
235+
# number of house meetings attended in the current semester
236+
h_meetings = (
237+
MemberHouseMeetingAttendance.query.join(
238+
HouseMeeting,
239+
MemberHouseMeetingAttendance.meeting_id == HouseMeeting.id,
240+
)
241+
.filter(
242+
MemberHouseMeetingAttendance.uid == username,
243+
HouseMeeting.date >= semester_start
244+
)
245+
.count()
246+
)
247+
result = eligibility_of_groups and (d_meetings >= 6 and t_seminars >= 2 and h_meetings >= 6)
248+
249+
return {
250+
"result": result,
251+
"h_meetings": h_meetings,
252+
"c_meetings": d_meetings,
253+
"t_seminars": t_seminars,
254+
}, 200
255+
256+
257+
258+
162259
@app.errorhandler(404)
163260
@app.errorhandler(500)
164261
@auth.oidc_auth("default")

conditional/templates/dashboard.html

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -15,12 +15,22 @@ <h3 class="username">{{ get_member_name(username) }}</h3>
1515
<h5 class="email">{{username}}@csh.rit.edu</h5>
1616
<div class="profile-badges">
1717
{% if active %}
18-
<span class="label label-success">Active</span> {% else %}
19-
<span class="label label-danger">Inactive</span> {% endif %} {% if onfloor %}
20-
<span class="label label-primary">On-floor Status</span> {% else %}
21-
<span class="label label-default">Off-floor Status</span> {% endif %} {% if voting %}
22-
<span class="label label-primary">Voting</span> {% else %}
23-
<span class="label label-default">Non-Voting</span> {% endif %}
18+
<span class="label label-success">Active</span>
19+
{% else %}
20+
<span class="label label-danger">Inactive</span>
21+
{% endif %}
22+
23+
{% if onfloor %}
24+
<span class="label label-primary">On-floor Status</span>
25+
{% else %}
26+
<span class="label label-default">Off-floor Status</span>
27+
{% endif %}
28+
29+
{% if voting %}
30+
<span class="label label-primary">Voting</span>
31+
{% else %}
32+
<span class="label label-default">Non-Voting</span>
33+
{% endif %}
2434
</div>
2535
</div>
2636
</div>

conditional/util/member.py

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
from datetime import datetime
22

3-
from conditional import start_of_year
3+
from conditional import gatekeep_status, start_of_year
44
from conditional.models.models import CommitteeMeeting
55
from conditional.models.models import CurrentCoops
66
from conditional.models.models import FreshmanEvalData
@@ -32,18 +32,17 @@ def get_voting_members():
3232
on_coop = set(member.uid for member in CurrentCoops.query.filter(
3333
CurrentCoops.date_created > start_of_year(),
3434
CurrentCoops.semester == semester).all())
35-
36-
voting_list = list(active_members - intro_members - on_coop)
35+
voting_set = active_members - intro_members - on_coop
3736

3837
passed_fall = FreshmanEvalData.query.filter(
3938
FreshmanEvalData.freshman_eval_result == "Passed",
4039
FreshmanEvalData.eval_date > start_of_year()
4140
).distinct()
4241

4342
for intro_member in passed_fall:
44-
if intro_member.uid not in voting_list:
45-
voting_list.append(intro_member.uid)
43+
voting_set.add(intro_member.uid)
4644

45+
voting_list = list(username for username in voting_set if gatekeep_status(username))
4746
return voting_list
4847

4948

config.env.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,3 +48,6 @@
4848

4949
# General config
5050
DUES_PER_SEMESTER = env.get("CONDITIONAL_DUES_PER_SEMESTER", 80)
51+
52+
# Vote config
53+
VOTE_TOKEN = env.get("CONDITIONAL_VOTE_TOKEN", "")

0 commit comments

Comments
 (0)