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 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) diff --git a/conditional/util/member.py b/conditional/util/member.py index 69a6ac97..9040c6ae 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 @@ -17,6 +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.util.ldap import ldap_is_intromember +from conditional.util.ldap import ldap_get_member @service_cache(maxsize=1024) @@ -42,7 +44,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 @@ -158,3 +160,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