|
3 | 3 |
|
4 | 4 | import structlog |
5 | 5 | from csh_ldap import CSHLDAP |
6 | | -from flask import Flask, redirect, render_template, g |
| 6 | +from flask import Flask, redirect, render_template, request, g |
7 | 7 | from flask_migrate import Migrate |
8 | 8 | from flask_gzip import Gzip |
9 | 9 | from flask_pyoidc.flask_pyoidc import OIDCAuthentication |
@@ -56,7 +56,17 @@ def start_of_year(): |
56 | 56 |
|
57 | 57 |
|
58 | 58 | # 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 | +) |
60 | 70 |
|
61 | 71 |
|
62 | 72 | # Configure Logging |
@@ -130,7 +140,7 @@ def database_processor(logger, log_method, event_dict): # pylint: disable=unuse |
130 | 140 | app.register_blueprint(co_op_bp) |
131 | 141 | app.register_blueprint(log_bp) |
132 | 142 |
|
133 | | -from .util.ldap import ldap_get_member |
| 143 | +from .util.ldap import ldap_get_member, ldap_is_active, ldap_is_intromember |
134 | 144 |
|
135 | 145 |
|
136 | 146 | @app.route('/<path:path>') |
@@ -159,6 +169,93 @@ def health(): |
159 | 169 | return {'status': 'ok'} |
160 | 170 |
|
161 | 171 |
|
| 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 | + |
162 | 259 | @app.errorhandler(404) |
163 | 260 | @app.errorhandler(500) |
164 | 261 | @auth.oidc_auth("default") |
|
0 commit comments