Compare commits

...

2 Commits

Author SHA1 Message Date
Aiirondev_dev 530d71ac8f changes to the design 2026-10-18 21:10:56 +02:00
Aiirondev_dev 64991326e7 Die Ursache wurde behoben: Die Ausleihungen speichern den Benutzer teilweise als Benutzer-ObjectId, während das Fenster „Meine Ausleihungen“ nur den Session-Benutzernamen verglichen hat. Dadurch wurden die Datensätze herausgefiltert.
Zusätzlich wurde die Item-Suche robuster gemacht:

Vergleich gegen Benutzername
Vergleich gegen Benutzer-ObjectId
Vergleich gegen session['user_id']
Unterstützung für verschlüsselte und unverschlüsselte Benutzerwerte
Unterstützung für Item-IDs als String und als MongoDB-ObjectId
Geändert wurde:

Web/app.py
2026-10-15 22:01:23 +02:00
2 changed files with 45 additions and 28 deletions
+25 -20
View File
@@ -11510,6 +11510,13 @@ def my_borrowed_items():
return redirect(url_for('login', next=request.path))
username = session['username']
current_user = us.get_user(username) or {}
user_ids = {
username,
str(current_user.get('_id')) if current_user.get('_id') else '',
str(session.get('user_id') or ''),
}
user_ids.discard('')
client = MongoClient(MONGODB_HOST, MONGODB_PORT)
db = client[MONGODB_DB]
@@ -11526,31 +11533,27 @@ def my_borrowed_items():
for appointment in all_ausleihungen:
raw_user = appointment.get('User', '')
user_values = {str(raw_user).strip()} if raw_user else set()
try:
decrypted_user = decrypt_text(raw_user) if raw_user else ''
except Exception as e:
app.logger.error(f"Entschlüsselungsfehler: {e}")
decrypted_user = ''
if raw_user:
user_values.add(str(decrypt_text(raw_user)).strip())
except Exception:
pass
if decrypted_user != username:
if not user_values.intersection(user_ids):
continue
item_id = appointment.get('Item')
if not item_id:
continue
try:
if isinstance(item_id, str):
query_id = ObjectId(item_id)
else:
query_id = item_id
item_obj = items_collection.find_one({
'_id': query_id,
'Deleted': {'$ne': True}
})
except Exception:
item_obj = None
item_queries = [{'_id': item_id}]
if isinstance(item_id, str) and ObjectId.is_valid(item_id):
item_queries.insert(0, {'_id': ObjectId(item_id)})
item_obj = items_collection.find_one({
'$or': item_queries,
'Deleted': {'$ne': True}
})
if item_obj:
item_obj['_id'] = str(item_obj['_id'])
@@ -11587,12 +11590,14 @@ def my_borrowed_items():
for item in all_borrowed_items:
raw_item_user = item.get('User', '')
item_user_values = {str(raw_item_user).strip()} if raw_item_user else set()
try:
dec_item_user = decrypt_text(raw_item_user) if raw_item_user else ''
if raw_item_user:
item_user_values.add(str(decrypt_text(raw_item_user)).strip())
except Exception:
dec_item_user = ''
pass
if dec_item_user == username and str(item['_id']) not in processed_item_ids:
if item_user_values.intersection(user_ids) and str(item['_id']) not in processed_item_ids:
item['_id'] = str(item['_id'])
item['ActiveAppointment'] = True
item['AppointmentData'] = {'status': 'active (no document)'}
+20 -8
View File
@@ -563,8 +563,13 @@
}
.navigation-buttons {
display: flex;
justify-content: center;
display: contents;
}
.items-navigation {
display: grid;
grid-template-columns: auto minmax(0, 1fr) auto;
align-items: center;
gap: 10px;
margin-top: 20px;
}
@@ -577,6 +582,7 @@
cursor: pointer;
padding: 10px;
border-radius: 5px;
z-index: 1;
}
.navigation-buttons .prev-button:hover,
@@ -1633,6 +1639,10 @@
}
/* Navigation buttons mobile */
.items-navigation {
display: block !important;
}
.navigation-buttons {
display: none !important; /* Hide horizontal navigation on mobile */
}
@@ -2543,12 +2553,14 @@ document.addEventListener('DOMContentLoaded', ()=>{
<span>Anzahl</span>
</div>
<div id="items-container" class="items-container">
<!-- Items will be dynamically loaded here -->
</div>
<div class="navigation-buttons">
<button class="prev-button" onclick="scrollPrev()">&#10094;</button>
<button class="next-button" onclick="scrollNext()">&#10095;</button>
<div class="items-navigation">
<div class="navigation-buttons">
<button class="prev-button" type="button" onclick="scrollPrev()" aria-label="Vorherige Elemente">&#10094;</button>
<button class="next-button" type="button" onclick="scrollNext()" aria-label="Nächste Elemente">&#10095;</button>
</div>
<div id="items-container" class="items-container">
<!-- Items will be dynamically loaded here -->
</div>
</div>
</div>
<div id="item-modal" class="item-modal">