diff --git a/.github/workflows/python-app.yml b/.github/workflows/python-app.yml index 980b1ab3..f8ae97f9 100644 --- a/.github/workflows/python-app.yml +++ b/.github/workflows/python-app.yml @@ -15,7 +15,7 @@ jobs: strategy: matrix: - python-version: [3.12] + python-version: [3.8, 3.9] steps: - name: Install ldap dependencies diff --git a/.pylintrc b/.pylintrc index 667edd88..407369b7 100644 --- a/.pylintrc +++ b/.pylintrc @@ -9,6 +9,7 @@ disable = duplicate-code, no-member, parse-error, + bad-continuation, too-few-public-methods, global-statement, cyclic-import, @@ -17,11 +18,14 @@ 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 = ' ' @@ -69,6 +73,8 @@ 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] @@ -84,4 +90,4 @@ min-public-methods = 2 max-public-methods = 20 [EXCEPTIONS] -overgeneral-exceptions = builtins.Exception +overgeneral-exceptions = Exception diff --git a/Dockerfile b/Dockerfile index e6c23e22..cae1b260 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,5 +1,5 @@ -FROM docker.io/python:3.12-bookworm -MAINTAINER Computer Science House +FROM docker.io/python:3.8-buster +MAINTAINER Devin Matte RUN mkdir /opt/conditional @@ -8,23 +8,19 @@ ADD requirements.txt /opt/conditional WORKDIR /opt/conditional RUN apt-get -yq update && \ - apt-get -yq install libsasl2-dev libldap2-dev libldap-common libssl-dev gcc g++ make && \ + apt-get -yq install libsasl2-dev libldap2-dev libssl-dev gcc g++ make && \ pip install -r requirements.txt && \ apt-get -yq clean all -ENV NVM_DIR /usr/local/nvm -ENV NODE_VERSION v10.24.1 -RUN mkdir -p $NVM_DIR - -RUN curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.0/install.sh | bash - -RUN /bin/bash -c "source $NVM_DIR/nvm.sh && nvm install $NODE_VERSION" - ADD . /opt/conditional -RUN /bin/bash -c "source $NVM_DIR/nvm.sh && nvm use --delete-prefix $NODE_VERSION && npm install && npm run production" - -RUN rm -rf node_modules && \ +RUN curl -sL https://deb.nodesource.com/setup_10.x | bash - && \ + apt-get -yq update && \ + apt-get -yq install nodejs && \ + npm install && \ + npm run production && \ + rm -rf node_modules && \ + apt-get -yq remove nodejs npm && \ apt-get -yq clean all RUN ln -sf /usr/share/zoneinfo/America/New_York /etc/localtime diff --git a/conditional/__init__.py b/conditional/__init__.py index e8f54a8b..041218ae 100644 --- a/conditional/__init__.py +++ b/conditional/__init__.py @@ -3,11 +3,10 @@ import structlog from csh_ldap import CSHLDAP -from flask import Flask, redirect, render_template, request, g +from flask import Flask, redirect, render_template, g from flask_migrate import Migrate from flask_gzip import Gzip from flask_pyoidc.flask_pyoidc import OIDCAuthentication -from flask_pyoidc.provider_configuration import ProviderConfiguration, ClientMetadata from flask_sqlalchemy import SQLAlchemy import sentry_sdk @@ -40,10 +39,8 @@ app.config['LDAP_BIND_PW'], ro=app.config['LDAP_RO']) -client_metadata = ClientMetadata(app.config["OIDC_CLIENT_CONFIG"]) -provider_config = ProviderConfiguration(issuer=app.config["OIDC_ISSUER"], client_registration_info=client_metadata) - -auth = OIDCAuthentication({'default': provider_config}, app) +auth = OIDCAuthentication(app, issuer=app.config["OIDC_ISSUER"], + client_registration_info=app.config["OIDC_CLIENT_CONFIG"]) app.secret_key = app.config["SECRET_KEY"] @@ -58,6 +55,7 @@ def start_of_year(): # pylint: disable=C0413 from .models.models import UserLog + # Configure Logging def request_processor(logger, log_method, event_dict): # pylint: disable=unused-argument, redefined-outer-name if 'request' in event_dict: @@ -101,7 +99,6 @@ 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 +137,7 @@ def static_proxy(path): @app.route('/') -@auth.oidc_auth("default") +@auth.oidc_auth def default_route(): return redirect('/dashboard') @@ -159,25 +156,12 @@ def health(): return {'status': 'ok'} -@app.route("/gatekeep/") -def gatekeep(username): - token = request.headers.get("X-VOTE-TOKEN", "") - if token != app.config["VOTE_TOKEN"]: - return "Users cannot access this page", 403 - try: - gatekeep_data = gatekeep_status(username) - except KeyError: - return "", 404 - - return gatekeep_data, 200 - - @app.errorhandler(404) @app.errorhandler(500) -@auth.oidc_auth("default") +@auth.oidc_auth @get_user def route_errors(error, user_dict=None): - data = {} + data = dict() # Handle the case where the header isn't present if user_dict['username'] is not None: diff --git a/conditional/blueprints/attendance.py b/conditional/blueprints/attendance.py index 22475703..7adbf995 100644 --- a/conditional/blueprints/attendance.py +++ b/conditional/blueprints/attendance.py @@ -29,7 +29,7 @@ @attendance_bp.route('/attendance/ts_members') -@auth.oidc_auth("default") +@auth.oidc_auth @get_user def get_all_members(user_dict=None): log = logger.new(request=request, auth_dict=user_dict) @@ -57,7 +57,7 @@ def get_all_members(user_dict=None): @attendance_bp.route('/attendance/hm_members') -@auth.oidc_auth("default") +@auth.oidc_auth @get_user def get_non_alumni_non_coop(internal=False, user_dict=None): log = logger.new(request=request, auth_dict=user_dict) @@ -102,7 +102,7 @@ def get_non_alumni_non_coop(internal=False, user_dict=None): @attendance_bp.route('/attendance/cm_members') -@auth.oidc_auth("default") +@auth.oidc_auth @get_user def get_non_alumni(user_dict=None): log = logger.new(request=request, auth_dict=user_dict) @@ -130,7 +130,7 @@ def get_non_alumni(user_dict=None): @attendance_bp.route('/attendance_cm') -@auth.oidc_auth("default") +@auth.oidc_auth @get_user def display_attendance_cm(user_dict=None): log = logger.new(request=request, auth_dict=user_dict) @@ -142,7 +142,7 @@ def display_attendance_cm(user_dict=None): @attendance_bp.route('/attendance_ts') -@auth.oidc_auth("default") +@auth.oidc_auth @get_user def display_attendance_ts(user_dict=None): log = logger.new(request=request, auth_dict=user_dict) @@ -154,7 +154,7 @@ def display_attendance_ts(user_dict=None): @attendance_bp.route('/attendance_hm') -@auth.oidc_auth("default") +@auth.oidc_auth @get_user def display_attendance_hm(user_dict=None): log = logger.new(request=request, auth_dict=user_dict) @@ -170,7 +170,7 @@ def display_attendance_hm(user_dict=None): @attendance_bp.route('/attendance/submit/cm', methods=['POST']) -@auth.oidc_auth("default") +@auth.oidc_auth @get_user def submit_committee_attendance(user_dict=None): log = logger.new(request=request, auth_dict=user_dict) @@ -183,7 +183,7 @@ def submit_committee_attendance(user_dict=None): f_attendees = post_data['freshmen'] timestamp = post_data['timestamp'] - log.info(f'Submit {committee} Meeting Attendance') + log.info('Submit {} Meeting Attendance'.format(committee)) timestamp = datetime.strptime(timestamp, "%Y-%m-%d") meeting = CommitteeMeeting(committee, timestamp, approved) @@ -193,11 +193,11 @@ def submit_committee_attendance(user_dict=None): db.session.refresh(meeting) for m in m_attendees: - log.info(f'Gave Attendance to {m} for {committee}') + log.info('Gave Attendance to {} for {}'.format(m, committee)) db.session.add(MemberCommitteeAttendance(m, meeting.id)) for f in f_attendees: - log.info(f'Gave Attendance to freshman-{f} for {committee}') + log.info('Gave Attendance to freshman-{} for {}'.format(f, committee)) db.session.add(FreshmanCommitteeAttendance(f, meeting.id)) db.session.commit() @@ -205,7 +205,7 @@ def submit_committee_attendance(user_dict=None): @attendance_bp.route('/attendance/submit/ts', methods=['POST']) -@auth.oidc_auth("default") +@auth.oidc_auth @get_user def submit_seminar_attendance(user_dict=None): log = logger.new(request=request, auth_dict=user_dict) @@ -228,11 +228,11 @@ def submit_seminar_attendance(user_dict=None): db.session.refresh(seminar) for m in m_attendees: - log.info(f'Gave Attendance to {m} for {seminar_name}') + log.info('Gave Attendance to {} for {}'.format(m, seminar_name)) db.session.add(MemberSeminarAttendance(m, seminar.id)) for f in f_attendees: - log.info(f'Gave Attendance to freshman-{f} for {seminar_name}') + log.info('Gave Attendance to freshman-{} for {}'.format(f, seminar_name)) db.session.add(FreshmanSeminarAttendance(f, seminar.id)) db.session.commit() @@ -240,7 +240,7 @@ def submit_seminar_attendance(user_dict=None): @attendance_bp.route('/attendance/submit/hm', methods=['POST']) -@auth.oidc_auth("default") +@auth.oidc_auth @get_user def submit_house_attendance(user_dict=None): log = logger.new(request=request, auth_dict=user_dict) @@ -263,7 +263,10 @@ def submit_house_attendance(user_dict=None): if "members" in post_data: for m in post_data['members']: - log.info(f'Marked {m['uid']} {m['status']} for House Meeting on {timestamp.strftime("%Y-%m-%d")}') + log.info('Marked {} {} for House Meeting on {}'.format( + m['uid'], + m['status'], + timestamp.strftime("%Y-%m-%d"))) db.session.add(MemberHouseMeetingAttendance( m['uid'], meeting.id, @@ -272,7 +275,10 @@ def submit_house_attendance(user_dict=None): if "freshmen" in post_data: for f in post_data['freshmen']: - log.info(f'Marked freshman-{f['id']} {f['status']} for House Meeting on {timestamp.strftime("%Y-%m-%d")}') + log.info('Marked freshman-{} {} for House Meeting on {}'.format( + f['id'], + f['status'], + timestamp.strftime("%Y-%m-%d"))) db.session.add(FreshmanHouseMeetingAttendance( f['id'], meeting.id, @@ -284,7 +290,7 @@ def submit_house_attendance(user_dict=None): @attendance_bp.route('/attendance/alter/hm//', methods=['GET']) -@auth.oidc_auth("default") +@auth.oidc_auth @get_user def alter_house_attendance(uid, hid, user_dict=None): log = logger.new(request=request, auth_dict=user_dict) @@ -293,7 +299,7 @@ def alter_house_attendance(uid, hid, user_dict=None): return "must be evals", 403 if not uid.isdigit(): - log.info(f'Mark {uid} Present for House Meeting ID: {hid}') + log.info('Mark {} Present for House Meeting ID: {}'.format(uid, hid)) member_meeting = MemberHouseMeetingAttendance.query.filter( MemberHouseMeetingAttendance.uid == uid, MemberHouseMeetingAttendance.meeting_id == hid @@ -302,7 +308,7 @@ def alter_house_attendance(uid, hid, user_dict=None): db.session.commit() return jsonify({"success": True}), 200 - log.info(f'Mark freshman-{uid} Present for House Meeting ID: {hid}') + log.info('Mark freshman-{} Present for House Meeting ID: {}'.format(uid, hid)) freshman_meeting = FreshmanHouseMeetingAttendance.query.filter( FreshmanHouseMeetingAttendance.fid == uid, FreshmanHouseMeetingAttendance.meeting_id == hid @@ -314,7 +320,7 @@ def alter_house_attendance(uid, hid, user_dict=None): @attendance_bp.route('/attendance/alter/hm//', methods=['POST']) -@auth.oidc_auth("default") +@auth.oidc_auth @get_user def alter_house_excuse(uid, hid, user_dict=None): log = logger.new(request=request, auth_dict=user_dict) @@ -327,7 +333,7 @@ def alter_house_excuse(uid, hid, user_dict=None): hm_excuse = post_data['excuse'] if not uid.isdigit(): - log.info(f'Mark {uid} as {hm_status} for HM ID: {hid}') + log.info('Mark {} as {} for HM ID: {}'.format(uid, hm_status, hid)) MemberHouseMeetingAttendance.query.filter( MemberHouseMeetingAttendance.uid == uid, MemberHouseMeetingAttendance.meeting_id == hid @@ -336,7 +342,7 @@ def alter_house_excuse(uid, hid, user_dict=None): 'attendance_status': hm_status }) else: - log.info(f'Mark {uid} as {hm_status} for HM ID: {hid}') + log.info('Mark {} as {} for HM ID: {}'.format(uid, hm_status, hid)) FreshmanHouseMeetingAttendance.query.filter( FreshmanHouseMeetingAttendance.fid == uid, FreshmanHouseMeetingAttendance.meeting_id == hid @@ -351,7 +357,7 @@ def alter_house_excuse(uid, hid, user_dict=None): @attendance_bp.route('/attendance/history', methods=['GET']) -@auth.oidc_auth("default") +@auth.oidc_auth @get_user def attendance_history(user_dict=None): @@ -425,9 +431,9 @@ def get_seminar_attendees(meeting_id): TechnicalSeminar.approved == False).all()] # pylint: disable=singleton-comparison all_meetings = sorted((all_cm + all_ts), key=lambda k: k['dt_obj'], reverse=True)[offset:limit] if len(all_cm) % 10 != 0: - total_pages = int(len(all_cm) / 10) + 1 + total_pages = (int(len(all_cm) / 10) + 1) else: - total_pages = int(len(all_cm) / 10) + total_pages = (int(len(all_cm) / 10)) return render_template('attendance_history.html', username=user_dict['username'], history=all_meetings, @@ -438,7 +444,7 @@ def get_seminar_attendees(meeting_id): @attendance_bp.route('/attendance/alter/cm/', methods=['POST']) -@auth.oidc_auth("default") +@auth.oidc_auth @get_user def alter_committee_attendance(cid, user_dict=None): log = logger.new(request=request, auth_dict=user_dict) @@ -470,7 +476,7 @@ def alter_committee_attendance(cid, user_dict=None): @attendance_bp.route('/attendance/alter/ts/', methods=['POST']) -@auth.oidc_auth("default") +@auth.oidc_auth @get_user def alter_seminar_attendance(sid, user_dict=None): log = logger.new(request=request, auth_dict=user_dict) @@ -502,7 +508,7 @@ def alter_seminar_attendance(sid, user_dict=None): @attendance_bp.route('/attendance/ts/', methods=['GET', 'DELETE']) -@auth.oidc_auth("default") +@auth.oidc_auth @get_user def get_cm_attendees(sid, user_dict=None): if request.method == 'GET': @@ -520,7 +526,7 @@ def get_cm_attendees(sid, user_dict=None): return jsonify({"attendees": attendees}), 200 log = logger.new(request=request, auth_dict=user_dict) - log.info(f'Delete Technical Seminar {sid}') + log.info('Delete Technical Seminar {}'.format(sid)) if not ldap_is_eboard(user_dict['account']): return jsonify({"success": False, "error": "Not EBoard"}), 403 @@ -539,7 +545,7 @@ def get_cm_attendees(sid, user_dict=None): @attendance_bp.route('/attendance/cm/', methods=['GET', 'DELETE']) -@auth.oidc_auth("default") +@auth.oidc_auth @get_user def get_ts_attendees(cid, user_dict=None): if request.method == 'GET': @@ -557,7 +563,7 @@ def get_ts_attendees(cid, user_dict=None): return jsonify({"attendees": attendees}), 200 log = logger.new(request=request, auth_dict=user_dict) - log.info(f'Delete Committee Meeting {cid}') + log.info('Delete Committee Meeting {}'.format(cid)) if not ldap_is_eboard(user_dict['account']): return jsonify({"success": False, "error": "Not EBoard"}), 403 @@ -576,11 +582,11 @@ def get_ts_attendees(cid, user_dict=None): @attendance_bp.route('/attendance/cm//approve', methods=['POST']) -@auth.oidc_auth("default") +@auth.oidc_auth @get_user def approve_cm(cid, user_dict=None): log = logger.new(request=request, auth_dict=user_dict) - log.info(f'Approve Committee Meeting {cid} Attendance') + log.info('Approve Committee Meeting {} Attendance'.format(cid)) if not ldap_is_eboard(user_dict['account']): return jsonify({"success": False, "error": "Not EBoard"}), 403 @@ -594,11 +600,11 @@ def approve_cm(cid, user_dict=None): @attendance_bp.route('/attendance/ts//approve', methods=['POST']) -@auth.oidc_auth("default") +@auth.oidc_auth @get_user def approve_ts(sid, user_dict=None): log = logger.new(request=request, auth_dict=user_dict) - log.info(f'Approve Technical Seminar {sid} Attendance') + log.info('Approve Technical Seminar {} Attendance'.format(sid)) if not ldap_is_eboard(user_dict['account']): return jsonify({"success": False, "error": "Not EBoard"}), 403 diff --git a/conditional/blueprints/cache_management.py b/conditional/blueprints/cache_management.py index 14290a51..fc4a1866 100644 --- a/conditional/blueprints/cache_management.py +++ b/conditional/blueprints/cache_management.py @@ -21,7 +21,7 @@ @cache_bp.route('/restart') -@auth.oidc_auth("default") +@auth.oidc_auth @get_user def restart_app(user_dict=None): if not ldap_is_rtp(user_dict['account']): @@ -34,7 +34,7 @@ def restart_app(user_dict=None): @cache_bp.route('/clearcache') -@auth.oidc_auth("default") +@auth.oidc_auth @get_user def clear_cache(user_dict=None): if not ldap_is_eval_director(user_dict['account']) and not ldap_is_rtp(user_dict['account']): diff --git a/conditional/blueprints/co_op.py b/conditional/blueprints/co_op.py index 94bf107a..27b86dce 100644 --- a/conditional/blueprints/co_op.py +++ b/conditional/blueprints/co_op.py @@ -17,7 +17,7 @@ @co_op_bp.route('/co_op/') -@auth.oidc_auth("default") +@auth.oidc_auth @get_user def display_co_op_form(user_dict=None): log = logger.new(request=request, auth_dict=user_dict) @@ -33,7 +33,7 @@ def display_co_op_form(user_dict=None): @co_op_bp.route('/co_op/submit', methods=['POST']) -@auth.oidc_auth("default") +@auth.oidc_auth @get_user def submit_co_op_form(user_dict=None): log = logger.new(request=request, auth_dict=user_dict) @@ -46,7 +46,7 @@ def submit_co_op_form(user_dict=None): if not ldap_is_current_student(user_dict['account']): return "Must be current student", 403 - log.info(f'Submit {semester} Co-Op') + log.info('Submit {} Co-Op'.format(semester)) if CurrentCoops.query.filter(CurrentCoops.uid == user_dict['username'], CurrentCoops.date_created > start_of_year()).first(): @@ -65,7 +65,7 @@ def submit_co_op_form(user_dict=None): @co_op_bp.route('/co_op/', methods=['DELETE']) -@auth.oidc_auth("default") +@auth.oidc_auth @get_user def delete_co_op(uid, user_dict=None): log = logger.new(request=request, auth_dict=user_dict) @@ -73,7 +73,7 @@ def delete_co_op(uid, user_dict=None): if not ldap_is_eval_director(user_dict['account']): return "must be eval director", 403 - log.info(f'Delete {uid}\'s Co-Op') + log.info('Delete {}\'s Co-Op'.format(uid)) # Remove from corresponding co-op ldap group if ldap_is_member_of_group(user_dict['account'], 'fall_coop'): @@ -91,7 +91,7 @@ def delete_co_op(uid, user_dict=None): @co_op_bp.route('/co_op/manage') -@auth.oidc_auth("default") +@auth.oidc_auth @get_user def display_co_op_management(user_dict=None): log = logger.new(request=request, auth_dict=user_dict) diff --git a/conditional/blueprints/conditional.py b/conditional/blueprints/conditional.py index 1082ca4f..a5bd005c 100644 --- a/conditional/blueprints/conditional.py +++ b/conditional/blueprints/conditional.py @@ -15,7 +15,7 @@ @conditionals_bp.route('/conditionals/') -@auth.oidc_auth("default") +@auth.oidc_auth @get_user def display_conditionals(user_dict=None): log = logger.new(request=request, auth_dict=user_dict) @@ -39,7 +39,7 @@ def display_conditionals(user_dict=None): @conditionals_bp.route('/conditionals/create', methods=['POST']) -@auth.oidc_auth("default") +@auth.oidc_auth @get_user def create_conditional(user_dict=None): log = logger.new(request=request, auth_dict=user_dict) @@ -52,7 +52,7 @@ def create_conditional(user_dict=None): uid = post_data['uid'] description = post_data['description'] due_date = datetime.strptime(post_data['dueDate'], "%Y-%m-%d") - log.info(f'Create a new conditional for {uid}') + log.info('Create a new conditional for {}'.format(uid)) if post_data['evaluation'] == 'spring': current_eval = SpringEval.query.filter(SpringEval.status == "Pending", SpringEval.uid == uid, @@ -76,7 +76,7 @@ def create_conditional(user_dict=None): @conditionals_bp.route('/conditionals/review', methods=['POST']) -@auth.oidc_auth("default") +@auth.oidc_auth @get_user def conditional_review(user_dict=None): log = logger.new(request=request, auth_dict=user_dict) @@ -88,7 +88,7 @@ def conditional_review(user_dict=None): cid = post_data['id'] status = post_data['status'] - log.info(f'Updated conditional-{cid} to {status}') + log.info('Updated conditional-{} to {}'.format(cid, status)) conditional = Conditional.query.filter(Conditional.id == cid) cond_obj = conditional.first() @@ -113,11 +113,11 @@ def conditional_review(user_dict=None): @conditionals_bp.route('/conditionals/delete/', methods=['DELETE']) -@auth.oidc_auth("default") +@auth.oidc_auth @get_user def conditional_delete(cid, user_dict=None): log = logger.new(request=request, auth_dict=user_dict) - log.info(f'Delete conditional-{cid}') + log.info('Delete conditional-{}'.format(cid)) if ldap_is_eval_director(user_dict['account']): Conditional.query.filter( diff --git a/conditional/blueprints/dashboard.py b/conditional/blueprints/dashboard.py index 527e8dd8..6028c454 100644 --- a/conditional/blueprints/dashboard.py +++ b/conditional/blueprints/dashboard.py @@ -29,7 +29,7 @@ def is_seminar_attendance_valid(attendance): # pylint: disable=too-many-statements @dashboard_bp.route('/dashboard/') -@auth.oidc_auth("default") +@auth.oidc_auth @get_user def display_dashboard(user_dict=None): log = logger.new(request=request, auth_dict=user_dict) @@ -38,7 +38,7 @@ def display_dashboard(user_dict=None): # Get the list of voting members. can_vote = get_voting_members() - data = {} + data = dict() data['username'] = user_dict['account'].uid data['active'] = ldap_is_active(user_dict['account']) data['bad_standing'] = ldap_is_bad_standing(user_dict['account']) @@ -71,7 +71,7 @@ def display_dashboard(user_dict=None): # only show housing if member has onfloor status if ldap_is_onfloor(user_dict['account']): - housing = {} + housing = dict() housing['points'] = user_dict['account'].housingPoints housing['room'] = user_dict['account'].roomNumber housing['queue_pos'] = get_queue_position(user_dict['account'].uid) diff --git a/conditional/blueprints/housing.py b/conditional/blueprints/housing.py index 45e29f90..b4ea5466 100644 --- a/conditional/blueprints/housing.py +++ b/conditional/blueprints/housing.py @@ -20,7 +20,7 @@ @housing_bp.route('/housing') -@auth.oidc_auth("default") +@auth.oidc_auth @get_user def display_housing(user_dict=None): log = logger.new(request=request, auth_dict=user_dict) @@ -62,7 +62,7 @@ def display_housing(user_dict=None): @housing_bp.route('/housing/in_queue', methods=['PUT']) -@auth.oidc_auth("default") +@auth.oidc_auth @get_user def change_queue_state(user_dict=None): log = logger.new(request=request, auth_dict=user_dict) @@ -75,11 +75,11 @@ def change_queue_state(user_dict=None): if uid: if post_data.get('inQueue', False): - log.info(f'Add {uid} to Housing Queue') + log.info('Add {} to Housing Queue'.format(uid)) queue_obj = InHousingQueue(uid=uid) db.session.add(queue_obj) else: - log.info(f'Remove {uid} from Housing Queue') + log.info('Remove {} from Housing Queue'.format(uid)) InHousingQueue.query.filter_by(uid=uid).delete() db.session.flush() @@ -88,7 +88,7 @@ def change_queue_state(user_dict=None): @housing_bp.route('/housing/update/', methods=['POST']) -@auth.oidc_auth("default") +@auth.oidc_auth @get_user def change_room_numbers(rmnumber, user_dict=None): log = logger.new(request=request, auth_dict=user_dict) @@ -107,21 +107,21 @@ def change_room_numbers(rmnumber, user_dict=None): if occupant != "": account = ldap_get_member(occupant) account.roomNumber = rmnumber - log.info(f'{occupant} assigned to room {rmnumber}') + log.info('{} assigned to room {}'.format(occupant, rmnumber)) ldap_set_active(account) - log.info(f'{occupant} marked as active because of room assignment') + log.info('{} marked as active because of room assignment'.format(occupant)) # Delete any old occupants that are no longer in room. for old_occupant in [account for account in current_students if ldap_get_roomnumber(account) == str(rmnumber) and account.uid not in update["occupants"]]: - log.info(f'{old_occupant.uid} removed from room {old_occupant.roomNumber}') + log.info('{} removed from room {}'.format(old_occupant.uid, old_occupant.roomNumber)) old_occupant.roomNumber = None return jsonify({"success": True}), 200 @housing_bp.route('/housing/room/', methods=['GET']) -@auth.oidc_auth("default") +@auth.oidc_auth def get_occupants(rmnumber): # Get the current list of people living on-floor. @@ -134,7 +134,7 @@ def get_occupants(rmnumber): @housing_bp.route('/housing', methods=['DELETE']) -@auth.oidc_auth("default") +@auth.oidc_auth @get_user def clear_all_rooms(user_dict=None): log = logger.new(request=request, auth_dict=user_dict) @@ -146,6 +146,6 @@ def clear_all_rooms(user_dict=None): # Find the current occupants and clear them. for occupant in current_students: - log.info(f'{occupant.uid} removed from room {occupant.roomNumber}') + log.info('{} removed from room {}'.format(occupant.uid, occupant.roomNumber)) occupant.roomNumber = None return jsonify({"success": True}), 200 diff --git a/conditional/blueprints/intro_evals.py b/conditional/blueprints/intro_evals.py index 3349bcb5..7cd276b0 100644 --- a/conditional/blueprints/intro_evals.py +++ b/conditional/blueprints/intro_evals.py @@ -25,7 +25,7 @@ @intro_evals_bp.route('/intro_evals/') -@auth.oidc_auth("default") +@auth.oidc_auth @get_user def display_intro_evals(internal=False, user_dict=None): log = logger.new(request=request, auth_dict=user_dict) diff --git a/conditional/blueprints/intro_evals_form.py b/conditional/blueprints/intro_evals_form.py index d90f161a..94efa60b 100644 --- a/conditional/blueprints/intro_evals_form.py +++ b/conditional/blueprints/intro_evals_form.py @@ -15,7 +15,7 @@ @intro_evals_form_bp.route('/intro_evals_form/') -@auth.oidc_auth("default") +@auth.oidc_auth @get_user def display_intro_evals_form(user_dict=None): log = logger.new(request=request, auth_dict=user_dict) @@ -36,7 +36,7 @@ def display_intro_evals_form(user_dict=None): @intro_evals_form_bp.route('/intro_evals/submit', methods=['POST']) -@auth.oidc_auth("default") +@auth.oidc_auth @get_user def submit_intro_evals(user_dict=None): log = logger.new(request=request, auth_dict=user_dict) diff --git a/conditional/blueprints/logs.py b/conditional/blueprints/logs.py index 92b671be..1e78fc18 100644 --- a/conditional/blueprints/logs.py +++ b/conditional/blueprints/logs.py @@ -14,7 +14,7 @@ @log_bp.route('/logs') -@auth.oidc_auth("default") +@auth.oidc_auth @get_user def display_logs(user_dict=None): log = logger.new(request=request, auth_dict=user_dict) diff --git a/conditional/blueprints/major_project_submission.py b/conditional/blueprints/major_project_submission.py index 54829e7d..f8278d16 100644 --- a/conditional/blueprints/major_project_submission.py +++ b/conditional/blueprints/major_project_submission.py @@ -22,108 +22,109 @@ logger = structlog.get_logger() -major_project_bp = Blueprint("major_project_bp", __name__) +major_project_bp = Blueprint('major_project_bp', __name__) -@major_project_bp.route("/major_project/") -@auth.oidc_auth("default") +@major_project_bp.route('/major_project/') +@auth.oidc_auth @get_user def display_major_project(user_dict=None): log = logger.new(request=request, auth_dict=user_dict) - log.info("Display Major Project Page") + log.info('Display Major Project Page') major_projects = [ { - "username": p.uid, - "name": ldap_get_member(p.uid).cn, - "proj_name": p.name, - "status": p.status, - "description": p.description, - "id": p.id, - "is_owner": bool(user_dict["username"] == p.uid), - } - for p in MajorProject.query.filter( - MajorProject.date > start_of_year() - ).order_by(desc(MajorProject.id)) - ] + 'username': p.uid, + 'name': ldap_get_member(p.uid).cn, + 'proj_name': p.name, + 'status': p.status, + 'description': p.description, + 'id': p.id, + 'is_owner': bool(user_dict['username'] == p.uid) + } for p in + MajorProject.query.filter( + MajorProject.date > start_of_year()).order_by( + desc(MajorProject.id))] major_projects_len = len(major_projects) # return names in 'first last (username)' format - return render_template( - "major_project_submission.html", - major_projects=major_projects, - major_projects_len=major_projects_len, - username=user_dict["username"], - ) + return render_template('major_project_submission.html', + major_projects=major_projects, + major_projects_len=major_projects_len, + username=user_dict['username']) -@major_project_bp.route("/major_project/submit", methods=["POST"]) -@auth.oidc_auth("default") +@major_project_bp.route('/major_project/submit', methods=['POST']) +@auth.oidc_auth @get_user def submit_major_project(user_dict=None): log = logger.new(request=request, auth_dict=user_dict) - log.info("Submit Major Project") + log.info('Submit Major Project') post_data = request.get_json() - name = post_data["projectName"] - description = post_data["projectDescription"] + name = post_data['projectName'] + description = post_data['projectDescription'] if name == "" or description == "": return jsonify({"success": False}), 400 - project = MajorProject(user_dict["username"], name, description) + project = MajorProject(user_dict['username'], name, description) - username = user_dict["username"] - send_slack_ping( - { - "text": f" *{get_member_name(username)}* ({username})" - f" submitted their major project, *{name}*!" - } - ) + username = user_dict['username'] + send_slack_ping({"text":f" *{get_member_name(username)}* ({username})" + f" submitted their major project, *{name}*!"}) db.session.add(project) db.session.commit() return jsonify({"success": True}), 200 -@major_project_bp.route("/major_project/review", methods=["POST"]) -@auth.oidc_auth("default") +@major_project_bp.route('/major_project/review', methods=['POST']) +@auth.oidc_auth @get_user def major_project_review(user_dict=None): log = logger.new(request=request, auth_dict=user_dict) - if not ldap_is_eval_director(user_dict["account"]): + if not ldap_is_eval_director(user_dict['account']): return redirect("/dashboard", code=302) post_data = request.get_json() - pid = post_data["id"] - status = post_data["status"] + pid = post_data['id'] + status = post_data['status'] - log.info(f"{status} Major Project ID: {pid}") + log.info('{} Major Project ID: {}'.format(status, pid)) print(post_data) - MajorProject.query.filter(MajorProject.id == pid).update({"status": status}) + MajorProject.query.filter( + MajorProject.id == pid). \ + update( + { + 'status': status + }) db.session.flush() db.session.commit() return jsonify({"success": True}), 200 -@major_project_bp.route("/major_project/delete/", methods=["DELETE"]) -@auth.oidc_auth("default") +@major_project_bp.route('/major_project/delete/', methods=['DELETE']) +@auth.oidc_auth @get_user def major_project_delete(pid, user_dict=None): log = logger.new(request=request, auth_dict=user_dict) - log.info(f"Delete Major Project ID: {pid}") + log.info('Delete Major Project ID: {}'.format(pid)) - major_project = MajorProject.query.filter(MajorProject.id == pid).first() + major_project = MajorProject.query.filter( + MajorProject.id == pid + ).first() creator = major_project.uid - if creator == user_dict["username"] or ldap_is_eval_director(user_dict["account"]): - MajorProject.query.filter(MajorProject.id == pid).delete() + if creator == user_dict['username'] or ldap_is_eval_director(user_dict['account']): + MajorProject.query.filter( + MajorProject.id == pid + ).delete() db.session.flush() db.session.commit() return jsonify({"success": True}), 200 return "Must be project owner to delete!", 401 - def send_slack_ping(payload): - requests.post(app.config["WEBHOOK_URL"], json.dumps(payload), timeout=120) + requests.post(app.config['WEBHOOK_URL'], json.dumps(payload)) diff --git a/conditional/blueprints/member_management.py b/conditional/blueprints/member_management.py index 1927e440..3f5d3d90 100644 --- a/conditional/blueprints/member_management.py +++ b/conditional/blueprints/member_management.py @@ -1,7 +1,7 @@ import csv import io from datetime import datetime -from distutils.util import strtobool # pylint: disable=no-name-in-module,import-error,deprecated-module +from distutils.util import strtobool # pylint: disable=no-name-in-module,import-error import structlog from flask import Blueprint, request, jsonify, make_response @@ -52,7 +52,7 @@ @member_management_bp.route('/manage') -@auth.oidc_auth("default") +@auth.oidc_auth @get_user def display_member_management(user_dict=None): log = logger.new(request=request, auth_dict=user_dict) @@ -100,7 +100,7 @@ def display_member_management(user_dict=None): @member_management_bp.route('/manage/settings', methods=['PUT']) -@auth.oidc_auth("default") +@auth.oidc_auth @get_user def member_management_eval(user_dict=None): log = logger.new(request=request, auth_dict=user_dict) @@ -111,14 +111,14 @@ def member_management_eval(user_dict=None): post_data = request.get_json() if 'siteLockdown' in post_data: - log.info(f'Changed Site Lockdown: {post_data['siteLockdown']}') + log.info('Changed Site Lockdown: {}'.format(post_data['siteLockdown'])) EvalSettings.query.update( { 'site_lockdown': post_data['siteLockdown'] }) if 'introForm' in post_data: - log.info(f'Changed Intro Form: {post_data['introForm']}') + log.info('Changed Intro Form: {}'.format(post_data['introForm'])) EvalSettings.query.update( { 'intro_form_active': post_data['introForm'] @@ -130,7 +130,7 @@ def member_management_eval(user_dict=None): @member_management_bp.route('/manage/accept_dues_until', methods=['PUT']) -@auth.oidc_auth("default") +@auth.oidc_auth @get_user def member_management_financial(user_dict=None): log = logger.new(request=request, auth_dict=user_dict) @@ -142,7 +142,7 @@ def member_management_financial(user_dict=None): if 'acceptDuesUntil' in post_data: date = datetime.strptime(post_data['acceptDuesUntil'], "%Y-%m-%d") - log.info(f'Changed Dues Accepted Until: {date}') + log.info('Changed Dues Accepted Until: {}'.format(date)) EvalSettings.query.update( { 'accept_dues_until': date @@ -154,7 +154,7 @@ def member_management_financial(user_dict=None): @member_management_bp.route('/manage/user', methods=['POST']) -@auth.oidc_auth("default") +@auth.oidc_auth @get_user def member_management_adduser(user_dict=None): log = logger.new(request=request, auth_dict=user_dict) @@ -167,7 +167,7 @@ def member_management_adduser(user_dict=None): name = post_data['name'] onfloor_status = post_data['onfloor'] room_number = post_data['roomNumber'] - log.info(f'Create Freshman Account for {name}') + log.info('Create Freshman Account for {}'.format(name)) # empty room numbers should be NULL if room_number == "": @@ -180,7 +180,7 @@ def member_management_adduser(user_dict=None): @member_management_bp.route('/manage/user/upload', methods=['POST']) -@auth.oidc_auth("default") +@auth.oidc_auth @get_user def member_management_uploaduser(user_dict=None): log = logger.new(request=request, auth_dict=user_dict) @@ -210,7 +210,7 @@ def member_management_uploaduser(user_dict=None): else: rit_username = None - log.info(f'Create Freshman Account for {name} via CSV Upload') + log.info('Create Freshman Account for {} via CSV Upload'.format(name)) db.session.add(FreshmanAccount(name, onfloor_status, room_number, None, rit_username)) db.session.flush() @@ -221,7 +221,7 @@ def member_management_uploaduser(user_dict=None): @member_management_bp.route('/manage/user/', methods=['POST']) -@auth.oidc_auth("default") +@auth.oidc_auth @get_user def member_management_edituser(uid, user_dict=None): if not ldap_is_eval_director(user_dict['account']) and not ldap_is_financial_director(user_dict['account']): @@ -248,7 +248,11 @@ def edit_uid(uid, flask_request, username): room_number = post_data['roomNumber'] onfloor_status = post_data['onfloorStatus'] housing_points = post_data['housingPoints'] - log.info(f'Edit {uid} - Room: {post_data['roomNumber']} On-Floor: {post_data['onfloorStatus']} Points: {post_data['housingPoints']}') #pylint: disable=line-too-long + log.info('Edit {} - Room: {} On-Floor: {} Points: {}'.format( + uid, + post_data['roomNumber'], + post_data['onfloorStatus'], + post_data['housingPoints'])) ldap_set_roomnumber(account, room_number) if onfloor_status: @@ -267,7 +271,7 @@ def edit_uid(uid, flask_request, username): ldap_set_housingpoints(account, housing_points) # Only update if there's a diff - log.info(f'Set {uid} Active: {active_member}') + log.info('Set {} Active: {}'.format(uid, active_member)) if ldap_is_active(account) != active_member: if active_member: ldap_set_active(account) @@ -289,9 +293,12 @@ def edit_uid(uid, flask_request, username): def edit_fid(uid, flask_request): log = logger.new(request=flask_request, auth_dict={'username': uid}) post_data = flask_request.get_json() - - log.info(f'Edit freshman-{uid} - Room: {post_data['roomNumber']} On-Floor: {post_data['onfloorStatus']} Eval: {post_data['evalDate']} SigMiss: {post_data['sigMissed']}') #pylint: disable=line-too-long - + log.info('Edit freshman-{} - Room: {} On-Floor: {} Eval: {} SigMiss: {}'.format( + uid, + post_data['roomNumber'], + post_data['onfloorStatus'], + post_data['evalDate'], + post_data['sigMissed'])) name = post_data['name'] @@ -318,11 +325,11 @@ def edit_fid(uid, flask_request): @member_management_bp.route('/manage/user/', methods=['GET']) -@auth.oidc_auth("default") +@auth.oidc_auth @get_user def member_management_getuserinfo(uid, user_dict=None): log = logger.new(request=request, auth_dict=user_dict) - log.info(f'Get {uid}\'s Information') + log.info('Get {}\'s Information'.format(uid)) if not ldap_is_eval_director(user_dict['account']) and not ldap_is_financial_director(user_dict['account']): return "must be eval or financial director", 403 @@ -403,11 +410,11 @@ def get_hm_date(hm_id): @member_management_bp.route('/manage/user/', methods=['DELETE']) -@auth.oidc_auth("default") +@auth.oidc_auth @get_user def member_management_deleteuser(fid, user_dict=None): log = logger.new(request=request, auth_dict=user_dict) - log.info(f'Delete freshman-{fid}') + log.info('Delete freshman-{}'.format(fid)) if not ldap_is_eval_director(user_dict['account']): return "must be eval director", 403 @@ -415,7 +422,7 @@ def member_management_deleteuser(fid, user_dict=None): if not fid.isdigit(): return "can only delete freshman accounts", 400 - log.info('backend', action=f"delete freshman account {fid}") + log.info('backend', action="delete freshman account %s" % fid) for fca in FreshmanCommitteeAttendance.query.filter(FreshmanCommitteeAttendance.fid == fid): db.session.delete(fca) @@ -437,7 +444,7 @@ def member_management_deleteuser(fid, user_dict=None): # user creation script. There's no reason that the evals director should ever # manually need to do this @member_management_bp.route('/manage/upgrade_user', methods=['POST']) -@auth.oidc_auth("default") +@auth.oidc_auth @get_user def member_management_upgrade_user(user_dict=None): log = logger.new(request=request, auth_dict=user_dict) @@ -451,7 +458,7 @@ def member_management_upgrade_user(user_dict=None): uid = post_data['uid'] signatures_missed = post_data['sigsMissed'] - log.info(f'Upgrade freshman-{fid} to Account: {uid}') + log.info('Upgrade freshman-{} to Account: {}'.format(fid, uid)) acct = FreshmanAccount.query.filter( FreshmanAccount.id == fid).first() @@ -476,7 +483,10 @@ def member_management_upgrade_user(user_dict=None): db.session.add(MemberHouseMeetingAttendance( uid, fhm.meeting_id, fhm.excuse, fhm.attendance_status)) else: - log.info(f'Duplicate house meeting attendance! fid: {fid}, uid: {uid}, id: {fhm.meeting_id}') + log.info('Duplicate house meeting attendance! fid: {}, uid: {}, id: {}'.format( + fid, + uid, + fhm.meeting_id)) db.session.delete(fhm) new_account = ldap_get_member(uid) @@ -498,7 +508,7 @@ def member_management_upgrade_user(user_dict=None): @member_management_bp.route('/manage/make_user_active', methods=['POST']) -@auth.oidc_auth("default") +@auth.oidc_auth @get_user def member_management_make_user_active(user_dict=None): log = logger.new(request=request, auth_dict=user_dict) @@ -509,18 +519,18 @@ def member_management_make_user_active(user_dict=None): return "must be current student, not in bad standing and not active", 403 ldap_set_active(user_dict['account']) - log.info(f"Make user {user_dict['username']} active") + log.info("Make user {} active".format(user_dict['username'])) clear_members_cache() return jsonify({"success": True}), 200 @member_management_bp.route('/member/', methods=['GET']) -@auth.oidc_auth("default") +@auth.oidc_auth @get_user def get_member(uid, user_dict=None): log = logger.new(request=request, auth_dict=user_dict) - log.info(f'Get {uid}\'s Information') + log.info('Get {}\'s Information'.format(uid)) if not ldap_is_eval_director(user_dict['account']): return "must be eval director", 403 @@ -536,7 +546,7 @@ def get_member(uid, user_dict=None): @member_management_bp.route('/manage/active', methods=['DELETE']) -@auth.oidc_auth("default") +@auth.oidc_auth @get_user def clear_active_members(user_dict=None): log = logger.new(request=request, auth_dict=user_dict) @@ -549,7 +559,7 @@ def clear_active_members(user_dict=None): # Clear the active group. for account in members: if account.uid != user_dict['username']: - log.info(f'Remove {account.uid} from Active Status') + log.info('Remove {} from Active Status'.format(account.uid)) ldap_set_inactive(account) return jsonify({"success": True}), 200 @@ -582,7 +592,7 @@ def export_active_list(): @member_management_bp.route('/manage/current/', methods=['POST', 'DELETE']) -@auth.oidc_auth("default") +@auth.oidc_auth @get_user def remove_current_student(uid, user_dict=None): log = logger.new(request=request, auth_dict=user_dict) @@ -592,16 +602,16 @@ def remove_current_student(uid, user_dict=None): member = ldap_get_member(uid) if request.method == 'DELETE': - log.info(f'Remove {uid} from Current Student') + log.info('Remove {} from Current Student'.format(uid)) ldap_set_non_current_student(member) elif request.method == 'POST': - log.info(f'Add {uid} to Current Students') + log.info('Add {} to Current Students'.format(uid)) ldap_set_current_student(member) return jsonify({"success": True}), 200 @member_management_bp.route('/manage/new', methods=['GET']) -@auth.oidc_auth("default") +@auth.oidc_auth @get_user def new_year(user_dict=None): log = logger.new(request=request, auth_dict=user_dict) diff --git a/conditional/blueprints/slideshow.py b/conditional/blueprints/slideshow.py index 1ea953d3..c745e24c 100644 --- a/conditional/blueprints/slideshow.py +++ b/conditional/blueprints/slideshow.py @@ -20,7 +20,7 @@ @slideshow_bp.route('/slideshow/intro') -@auth.oidc_auth("default") +@auth.oidc_auth @get_user def slideshow_intro_display(user_dict=None): log = logger.new(request=request, auth_dict=user_dict) @@ -36,7 +36,7 @@ def slideshow_intro_display(user_dict=None): @slideshow_bp.route('/slideshow/intro/members') -@auth.oidc_auth("default") +@auth.oidc_auth @get_user def slideshow_intro_members(user_dict=None): log = logger.new(request=request, auth_dict=user_dict) @@ -49,7 +49,7 @@ def slideshow_intro_members(user_dict=None): @slideshow_bp.route('/slideshow/intro/review', methods=['POST']) -@auth.oidc_auth("default") +@auth.oidc_auth @get_user def slideshow_intro_review(user_dict=None): log = logger.new(request=request, auth_dict=user_dict) @@ -61,7 +61,7 @@ def slideshow_intro_review(user_dict=None): uid = post_data['uid'] status = post_data['status'] - log.info(f'Intro Eval for {uid}: {status}') + log.info('Intro Eval for {}: {}'.format(uid, status)) FreshmanEvalData.query.filter( FreshmanEvalData.uid == uid and FreshmanEvalData.active). \ @@ -76,7 +76,7 @@ def slideshow_intro_review(user_dict=None): @slideshow_bp.route('/slideshow/spring') -@auth.oidc_auth("default") +@auth.oidc_auth @get_user def slideshow_spring_display(user_dict=None): log = logger.new(request=request, auth_dict=user_dict) @@ -92,7 +92,7 @@ def slideshow_spring_display(user_dict=None): @slideshow_bp.route('/slideshow/spring/members') -@auth.oidc_auth("default") +@auth.oidc_auth @get_user def slideshow_spring_members(user_dict=None): log = logger.new(request=request, auth_dict=user_dict) @@ -105,7 +105,7 @@ def slideshow_spring_members(user_dict=None): @slideshow_bp.route('/slideshow/spring/review', methods=['POST']) -@auth.oidc_auth("default") +@auth.oidc_auth @get_user def slideshow_spring_review(user_dict=None): log = logger.new(request=request, auth_dict=user_dict) @@ -117,7 +117,7 @@ def slideshow_spring_review(user_dict=None): uid = post_data['uid'] status = post_data['status'] - log.info(f'Spring Eval for {uid}: {status}') + log.info('Spring Eval for {}: {}'.format(uid, status)) SpringEval.query.filter( SpringEval.uid == uid and diff --git a/conditional/blueprints/spring_evals.py b/conditional/blueprints/spring_evals.py index 212ca88e..e8c6e1db 100644 --- a/conditional/blueprints/spring_evals.py +++ b/conditional/blueprints/spring_evals.py @@ -17,7 +17,7 @@ @spring_evals_bp.route('/spring_evals/') -@auth.oidc_auth("default") +@auth.oidc_auth @get_user def display_spring_evals(internal=False, user_dict=None): log = logger.new(request=request, auth_dict=user_dict) diff --git a/conditional/models/models.py b/conditional/models/models.py index 97e8875f..59ed4337 100644 --- a/conditional/models/models.py +++ b/conditional/models/models.py @@ -18,7 +18,7 @@ class FreshmanAccount(db.Model): signatures_missed = Column(Integer) rit_username = Column(String(10), nullable=True) - def __init__(self, name, onfloor, room=None, missed=None, rit_username=None): # pylint: disable=too-many-positional-arguments + def __init__(self, name, onfloor, room=None, missed=None, rit_username=None): self.name = name today = date.fromtimestamp(time.time()) self.eval_date = today + timedelta(weeks=6) @@ -32,7 +32,8 @@ class FreshmanEvalData(db.Model): __tablename__ = 'freshman_eval_data' id = Column(Integer, primary_key=True) uid = Column(String(32), nullable=False) - freshman_project = Column(Enum('Pending', 'Passed', 'Failed', name="freshman_project_enum"), nullable=True) + freshman_project = Column(Enum('Pending', 'Passed', 'Failed', + name="freshman_project_enum"), nullable=True) eval_date = Column(DateTime, nullable=False) signatures_missed = Column(Integer, nullable=False) social_events = Column(Text) @@ -228,7 +229,7 @@ class Conditional(db.Model): s_evaluation = Column(ForeignKey('spring_evals.id')) i_evaluation = Column(ForeignKey('freshman_eval_data.id')) - def __init__(self, uid, description, due, s_eval=None, i_eval=None): # pylint: disable=too-many-positional-arguments + def __init__(self, uid, description, due, s_eval=None, i_eval=None): self.uid = uid self.description = description self.date_due = due @@ -288,7 +289,7 @@ class UserLog(db.Model): path = Column(String(128), nullable=False) description = Column(String(128), nullable=False) - def __init__(self, ipaddr, user, method, blueprint, path, description): # pylint: disable=too-many-positional-arguments + def __init__(self, ipaddr, user, method, blueprint, path, description): self.ipaddr = ipaddr self.timestamp = datetime.now() self.uid = user diff --git a/conditional/templates/dashboard.html b/conditional/templates/dashboard.html index b8abfa96..3bfd8197 100644 --- a/conditional/templates/dashboard.html +++ b/conditional/templates/dashboard.html @@ -15,22 +15,12 @@

{{ 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/context_processors.py b/conditional/util/context_processors.py index 766e4d82..feecb107 100644 --- a/conditional/util/context_processors.py +++ b/conditional/util/context_processors.py @@ -33,9 +33,7 @@ def check_current_student(username): @app.context_processor def utility_processor(): - return { - "get_csh_name": get_csh_name, - "get_freshman_name": get_freshman_name, - "get_member_name": get_member_name, - "check_current_student": check_current_student - } + return dict( + get_csh_name=get_csh_name, get_freshman_name=get_freshman_name, get_member_name=get_member_name, + check_current_student=check_current_student + ) diff --git a/conditional/util/member.py b/conditional/util/member.py index 15bd1f61..1c4ae8c5 100644 --- a/conditional/util/member.py +++ b/conditional/util/member.py @@ -17,8 +17,6 @@ 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) @@ -34,7 +32,8 @@ 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_set = active_members - intro_members - on_coop + + voting_list = list(active_members - intro_members - on_coop) passed_fall = FreshmanEvalData.query.filter( FreshmanEvalData.freshman_eval_result == "Passed", @@ -42,9 +41,9 @@ def get_voting_members(): ).distinct() for intro_member in passed_fall: - voting_set.add(intro_member.uid) + if intro_member.uid not in voting_list: + voting_list.append(intro_member.uid) - voting_list = list(username for username in voting_set if gatekeep_status(username)["result"]) return voting_list @@ -160,82 +159,3 @@ 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, - } diff --git a/config.env.py b/config.env.py index 4cf4a7b7..44e0464e 100644 --- a/config.env.py +++ b/config.env.py @@ -48,6 +48,3 @@ # General config DUES_PER_SEMESTER = env.get("CONDITIONAL_DUES_PER_SEMESTER", 80) - -# Vote config -VOTE_TOKEN = env.get("CONDITIONAL_VOTE_TOKEN", "") diff --git a/frontend/stylesheets/pages/_evals.scss b/frontend/stylesheets/pages/_evals.scss index 7488542e..b134244c 100644 --- a/frontend/stylesheets/pages/_evals.scss +++ b/frontend/stylesheets/pages/_evals.scss @@ -61,19 +61,8 @@ border: 0; background: transparent; width: 100%; + height: 0; text-align: center; - display: block; - } - - &[aria-expanded="true"] { - span.glyphicon { - transform: rotate(180deg); - } - } - - span.glyphicon { - transition: transform ease-in-out 0.2s; - transform: rotate(0deg); } } diff --git a/requirements.in b/requirements.in index 0d554b9a..3a38df5b 100644 --- a/requirements.in +++ b/requirements.in @@ -1,31 +1,30 @@ -alembic~=1.15.1 -astroid~=3.3.9 +alembic~=0.9.8 +astroid~=2.4.0 blinker~=1.4 click~=7.1 csh_ldap>=2.3.1 -ddtrace~=3.2.1 -Flask~=3.1.0 +Flask~=1.1.4 Flask-Migrate~=2.1.1 Flask-Gzip~=0.2 -Flask-pyoidc~=3.14.3 -Flask-SQLAlchemy~=3.1.1 +Flask-pyoidc~=1.3.0 +Flask-SQLAlchemy~=2.3.2 gunicorn~=20.1.0 isort~=4.3.4 -itsdangerous~=2.2.0 -Jinja2~=3.1.6 +itsdangerous~=0.24 +Jinja2~=2.10 lazy-object-proxy~=1.4.0 Mako~=1.0.7 -MarkupSafe~=3.0.2 +MarkupSafe~=1.0 mccabe~=0.6.1 -oic~=1.6.1 -pip-tools~=7.4.1 +oic~=0.11.0 +pip-tools~=6.6.2 psycopg2-binary~=2.9.3 -pylint~=3.3.6 +pylint~=2.6.0 python-dateutil~=2.6.1 python-editor~=1.0.3 -sentry-sdk[flask]~=2.24.1 -six~=1.17.0 -SQLAlchemy~=2.0.40 +sentry-sdk[flask]~=0.19.5 +six~=1.12.0 +SQLAlchemy~=1.3.22 structlog~=18.1.0 -Werkzeug~=3.1.3 -wrapt~=1.17.2 +Werkzeug~=0.15.3 +wrapt~=1.11.0 diff --git a/requirements.txt b/requirements.txt index dd17e05d..e6cff61e 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,23 +1,26 @@ # -# This file is autogenerated by pip-compile with Python 3.13 -# by the following command: +# This file is autogenerated by pip-compile with python 3.8 +# To update, run: # # pip-compile requirements.in # -alembic==1.15.1 +alabaster==0.7.12 + # via oic +alembic==0.9.10 # via # -r requirements.in # flask-migrate -annotated-types==0.7.0 - # via pydantic -astroid==3.3.9 +astroid==2.4.2 # via # -r requirements.in # pylint -blinker==1.9.0 +attrs==21.4.0 + # via ddtrace +beaker==1.11.0 + # via oic +blinker==1.4 # via # -r requirements.in - # flask # sentry-sdk certifi==2022.5.18.1 # via @@ -27,28 +30,22 @@ cffi==1.15.0 # via cryptography charset-normalizer==2.0.12 # via requests -click==8.1.8 +click==7.1.2 # via # -r requirements.in # flask # pip-tools cryptography==37.0.2 - # via oic + # via pyopenssl csh-ldap==2.3.1 # via -r requirements.in -ddtrace==3.2.2 +ddsketch==2.0.3 + # via ddtrace +ddtrace==1.1.4 # via -r requirements.in -defusedxml==0.7.1 - # via oic -deprecated==1.2.18 - # via opentelemetry-api -dill==0.3.9 - # via pylint dnspython==2.2.1 # via srvlookup -envier==0.6.1 - # via ddtrace -flask==3.1.0 +flask==1.1.4 # via # -r requirements.in # flask-gzip @@ -60,74 +57,64 @@ flask-gzip==0.2 # via -r requirements.in flask-migrate==2.1.1 # via -r requirements.in -flask-pyoidc==3.14.3 +flask-pyoidc==1.3.0 # via -r requirements.in -flask-sqlalchemy==3.1.1 +flask-sqlalchemy==2.3.2 # via # -r requirements.in # flask-migrate future==0.18.2 - # via pyjwkest -greenlet==3.1.1 - # via sqlalchemy + # via + # oic + # pyjwkest gunicorn==20.1.0 # via -r requirements.in idna==3.3 # via requests -importlib-metadata==8.6.1 - # via opentelemetry-api -importlib-resources==6.5.2 - # via flask-pyoidc isort==4.3.21 # via # -r requirements.in # pylint -itsdangerous==2.2.0 +itsdangerous==0.24 # via # -r requirements.in # flask -jinja2==3.1.6 +jinja2==2.11.3 # via # -r requirements.in # flask -jmespath==1.0.1 - # via - # boto3 - # botocore lazy-object-proxy==1.4.3 - # via -r requirements.in -legacy-cgi==2.6.3 - # via ddtrace + # via + # -r requirements.in + # astroid mako==1.0.14 # via # -r requirements.in # alembic # oic -markupsafe==3.0.2 +markupsafe==1.1.1 # via # -r requirements.in # jinja2 # mako - # sentry-sdk - # werkzeug mccabe==0.6.1 # via # -r requirements.in # pylint -oic==1.6.1 +oic==0.11.0.1 # via # -r requirements.in # flask-pyoidc -opentelemetry-api==1.31.1 +packaging==21.3 # via ddtrace -packaging==24.2 - # via build -pip-tools==7.4.1 +pep517==0.12.0 + # via pip-tools +pip-tools==6.6.2 # via -r requirements.in -platformdirs==4.3.7 - # via pylint protobuf==3.20.1 - # via ddtrace + # via + # ddsketch + # ddtrace psycopg2-binary==2.9.3 # via -r requirements.in pyasn1==0.4.8 @@ -142,46 +129,41 @@ pycryptodomex==3.14.1 # via # oic # pyjwkest -pydantic==2.11.0 - # via pydantic-settings -pydantic-core==2.33.0 - # via pydantic -pydantic-settings==2.8.1 - # via oic pyjwkest==1.4.2 # via oic -pylint==3.3.6 +pylint==2.6.2 # via -r requirements.in -pyproject-hooks==1.2.0 - # via - # build - # pip-tools +pyopenssl==22.0.0 + # via oic +pyparsing==3.0.9 + # via packaging python-dateutil==2.6.1 # via # -r requirements.in - # botocore -python-dotenv==1.1.0 - # via pydantic-settings + # alembic python-editor==1.0.4 - # via -r requirements.in + # via + # -r requirements.in + # alembic python-ldap==3.0.0 # via csh-ldap requests==2.27.1 # via - # flask-pyoidc # oic # pyjwkest -s3transfer==0.10.4 - # via boto3 -sentry-sdk[flask]==2.24.1 +sentry-sdk[flask]==0.19.5 # via -r requirements.in -six==1.17.0 +six==1.12.0 # via # -r requirements.in + # astroid + # ddsketch + # ddtrace + # oic # pyjwkest # python-dateutil # structlog -sqlalchemy==2.0.40 +sqlalchemy==1.3.24 # via # -r requirements.in # alembic @@ -190,38 +172,26 @@ srvlookup==2.0.0 # via csh-ldap structlog==18.1.0 # via -r requirements.in -tomlkit==0.13.2 +tenacity==8.0.1 + # via ddtrace +toml==0.10.2 # via pylint -typing-extensions==4.13.0 +tomli==2.0.1 + # via pep517 +urllib3==1.26.9 # via - # alembic - # ddtrace - # pydantic - # pydantic-core - # sqlalchemy - # typing-inspection -typing-inspection==0.4.0 - # via pydantic -urllib3==1.26.20 - # via - # botocore # requests # sentry-sdk -werkzeug==3.1.3 +werkzeug==0.15.6 # via # -r requirements.in # flask wheel==0.37.1 # via pip-tools -wrapt==1.17.2 +wrapt==1.11.2 # via # -r requirements.in - # ddtrace - # deprecated -xmltodict==0.14.2 - # via ddtrace -zipp==3.21.0 - # via importlib-metadata + # astroid # The following packages are considered to be unsafe in a requirements file: # pip