Klass implementation
Release Inventarsystem / release-docker (push) Successful in 2m19s

This commit is contained in:
2026-08-21 13:20:34 +02:00
parent 01637c31ee
commit f0b112b34c
+57 -36
View File
@@ -3312,13 +3312,13 @@ def library_view():
def library_loans_admin(): def library_loans_admin():
"""Admin overview for library borrowings and damaged library items.""" """Admin overview for library borrowings and damaged library items."""
if 'username' not in session: if 'username' not in session:
flash('Ihnen ist es nicht gestattet auf dieser Internetanwendung, die eben besuchte Adrrese zu nutzen, versuchen sie es erneut nach dem sie sich mit einem berechtigten Nutzer angemeldet haben!', 'error') flash('Ihnen ist es nicht gestattet auf dieser Internetanwendung, die eben besuchte Adrrese zu nutzen, versuchen sie es erneut nach dem sie sich mit einem berechtigten Nutzer angemeldet haben!','error')
return redirect(url_for('login')) return redirect(url_for('login'))
current_permissions = us.get_effective_permissions(session['username']) current_permissions = us.get_effective_permissions(session['username'])
if not current_permissions['pages'].get('library_loans_admin', False): if not current_permissions['pages'].get('library_loans_admin', False):
flash('Ihnen ist es nicht gestattet auf dieser Internetanwendung, die eben besuchte Adrrese zu nutzen, versuchen sie es erneut nach dem sie sich mit einem berechtigten Nutzer angemeldet haben!', 'error') flash('Ihnen ist es nicht gestattet auf dieser Internetanwendung, die eben besuchte Adrrese zu nutzen, versuchen sie es erneut nach dem sie sich mit einem berechtigten Nutzer angemeldet haben!','error')
return redirect(url_for('library_view')) return redirect(url_for('library_view'))
if not cfg.MODULES.is_enabled('library'): if not cfg.MODULES.is_enabled('library'):
@@ -3336,6 +3336,15 @@ def library_loans_admin():
def fmt_money(value): def fmt_money(value):
return _format_money_value(value) return _format_money_value(value)
def safe_decrypt(val):
"""Helper to decrypt strings that start with enc:: or standard encrypted strings."""
if not val or not isinstance(val, str):
return val or ''
try:
return decrypt_text(val)
except Exception:
return val
client = None client = None
try: try:
client = MongoClient(MONGODB_HOST, MONGODB_PORT) client = MongoClient(MONGODB_HOST, MONGODB_PORT)
@@ -3343,6 +3352,7 @@ def library_loans_admin():
items_col = db['items'] items_col = db['items']
ausleihungen_col = db['ausleihungen'] ausleihungen_col = db['ausleihungen']
users_col = db['users'] users_col = db['users']
student_cards_col = db['student_cards']
library_items = list(items_col.find( library_items = list(items_col.find(
{'ItemType': {'$in': LIBRARY_ITEM_TYPES}, 'Deleted': {'$ne': True}}, {'ItemType': {'$in': LIBRARY_ITEM_TYPES}, 'Deleted': {'$ne': True}},
@@ -3357,37 +3367,42 @@ def library_loans_admin():
active_records = list(ausleihungen_col.find( active_records = list(ausleihungen_col.find(
{'Item': {'$in': item_ids}, 'Status': {'$in': ['active', 'planned', 'completed']}}, {'Item': {'$in': item_ids}, 'Status': {'$in': ['active', 'planned', 'completed']}},
{'User': 1, 'Item': 1, 'Status': 1, 'Start': 1, 'End': 1, 'Period': 1, 'Notes': 1, 'InvoiceData': 1, {'User': 1, 'Item': 1, 'Status': 1, 'Start': 1, 'End': 1, 'Period': 1, 'Notes': 1, 'InvoiceData': 1,
'Klasse': 1, 'Class': 1, 'school_class': 1} 'Klasse': 1, 'klasse': 1, 'Class': 1, 'school_class': 1}
).sort('Start', -1)) ).sort('Start', -1))
user_map = {} class_map = {}
if active_records: student_cards = list(student_cards_col.find({}, {'SchülerName': 1, 'Klasse': 1, 'AusweisId': 1}))
raw_users = list({r.get('User') for r in active_records if r.get('User')}) for sc in student_cards:
decrypted_users = [] dec_cls = safe_decrypt(sc.get('Klasse'))
for ru in raw_users: if not dec_cls:
try: continue
du = decrypt_text(ru) if ru else ''
if du:
decrypted_users.append(du)
except Exception:
pass
query_identifiers = list(set(raw_users + decrypted_users)) dec_name = safe_decrypt(sc.get('SchülerName'))
if query_identifiers: raw_name = sc.get('SchülerName')
user_docs = list(users_col.find( ausweis_id = sc.get('AusweisId')
{'$or': [
{'Username': {'$in': query_identifiers}}, if dec_name:
{'Name': {'$in': query_identifiers}}, class_map[dec_name.strip().lower()] = dec_cls
{'User': {'$in': query_identifiers}} class_map[dec_name] = dec_cls
]}, if raw_name:
{'Username': 1, 'Name': 1, 'User': 1, 'Klasse': 1, 'Class': 1, 'school_class': 1} class_map[raw_name] = dec_cls
)) if ausweis_id:
for u in user_docs: class_map[str(ausweis_id).strip().lower()] = dec_cls
cls = u.get('Klasse') or u.get('Class') or u.get('school_class') or ''
if cls: users = list(users_col.find({}, {'Username': 1, 'Name': 1, 'User': 1, 'Klasse': 1, 'klasse': 1, 'Class': 1,
if u.get('Username'): user_map[u['Username']] = cls 'school_class': 1}))
if u.get('Name'): user_map[u['Name']] = cls for u in users:
if u.get('User'): user_map[u['User']] = cls raw_cls = u.get('Klasse') or u.get('klasse') or u.get('Class') or u.get('school_class') or ''
dec_cls = safe_decrypt(raw_cls)
if not dec_cls:
continue
for key in [u.get('Username'), u.get('Name'), u.get('User')]:
if key:
dec_key = safe_decrypt(key)
class_map[key] = dec_cls
class_map[dec_key] = dec_cls
class_map[dec_key.strip().lower()] = dec_cls
active_item_ids = set() active_item_ids = set()
loan_entries = [] loan_entries = []
@@ -3407,14 +3422,20 @@ def library_loans_admin():
damage_reports = item_doc.get('DamageReports', []) or [] damage_reports = item_doc.get('DamageReports', []) or []
raw_user = record.get('User', '') raw_user = record.get('User', '')
decrypted_user = decrypt_text(raw_user) if raw_user else '' decrypted_user = safe_decrypt(raw_user)
direct_class = (
safe_decrypt(record.get('Klasse'))
or safe_decrypt(record.get('klasse'))
or safe_decrypt(record.get('Class'))
or safe_decrypt(record.get('school_class'))
)
user_class = ( user_class = (
record.get('Klasse') direct_class
or record.get('Class') or class_map.get(decrypted_user)
or record.get('school_class') or class_map.get(decrypted_user.strip().lower())
or user_map.get(raw_user, '') or class_map.get(raw_user)
or user_map.get(decrypted_user, '')
or '' or ''
) )