fix: resolve item repair logic and clear mongo damage flags
Release Inventarsystem / release-docker (push) Successful in 2m20s

- Fixed incorrect form field key (`action_type` -> `action`) in admin route.
- Switched to MongoDB `$unset` to completely remove damage fields (`HasDamage`, `DamageText`, etc.) from the items collection instead of just setting them to false.
- Added cleanup logic to `$unset` damage flags from related active loans in the `borrowings` collection.
- Ensures repaired/replaced items correctly disappear from the damaged items UI.
This commit is contained in:
2026-08-21 11:59:50 +02:00
parent e4b27c2d62
commit a51c4c4cbe
+44 -21
View File
@@ -9145,10 +9145,12 @@ def admin_resolve_repair(item_id):
return redirect(url_for('library_loans_admin')) return redirect(url_for('library_loans_admin'))
def resolve_repaired_item_funct(item_id, action, new_code_4="", current_user="admin"): def resolve_repaired_item_funct(item_id, action, new_code_4="", current_user="admin"):
""" """
Verarbeitet Items aus der Reparatur und aktualisiert die Serien-Counts Verarbeitet Items aus der Reparatur und aktualisiert die Serien-Counts
sowie Parent/Child-Abhängigkeiten beim Löschen korrekt. sowie Parent/Child-Abhängigkeiten beim Löschen korrekt.
Entfernt Schadens-Flags komplett aus Items und zugehörigen Ausleihen.
""" """
if not ObjectId.is_valid(item_id): if not ObjectId.is_valid(item_id):
return False, "Ungültige Item-ID." return False, "Ungültige Item-ID."
@@ -9158,12 +9160,25 @@ def resolve_repaired_item_funct(item_id, action, new_code_4="", current_user="ad
db = client[cfg.MONGODB_DB] db = client[cfg.MONGODB_DB]
items = db['items'] items = db['items']
borrowings = db['borrowings'] if 'borrowings' in db.list_collection_names() else None
item = items.find_one({'_id': ObjectId(item_id)}) item = items.find_one({'_id': ObjectId(item_id)})
if not item: if not item:
return False, "Item nicht in der Datenbank gefunden." return False, "Item nicht in der Datenbank gefunden."
series_group_id = item.get('SeriesGroupId') series_group_id = item.get('SeriesGroupId')
damage_unset = {
'HasDamage': "",
'has_damage': "",
'DamageCount': "",
'damage_count': "",
'DamageText': "",
'damage_text': "",
'is_damaged': "",
'IsDamaged': ""
}
# --- OPTION 1: DELETE --- # --- OPTION 1: DELETE ---
if action == 'delete': if action == 'delete':
is_parent = not item.get('IsGroupedSubItem') is_parent = not item.get('IsGroupedSubItem')
@@ -9208,35 +9223,43 @@ def resolve_repaired_item_funct(item_id, action, new_code_4="", current_user="ad
elif action == 'replace': elif action == 'replace':
items.update_one( items.update_one(
{'_id': ObjectId(item_id)}, {'_id': ObjectId(item_id)},
{'$set': { {
'Code_4': str(new_code_4).strip(), '$set': {
'Verfuegbar': True, 'Code_4': str(new_code_4).strip(),
'HasDamage': False, 'Verfuegbar': True,
'has_damage': False, 'LastUpdated': datetime.datetime.now()
'DamageCount': 0, },
'damage_count': 0, '$unset': damage_unset
'DamageText': '', }
'damage_text': '',
'LastUpdated': datetime.datetime.now()
}}
) )
if borrowings is not None:
borrowings.update_many(
{'$or': [{'item_id': str(item_id)}, {'item_id': ObjectId(item_id)}]},
{'$unset': damage_unset}
)
return True, f"Item wurde ersetzt. Neuer Code 4 zugewiesen: {new_code_4}." return True, f"Item wurde ersetzt. Neuer Code 4 zugewiesen: {new_code_4}."
# --- OPTION 3: JUST REPAIR --- # --- OPTION 3: JUST REPAIR ---
elif action == 'repair': elif action == 'repair':
items.update_one( items.update_one(
{'_id': ObjectId(item_id)}, {'_id': ObjectId(item_id)},
{'$set': { {
'Verfuegbar': True, '$set': {
'HasDamage': False, 'Verfuegbar': True,
'has_damage': False, 'LastUpdated': datetime.datetime.now()
'DamageCount': 0, },
'damage_count': 0, '$unset': damage_unset
'DamageText': '', }
'damage_text': '',
'LastUpdated': datetime.datetime.now()
}}
) )
if borrowings is not None:
borrowings.update_many(
{'$or': [{'item_id': str(item_id)}, {'item_id': ObjectId(item_id)}]},
{'$unset': damage_unset}
)
return True, "Item wurde repariert und ist wieder regulär verfügbar." return True, "Item wurde repariert und ist wieder regulär verfügbar."
else: else: