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