Changes to the damaged Items

This commit is contained in:
2026-07-31 22:12:19 +02:00
parent 46f79b002b
commit 87027cf3c9
2 changed files with 84 additions and 43 deletions
+70 -40
View File
@@ -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: