diff --git a/conditional/__init__.py b/conditional/__init__.py index 1c2f5ee..753c75f 100644 --- a/conditional/__init__.py +++ b/conditional/__init__.py @@ -3,7 +3,7 @@ import structlog from csh_ldap import CSHLDAP -from flask import Flask, redirect, render_template, g +from flask import Flask, redirect, render_template, request, g from flask_migrate import Migrate from flask_gzip import Gzip from flask_pyoidc.flask_pyoidc import OIDCAuthentication @@ -56,7 +56,17 @@ def start_of_year(): # pylint: disable=C0413 -from .models.models import UserLog +from .models.models import ( + CommitteeMeeting, + CurrentCoops, + FreshmanEvalData, + HouseMeeting, + MemberCommitteeAttendance, + MemberHouseMeetingAttendance, + MemberSeminarAttendance, + TechnicalSeminar, + UserLog, +) # Configure Logging @@ -130,7 +140,7 @@ def database_processor(logger, log_method, event_dict): # pylint: disable=unuse app.register_blueprint(co_op_bp) app.register_blueprint(log_bp) -from .util.ldap import ldap_get_member +from .util.ldap import ldap_get_member, ldap_is_active, ldap_is_intromember @app.route('/') @@ -159,6 +169,93 @@ def health(): return {'status': 'ok'} +@app.route("/gatekeep/") +def gatekeep_status(username): + token = request.headers.get("X-VOTE-TOKEN", "") + if token != app.config["VOTE_TOKEN"]: + return "Users cannot access this page", 403 + + if datetime.today() < datetime(start_of_year().year, 12, 31): + semester = "Fall" + semester_start = datetime(start_of_year().year,6,1) + else: + semester = "Spring" + semester_start = datetime(start_of_year().year + 1,1,1) + + # groups + ldap_member = ldap_get_member(username) + is_intro_member = ldap_is_intromember(ldap_member) + is_active_member = ldap_is_active(ldap_member) and not is_intro_member + + is_on_coop = ( + CurrentCoops.query.filter( + CurrentCoops.date_created > start_of_year(), + CurrentCoops.semester == semester, + CurrentCoops.uid == username, + ).first() + is not None + ) + + passed_fall = ( + FreshmanEvalData.query.filter( + FreshmanEvalData.freshman_eval_result == "Passed", + FreshmanEvalData.eval_date > start_of_year(), + FreshmanEvalData.uid == username, + ).first() + is not None + ) + eligibility_of_groups = (is_active_member and not is_on_coop) or passed_fall + + # number of directorship meetings attended in the current semester + d_meetings = ( + MemberCommitteeAttendance.query.join( + CommitteeMeeting, + MemberCommitteeAttendance.meeting_id == CommitteeMeeting.id, + ) + .filter( + MemberCommitteeAttendance.uid == username, + CommitteeMeeting.approved is True, + CommitteeMeeting.date >= semester_start, + ) + .count() + ) + # number of technical seminars attended in the current semester + t_seminars = ( + MemberSeminarAttendance.query.join( + TechnicalSeminar, + MemberSeminarAttendance.meeting_id == TechnicalSeminar.id, + ) + .filter( + MemberSeminarAttendance.uid == username, + TechnicalSeminar.approved is True, + TechnicalSeminar.date >= semester_start, + ) + .count() + ) + # number of house meetings attended in the current semester + h_meetings = ( + MemberHouseMeetingAttendance.query.join( + HouseMeeting, + MemberHouseMeetingAttendance.meeting_id == HouseMeeting.id, + ) + .filter( + MemberHouseMeetingAttendance.uid == username, + HouseMeeting.date >= semester_start + ) + .count() + ) + result = eligibility_of_groups and (d_meetings >= 6 and t_seminars >= 2 and h_meetings >= 6) + + return { + "result": result, + "h_meetings": h_meetings, + "c_meetings": d_meetings, + "t_seminars": t_seminars, + }, 200 + + + + @app.errorhandler(404) @app.errorhandler(500) @auth.oidc_auth("default") diff --git a/conditional/templates/dashboard.html b/conditional/templates/dashboard.html index 3bfd819..b8abfa9 100644 --- a/conditional/templates/dashboard.html +++ b/conditional/templates/dashboard.html @@ -15,12 +15,22 @@

{{ get_member_name(username) }}

{% if active %} - Active {% else %} - Inactive {% endif %} {% if onfloor %} - On-floor Status {% else %} - Off-floor Status {% endif %} {% if voting %} - Voting {% else %} - Non-Voting {% endif %} + Active + {% else %} + Inactive + {% endif %} + + {% if onfloor %} + On-floor Status + {% else %} + Off-floor Status + {% endif %} + + {% if voting %} + Voting + {% else %} + Non-Voting + {% endif %}
diff --git a/conditional/util/member.py b/conditional/util/member.py index 1c4ae8c..69a6ac9 100644 --- a/conditional/util/member.py +++ b/conditional/util/member.py @@ -1,6 +1,6 @@ from datetime import datetime -from conditional import start_of_year +from conditional import gatekeep_status, start_of_year from conditional.models.models import CommitteeMeeting from conditional.models.models import CurrentCoops from conditional.models.models import FreshmanEvalData @@ -32,8 +32,7 @@ def get_voting_members(): on_coop = set(member.uid for member in CurrentCoops.query.filter( CurrentCoops.date_created > start_of_year(), CurrentCoops.semester == semester).all()) - - voting_list = list(active_members - intro_members - on_coop) + voting_set = active_members - intro_members - on_coop passed_fall = FreshmanEvalData.query.filter( FreshmanEvalData.freshman_eval_result == "Passed", @@ -41,9 +40,9 @@ def get_voting_members(): ).distinct() for intro_member in passed_fall: - if intro_member.uid not in voting_list: - voting_list.append(intro_member.uid) + voting_set.add(intro_member.uid) + voting_list = list(username for username in voting_set if gatekeep_status(username)) return voting_list diff --git a/config.env.py b/config.env.py index 29c0689..f8c419e 100644 --- a/config.env.py +++ b/config.env.py @@ -52,3 +52,6 @@ # General config DUES_PER_SEMESTER = env.get("CONDITIONAL_DUES_PER_SEMESTER", 80) + +# Vote config +VOTE_TOKEN = env.get("CONDITIONAL_VOTE_TOKEN", "")