diff --git a/conditional/blueprints/attendance.py b/conditional/blueprints/attendance.py index 16c0f081..6ebb4d6c 100644 --- a/conditional/blueprints/attendance.py +++ b/conditional/blueprints/attendance.py @@ -3,7 +3,7 @@ import structlog from flask import Blueprint, jsonify, redirect, request -from conditional import db, start_of_year, auth +from conditional import db, start_of_year, auth, ldap from conditional.models.models import CommitteeMeeting from conditional.models.models import CurrentCoops from conditional.models.models import FreshmanAccount @@ -19,8 +19,6 @@ from conditional.models.models import TechnicalSeminar from conditional.util.auth import get_user from conditional.util.flask import render_template -from conditional.util.ldap import ldap_get_active_members -from conditional.util.ldap import ldap_get_current_students from conditional.util.ldap import ldap_get_member from conditional.util.ldap import ldap_is_eboard from conditional.util.user_dict import user_dict_is_eboard, user_dict_is_eval_director @@ -37,7 +35,8 @@ def get_all_members(user_dict=None): log = logger.new(request=request, auth_dict=user_dict) log.info('Retrieve Technical Seminar Attendance List') - members = ldap_get_current_students() + members = ldap.get_group_member_attributes(groups=['current_student'], + excluded_groups=[], attributes=['uid', 'displayName']) named_members = [ { @@ -50,8 +49,8 @@ def get_all_members(user_dict=None): for account in members: named_members.append( { - 'display': account.displayName, - 'value': account.uid, + 'display': account['displayName'], + 'value': account['uid'], 'freshman': False }) @@ -66,7 +65,8 @@ def get_non_alumni_non_coop(internal=False, user_dict=None): log.info('Retrieve House Meeting Attendance List') # Get all active members as a base house meeting attendance. - active_members = ldap_get_active_members() + active_members = ldap.get_group_member_attributes(groups=['active'], + excluded_groups=[], attributes=['uid', 'displayName']) if datetime.today() < datetime(start_of_year().year, 12, 31): semester = 'Fall' @@ -86,14 +86,14 @@ def get_non_alumni_non_coop(internal=False, user_dict=None): FreshmanAccount.eval_date > datetime.now())] for account in active_members: - if account.uid in coop_members: + if account['uid'] in coop_members: # Members who are on co-op don't need to go to house meeting. continue eligible_members.append( { - 'display': account.displayName, - 'value': account.uid, + 'display': account['displayName'], + 'value': account['uid'], 'freshman': False }) @@ -110,7 +110,8 @@ def get_non_alumni(user_dict=None): log = logger.new(request=request, auth_dict=user_dict) log.info('Retrieve Committee Meeting Attendance List') - current_students = ldap_get_current_students() + current_students = ldap.get_group_member_attributes(groups=['current_student'], + excluded_groups=[], attributes=['uid', 'displayName']) eligible_members = [ { @@ -123,8 +124,8 @@ def get_non_alumni(user_dict=None): for account in current_students: eligible_members.append( { - 'display': account.displayName, - 'value': account.uid, + 'display': account['displayName'], + 'value': account['uid'], 'freshman': False }) diff --git a/conditional/blueprints/dashboard.py b/conditional/blueprints/dashboard.py index 0bd5f951..67b2db7b 100644 --- a/conditional/blueprints/dashboard.py +++ b/conditional/blueprints/dashboard.py @@ -12,8 +12,9 @@ from conditional.util.auth import get_user from conditional.util.flask import render_template from conditional.util.housing import get_queue_position +from conditional.util.ldap import ldap_get_active_member_uids from conditional.util.major_project import get_project_list -from conditional.util.member import gatekeep_values, get_active_members, get_freshman_data, get_voting_members, \ +from conditional.util.member import gatekeep_values, get_freshman_data, get_voting_members, \ get_cm, get_hm, is_gatekeep_active, req_cm from conditional.util.user_dict import user_dict_is_active, user_dict_is_bad_standing, user_dict_is_intromember, \ user_dict_is_onfloor @@ -49,7 +50,7 @@ def display_dashboard(user_dict=None): data['voting'] = bool(uid in can_vote) data['voting_count'] = {"Voting Members": len(can_vote), - "Active Members": len(get_active_members())} + "Active Members": len(ldap_get_active_member_uids())} # freshman shit if user_dict_is_intromember(user_dict): data['freshman'] = get_freshman_data(uid) diff --git a/conditional/blueprints/gatekeep.py b/conditional/blueprints/gatekeep.py index 1eba8668..4b799588 100644 --- a/conditional/blueprints/gatekeep.py +++ b/conditional/blueprints/gatekeep.py @@ -2,13 +2,12 @@ from flask import Blueprint, request from sqlalchemy import func -from conditional import start_of_year, auth +from conditional import start_of_year, auth, ldap from conditional.models.models import CommitteeMeeting, HouseMeeting, MemberCommitteeAttendance, \ MemberSeminarAttendance, MemberSeminarHost, TechnicalSeminar from conditional.models.models import MemberHouseMeetingAttendance from conditional.util.auth import get_user from conditional.util.flask import render_template -from conditional.util.ldap import ldap_get_active_members from conditional.util.member import get_semester_info, is_gatekeep_active gatekeep_bp = Blueprint('gatekeep_bp', __name__) @@ -89,9 +88,9 @@ def display_spring_evals(internal=False, user_dict=None): ).all()} gk_members = [] - for account in ldap_get_active_members(): - uid = account.uid - name = account.cn + for account in ldap.get_group_member_attributes(groups=['active'], excluded_groups=[], attributes=['uid', 'cn']): + uid = account['uid'] + name = account['cn'] member_missed_hms = [] diff --git a/conditional/blueprints/housing.py b/conditional/blueprints/housing.py index 45b25476..0cbc9cdd 100644 --- a/conditional/blueprints/housing.py +++ b/conditional/blueprints/housing.py @@ -1,7 +1,7 @@ import structlog from flask import Blueprint, request, jsonify -from conditional import db, auth +from conditional import db, auth, ldap from conditional.models.models import FreshmanAccount from conditional.models.models import InHousingQueue from conditional.util.auth import get_user @@ -9,7 +9,6 @@ from conditional.util.housing import get_housing_queue from conditional.util.ldap import ldap_get_current_students from conditional.util.ldap import ldap_get_member -from conditional.util.ldap import ldap_get_onfloor_members from conditional.util.ldap import ldap_get_roomnumber from conditional.util.ldap import ldap_is_eval_director from conditional.util.ldap import ldap_set_active @@ -28,7 +27,8 @@ def display_housing(user_dict=None): log.info('Display Housing Board') housing = {} - onfloors = ldap_get_onfloor_members() + onfloors = ldap.get_group_member_attributes(groups=['onfloor', 'current_student'], + excluded_groups=[], attributes=['cn', 'roomNumber']) onfloor_freshmen = FreshmanAccount.query.filter( FreshmanAccount.room_number is not None ) @@ -36,12 +36,15 @@ def display_housing(user_dict=None): room_list = set() for member in onfloors: - room = ldap_get_roomnumber(member) + if 'roomNumber' not in member: + continue + + room = member['roomNumber'] if room in housing and room is not None: - housing[room].append(member.cn) + housing[room].append(member['cn']) room_list.add(room) elif room is not None: - housing[room] = [member.cn] + housing[room] = [member['cn']] room_list.add(room) for f in onfloor_freshmen: diff --git a/conditional/blueprints/intro_evals.py b/conditional/blueprints/intro_evals.py index 3787fefb..a41b23e6 100644 --- a/conditional/blueprints/intro_evals.py +++ b/conditional/blueprints/intro_evals.py @@ -2,7 +2,7 @@ from flask import Blueprint, request from sqlalchemy import func -from conditional import start_of_year, auth +from conditional import start_of_year, auth, ldap from conditional.models.models import CommitteeMeeting from conditional.models.models import FreshmanAccount from conditional.models.models import FreshmanCommitteeAttendance @@ -18,7 +18,6 @@ from conditional.models.models import TechnicalSeminar from conditional.util.auth import get_user from conditional.util.flask import render_template -from conditional.util.ldap import ldap_get_intro_members from conditional.util.member import get_semester_info intro_evals_bp = Blueprint('intro_evals_bp', __name__) @@ -157,7 +156,7 @@ def display_intro_evals(internal=False, user_dict=None): log = logger.new(request=request, auth_dict=user_dict) log.info('Display Intro Evals Listing') - members = ldap_get_intro_members() + members = ldap.get_group_member_attributes(groups=['intromembers'], excluded_groups=[], attributes=['uid', 'cn']) ie_members = get_intro_members_without_accounts() @@ -240,8 +239,8 @@ def display_intro_evals(internal=False, user_dict=None): # freshmen who have accounts for member in members: - uid = member.uid - name = member.cn + uid = member['uid'] + name = member['cn'] freshman_data = FreshmanEvalData.query.filter( FreshmanEvalData.eval_date >= semester_start, FreshmanEvalData.uid == uid).first() diff --git a/conditional/blueprints/member_management.py b/conditional/blueprints/member_management.py index e3714e90..7af8d02b 100644 --- a/conditional/blueprints/member_management.py +++ b/conditional/blueprints/member_management.py @@ -6,7 +6,7 @@ import structlog from flask import Blueprint, request, jsonify, make_response -from conditional import app, get_user, auth, db, start_of_year +from conditional import app, get_user, auth, db, start_of_year, ldap from conditional.models.models import FreshmanAccount from conditional.models.models import FreshmanEvalData @@ -26,7 +26,7 @@ from conditional.blueprints.cache_management import clear_members_cache -from conditional.util.ldap import ldap_is_eval_director +from conditional.util.ldap import ldap_get_active_member_uids, ldap_get_onfloor_member_uids, ldap_is_eval_director from conditional.util.ldap import ldap_is_active from conditional.util.ldap import ldap_is_onfloor from conditional.util.ldap import ldap_set_roomnumber @@ -42,8 +42,6 @@ from conditional.util.ldap import _ldap_add_member_to_group as ldap_add_member_to_group from conditional.util.ldap import _ldap_remove_member_from_group as ldap_remove_member_from_group -from conditional.util.member import get_members_info_active_and_onfloor - from conditional.util.flask import render_template from conditional.models.models import attendance_enum from conditional.util.user_dict import user_dict_is_active, user_dict_is_bad_standing, user_dict_is_current_student, \ @@ -64,7 +62,20 @@ def display_member_management(user_dict=None): if not user_dict_is_eval_director(user_dict) and not user_dict_is_financial_director(user_dict): return "must be eval director", 403 - member_list, active_members, onfloor_members = get_members_info_active_and_onfloor() + active_members = set(ldap_get_active_member_uids()) + onfloor_members = set(ldap_get_onfloor_member_uids()) + + member_list = ldap.get_group_member_attributes(groups=["current_student"], + excluded_groups=[], attributes=['uid', 'housingPoints', 'roomNumber', 'cn']) + + for member in member_list: + member['name'] = member['cn'] + member['active'] = member['uid'] in active_members + member['onfloor'] = member['uid'] in onfloor_members + + if 'roomNumber' in member: + member['room'] = member['roomNumber'] + freshmen = FreshmanAccount.query freshmen_list = [] diff --git a/conditional/blueprints/spring_evals.py b/conditional/blueprints/spring_evals.py index 80c91943..40756240 100644 --- a/conditional/blueprints/spring_evals.py +++ b/conditional/blueprints/spring_evals.py @@ -2,12 +2,11 @@ from flask import Blueprint, request from sqlalchemy import func -from conditional import db, start_of_year, auth +from conditional import db, start_of_year, auth, ldap from conditional.models.models import CommitteeMeeting, CurrentCoops, HouseMeeting, MemberCommitteeAttendance from conditional.models.models import MajorProject, MemberHouseMeetingAttendance, SpringEval from conditional.util.auth import get_user from conditional.util.flask import render_template -from conditional.util.ldap import ldap_get_active_members from conditional.util.member import req_cm spring_evals_bp = Blueprint('spring_evals_bp', __name__) @@ -22,7 +21,7 @@ def display_spring_evals(internal=False, user_dict=None): log = logger.new(request=request, auth_dict=user_dict) log.info('Display Membership Evaluations Listing') - active_members = ldap_get_active_members() + active_members = ldap.get_group_member_attributes(groups=['active'], excluded_groups=[], attributes=['uid', 'cn']) cm_count = dict([tuple(row) for row in MemberCommitteeAttendance.query.join( CommitteeMeeting, @@ -78,8 +77,8 @@ def display_spring_evals(internal=False, user_dict=None): sp_members = [] for account in active_members: - uid = account.uid - name = account.cn + uid = account['uid'] + name = account['cn'] spring_entry = SpringEval.query.filter( SpringEval.date_created >= start_of_year(), diff --git a/conditional/templates/housing.html b/conditional/templates/housing.html index 4fbcb9bb..8992b71e 100644 --- a/conditional/templates/housing.html +++ b/conditional/templates/housing.html @@ -31,8 +31,8 @@

Housing Queue {% for m in queue %} - {{m['name']}} - {{m['points']}} + {{m['cn']}} + {{m['housingPoints']}} {% if is_eval_director %} {% endif %} diff --git a/conditional/templates/intro_evals.html b/conditional/templates/intro_evals.html index fb1a9c68..a871e65d 100644 --- a/conditional/templates/intro_evals.html +++ b/conditional/templates/intro_evals.html @@ -88,28 +88,28 @@
{{ m['uid'] }}
- {% if m['technical_seminars_hosted'] < 1 or m['technical_seminars'] < 2 %} + {% if m['technical_seminars_hosted']|length < 1 or m['technical_seminars']|length < 2 %}
Technical Seminars - Hosted - {{m['technical_seminars_hosted']}} / 1 + {{m['technical_seminars_hosted']|length}} / 1
{% else %}
Technical Seminars - Hosted - {{m['technical_seminars_hosted']}} / 1 + {{m['technical_seminars_hosted']|length}} / 1
{% endif %}
- {% if m['technical_seminars'] < 2 or m['technical_seminars_hosted'] < 1 %} + {% if m['technical_seminars']|length < 2 or m['technical_seminars_hosted']|length < 1 %}
Technical Seminars - Attended - {{m['technical_seminars_attended']}} / 2 + {{m['technical_seminars_attended']|length}} / 2
{% else %}
Technical Seminars - Attended - {{m['technical_seminars']}} / 2 + {{m['technical_seminars']|length}} / 2
{% endif %}
diff --git a/conditional/templates/member_management.html b/conditional/templates/member_management.html index 84b1b25e..1eda1e6c 100644 --- a/conditional/templates/member_management.html +++ b/conditional/templates/member_management.html @@ -168,7 +168,7 @@

{% if m['onfloor'] %} ✓ {% endif %} {% if m['room'] %}{{m['room']}}{% endif %} - {{m['hp']}} + {{m['housingPoints']}} {% endfor %} diff --git a/conditional/util/housing.py b/conditional/util/housing.py index 96ea5f44..cf2d727e 100644 --- a/conditional/util/housing.py +++ b/conditional/util/housing.py @@ -1,9 +1,9 @@ from datetime import datetime +from conditional import ldap + from conditional.models.models import InHousingQueue from conditional.models.models import OnFloorStatusAssigned -from conditional.util.ldap import ldap_get_current_students, ldap_get_member, ldap_is_current_student - def get_housing_queue(is_eval_director=False): @@ -23,33 +23,22 @@ def get_housing_queue(is_eval_director=False): ).all() } - # CSHMember accounts that are in queue - potential_accounts = [] - - if is_eval_director: - potential_accounts = ldap_get_current_students() - else: - potential_accounts = [ldap_get_member(username) for username in in_queue] - - potential_accounts = [user for user in potential_accounts if ldap_is_current_student(user)] - - # Populate a list of dictionaries containing the name, username, - # and on-floor datetime for each current studetn who has on-floor status - # and is not already assigned to a room - queue = [ - { - "uid": account.uid, - "name": account.cn, - "points": account.housingPoints, - "time": in_queue.get(account.uid, {}).get('time', datetime.now()) or datetime.now(), - "in_queue": account.uid in in_queue - } for account in potential_accounts - if is_eval_director or account.roomNumber is None - ] + queue = ldap.get_group_member_attributes(groups=['current_student'], + excluded_groups=[], attributes=['uid', 'housingPoints', 'cn']) + + # if the user is not evals, they should only see people in the cue without a room number + if not is_eval_director: + queue = list(filter(lambda member: member['uid'] in in_queue and member['roomNumber'] is not None, queue)) + + + # set the time they were added to the queue + # i'm sorry this is cursed, it's this way because of database structure or something + for member in queue: + member['time'] = in_queue.get(member['uid'], {}).get('time', datetime.now()) or datetime.now() # Sort based on time (ascending) and then points (decending). queue.sort(key=lambda m: m['time']) - queue.sort(key=lambda m: m['points'], reverse=True) + queue.sort(key=lambda m: m['housingPoints'], reverse=True) return queue diff --git a/conditional/util/ldap.py b/conditional/util/ldap.py index e6b19135..d5e0a6f3 100644 --- a/conditional/util/ldap.py +++ b/conditional/util/ldap.py @@ -6,6 +6,8 @@ def _ldap_get_group_members(group: str) -> list[CSHMember]: return ldap.get_group(group).get_members() +def _ldap_get_group_member_uids(group: str) -> list[str]: + return ldap.get_group(group).get_member_uids() def _ldap_is_member_of_group(member: CSHMember, group: str) -> bool: return ldap.get_group(group).check_member(member) @@ -20,7 +22,6 @@ def _ldap_remove_member_from_group(account: CSHMember, group: str): if _ldap_is_member_of_group(account, group): ldap.get_group(group).del_member(account, dn=False) - @service_cache(maxsize=256) def _ldap_is_member_of_directorship(member: CSHMember, directorship: str): return _ldap_is_member_of_group(member, f'eboard-{directorship}') @@ -33,21 +34,33 @@ def ldap_get_member(username: str) -> CSHMember: def ldap_get_active_members() -> list[CSHMember]: return _ldap_get_group_members("active") +@service_cache(maxsize=1024) +def ldap_get_active_member_uids() -> list[str]: + return _ldap_get_group_member_uids("active") @service_cache(maxsize=1024) def ldap_get_intro_members() -> list[CSHMember]: return _ldap_get_group_members("intromembers") +@service_cache(maxsize=1024) +def ldap_get_intro_member_uids() -> list[str]: + return _ldap_get_group_member_uids("intromembers") @service_cache(maxsize=1024) def ldap_get_onfloor_members() -> list[CSHMember]: return _ldap_get_group_members("onfloor") +@service_cache(maxsize=1024) +def ldap_get_onfloor_member_uids() -> list[str]: + return _ldap_get_group_member_uids("onfloor") @service_cache(maxsize=1024) def ldap_get_current_students() -> list[CSHMember]: return _ldap_get_group_members("current_student") +@service_cache(maxsize=1024) +def ldap_get_current_student_uids() -> list[str]: + return _ldap_get_group_member_uids("current_student") @service_cache(maxsize=128) def ldap_get_roomnumber(account) -> str: diff --git a/conditional/util/member.py b/conditional/util/member.py index a2b29443..1d4a25ac 100644 --- a/conditional/util/member.py +++ b/conditional/util/member.py @@ -1,7 +1,7 @@ from datetime import datetime from sqlalchemy import func, or_ -from conditional import start_of_year +from conditional import start_of_year, ldap from conditional.models.models import CommitteeMeeting, FreshmanAccount from conditional.models.models import CurrentCoops from conditional.models.models import FreshmanEvalData @@ -12,49 +12,10 @@ from conditional.models.models import MemberSeminarHost from conditional.models.models import TechnicalSeminar from conditional.util.cache import service_cache -from conditional.util.ldap import ldap_get_active_members -from conditional.util.ldap import ldap_get_current_students -from conditional.util.ldap import ldap_get_intro_members -from conditional.util.ldap import ldap_get_onfloor_members -from conditional.util.ldap import ldap_is_active +from conditional.util.ldap import ldap_get_active_member_uids, ldap_get_intro_member_uids, ldap_is_active from conditional.util.ldap import ldap_is_intromember from conditional.util.ldap import ldap_get_member - -@service_cache(maxsize=1024) -def get_members_info_active_and_onfloor(): - members = ldap_get_current_students() - member_list = [] - - onfloor_set = set() - active_set = set() - - for account in members: - uid = account.uid - name = account.cn - groups = "".join(account.groups()) - active = "active" in groups - onfloor = "onfloor" in groups - - if active: - active_set.add(uid) - - if onfloor: - onfloor_set.add(uid) - - room = account.roomNumber - hp = account.housingPoints - member_list.append({ - "uid": uid, - "name": name, - "active": active, - "onfloor": onfloor, - "room": room, - "hp": hp - }) - - return member_list, active_set, onfloor_set - def get_freshman_data(user_name): freshman = {} freshman_data = FreshmanEvalData.query.filter(FreshmanEvalData.uid == user_name).first() @@ -103,21 +64,8 @@ def get_freshman_data(user_name): freshman['eval_date'] = freshman_data.eval_date return freshman -@service_cache(maxsize=1024) -def get_active_members() -> set[str]: - return {members.uid for members in ldap_get_active_members()} - -@service_cache(maxsize=1024) -def get_intro_members() -> set[str]: - return {member.uid for member in ldap_get_intro_members()} - -@service_cache(maxsize=1024) -def get_all_onfloor_members() -> set[str]: - return {members.uid for members in ldap_get_onfloor_members()} - -@service_cache(maxsize=1024) def get_onfloor_members() -> set[str]: - return get_active_members() & get_all_onfloor_members() + return set(ldap.get_group_member_uids(groups=['onfloor', 'active'], excluded_groups=[])) def get_cm(member): query_result = CommitteeMeeting.query.join( @@ -207,8 +155,8 @@ def get_semester_info() -> tuple[str, datetime]: def get_voting_members(): semester, semester_start = get_semester_info() - active_members = get_active_members() - intro_members = get_intro_members() + active_members = set(ldap_get_active_member_uids()) + intro_members = set(ldap_get_intro_member_uids()) coop_members = CurrentCoops.query.filter( CurrentCoops.date_created > start_of_year(), diff --git a/requirements.in b/requirements.in index d2e89d55..58c81743 100644 --- a/requirements.in +++ b/requirements.in @@ -4,7 +4,7 @@ blinker~=1.4 boto3==1.35.99 botocore==1.35.99 click~=8.3.1 -csh_ldap>=2.5.3 +csh-ldap>=2.5.5 Flask~=3.1.0 Flask-Migrate~=4.1.0 Flask-Gzip~=0.2 diff --git a/requirements.txt b/requirements.txt index 57d22361..90848fce 100644 --- a/requirements.txt +++ b/requirements.txt @@ -22,9 +22,9 @@ botocore==1.35.99 # -r requirements.in # boto3 # s3transfer -build==1.4.3 +build==1.5.0 # via pip-tools -certifi==2026.2.25 +certifi==2026.6.17 # via # requests # sentry-sdk @@ -32,14 +32,14 @@ cffi==2.0.0 # via cryptography charset-normalizer==3.4.7 # via requests -click==8.3.2 +click==8.3.3 # via # -r requirements.in # flask # pip-tools -cryptography==46.0.7 +cryptography==49.0.0 # via oic -csh-ldap==2.5.3 +csh-ldap==2.5.5 # via -r requirements.in defusedxml==0.7.1 # via oic @@ -67,11 +67,11 @@ flask-sqlalchemy==3.1.1 # flask-migrate future==1.0.0 # via pyjwkest -greenlet==3.4.0 +greenlet==3.5.2 # via sqlalchemy gunicorn==25.3.0 # via -r requirements.in -idna==3.11 +idna==3.18 # via requests importlib-resources==7.1.0 # via flask-pyoidc @@ -93,7 +93,7 @@ jmespath==1.1.0 # botocore lazy-object-proxy==1.12.0 # via -r requirements.in -mako==1.3.11 +mako==1.3.12 # via # -r requirements.in # alembic @@ -114,16 +114,18 @@ oic==1.6.1 # via # -r requirements.in # flask-pyoidc -packaging==26.0 +packaging==26.2 # via # build # gunicorn # wheel +pip==26.1.2 + # via pip-tools pip-tools==7.5.3 # via -r requirements.in -platformdirs==4.9.6 +platformdirs==4.10.0 # via pylint -psycopg2-binary==2.9.11 +psycopg2-binary==2.9.12 # via -r requirements.in pyasn1==0.6.3 # via @@ -137,11 +139,11 @@ pycryptodomex==3.23.0 # via # oic # pyjwkest -pydantic==2.13.0 +pydantic==2.13.4 # via pydantic-settings -pydantic-core==2.46.0 +pydantic-core==2.46.4 # via pydantic -pydantic-settings==2.13.1 +pydantic-settings==2.14.2 # via oic pyjwkest==1.4.4 # via oic @@ -159,21 +161,23 @@ python-editor==1.0.4 # via -r requirements.in python-ldap==3.4.5 # via csh-ldap -requests==2.33.1 +requests==2.34.2 # via # flask-pyoidc # oic # pyjwkest s3transfer==0.10.4 # via boto3 -sentry-sdk[flask]==2.58.0 +sentry-sdk==2.58.0 # via -r requirements.in +setuptools==82.0.1 + # via pip-tools six==1.17.0 # via # -r requirements.in # pyjwkest # python-dateutil -sqlalchemy==2.0.49 +sqlalchemy==2.0.51 # via # -r requirements.in # alembic @@ -182,7 +186,7 @@ srvlookup==3.0.0 # via csh-ldap structlog==25.5.0 # via -r requirements.in -tomlkit==0.14.0 +tomlkit==0.15.0 # via pylint typing-extensions==4.15.0 # via @@ -195,7 +199,7 @@ typing-inspection==0.4.2 # via # pydantic # pydantic-settings -urllib3==2.6.3 +urllib3==2.7.0 # via # botocore # requests @@ -204,7 +208,7 @@ werkzeug==3.1.8 # via # -r requirements.in # flask -wheel==0.46.3 +wheel==0.47.0 # via pip-tools wrapt==2.1.2 # via -r requirements.in