From 66375f2f33d5f8ffd2e1e3946a652784658be10f Mon Sep 17 00:00:00 2001 From: "Noah Hanford (spaced)" Date: Wed, 24 Jun 2026 22:40:04 -0400 Subject: [PATCH 1/9] feat: update csh-ldap --- requirements.in | 2 +- requirements.txt | 44 ++++++++++++++++++++++++-------------------- 2 files changed, 25 insertions(+), 21 deletions(-) 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 From 02d0dce1fb94d463d8311efc3175d9d8011c3c3a Mon Sep 17 00:00:00 2001 From: "Noah Hanford (spaced)" Date: Wed, 24 Jun 2026 22:40:15 -0400 Subject: [PATCH 2/9] feat: member management page goes fastttt --- conditional/blueprints/member_management.py | 15 ++++++--- conditional/util/ldap.py | 15 ++++++++- conditional/util/member.py | 36 --------------------- conditional/util/user_dict.py | 1 + 4 files changed, 25 insertions(+), 42 deletions(-) diff --git a/conditional/blueprints/member_management.py b/conditional/blueprints/member_management.py index e3714e90..83a69944 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,14 @@ 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']) + + for member in member_list: + member['active'] = member['uid'] in active_members + member['onfloor'] = member['uid'] in onfloor_members freshmen = FreshmanAccount.query freshmen_list = [] 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..4ca09db1 100644 --- a/conditional/util/member.py +++ b/conditional/util/member.py @@ -13,48 +13,12 @@ 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_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() diff --git a/conditional/util/user_dict.py b/conditional/util/user_dict.py index bfc9ad3a..a219e4dc 100644 --- a/conditional/util/user_dict.py +++ b/conditional/util/user_dict.py @@ -26,6 +26,7 @@ def user_dict_is_financial_director(user_dict) -> bool: return user_dict_is_in_group(user_dict, 'eboard-financial') def user_dict_is_eval_director(user_dict) -> bool: + return True return user_dict_is_in_group(user_dict, 'eboard-evaluations') def user_dict_is_current_student(user_dict) -> bool: From fa9706b1b7508da2817e62e12205fb1f81d3a5a6 Mon Sep 17 00:00:00 2001 From: "Noah Hanford (spaced)" Date: Thu, 25 Jun 2026 21:06:03 -0400 Subject: [PATCH 3/9] feat: dashboard, housing, and intro evals speeeed --- conditional/blueprints/dashboard.py | 5 ++-- conditional/blueprints/housing.py | 13 +++++---- conditional/blueprints/intro_evals.py | 8 +++--- conditional/templates/housing.html | 4 +-- conditional/templates/intro_evals.html | 12 ++++---- conditional/util/housing.py | 38 ++++++++++---------------- conditional/util/member.py | 26 ++++-------------- 7 files changed, 42 insertions(+), 64 deletions(-) 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/housing.py b/conditional/blueprints/housing.py index 45b25476..de55187d 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 @@ -28,7 +28,7 @@ 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 not 'roomNumber' 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..3be793e2 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 @@ -157,7 +157,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 +240,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/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/util/housing.py b/conditional/util/housing.py index 96ea5f44..942f65bc 100644 --- a/conditional/util/housing.py +++ b/conditional/util/housing.py @@ -1,5 +1,7 @@ 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 @@ -23,33 +25,21 @@ 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/member.py b/conditional/util/member.py index 4ca09db1..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,10 +12,7 @@ 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_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 @@ -67,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( @@ -171,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(), From 968335cc0b367b92aa5f212abc54967896bdab1e Mon Sep 17 00:00:00 2001 From: "Noah Hanford (spaced)" Date: Thu, 25 Jun 2026 21:08:07 -0400 Subject: [PATCH 4/9] feat: spring evals --- conditional/blueprints/spring_evals.py | 8 ++++---- conditional/util/user_dict.py | 1 - 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/conditional/blueprints/spring_evals.py b/conditional/blueprints/spring_evals.py index 80c91943..1947c95f 100644 --- a/conditional/blueprints/spring_evals.py +++ b/conditional/blueprints/spring_evals.py @@ -2,7 +2,7 @@ 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 @@ -22,7 +22,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 +78,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/util/user_dict.py b/conditional/util/user_dict.py index a219e4dc..bfc9ad3a 100644 --- a/conditional/util/user_dict.py +++ b/conditional/util/user_dict.py @@ -26,7 +26,6 @@ def user_dict_is_financial_director(user_dict) -> bool: return user_dict_is_in_group(user_dict, 'eboard-financial') def user_dict_is_eval_director(user_dict) -> bool: - return True return user_dict_is_in_group(user_dict, 'eboard-evaluations') def user_dict_is_current_student(user_dict) -> bool: From 64a17783b264356a104b998a8730c603be5a618b Mon Sep 17 00:00:00 2001 From: "Noah Hanford (spaced)" Date: Thu, 25 Jun 2026 21:14:37 -0400 Subject: [PATCH 5/9] feat: attendance pages speedup --- conditional/blueprints/attendance.py | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/conditional/blueprints/attendance.py b/conditional/blueprints/attendance.py index 16c0f081..1a051304 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 @@ -37,7 +37,7 @@ 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 +50,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 +66,7 @@ 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,7 @@ 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 +123,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 }) From 38d8703ebf3b97e33fa67ed6bb661b90e8bf1009 Mon Sep 17 00:00:00 2001 From: "Noah Hanford (spaced)" Date: Thu, 25 Jun 2026 21:24:28 -0400 Subject: [PATCH 6/9] fix: member management not working --- conditional/blueprints/member_management.py | 7 ++++++- conditional/templates/member_management.html | 2 +- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/conditional/blueprints/member_management.py b/conditional/blueprints/member_management.py index 83a69944..f6c2e422 100644 --- a/conditional/blueprints/member_management.py +++ b/conditional/blueprints/member_management.py @@ -65,12 +65,17 @@ def display_member_management(user_dict=None): 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']) + 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/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 %} From 6deb9975f28507ecde691c5e115318f1f10d5aa6 Mon Sep 17 00:00:00 2001 From: "Noah Hanford (spaced)" Date: Thu, 25 Jun 2026 21:35:12 -0400 Subject: [PATCH 7/9] fix: remove most references to ldap_get_GROUPNAME_group --- conditional/blueprints/gatekeep.py | 9 ++++----- conditional/blueprints/housing.py | 1 - conditional/blueprints/intro_evals.py | 1 - conditional/blueprints/spring_evals.py | 1 - conditional/util/housing.py | 2 -- conditional/util/user_dict.py | 1 + 6 files changed, 5 insertions(+), 10 deletions(-) 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 de55187d..c5a5122f 100644 --- a/conditional/blueprints/housing.py +++ b/conditional/blueprints/housing.py @@ -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 diff --git a/conditional/blueprints/intro_evals.py b/conditional/blueprints/intro_evals.py index 3be793e2..a41b23e6 100644 --- a/conditional/blueprints/intro_evals.py +++ b/conditional/blueprints/intro_evals.py @@ -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__) diff --git a/conditional/blueprints/spring_evals.py b/conditional/blueprints/spring_evals.py index 1947c95f..40756240 100644 --- a/conditional/blueprints/spring_evals.py +++ b/conditional/blueprints/spring_evals.py @@ -7,7 +7,6 @@ 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__) diff --git a/conditional/util/housing.py b/conditional/util/housing.py index 942f65bc..0f300c1c 100644 --- a/conditional/util/housing.py +++ b/conditional/util/housing.py @@ -4,8 +4,6 @@ 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): diff --git a/conditional/util/user_dict.py b/conditional/util/user_dict.py index bfc9ad3a..a219e4dc 100644 --- a/conditional/util/user_dict.py +++ b/conditional/util/user_dict.py @@ -26,6 +26,7 @@ def user_dict_is_financial_director(user_dict) -> bool: return user_dict_is_in_group(user_dict, 'eboard-financial') def user_dict_is_eval_director(user_dict) -> bool: + return True return user_dict_is_in_group(user_dict, 'eboard-evaluations') def user_dict_is_current_student(user_dict) -> bool: From 8c4ca15b3a7e1ad905d4d7f0902f1c7a4b442aca Mon Sep 17 00:00:00 2001 From: "Noah Hanford (spaced)" Date: Thu, 25 Jun 2026 21:39:35 -0400 Subject: [PATCH 8/9] fix: not all user dict --- conditional/util/user_dict.py | 1 - 1 file changed, 1 deletion(-) diff --git a/conditional/util/user_dict.py b/conditional/util/user_dict.py index a219e4dc..bfc9ad3a 100644 --- a/conditional/util/user_dict.py +++ b/conditional/util/user_dict.py @@ -26,7 +26,6 @@ def user_dict_is_financial_director(user_dict) -> bool: return user_dict_is_in_group(user_dict, 'eboard-financial') def user_dict_is_eval_director(user_dict) -> bool: - return True return user_dict_is_in_group(user_dict, 'eboard-evaluations') def user_dict_is_current_student(user_dict) -> bool: From 6cb035e024b11a0a0a2a90298f649e16f33e23be Mon Sep 17 00:00:00 2001 From: "Noah Hanford (spaced)" Date: Thu, 25 Jun 2026 21:44:13 -0400 Subject: [PATCH 9/9] fix: lint --- conditional/blueprints/attendance.py | 11 ++++++----- conditional/blueprints/housing.py | 5 +++-- conditional/blueprints/member_management.py | 3 ++- conditional/util/housing.py | 3 ++- 4 files changed, 13 insertions(+), 9 deletions(-) diff --git a/conditional/blueprints/attendance.py b/conditional/blueprints/attendance.py index 1a051304..6ebb4d6c 100644 --- a/conditional/blueprints/attendance.py +++ b/conditional/blueprints/attendance.py @@ -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_group_member_attributes(groups=['current_student'], excluded_groups=[], attributes=['uid', 'displayName']) + members = ldap.get_group_member_attributes(groups=['current_student'], + excluded_groups=[], attributes=['uid', 'displayName']) named_members = [ { @@ -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_group_member_attributes(groups=['active'], excluded_groups=[], attributes=['uid', 'displayName']) + 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' @@ -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_group_member_attributes(groups=['current_student'], excluded_groups=[], attributes=['uid', 'displayName']) + current_students = ldap.get_group_member_attributes(groups=['current_student'], + excluded_groups=[], attributes=['uid', 'displayName']) eligible_members = [ { diff --git a/conditional/blueprints/housing.py b/conditional/blueprints/housing.py index c5a5122f..0cbc9cdd 100644 --- a/conditional/blueprints/housing.py +++ b/conditional/blueprints/housing.py @@ -27,7 +27,8 @@ def display_housing(user_dict=None): log.info('Display Housing Board') housing = {} - onfloors = ldap.get_group_member_attributes(groups=['onfloor', 'current_student'], excluded_groups=[], attributes=['cn', 'roomNumber']) + 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 ) @@ -35,7 +36,7 @@ def display_housing(user_dict=None): room_list = set() for member in onfloors: - if not 'roomNumber' in member: + if 'roomNumber' not in member: continue room = member['roomNumber'] diff --git a/conditional/blueprints/member_management.py b/conditional/blueprints/member_management.py index f6c2e422..7af8d02b 100644 --- a/conditional/blueprints/member_management.py +++ b/conditional/blueprints/member_management.py @@ -65,7 +65,8 @@ def display_member_management(user_dict=None): 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']) + 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'] diff --git a/conditional/util/housing.py b/conditional/util/housing.py index 0f300c1c..cf2d727e 100644 --- a/conditional/util/housing.py +++ b/conditional/util/housing.py @@ -23,7 +23,8 @@ def get_housing_queue(is_eval_director=False): ).all() } - queue = ldap.get_group_member_attributes(groups=['current_student'], excluded_groups=[], attributes=['uid', 'housingPoints', 'cn']) + 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: