From 81aa4d39dd153184dc939b0ef11687793f2da902 Mon Sep 17 00:00:00 2001 From: dragongoose Date: Sun, 19 Oct 2025 22:26:49 -0400 Subject: [PATCH 1/5] move gatekeep_status to members.py --- conditional/__init__.py | 96 +++-------------------------------------- 1 file changed, 5 insertions(+), 91 deletions(-) diff --git a/conditional/__init__.py b/conditional/__init__.py index 753c75fc..10ee9214 100644 --- a/conditional/__init__.py +++ b/conditional/__init__.py @@ -56,18 +56,7 @@ def start_of_year(): # pylint: disable=C0413 -from .models.models import ( - CommitteeMeeting, - CurrentCoops, - FreshmanEvalData, - HouseMeeting, - MemberCommitteeAttendance, - MemberHouseMeetingAttendance, - MemberSeminarAttendance, - TechnicalSeminar, - UserLog, -) - +from .models.models import UserLog # Configure Logging def request_processor(logger, log_method, event_dict): # pylint: disable=unused-argument, redefined-outer-name @@ -112,6 +101,7 @@ def database_processor(logger, log_method, event_dict): # pylint: disable=unuse # pylint: disable=wrong-import-order from conditional.util import context_processors from conditional.util.auth import get_user +from conditional.util.member import gatekeep_status from .blueprints.dashboard import dashboard_bp # pylint: disable=ungrouped-imports from .blueprints.attendance import attendance_bp from .blueprints.major_project_submission import major_project_bp @@ -140,7 +130,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, ldap_is_active, ldap_is_intromember +from .util.ldap import ldap_get_member @app.route('/') @@ -170,88 +160,12 @@ def health(): @app.route("/gatekeep/") -def gatekeep_status(username): +def gatekeep(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 + return gatekeep_status(username) From e7b491341343806c09f543a850a7119620c2b210 Mon Sep 17 00:00:00 2001 From: dragongoose Date: Sun, 19 Oct 2025 22:27:14 -0400 Subject: [PATCH 2/5] Fix errors in gatekeep_status --- conditional/util/member.py | 95 +++++++++++++++++++++++++++++++++++++- 1 file changed, 94 insertions(+), 1 deletion(-) diff --git a/conditional/util/member.py b/conditional/util/member.py index 69a6ac97..57fd8cfd 100644 --- a/conditional/util/member.py +++ b/conditional/util/member.py @@ -1,6 +1,6 @@ from datetime import datetime -from conditional import gatekeep_status, start_of_year +from conditional import start_of_year from conditional.models.models import CommitteeMeeting from conditional.models.models import CurrentCoops from conditional.models.models import FreshmanEvalData @@ -18,6 +18,20 @@ from conditional.util.ldap import ldap_is_active from conditional.util.ldap import ldap_is_onfloor +from conditional.models.models import ( + CommitteeMeeting, + CurrentCoops, + FreshmanEvalData, + HouseMeeting, + MemberCommitteeAttendance, + MemberHouseMeetingAttendance, + MemberSeminarAttendance, + TechnicalSeminar, + UserLog, +) + +from .ldap import ldap_get_member, ldap_is_active, ldap_is_intromember + @service_cache(maxsize=1024) def get_voting_members(): @@ -158,3 +172,82 @@ def req_cm(member): if co_op: return 15 return 30 + +def gatekeep_status(username): + 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.timestamp >= semester_start, + ) + .count() + ) + # number of technical seminars attended in the current semester + t_seminars = ( + MemberSeminarAttendance.query.join( + TechnicalSeminar, + MemberSeminarAttendance.seminar_id == TechnicalSeminar.id, + ) + .filter( + MemberSeminarAttendance.uid == username, + TechnicalSeminar.approved is True, + TechnicalSeminar.timestamp >= 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 From 0c4dacb22816e2b5baf8669d91900dc982714a92 Mon Sep 17 00:00:00 2001 From: dragongoose Date: Sun, 19 Oct 2025 22:33:36 -0400 Subject: [PATCH 3/5] Fix unused import, fix logic error --- conditional/util/member.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/conditional/util/member.py b/conditional/util/member.py index 57fd8cfd..c3af1f36 100644 --- a/conditional/util/member.py +++ b/conditional/util/member.py @@ -27,7 +27,6 @@ MemberHouseMeetingAttendance, MemberSeminarAttendance, TechnicalSeminar, - UserLog, ) from .ldap import ldap_get_member, ldap_is_active, ldap_is_intromember @@ -56,7 +55,7 @@ def get_voting_members(): for intro_member in passed_fall: voting_set.add(intro_member.uid) - voting_list = list(username for username in voting_set if gatekeep_status(username)) + voting_list = list(username for username in voting_set if gatekeep_status(username)[0]["result"]) return voting_list From 6fb1f0f1ac553207e1acdba984bc40e03d7c5a05 Mon Sep 17 00:00:00 2001 From: dragongoose Date: Sun, 19 Oct 2025 22:42:27 -0400 Subject: [PATCH 4/5] Remove duplicate imports --- conditional/util/member.py | 15 ++------------- 1 file changed, 2 insertions(+), 13 deletions(-) diff --git a/conditional/util/member.py b/conditional/util/member.py index c3af1f36..9040c6ae 100644 --- a/conditional/util/member.py +++ b/conditional/util/member.py @@ -17,19 +17,8 @@ from conditional.util.ldap import ldap_get_roomnumber from conditional.util.ldap import ldap_is_active from conditional.util.ldap import ldap_is_onfloor - -from conditional.models.models import ( - CommitteeMeeting, - CurrentCoops, - FreshmanEvalData, - HouseMeeting, - MemberCommitteeAttendance, - MemberHouseMeetingAttendance, - MemberSeminarAttendance, - TechnicalSeminar, -) - -from .ldap import ldap_get_member, ldap_is_active, ldap_is_intromember +from conditional.util.ldap import ldap_is_intromember +from conditional.util.ldap import ldap_get_member @service_cache(maxsize=1024) From 4100d8ac42f6a926791b0c30ac2ee2bfdee41289 Mon Sep 17 00:00:00 2001 From: dragongoose Date: Sun, 19 Oct 2025 22:42:37 -0400 Subject: [PATCH 5/5] Remove non-existent options from lint --- .pylintrc | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/.pylintrc b/.pylintrc index 22e31bcb..667edd88 100644 --- a/.pylintrc +++ b/.pylintrc @@ -17,14 +17,11 @@ disable = [REPORTS] output-format = text -files-output = no reports = no [FORMAT] max-line-length = 120 -max-statement-lines = 75 single-line-if-stmt = no -no-space-check = trailing-comma,dict-separator max-module-lines = 1000 indent-string = ' ' @@ -72,8 +69,6 @@ good-names=logger,id,ID # Bad variable names which should always be refused, separated by a comma bad-names=foo,bar,baz,toto,tutu,tata -# List of builtins function names that should not be used, separated by a comma -bad-functions=apply,input [DESIGN] @@ -89,4 +84,4 @@ min-public-methods = 2 max-public-methods = 20 [EXCEPTIONS] -overgeneral-exceptions = Exception +overgeneral-exceptions = builtins.Exception