From 87027cf3c931db152a12296996e6b92ae33103c4 Mon Sep 17 00:00:00 2001 From: AIIrondev Date: Fri, 31 Jul 2026 22:12:19 +0200 Subject: [PATCH] Changes to the damaged Items --- Web/app.py | 110 ++++++++++++++++--------- Web/templates/admin_damaged_items.html | 17 +++- 2 files changed, 84 insertions(+), 43 deletions(-) diff --git a/Web/app.py b/Web/app.py index 24ecd6a..9f66cae 100755 --- a/Web/app.py +++ b/Web/app.py @@ -10586,76 +10586,106 @@ def notifications_unread_status(): @app.route('/admin/damaged_items') def admin_damaged_items(): - """Admin-Übersicht aller Ausleihen von beschädigten Objekten.""" + """Admin-Übersicht aller defekten, reparierten oder zerstörten Items.""" if 'username' not in session: flash('Anmeldung erforderlich.', 'error') return redirect(url_for('login')) - # SICHERHEIT: Berechtigungsprüfung (wie in admin_borrowings) - # Entferne die Kommentare, falls du `us` in dieser Datei importiert hast - """ - current_permissions = us.get_effective_permissions(session['username']) - if not current_permissions['pages'].get('admin_damaged_items', False): - flash('Ihnen fehlen die nötigen Berechtigungen, um diese Aktion auszuführen.', 'error') - return redirect(url_for('home_admin')) - """ - - # Import sicherstellen from modules.inventarsystem.data_protection import decrypt_text client = None try: client = MongoClient(MONGODB_HOST, MONGODB_PORT) db = client[MONGODB_DB] - ausleihungen_col = db['ausleihungen'] items_col = db['items'] + ausleihungen_col = db['ausleihungen'] - alle_ausleihungen = list(ausleihungen_col.find().sort('Start', -1)) + # 1. Alle Items suchen, die einen Schaden haben, repariert oder zerstört sind + query = { + '$or': [ + {'HasDamage': True}, + {'DamageReports': {'$exists': True, '$not': {'$size': 0}}}, + {'Condition': {'$in': ['destroyed', 'broken', 'damaged', 'repaired', 'fixed']}} + ] + } - beschädigte_ausleihungen = [] + raw_items = list(items_col.find(query).sort('LastUpdated', -1)) + damaged_items = [] - for record in alle_ausleihungen: - item_id = record.get('Item') - if not item_id: - continue + for item in raw_items: + # Dynamischen Status ermitteln (wie zuvor besprochen) + condition_value = str(item.get('Condition', '')).strip().lower() + has_damage_flag = bool(item.get('HasDamage')) + has_reports = bool(item.get('DamageReports')) - try: - if isinstance(item_id, str): - query_id = ObjectId(item_id) - else: - query_id = item_id + if condition_value == 'destroyed': + status_text = 'Komplett zerstört' + status_color = 'danger' # Rot + elif condition_value in ['repaired', 'fixed'] or (has_reports and not has_damage_flag): + status_text = 'Bereits repariert' + status_color = 'success' # Grün + else: + status_text = 'Aktuelles Problem' + status_color = 'warning' # Gelb - item_doc = items_col.find_one({'_id': query_id}) + # Schadensberichte analysieren + damage_reports = item.get('DamageReports', []) + latest_report = damage_reports[-1] if damage_reports else {} - if item_doc: - condition_value = str(item_doc.get('Condition', '')).strip().lower() - has_damage = bool(item_doc.get('HasDamage')) or condition_value == 'destroyed' or bool( - item_doc.get('DamageReports')) + # Prüfen, ob es eine aktive oder geplante Ausleihe für dieses Item gibt + active_borrow = ausleihungen_col.find_one({ + 'Item': item.get('_id'), # Suche mit ObjectId + 'Status': {'$in': ['active', 'planned']} + }) - if has_damage: - raw_user = record.get('User', '') - if raw_user: - record['User'] = decrypt_text(raw_user) + # Falls die ID in der Ausleihen-Collection als String hinterlegt ist (Fallback) + if not active_borrow: + active_borrow = ausleihungen_col.find_one({ + 'Item': str(item.get('_id')), + 'Status': {'$in': ['active', 'planned']} + }) - if item_doc.get('User'): - item_doc['User'] = decrypt_text(item_doc['User']) + # Benutzernamen der Ausleihe entschlüsseln + if active_borrow and active_borrow.get('User'): + active_borrow['User'] = decrypt_text(active_borrow['User']) - record['ItemDetails'] = item_doc - beschädigte_ausleihungen.append(record) + # Direkt am Item hinterlegten Nutzer entschlüsseln + item_user = decrypt_text(item.get('User')) if item.get('User') else '' - except Exception as e: - app.logger.warning(f"Konnte Item {item_id} für Ausleihe {record.get('_id')} nicht laden: {e}") + # Datenstruktur exakt für dein Jinja2 Template aufbauen + damaged_items.append({ + 'id': str(item['_id']), + 'name': item.get('Name', ''), + 'code': item.get('Code_4', ''), + 'item_type': item.get('ItemType', ''), + 'author': item.get('Author', item.get('Autor', '')), # Deckt beide Schreibweisen ab + 'isbn': item.get('ISBN', ''), + 'borrow_user': item_user, + 'damage_count': len(damage_reports), + 'condition': item.get('Condition', '-'), + 'available': item.get('Verfuegbar', False), + + # Letzte Meldung + 'latest_damage_description': latest_report.get('description', ''), + 'latest_damage_by': latest_report.get('reported_by', ''), + 'latest_damage_at': latest_report.get('reported_at', ''), + + # Status & Ausleihe + 'status_text': status_text, + 'status_color': status_color, + 'active_borrow': active_borrow + }) return render_template( 'admin_damaged_items.html', - ausleihungen=beschädigte_ausleihungen, + damaged_items=damaged_items, library_module_enabled=cfg.MODULES.is_enabled('library'), student_cards_module_enabled=cfg.MODULES.is_enabled('student_cards'), mail_module_enabled=cfg.MODULES.is_enabled('mail') ) except Exception as exc: - app.logger.error(f"Fehler beim Laden der beschädigten Objekte: {exc}") + app.logger.error(f"Fehler beim Laden der defekten Items: {exc}") flash('Fehler beim Laden der Übersicht.', 'error') return redirect(url_for('home_admin')) finally: diff --git a/Web/templates/admin_damaged_items.html b/Web/templates/admin_damaged_items.html index a2fc687..b2c87cd 100644 --- a/Web/templates/admin_damaged_items.html +++ b/Web/templates/admin_damaged_items.html @@ -7,7 +7,7 @@

Defekte Items

-

Eigenes Verwaltungsfenster fuer gemeldete Defekte mit schneller Reparatur-Funktion.

+

Eigenes Verwaltungsfenster für gemeldete Defekte mit schneller Reparatur-Funktion.

Ausleihen @@ -42,7 +42,13 @@ {% if item.isbn %}
ISBN: {{ item.isbn }}
{% endif %} -
Defekt
+ + +
+ {{ item.status_text }} +
+ +
Meldungen: {{ item.damage_count }}
Condition: {{ item.condition or '-' }}
Verfuegbar: {{ 'Ja' if item.available else 'Nein' }}
@@ -66,7 +72,12 @@ {% endif %} + + {% if item.condition not in ['repaired', 'fixed'] %} + {% else %} + Repariert + {% endif %} {% endfor %} @@ -118,4 +129,4 @@ function repairDamage(itemId, button) { }); } -{% endblock %} +{% endblock %} \ No newline at end of file