From 59767da833c547be3d8409aa5ce0fa68707d3b3b Mon Sep 17 00:00:00 2001 From: Ella Soccoli Date: Fri, 28 Mar 2025 00:04:51 -0400 Subject: [PATCH 1/8] I DID IT --- Dockerfile | 7 +- conditional/__init__.py | 13 +- conditional/blueprints/attendance.py | 36 ++-- conditional/blueprints/cache_management.py | 4 +- conditional/blueprints/co_op.py | 8 +- conditional/blueprints/conditional.py | 8 +- conditional/blueprints/dashboard.py | 2 +- conditional/blueprints/housing.py | 10 +- conditional/blueprints/intro_evals.py | 2 +- conditional/blueprints/intro_evals_form.py | 4 +- conditional/blueprints/logs.py | 2 +- .../blueprints/major_project_submission.py | 11 +- conditional/blueprints/member_management.py | 28 +-- conditional/blueprints/slideshow.py | 12 +- conditional/blueprints/spring_evals.py | 2 +- requirements.in | 34 ++-- requirements.txt | 159 +++++++++++------- 17 files changed, 194 insertions(+), 148 deletions(-) diff --git a/Dockerfile b/Dockerfile index 3148d474..a086397f 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,4 @@ -FROM docker.io/python:3.8-buster +FROM docker.io/python:3.12-bookworm MAINTAINER Computer Science House RUN mkdir /opt/conditional @@ -8,7 +8,7 @@ ADD requirements.txt /opt/conditional WORKDIR /opt/conditional RUN apt-get -yq update && \ - apt-get -yq install libsasl2-dev libldap2-dev libssl-dev gcc g++ make && \ + apt-get -yq install libsasl2-dev libldap2-dev libldap-common libssl-dev gcc g++ make && \ pip install -r requirements.txt && \ apt-get -yq clean all @@ -29,4 +29,5 @@ RUN rm -rf node_modules && \ RUN ln -sf /usr/share/zoneinfo/America/New_York /etc/localtime -CMD ["ddtrace-run", "gunicorn", "conditional:app", "--bind=0.0.0.0:8080", "--access-logfile=-", "--timeout=256"] +#CMD ["ddtrace-run", "gunicorn", "conditional:app", "--bind=0.0.0.0:8080", "--access-logfile=-", "--timeout=256"] +CMD ["gunicorn", "conditional:app", "--bind=0.0.0.0:8080", "--access-logfile=-", "--timeout=256"] diff --git a/conditional/__init__.py b/conditional/__init__.py index 041218ae..53535a79 100644 --- a/conditional/__init__.py +++ b/conditional/__init__.py @@ -7,6 +7,7 @@ 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 @@ -39,8 +40,12 @@ app.config['LDAP_BIND_PW'], ro=app.config['LDAP_RO']) -auth = OIDCAuthentication(app, issuer=app.config["OIDC_ISSUER"], - client_registration_info=app.config["OIDC_CLIENT_CONFIG"]) +#auth = OIDCAuthentication(app, issuer=app.config["OIDC_ISSUER"], client_registration_info=app.config["OIDC_CLIENT_CONFIG"]) + +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) app.secret_key = app.config["SECRET_KEY"] @@ -137,7 +142,7 @@ def static_proxy(path): @app.route('/') -@auth.oidc_auth +@auth.oidc_auth("default") def default_route(): return redirect('/dashboard') @@ -158,7 +163,7 @@ def health(): @app.errorhandler(404) @app.errorhandler(500) -@auth.oidc_auth +@auth.oidc_auth("default") @get_user def route_errors(error, user_dict=None): data = dict() diff --git a/conditional/blueprints/attendance.py b/conditional/blueprints/attendance.py index 7adbf995..b8cda2e6 100644 --- a/conditional/blueprints/attendance.py +++ b/conditional/blueprints/attendance.py @@ -29,7 +29,7 @@ @attendance_bp.route('/attendance/ts_members') -@auth.oidc_auth +@auth.oidc_auth("default") @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 +@auth.oidc_auth("default") @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 +@auth.oidc_auth("default") @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 +@auth.oidc_auth("default") @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 +@auth.oidc_auth("default") @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 +@auth.oidc_auth("default") @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 +@auth.oidc_auth("default") @get_user def submit_committee_attendance(user_dict=None): log = logger.new(request=request, auth_dict=user_dict) @@ -205,7 +205,7 @@ def submit_committee_attendance(user_dict=None): @attendance_bp.route('/attendance/submit/ts', methods=['POST']) -@auth.oidc_auth +@auth.oidc_auth("default") @get_user def submit_seminar_attendance(user_dict=None): log = logger.new(request=request, auth_dict=user_dict) @@ -240,7 +240,7 @@ def submit_seminar_attendance(user_dict=None): @attendance_bp.route('/attendance/submit/hm', methods=['POST']) -@auth.oidc_auth +@auth.oidc_auth("default") @get_user def submit_house_attendance(user_dict=None): log = logger.new(request=request, auth_dict=user_dict) @@ -290,7 +290,7 @@ def submit_house_attendance(user_dict=None): @attendance_bp.route('/attendance/alter/hm//', methods=['GET']) -@auth.oidc_auth +@auth.oidc_auth("default") @get_user def alter_house_attendance(uid, hid, user_dict=None): log = logger.new(request=request, auth_dict=user_dict) @@ -320,7 +320,7 @@ def alter_house_attendance(uid, hid, user_dict=None): @attendance_bp.route('/attendance/alter/hm//', methods=['POST']) -@auth.oidc_auth +@auth.oidc_auth("default") @get_user def alter_house_excuse(uid, hid, user_dict=None): log = logger.new(request=request, auth_dict=user_dict) @@ -357,7 +357,7 @@ def alter_house_excuse(uid, hid, user_dict=None): @attendance_bp.route('/attendance/history', methods=['GET']) -@auth.oidc_auth +@auth.oidc_auth("default") @get_user def attendance_history(user_dict=None): @@ -444,7 +444,7 @@ def get_seminar_attendees(meeting_id): @attendance_bp.route('/attendance/alter/cm/', methods=['POST']) -@auth.oidc_auth +@auth.oidc_auth("default") @get_user def alter_committee_attendance(cid, user_dict=None): log = logger.new(request=request, auth_dict=user_dict) @@ -476,7 +476,7 @@ def alter_committee_attendance(cid, user_dict=None): @attendance_bp.route('/attendance/alter/ts/', methods=['POST']) -@auth.oidc_auth +@auth.oidc_auth("default") @get_user def alter_seminar_attendance(sid, user_dict=None): log = logger.new(request=request, auth_dict=user_dict) @@ -508,7 +508,7 @@ def alter_seminar_attendance(sid, user_dict=None): @attendance_bp.route('/attendance/ts/', methods=['GET', 'DELETE']) -@auth.oidc_auth +@auth.oidc_auth("default") @get_user def get_cm_attendees(sid, user_dict=None): if request.method == 'GET': @@ -545,7 +545,7 @@ def get_cm_attendees(sid, user_dict=None): @attendance_bp.route('/attendance/cm/', methods=['GET', 'DELETE']) -@auth.oidc_auth +@auth.oidc_auth("default") @get_user def get_ts_attendees(cid, user_dict=None): if request.method == 'GET': @@ -582,7 +582,7 @@ def get_ts_attendees(cid, user_dict=None): @attendance_bp.route('/attendance/cm//approve', methods=['POST']) -@auth.oidc_auth +@auth.oidc_auth("default") @get_user def approve_cm(cid, user_dict=None): log = logger.new(request=request, auth_dict=user_dict) @@ -600,7 +600,7 @@ def approve_cm(cid, user_dict=None): @attendance_bp.route('/attendance/ts//approve', methods=['POST']) -@auth.oidc_auth +@auth.oidc_auth("default") @get_user def approve_ts(sid, user_dict=None): log = logger.new(request=request, auth_dict=user_dict) diff --git a/conditional/blueprints/cache_management.py b/conditional/blueprints/cache_management.py index fc4a1866..14290a51 100644 --- a/conditional/blueprints/cache_management.py +++ b/conditional/blueprints/cache_management.py @@ -21,7 +21,7 @@ @cache_bp.route('/restart') -@auth.oidc_auth +@auth.oidc_auth("default") @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 +@auth.oidc_auth("default") @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 27b86dce..62f51a6b 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 +@auth.oidc_auth("default") @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 +@auth.oidc_auth("default") @get_user def submit_co_op_form(user_dict=None): log = logger.new(request=request, auth_dict=user_dict) @@ -65,7 +65,7 @@ def submit_co_op_form(user_dict=None): @co_op_bp.route('/co_op/', methods=['DELETE']) -@auth.oidc_auth +@auth.oidc_auth("default") @get_user def delete_co_op(uid, user_dict=None): log = logger.new(request=request, auth_dict=user_dict) @@ -91,7 +91,7 @@ def delete_co_op(uid, user_dict=None): @co_op_bp.route('/co_op/manage') -@auth.oidc_auth +@auth.oidc_auth("default") @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 a5bd005c..e061cd44 100644 --- a/conditional/blueprints/conditional.py +++ b/conditional/blueprints/conditional.py @@ -15,7 +15,7 @@ @conditionals_bp.route('/conditionals/') -@auth.oidc_auth +@auth.oidc_auth("default") @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 +@auth.oidc_auth("default") @get_user def create_conditional(user_dict=None): log = logger.new(request=request, auth_dict=user_dict) @@ -76,7 +76,7 @@ def create_conditional(user_dict=None): @conditionals_bp.route('/conditionals/review', methods=['POST']) -@auth.oidc_auth +@auth.oidc_auth("default") @get_user def conditional_review(user_dict=None): log = logger.new(request=request, auth_dict=user_dict) @@ -113,7 +113,7 @@ def conditional_review(user_dict=None): @conditionals_bp.route('/conditionals/delete/', methods=['DELETE']) -@auth.oidc_auth +@auth.oidc_auth("default") @get_user def conditional_delete(cid, user_dict=None): log = logger.new(request=request, auth_dict=user_dict) diff --git a/conditional/blueprints/dashboard.py b/conditional/blueprints/dashboard.py index 6028c454..b90142e0 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 +@auth.oidc_auth("default") @get_user def display_dashboard(user_dict=None): log = logger.new(request=request, auth_dict=user_dict) diff --git a/conditional/blueprints/housing.py b/conditional/blueprints/housing.py index b4ea5466..47c33806 100644 --- a/conditional/blueprints/housing.py +++ b/conditional/blueprints/housing.py @@ -20,7 +20,7 @@ @housing_bp.route('/housing') -@auth.oidc_auth +@auth.oidc_auth("default") @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 +@auth.oidc_auth("default") @get_user def change_queue_state(user_dict=None): log = logger.new(request=request, auth_dict=user_dict) @@ -88,7 +88,7 @@ def change_queue_state(user_dict=None): @housing_bp.route('/housing/update/', methods=['POST']) -@auth.oidc_auth +@auth.oidc_auth("default") @get_user def change_room_numbers(rmnumber, user_dict=None): log = logger.new(request=request, auth_dict=user_dict) @@ -121,7 +121,7 @@ def change_room_numbers(rmnumber, user_dict=None): @housing_bp.route('/housing/room/', methods=['GET']) -@auth.oidc_auth +@auth.oidc_auth("default") 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 +@auth.oidc_auth("default") @get_user def clear_all_rooms(user_dict=None): log = logger.new(request=request, auth_dict=user_dict) diff --git a/conditional/blueprints/intro_evals.py b/conditional/blueprints/intro_evals.py index 7cd276b0..3349bcb5 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 +@auth.oidc_auth("default") @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 94efa60b..d90f161a 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 +@auth.oidc_auth("default") @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 +@auth.oidc_auth("default") @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 1e78fc18..92b671be 100644 --- a/conditional/blueprints/logs.py +++ b/conditional/blueprints/logs.py @@ -14,7 +14,7 @@ @log_bp.route('/logs') -@auth.oidc_auth +@auth.oidc_auth("default") @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 dfe8de0a..b574243d 100644 --- a/conditional/blueprints/major_project_submission.py +++ b/conditional/blueprints/major_project_submission.py @@ -31,7 +31,7 @@ @major_project_bp.route('/major_project/') -@auth.oidc_auth +@auth.oidc_auth("default") @get_user def display_major_project(user_dict=None): log = logger.new(request=request, auth_dict=user_dict) @@ -59,12 +59,13 @@ def display_major_project(user_dict=None): username=user_dict['username']) @major_project_bp.route('/major_project/upload', methods=['POST']) -@auth.oidc_auth +@auth.oidc_auth("default") @get_user def upload_major_project_files(user_dict=None): log = logger.new(request=request, auth_dict=user_dict) log.info('Uploading Major Project File(s)') + if len(list(request.files.keys())) < 1: return "No file", 400 @@ -83,7 +84,7 @@ def upload_major_project_files(user_dict=None): @major_project_bp.route('/major_project/submit', methods=['POST']) -@auth.oidc_auth +@auth.oidc_auth("default") @get_user def submit_major_project(user_dict=None): log = logger.new(request=request, auth_dict=user_dict) @@ -135,7 +136,7 @@ def submit_major_project(user_dict=None): @major_project_bp.route('/major_project/review', methods=['POST']) -@auth.oidc_auth +@auth.oidc_auth("default") @get_user def major_project_review(user_dict=None): log = logger.new(request=request, auth_dict=user_dict) @@ -162,7 +163,7 @@ def major_project_review(user_dict=None): @major_project_bp.route('/major_project/delete/', methods=['DELETE']) -@auth.oidc_auth +@auth.oidc_auth("default") @get_user def major_project_delete(pid, user_dict=None): log = logger.new(request=request, auth_dict=user_dict) diff --git a/conditional/blueprints/member_management.py b/conditional/blueprints/member_management.py index 3f5d3d90..f4a476c9 100644 --- a/conditional/blueprints/member_management.py +++ b/conditional/blueprints/member_management.py @@ -52,7 +52,7 @@ @member_management_bp.route('/manage') -@auth.oidc_auth +@auth.oidc_auth("default") @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 +@auth.oidc_auth("default") @get_user def member_management_eval(user_dict=None): log = logger.new(request=request, auth_dict=user_dict) @@ -130,7 +130,7 @@ def member_management_eval(user_dict=None): @member_management_bp.route('/manage/accept_dues_until', methods=['PUT']) -@auth.oidc_auth +@auth.oidc_auth("default") @get_user def member_management_financial(user_dict=None): log = logger.new(request=request, auth_dict=user_dict) @@ -154,7 +154,7 @@ def member_management_financial(user_dict=None): @member_management_bp.route('/manage/user', methods=['POST']) -@auth.oidc_auth +@auth.oidc_auth("default") @get_user def member_management_adduser(user_dict=None): log = logger.new(request=request, auth_dict=user_dict) @@ -180,7 +180,7 @@ def member_management_adduser(user_dict=None): @member_management_bp.route('/manage/user/upload', methods=['POST']) -@auth.oidc_auth +@auth.oidc_auth("default") @get_user def member_management_uploaduser(user_dict=None): log = logger.new(request=request, auth_dict=user_dict) @@ -221,7 +221,7 @@ def member_management_uploaduser(user_dict=None): @member_management_bp.route('/manage/user/', methods=['POST']) -@auth.oidc_auth +@auth.oidc_auth("default") @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']): @@ -325,7 +325,7 @@ def edit_fid(uid, flask_request): @member_management_bp.route('/manage/user/', methods=['GET']) -@auth.oidc_auth +@auth.oidc_auth("default") @get_user def member_management_getuserinfo(uid, user_dict=None): log = logger.new(request=request, auth_dict=user_dict) @@ -410,7 +410,7 @@ def get_hm_date(hm_id): @member_management_bp.route('/manage/user/', methods=['DELETE']) -@auth.oidc_auth +@auth.oidc_auth("default") @get_user def member_management_deleteuser(fid, user_dict=None): log = logger.new(request=request, auth_dict=user_dict) @@ -444,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 +@auth.oidc_auth("default") @get_user def member_management_upgrade_user(user_dict=None): log = logger.new(request=request, auth_dict=user_dict) @@ -508,7 +508,7 @@ def member_management_upgrade_user(user_dict=None): @member_management_bp.route('/manage/make_user_active', methods=['POST']) -@auth.oidc_auth +@auth.oidc_auth("default") @get_user def member_management_make_user_active(user_dict=None): log = logger.new(request=request, auth_dict=user_dict) @@ -526,7 +526,7 @@ def member_management_make_user_active(user_dict=None): @member_management_bp.route('/member/', methods=['GET']) -@auth.oidc_auth +@auth.oidc_auth("default") @get_user def get_member(uid, user_dict=None): log = logger.new(request=request, auth_dict=user_dict) @@ -546,7 +546,7 @@ def get_member(uid, user_dict=None): @member_management_bp.route('/manage/active', methods=['DELETE']) -@auth.oidc_auth +@auth.oidc_auth("default") @get_user def clear_active_members(user_dict=None): log = logger.new(request=request, auth_dict=user_dict) @@ -592,7 +592,7 @@ def export_active_list(): @member_management_bp.route('/manage/current/', methods=['POST', 'DELETE']) -@auth.oidc_auth +@auth.oidc_auth("default") @get_user def remove_current_student(uid, user_dict=None): log = logger.new(request=request, auth_dict=user_dict) @@ -611,7 +611,7 @@ def remove_current_student(uid, user_dict=None): @member_management_bp.route('/manage/new', methods=['GET']) -@auth.oidc_auth +@auth.oidc_auth("default") @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 c745e24c..6696b18a 100644 --- a/conditional/blueprints/slideshow.py +++ b/conditional/blueprints/slideshow.py @@ -20,7 +20,7 @@ @slideshow_bp.route('/slideshow/intro') -@auth.oidc_auth +@auth.oidc_auth("default") @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 +@auth.oidc_auth("default") @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 +@auth.oidc_auth("default") @get_user def slideshow_intro_review(user_dict=None): log = logger.new(request=request, auth_dict=user_dict) @@ -76,7 +76,7 @@ def slideshow_intro_review(user_dict=None): @slideshow_bp.route('/slideshow/spring') -@auth.oidc_auth +@auth.oidc_auth("default") @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 +@auth.oidc_auth("default") @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 +@auth.oidc_auth("default") @get_user def slideshow_spring_review(user_dict=None): log = logger.new(request=request, auth_dict=user_dict) diff --git a/conditional/blueprints/spring_evals.py b/conditional/blueprints/spring_evals.py index e8c6e1db..212ca88e 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 +@auth.oidc_auth("default") @get_user def display_spring_evals(internal=False, user_dict=None): log = logger.new(request=request, auth_dict=user_dict) diff --git a/requirements.in b/requirements.in index 5636cd6d..7ba4ae4f 100644 --- a/requirements.in +++ b/requirements.in @@ -1,33 +1,33 @@ -alembic~=0.9.8 -astroid~=2.4.0 +alembic~=1.15.1 +astroid~=3.3.9 blinker~=1.4 boto3==1.35.13 botocore==1.35.13 -click~=7.1 +click~=8.1.8 csh_ldap>=2.3.1 -ddtrace~=1.1.4 -Flask~=1.1.4 +ddtrace~=3.3.0 +Flask~=3.1.0 Flask-Migrate~=2.1.1 Flask-Gzip~=0.2 -Flask-pyoidc~=1.3.0 -Flask-SQLAlchemy~=2.3.2 +Flask-pyoidc~=3.14.3 +Flask-SQLAlchemy~=3.1.1 gunicorn~=20.1.0 isort~=4.3.4 -itsdangerous~=0.24 -Jinja2~=2.10 +itsdangerous~=2.2.0 +Jinja2~=3.1.6 lazy-object-proxy~=1.4.0 Mako~=1.0.7 -MarkupSafe~=1.0 +MarkupSafe~=3.0.2 mccabe~=0.6.1 -oic~=0.11.0 -pip-tools~=6.6.2 +oic~=1.6.1 +pip-tools~=7.4.1 psycopg2-binary~=2.9.3 -pylint~=2.6.0 +pylint~=3.3.6 python-dateutil~=2.6.1 python-editor~=1.0.3 -sentry-sdk[flask]~=0.19.5 -six~=1.12.0 -SQLAlchemy~=1.3.22 +sentry-sdk[flask]~=2.24.1 +six~=1.17.0 +SQLAlchemy~=2.0.40 structlog~=18.1.0 -Werkzeug~=0.15.3 +Werkzeug~=3.1.3 wrapt~=1.11.0 diff --git a/requirements.txt b/requirements.txt index 3bc182c3..ba5d4ba2 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,29 +1,35 @@ # -# This file is autogenerated by pip-compile with python 3.8 -# To update, run: +# This file is autogenerated by pip-compile with Python 3.13 +# by the following command: # # pip-compile requirements.in # -alabaster==0.7.12 - # via oic -alembic==0.9.10 +alembic==1.15.1 # via # -r requirements.in # flask-migrate -astroid==2.4.2 +annotated-types==0.7.0 + # via pydantic +astroid==3.3.9 # via # -r requirements.in # pylint -attrs==21.4.0 - # via ddtrace -beaker==1.11.0 - # via oic -blinker==1.4 +blinker==1.9.0 # via # -r requirements.in + # flask # sentry-sdk boto3==1.35.13 + # via -r requirements.in botocore==1.35.13 + # via + # -r requirements.in + # boto3 + # s3transfer +build==1.2.2.post1 + # via pip-tools +bytecode==0.16.1 + # via ddtrace certifi==2022.5.18.1 # via # requests @@ -32,22 +38,28 @@ cffi==1.15.0 # via cryptography charset-normalizer==2.0.12 # via requests -click==7.1.2 +click==8.1.8 # via # -r requirements.in # flask # pip-tools cryptography==37.0.2 - # via pyopenssl + # via oic csh-ldap==2.3.1 # via -r requirements.in -ddsketch==2.0.3 - # via ddtrace -ddtrace==1.1.4 +ddtrace==3.3.0 # 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 -flask==1.1.4 +envier==0.6.1 + # via ddtrace +flask==3.1.0 # via # -r requirements.in # flask-gzip @@ -59,64 +71,74 @@ flask-gzip==0.2 # via -r requirements.in flask-migrate==2.1.1 # via -r requirements.in -flask-pyoidc==1.3.0 +flask-pyoidc==3.14.3 # via -r requirements.in -flask-sqlalchemy==2.3.2 +flask-sqlalchemy==3.1.1 # via # -r requirements.in # flask-migrate future==0.18.2 - # via - # oic - # pyjwkest + # via pyjwkest +greenlet==3.1.1 + # via sqlalchemy 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==0.24 +itsdangerous==2.2.0 # via # -r requirements.in # flask -jinja2==2.11.3 +jinja2==3.1.6 # via # -r requirements.in # flask -lazy-object-proxy==1.4.3 +jmespath==1.0.1 # via - # -r requirements.in - # astroid + # boto3 + # botocore +lazy-object-proxy==1.4.3 + # via -r requirements.in +legacy-cgi==2.6.3 + # via ddtrace mako==1.0.14 # via # -r requirements.in # alembic # oic -markupsafe==1.1.1 +markupsafe==3.0.2 # via # -r requirements.in # jinja2 # mako + # sentry-sdk + # werkzeug mccabe==0.6.1 # via # -r requirements.in # pylint -oic==0.11.0.1 +oic==1.6.1 # via # -r requirements.in # flask-pyoidc -packaging==21.3 +opentelemetry-api==1.31.1 # via ddtrace -pep517==0.12.0 - # via pip-tools -pip-tools==6.6.2 +packaging==24.2 + # via build +pip-tools==7.4.1 # via -r requirements.in +platformdirs==4.3.7 + # via pylint protobuf==3.20.1 - # via - # ddsketch - # ddtrace + # via ddtrace psycopg2-binary==2.9.3 # via -r requirements.in pyasn1==0.4.8 @@ -131,41 +153,46 @@ 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==2.6.2 +pylint==3.3.6 # via -r requirements.in -pyopenssl==22.0.0 - # via oic -pyparsing==3.0.9 - # via packaging +pyproject-hooks==1.2.0 + # via + # build + # pip-tools python-dateutil==2.6.1 # via # -r requirements.in - # alembic + # botocore +python-dotenv==1.1.0 + # via pydantic-settings python-editor==1.0.4 - # via - # -r requirements.in - # alembic + # via -r requirements.in python-ldap==3.0.0 # via csh-ldap requests==2.27.1 # via + # flask-pyoidc # oic # pyjwkest -sentry-sdk[flask]==0.19.5 +s3transfer==0.10.4 + # via boto3 +sentry-sdk[flask]==2.24.1 # via -r requirements.in -six==1.12.0 +six==1.17.0 # via # -r requirements.in - # astroid - # ddsketch - # ddtrace - # oic # pyjwkest # python-dateutil # structlog -sqlalchemy==1.3.24 +sqlalchemy==2.0.40 # via # -r requirements.in # alembic @@ -174,17 +201,24 @@ srvlookup==2.0.0 # via csh-ldap structlog==18.1.0 # via -r requirements.in -tenacity==8.0.1 - # via ddtrace -toml==0.10.2 +tomlkit==0.13.2 # via pylint -tomli==2.0.1 - # via pep517 -urllib3==1.26.9 +typing-extensions==4.13.0 # 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==0.15.6 +werkzeug==3.1.3 # via # -r requirements.in # flask @@ -193,7 +227,12 @@ wheel==0.37.1 wrapt==1.11.2 # via # -r requirements.in - # astroid + # ddtrace + # deprecated +xmltodict==0.14.2 + # via ddtrace +zipp==3.21.0 + # via importlib-metadata # The following packages are considered to be unsafe in a requirements file: # pip From 24bf06143a73a0d3cf985b57f93a2f753a29daf6 Mon Sep 17 00:00:00 2001 From: Ella Soccoli Date: Fri, 28 Mar 2025 00:08:12 -0400 Subject: [PATCH 2/8] Removed unnecessary commented lines, changed dockerfile to call ddtrace again --- Dockerfile | 3 +-- conditional/__init__.py | 2 -- 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/Dockerfile b/Dockerfile index a086397f..5fa9b20b 100644 --- a/Dockerfile +++ b/Dockerfile @@ -29,5 +29,4 @@ RUN rm -rf node_modules && \ RUN ln -sf /usr/share/zoneinfo/America/New_York /etc/localtime -#CMD ["ddtrace-run", "gunicorn", "conditional:app", "--bind=0.0.0.0:8080", "--access-logfile=-", "--timeout=256"] -CMD ["gunicorn", "conditional:app", "--bind=0.0.0.0:8080", "--access-logfile=-", "--timeout=256"] +CMD ["ddtrace-run", "gunicorn", "conditional:app", "--bind=0.0.0.0:8080", "--access-logfile=-", "--timeout=256"] diff --git a/conditional/__init__.py b/conditional/__init__.py index 53535a79..0ee5a3d4 100644 --- a/conditional/__init__.py +++ b/conditional/__init__.py @@ -40,8 +40,6 @@ app.config['LDAP_BIND_PW'], ro=app.config['LDAP_RO']) -#auth = OIDCAuthentication(app, issuer=app.config["OIDC_ISSUER"], client_registration_info=app.config["OIDC_CLIENT_CONFIG"]) - client_metadata = ClientMetadata(app.config["OIDC_CLIENT_CONFIG"]) provider_config = ProviderConfiguration(issuer=app.config["OIDC_ISSUER"], client_registration_info=client_metadata) From 15c2c87c125d91d446e9b8aa090bed5d5a881b46 Mon Sep 17 00:00:00 2001 From: Max Meinhold Date: Fri, 28 Mar 2025 01:57:22 -0400 Subject: [PATCH 3/8] Bump python in CI --- .github/workflows/python-app.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/python-app.yml b/.github/workflows/python-app.yml index f8ae97f9..980b1ab3 100644 --- a/.github/workflows/python-app.yml +++ b/.github/workflows/python-app.yml @@ -15,7 +15,7 @@ jobs: strategy: matrix: - python-version: [3.8, 3.9] + python-version: [3.12] steps: - name: Install ldap dependencies From 1636a2dcfa76707a18faec0142ada6feb90e6f9d Mon Sep 17 00:00:00 2001 From: Ella Soccoli Date: Sat, 29 Mar 2025 18:06:21 -0400 Subject: [PATCH 4/8] Fixed formatting for linting --- conditional/blueprints/attendance.py | 28 +++++------ conditional/blueprints/co_op.py | 2 +- conditional/blueprints/conditional.py | 4 +- conditional/blueprints/housing.py | 12 ++--- .../blueprints/major_project_submission.py | 4 +- conditional/blueprints/member_management.py | 46 +++++++------------ conditional/blueprints/slideshow.py | 4 +- 7 files changed, 41 insertions(+), 59 deletions(-) diff --git a/conditional/blueprints/attendance.py b/conditional/blueprints/attendance.py index b8cda2e6..ae41b8d6 100644 --- a/conditional/blueprints/attendance.py +++ b/conditional/blueprints/attendance.py @@ -183,7 +183,7 @@ def submit_committee_attendance(user_dict=None): f_attendees = post_data['freshmen'] timestamp = post_data['timestamp'] - log.info('Submit {} Meeting Attendance'.format(committee)) + log.info(f'Submit {committee} Meeting Attendance') 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('Gave Attendance to {} for {}'.format(m, committee)) + log.info(f'Gave Attendance to {m} for {committee}') db.session.add(MemberCommitteeAttendance(m, meeting.id)) for f in f_attendees: - log.info('Gave Attendance to freshman-{} for {}'.format(f, committee)) + log.info(f'Gave Attendance to freshman-{f} for {committee}') db.session.add(FreshmanCommitteeAttendance(f, meeting.id)) db.session.commit() @@ -228,11 +228,11 @@ def submit_seminar_attendance(user_dict=None): db.session.refresh(seminar) for m in m_attendees: - log.info('Gave Attendance to {} for {}'.format(m, seminar_name)) + log.info(f'Gave Attendance to {m} for {seminar_name}') db.session.add(MemberSeminarAttendance(m, seminar.id)) for f in f_attendees: - log.info('Gave Attendance to freshman-{} for {}'.format(f, seminar_name)) + log.info(f'Gave Attendance to freshman-{f} for {seminar_name}') db.session.add(FreshmanSeminarAttendance(f, seminar.id)) db.session.commit() @@ -263,10 +263,7 @@ def submit_house_attendance(user_dict=None): if "members" in post_data: for m in post_data['members']: - log.info('Marked {} {} for House Meeting on {}'.format( - m['uid'], - m['status'], - timestamp.strftime("%Y-%m-%d"))) + log.info(f'Marked {m['uid']} {m['status']} for House Meeting on {timestamp.strftime("%Y-%m-%d")}') db.session.add(MemberHouseMeetingAttendance( m['uid'], meeting.id, @@ -275,10 +272,7 @@ def submit_house_attendance(user_dict=None): if "freshmen" in post_data: for f in post_data['freshmen']: - log.info('Marked freshman-{} {} for House Meeting on {}'.format( - f['id'], - f['status'], - timestamp.strftime("%Y-%m-%d"))) + log.info(f'Marked freshman-{f['id']} {f['status']} for House Meeting on {timestamp.strftime("%Y-%m-%d")}') db.session.add(FreshmanHouseMeetingAttendance( f['id'], meeting.id, @@ -299,7 +293,7 @@ def alter_house_attendance(uid, hid, user_dict=None): return "must be evals", 403 if not uid.isdigit(): - log.info('Mark {} Present for House Meeting ID: {}'.format(uid, hid)) + log.info(f'Mark {uid} Present for House Meeting ID: {hid}') member_meeting = MemberHouseMeetingAttendance.query.filter( MemberHouseMeetingAttendance.uid == uid, MemberHouseMeetingAttendance.meeting_id == hid @@ -308,7 +302,7 @@ def alter_house_attendance(uid, hid, user_dict=None): db.session.commit() return jsonify({"success": True}), 200 - log.info('Mark freshman-{} Present for House Meeting ID: {}'.format(uid, hid)) + log.info(f'Mark freshman-{uid} Present for House Meeting ID: {hid}') freshman_meeting = FreshmanHouseMeetingAttendance.query.filter( FreshmanHouseMeetingAttendance.fid == uid, FreshmanHouseMeetingAttendance.meeting_id == hid @@ -333,7 +327,7 @@ def alter_house_excuse(uid, hid, user_dict=None): hm_excuse = post_data['excuse'] if not uid.isdigit(): - log.info('Mark {} as {} for HM ID: {}'.format(uid, hm_status, hid)) + log.info(f'Mark {uid} as {hm_status} for HM ID: {hid}') MemberHouseMeetingAttendance.query.filter( MemberHouseMeetingAttendance.uid == uid, MemberHouseMeetingAttendance.meeting_id == hid @@ -342,7 +336,7 @@ def alter_house_excuse(uid, hid, user_dict=None): 'attendance_status': hm_status }) else: - log.info('Mark {} as {} for HM ID: {}'.format(uid, hm_status, hid)) + log.info(f'Mark {uid} as {hm_status} for HM ID: {hid}') FreshmanHouseMeetingAttendance.query.filter( FreshmanHouseMeetingAttendance.fid == uid, FreshmanHouseMeetingAttendance.meeting_id == hid diff --git a/conditional/blueprints/co_op.py b/conditional/blueprints/co_op.py index 62f51a6b..9f72c203 100644 --- a/conditional/blueprints/co_op.py +++ b/conditional/blueprints/co_op.py @@ -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('Delete {}\'s Co-Op'.format(uid)) + log.info(f'Delete {uid}\'s Co-Op') # Remove from corresponding co-op ldap group if ldap_is_member_of_group(user_dict['account'], 'fall_coop'): diff --git a/conditional/blueprints/conditional.py b/conditional/blueprints/conditional.py index e061cd44..9de9bd0d 100644 --- a/conditional/blueprints/conditional.py +++ b/conditional/blueprints/conditional.py @@ -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('Create a new conditional for {}'.format(uid)) + log.info(f'Create a new conditional for {uid}') if post_data['evaluation'] == 'spring': current_eval = SpringEval.query.filter(SpringEval.status == "Pending", SpringEval.uid == uid, @@ -88,7 +88,7 @@ def conditional_review(user_dict=None): cid = post_data['id'] status = post_data['status'] - log.info('Updated conditional-{} to {}'.format(cid, status)) + log.info(f'Updated conditional-{cid} to {status}') conditional = Conditional.query.filter(Conditional.id == cid) cond_obj = conditional.first() diff --git a/conditional/blueprints/housing.py b/conditional/blueprints/housing.py index 47c33806..45e29f90 100644 --- a/conditional/blueprints/housing.py +++ b/conditional/blueprints/housing.py @@ -75,11 +75,11 @@ def change_queue_state(user_dict=None): if uid: if post_data.get('inQueue', False): - log.info('Add {} to Housing Queue'.format(uid)) + log.info(f'Add {uid} to Housing Queue') queue_obj = InHousingQueue(uid=uid) db.session.add(queue_obj) else: - log.info('Remove {} from Housing Queue'.format(uid)) + log.info(f'Remove {uid} from Housing Queue') InHousingQueue.query.filter_by(uid=uid).delete() db.session.flush() @@ -107,14 +107,14 @@ def change_room_numbers(rmnumber, user_dict=None): if occupant != "": account = ldap_get_member(occupant) account.roomNumber = rmnumber - log.info('{} assigned to room {}'.format(occupant, rmnumber)) + log.info(f'{occupant} assigned to room {rmnumber}') ldap_set_active(account) - log.info('{} marked as active because of room assignment'.format(occupant)) + log.info(f'{occupant} marked as active because of room assignment') # 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('{} removed from room {}'.format(old_occupant.uid, old_occupant.roomNumber)) + log.info(f'{old_occupant.uid} removed from room {old_occupant.roomNumber}') old_occupant.roomNumber = None return jsonify({"success": True}), 200 @@ -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('{} removed from room {}'.format(occupant.uid, occupant.roomNumber)) + log.info(f'{occupant.uid} removed from room {occupant.roomNumber}') occupant.roomNumber = None return jsonify({"success": True}), 200 diff --git a/conditional/blueprints/major_project_submission.py b/conditional/blueprints/major_project_submission.py index b574243d..fd7251a6 100644 --- a/conditional/blueprints/major_project_submission.py +++ b/conditional/blueprints/major_project_submission.py @@ -148,7 +148,7 @@ def major_project_review(user_dict=None): pid = post_data['id'] status = post_data['status'] - log.info('{} Major Project ID: {}'.format(status, pid)) + log.info(f'{status} Major Project ID: {pid}') print(post_data) MajorProject.query.filter( @@ -167,7 +167,7 @@ def major_project_review(user_dict=None): @get_user def major_project_delete(pid, user_dict=None): log = logger.new(request=request, auth_dict=user_dict) - log.info('Delete Major Project ID: {}'.format(pid)) + log.info(f'Delete Major Project ID: {pid}') major_project = MajorProject.query.filter( MajorProject.id == pid diff --git a/conditional/blueprints/member_management.py b/conditional/blueprints/member_management.py index f4a476c9..dc3ff7c2 100644 --- a/conditional/blueprints/member_management.py +++ b/conditional/blueprints/member_management.py @@ -111,14 +111,14 @@ def member_management_eval(user_dict=None): post_data = request.get_json() if 'siteLockdown' in post_data: - log.info('Changed Site Lockdown: {}'.format(post_data['siteLockdown'])) + log.info(f'Changed Site Lockdown: {post_data['siteLockdown']}') EvalSettings.query.update( { 'site_lockdown': post_data['siteLockdown'] }) if 'introForm' in post_data: - log.info('Changed Intro Form: {}'.format(post_data['introForm'])) + log.info(f'Changed Intro Form: {post_data['introForm']}') EvalSettings.query.update( { 'intro_form_active': post_data['introForm'] @@ -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('Changed Dues Accepted Until: {}'.format(date)) + log.info(f'Changed Dues Accepted Until: {date}') EvalSettings.query.update( { 'accept_dues_until': date @@ -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('Create Freshman Account for {}'.format(name)) + log.info(f'Create Freshman Account for {name}') # empty room numbers should be NULL if room_number == "": @@ -210,7 +210,7 @@ def member_management_uploaduser(user_dict=None): else: rit_username = None - log.info('Create Freshman Account for {} via CSV Upload'.format(name)) + log.info(f'Create Freshman Account for {name} via CSV Upload') db.session.add(FreshmanAccount(name, onfloor_status, room_number, None, rit_username)) db.session.flush() @@ -248,11 +248,7 @@ def edit_uid(uid, flask_request, username): room_number = post_data['roomNumber'] onfloor_status = post_data['onfloorStatus'] housing_points = post_data['housingPoints'] - log.info('Edit {} - Room: {} On-Floor: {} Points: {}'.format( - uid, - post_data['roomNumber'], - post_data['onfloorStatus'], - post_data['housingPoints'])) + log.info(f'Edit {uid} - Room: {post_data['roomNumber']} On-Floor: {post_data['onfloorStatus']} Points: {post_data['housingPoints']}') ldap_set_roomnumber(account, room_number) if onfloor_status: @@ -271,7 +267,7 @@ def edit_uid(uid, flask_request, username): ldap_set_housingpoints(account, housing_points) # Only update if there's a diff - log.info('Set {} Active: {}'.format(uid, active_member)) + log.info(f'Set {uid} Active: {active_member}') if ldap_is_active(account) != active_member: if active_member: ldap_set_active(account) @@ -293,12 +289,7 @@ 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('Edit freshman-{} - Room: {} On-Floor: {} Eval: {} SigMiss: {}'.format( - uid, - post_data['roomNumber'], - post_data['onfloorStatus'], - post_data['evalDate'], - post_data['sigMissed'])) + log.info(f'Edit freshman-{uid} - Room: {post_data['roomNumber']} On-Floor: {post_data['onfloorStatus']} Eval: {post_data['evalDate']} SigMiss: {post_data['sigMissed']}') name = post_data['name'] @@ -329,7 +320,7 @@ def edit_fid(uid, flask_request): @get_user def member_management_getuserinfo(uid, user_dict=None): log = logger.new(request=request, auth_dict=user_dict) - log.info('Get {}\'s Information'.format(uid)) + log.info(f'Get {uid}\'s Information') 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 @@ -414,7 +405,7 @@ def get_hm_date(hm_id): @get_user def member_management_deleteuser(fid, user_dict=None): log = logger.new(request=request, auth_dict=user_dict) - log.info('Delete freshman-{}'.format(fid)) + log.info(f'Delete freshman-{fid}') if not ldap_is_eval_director(user_dict['account']): return "must be eval director", 403 @@ -458,7 +449,7 @@ def member_management_upgrade_user(user_dict=None): uid = post_data['uid'] signatures_missed = post_data['sigsMissed'] - log.info('Upgrade freshman-{} to Account: {}'.format(fid, uid)) + log.info(f'Upgrade freshman-{fid} to Account: {uid}') acct = FreshmanAccount.query.filter( FreshmanAccount.id == fid).first() @@ -483,10 +474,7 @@ def member_management_upgrade_user(user_dict=None): db.session.add(MemberHouseMeetingAttendance( uid, fhm.meeting_id, fhm.excuse, fhm.attendance_status)) else: - log.info('Duplicate house meeting attendance! fid: {}, uid: {}, id: {}'.format( - fid, - uid, - fhm.meeting_id)) + log.info(f'Duplicate house meeting attendance! fid: {fid}, uid: {uid}, id: {fhm.meeting_id}') db.session.delete(fhm) new_account = ldap_get_member(uid) @@ -519,7 +507,7 @@ 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("Make user {} active".format(user_dict['username'])) + log.info(f"Make user {user_dict['username']} active") clear_members_cache() return jsonify({"success": True}), 200 @@ -530,7 +518,7 @@ def member_management_make_user_active(user_dict=None): @get_user def get_member(uid, user_dict=None): log = logger.new(request=request, auth_dict=user_dict) - log.info('Get {}\'s Information'.format(uid)) + log.info(f'Get {uid}\'s Information') if not ldap_is_eval_director(user_dict['account']): return "must be eval director", 403 @@ -559,7 +547,7 @@ def clear_active_members(user_dict=None): # Clear the active group. for account in members: if account.uid != user_dict['username']: - log.info('Remove {} from Active Status'.format(account.uid)) + log.info(f'Remove {account.uid} from Active Status') ldap_set_inactive(account) return jsonify({"success": True}), 200 @@ -602,10 +590,10 @@ def remove_current_student(uid, user_dict=None): member = ldap_get_member(uid) if request.method == 'DELETE': - log.info('Remove {} from Current Student'.format(uid)) + log.info(f'Remove {uid} from Current Student') ldap_set_non_current_student(member) elif request.method == 'POST': - log.info('Add {} to Current Students'.format(uid)) + log.info(f'Add {uid} to Current Students') ldap_set_current_student(member) return jsonify({"success": True}), 200 diff --git a/conditional/blueprints/slideshow.py b/conditional/blueprints/slideshow.py index 6696b18a..1ea953d3 100644 --- a/conditional/blueprints/slideshow.py +++ b/conditional/blueprints/slideshow.py @@ -61,7 +61,7 @@ def slideshow_intro_review(user_dict=None): uid = post_data['uid'] status = post_data['status'] - log.info('Intro Eval for {}: {}'.format(uid, status)) + log.info(f'Intro Eval for {uid}: {status}') FreshmanEvalData.query.filter( FreshmanEvalData.uid == uid and FreshmanEvalData.active). \ @@ -117,7 +117,7 @@ def slideshow_spring_review(user_dict=None): uid = post_data['uid'] status = post_data['status'] - log.info('Spring Eval for {}: {}'.format(uid, status)) + log.info(f'Spring Eval for {uid}: {status}') SpringEval.query.filter( SpringEval.uid == uid and From ef3870a9b6320c5b00b3481dd358b2cbc710b5cb Mon Sep 17 00:00:00 2001 From: Ella Soccoli Date: Sat, 29 Mar 2025 18:14:50 -0400 Subject: [PATCH 5/8] More fstr fixes --- conditional/__init__.py | 2 +- conditional/blueprints/attendance.py | 8 ++++---- conditional/blueprints/co_op.py | 2 +- conditional/blueprints/conditional.py | 2 +- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/conditional/__init__.py b/conditional/__init__.py index 0ee5a3d4..1c2f5ee9 100644 --- a/conditional/__init__.py +++ b/conditional/__init__.py @@ -164,7 +164,7 @@ def health(): @auth.oidc_auth("default") @get_user def route_errors(error, user_dict=None): - data = dict() + data = {} # 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 ae41b8d6..341ee2f8 100644 --- a/conditional/blueprints/attendance.py +++ b/conditional/blueprints/attendance.py @@ -520,7 +520,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('Delete Technical Seminar {}'.format(sid)) + log.info(f'Delete Technical Seminar {sid}') if not ldap_is_eboard(user_dict['account']): return jsonify({"success": False, "error": "Not EBoard"}), 403 @@ -557,7 +557,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('Delete Committee Meeting {}'.format(cid)) + log.info(f'Delete Committee Meeting {cid}') if not ldap_is_eboard(user_dict['account']): return jsonify({"success": False, "error": "Not EBoard"}), 403 @@ -580,7 +580,7 @@ def get_ts_attendees(cid, user_dict=None): @get_user def approve_cm(cid, user_dict=None): log = logger.new(request=request, auth_dict=user_dict) - log.info('Approve Committee Meeting {} Attendance'.format(cid)) + log.info(f'Approve Committee Meeting {cid} Attendance') if not ldap_is_eboard(user_dict['account']): return jsonify({"success": False, "error": "Not EBoard"}), 403 @@ -598,7 +598,7 @@ def approve_cm(cid, user_dict=None): @get_user def approve_ts(sid, user_dict=None): log = logger.new(request=request, auth_dict=user_dict) - log.info('Approve Technical Seminar {} Attendance'.format(sid)) + log.info(f'Approve Technical Seminar {sid} Attendance') if not ldap_is_eboard(user_dict['account']): return jsonify({"success": False, "error": "Not EBoard"}), 403 diff --git a/conditional/blueprints/co_op.py b/conditional/blueprints/co_op.py index 9f72c203..94bf107a 100644 --- a/conditional/blueprints/co_op.py +++ b/conditional/blueprints/co_op.py @@ -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('Submit {} Co-Op'.format(semester)) + log.info(f'Submit {semester} Co-Op') if CurrentCoops.query.filter(CurrentCoops.uid == user_dict['username'], CurrentCoops.date_created > start_of_year()).first(): diff --git a/conditional/blueprints/conditional.py b/conditional/blueprints/conditional.py index 9de9bd0d..1082ca4f 100644 --- a/conditional/blueprints/conditional.py +++ b/conditional/blueprints/conditional.py @@ -117,7 +117,7 @@ def conditional_review(user_dict=None): @get_user def conditional_delete(cid, user_dict=None): log = logger.new(request=request, auth_dict=user_dict) - log.info('Delete conditional-{}'.format(cid)) + log.info(f'Delete conditional-{cid}') if ldap_is_eval_director(user_dict['account']): Conditional.query.filter( From 9056f405be5e069410eea7625be474a7aeb5ff7c Mon Sep 17 00:00:00 2001 From: Ella Soccoli Date: Sat, 29 Mar 2025 18:30:28 -0400 Subject: [PATCH 6/8] Fixed more lint errors. There are some lint errors hat i just cant fix, like line length in some log statements, and too many args --- conditional/blueprints/attendance.py | 4 ++-- conditional/blueprints/dashboard.py | 4 ++-- conditional/blueprints/major_project_submission.py | 3 +-- conditional/blueprints/member_management.py | 2 +- conditional/util/context_processors.py | 10 ++++++---- 5 files changed, 12 insertions(+), 11 deletions(-) diff --git a/conditional/blueprints/attendance.py b/conditional/blueprints/attendance.py index 341ee2f8..22475703 100644 --- a/conditional/blueprints/attendance.py +++ b/conditional/blueprints/attendance.py @@ -425,9 +425,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, diff --git a/conditional/blueprints/dashboard.py b/conditional/blueprints/dashboard.py index b90142e0..527e8dd8 100644 --- a/conditional/blueprints/dashboard.py +++ b/conditional/blueprints/dashboard.py @@ -38,7 +38,7 @@ def display_dashboard(user_dict=None): # Get the list of voting members. can_vote = get_voting_members() - data = dict() + data = {} 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 = dict() + housing = {} 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/major_project_submission.py b/conditional/blueprints/major_project_submission.py index fd7251a6..6fb9649f 100644 --- a/conditional/blueprints/major_project_submission.py +++ b/conditional/blueprints/major_project_submission.py @@ -3,7 +3,6 @@ import requests import boto3 -from botocore.exceptions import ClientError from flask import Blueprint from flask import request @@ -185,4 +184,4 @@ def major_project_delete(pid, user_dict=None): return "Must be project owner to delete!", 401 def send_slack_ping(payload): - requests.post(app.config['WEBHOOK_URL'], json.dumps(payload)) + requests.post(app.config['WEBHOOK_URL'], json.dumps(payload), timeout=120) diff --git a/conditional/blueprints/member_management.py b/conditional/blueprints/member_management.py index dc3ff7c2..467f265d 100644 --- a/conditional/blueprints/member_management.py +++ b/conditional/blueprints/member_management.py @@ -413,7 +413,7 @@ def member_management_deleteuser(fid, user_dict=None): if not fid.isdigit(): return "can only delete freshman accounts", 400 - log.info('backend', action="delete freshman account %s" % fid) + log.info('backend', action=f"delete freshman account {fid}") for fca in FreshmanCommitteeAttendance.query.filter(FreshmanCommitteeAttendance.fid == fid): db.session.delete(fca) diff --git a/conditional/util/context_processors.py b/conditional/util/context_processors.py index feecb107..766e4d82 100644 --- a/conditional/util/context_processors.py +++ b/conditional/util/context_processors.py @@ -33,7 +33,9 @@ def check_current_student(username): @app.context_processor def utility_processor(): - 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 - ) + 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 + } From 6f3ece816aea60275a34007b810e56b86e5cddac Mon Sep 17 00:00:00 2001 From: Ella Soccoli Date: Mon, 31 Mar 2025 13:27:58 -0400 Subject: [PATCH 7/8] Fixed more linter issues Part of doing this was that I removed 'bad-continuation' from the disable list in the .pylintrc bc the linting action said that option has been removed from pylint. I left it commented out for now to make sure the lint passes, but I can delete it entirely before this pr is merged assuming this fix passes the check --- .pylintrc | 2 +- conditional/blueprints/member_management.py | 8 +++++--- conditional/models/models.py | 11 +++++------ 3 files changed, 11 insertions(+), 10 deletions(-) diff --git a/.pylintrc b/.pylintrc index 407369b7..6bf0b78f 100644 --- a/.pylintrc +++ b/.pylintrc @@ -9,12 +9,12 @@ disable = duplicate-code, no-member, parse-error, - bad-continuation, too-few-public-methods, global-statement, cyclic-import, locally-disabled, file-ignored + # bad-continuation, [REPORTS] output-format = text diff --git a/conditional/blueprints/member_management.py b/conditional/blueprints/member_management.py index 467f265d..1927e440 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 +from distutils.util import strtobool # pylint: disable=no-name-in-module,import-error,deprecated-module import structlog from flask import Blueprint, request, jsonify, make_response @@ -248,7 +248,7 @@ 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']}') + log.info(f'Edit {uid} - Room: {post_data['roomNumber']} On-Floor: {post_data['onfloorStatus']} Points: {post_data['housingPoints']}') #pylint: disable=line-too-long ldap_set_roomnumber(account, room_number) if onfloor_status: @@ -289,7 +289,9 @@ 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']}') + + 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 + name = post_data['name'] diff --git a/conditional/models/models.py b/conditional/models/models.py index fec3036a..423795ea 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): + def __init__(self, name, onfloor, room=None, missed=None, rit_username=None): # pylint: disable=too-many-positional-arguments self.name = name today = date.fromtimestamp(time.time()) self.eval_date = today + timedelta(weeks=6) @@ -32,8 +32,7 @@ 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) @@ -143,7 +142,7 @@ class MajorProject(db.Model): name="major_project_enum"), nullable=False) - def __init__(self, uid, name, tldr, time, desc): + def __init__(self, uid, name, tldr, time, desc): # pylint: disable=too-many-positional-arguments,redefined-outer-name self.uid = uid self.date = datetime.now() self.name = name @@ -233,7 +232,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): + def __init__(self, uid, description, due, s_eval=None, i_eval=None): # pylint: disable=too-many-positional-arguments self.uid = uid self.description = description self.date_due = due @@ -293,7 +292,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): + def __init__(self, ipaddr, user, method, blueprint, path, description): # pylint: disable=too-many-positional-arguments self.ipaddr = ipaddr self.timestamp = datetime.now() self.uid = user From d7542879653bfd3159c45efcefce53c472f42d90 Mon Sep 17 00:00:00 2001 From: Ella Soccoli Date: Mon, 31 Mar 2025 19:11:36 -0400 Subject: [PATCH 8/8] Removed commented line --- .pylintrc | 1 - 1 file changed, 1 deletion(-) diff --git a/.pylintrc b/.pylintrc index 6bf0b78f..22e31bcb 100644 --- a/.pylintrc +++ b/.pylintrc @@ -14,7 +14,6 @@ disable = cyclic-import, locally-disabled, file-ignored - # bad-continuation, [REPORTS] output-format = text