implementation of the right time zones and blocked user by mahnung as a blocker for the library ausleih process
Release Inventarsystem / release-docker (push) Successful in 2m14s
Release Inventarsystem / release-docker (push) Successful in 2m14s
This commit is contained in:
@@ -34,6 +34,7 @@ import Web.modules.database.settings as cfg
|
||||
from Web.modules.database.settings import MongoClient
|
||||
import Web.modules.inventarsystem.data_protection as dp
|
||||
import Web.modules.database.user as us
|
||||
from zoneinfo import ZoneInfo
|
||||
|
||||
|
||||
def _get_client():
|
||||
@@ -184,7 +185,7 @@ def create_backup_database():
|
||||
|
||||
# === AUSLEIHUNG MANAGEMENT ===
|
||||
|
||||
def add_ausleihung(item_id, user, start_date, end_date=None, notes="", status="active", period=None, exemplar_data=None):
|
||||
def add_ausleihung(item_id, user, start_date, end_date=None, notes="", status="active", period=None, exemplar_data=None, due_date=None):
|
||||
"""
|
||||
Add a new borrowing record for an item.
|
||||
|
||||
@@ -224,6 +225,9 @@ def add_ausleihung(item_id, user, start_date, end_date=None, notes="", status="a
|
||||
|
||||
if exemplar_data:
|
||||
ausleihung['ExemplarData'] = exemplar_data
|
||||
|
||||
if due_date:
|
||||
ausleihung['DueDate'] = due_date
|
||||
|
||||
result = ausleihungen.insert_one(ausleihung)
|
||||
ausleihung_id = result.inserted_id
|
||||
|
||||
@@ -26,6 +26,7 @@ import Web.modules.database.settings as cfg
|
||||
from Web.modules.database.settings import MongoClient
|
||||
import Web.modules.inventarsystem.data_protection as dp
|
||||
import logging
|
||||
from zoneinfo import ZoneInfo
|
||||
|
||||
|
||||
def is_library_item(item):
|
||||
@@ -177,8 +178,8 @@ def add_item(name, ort, beschreibung, images=None, filter=None, filter2=None, fi
|
||||
'SeriesPosition': series_position,
|
||||
'IsGroupedSubItem': is_grouped_sub_item,
|
||||
'ParentItemId': parent_item_id,
|
||||
'Created': datetime.datetime.now(),
|
||||
'LastUpdated': datetime.datetime.now()
|
||||
'Created': datetime.datetime.now(ZoneInfo("Europe/Berlin")),
|
||||
'LastUpdated': datetime.datetime.now(ZoneInfo("Europe/Berlin"))
|
||||
}
|
||||
result = items.insert_one(item)
|
||||
item_id = result.inserted_id
|
||||
@@ -208,8 +209,8 @@ def remove_item(id):
|
||||
{'_id': ObjectId(id), 'Deleted': {'$ne': True}},
|
||||
{'$set': {
|
||||
'Deleted': True,
|
||||
'DeletedAt': datetime.datetime.now(),
|
||||
'LastUpdated': datetime.datetime.now(),
|
||||
'DeletedAt': datetime.datetime.now(ZoneInfo("Europe/Berlin")),
|
||||
'LastUpdated': datetime.datetime.now(ZoneInfo("Europe/Berlin")),
|
||||
'Verfuegbar': False,
|
||||
}}
|
||||
)
|
||||
@@ -304,7 +305,7 @@ def update_item(id, name, ort, beschreibung, images, verfuegbar, filter1, filter
|
||||
'is_library': is_lib,
|
||||
'library_category': library_category,
|
||||
'Verfuegbar': bool(verfuegbar),
|
||||
'LastUpdated': datetime.datetime.now()
|
||||
'LastUpdated': datetime.datetime.now(ZoneInfo("Europe/Berlin"))
|
||||
}
|
||||
|
||||
specific_update = shared_update.copy()
|
||||
@@ -346,7 +347,7 @@ def update_item_status(id, verfuegbar, user=None):
|
||||
|
||||
update_data = {
|
||||
'Verfuegbar': verfuegbar,
|
||||
'LastUpdated': datetime.datetime.now()
|
||||
'LastUpdated': datetime.datetime.now(ZoneInfo("Europe/Berlin"))
|
||||
}
|
||||
|
||||
update_query = {'$set': update_data}
|
||||
@@ -387,7 +388,7 @@ def update_item_exemplare_status(id, exemplare_status):
|
||||
|
||||
update_data = {
|
||||
'ExemplareStatus': exemplare_status,
|
||||
'LastUpdated': datetime.datetime.now()
|
||||
'LastUpdated': datetime.datetime.now(ZoneInfo("Europe/Berlin"))
|
||||
}
|
||||
|
||||
result = items.update_one(
|
||||
@@ -734,7 +735,7 @@ def unstuck_item(id):
|
||||
{'$set': {
|
||||
'Status': 'cancelled',
|
||||
'CancelledReason': 'unstuck_reset',
|
||||
'LastUpdated': datetime.datetime.now()
|
||||
'LastUpdated': datetime.datetime.now(ZoneInfo("Europe/Berlin"))
|
||||
}}
|
||||
)
|
||||
|
||||
@@ -745,7 +746,7 @@ def unstuck_item(id):
|
||||
{
|
||||
'$set': {
|
||||
'Verfuegbar': True,
|
||||
'LastUpdated': datetime.datetime.now()
|
||||
'LastUpdated': datetime.datetime.now(ZoneInfo("Europe/Berlin"))
|
||||
},
|
||||
'$unset': {'User': ""}
|
||||
}
|
||||
@@ -1075,7 +1076,7 @@ def update_item_next_appointment(item_id, appointment_data):
|
||||
if appointment_data is None:
|
||||
update_query = {
|
||||
'$unset': {'NextAppointment': ""},
|
||||
'$set': {'LastUpdated': datetime.datetime.now()}
|
||||
'$set': {'LastUpdated': datetime.datetime.now(ZoneInfo("Europe/Berlin"))}
|
||||
}
|
||||
else:
|
||||
# Create a copy so we don't mutate the original dictionary passed in
|
||||
@@ -1088,7 +1089,7 @@ def update_item_next_appointment(item_id, appointment_data):
|
||||
update_query = {
|
||||
'$set': {
|
||||
'NextAppointment': data_to_save,
|
||||
'LastUpdated': datetime.datetime.now()
|
||||
'LastUpdated': datetime.datetime.now(ZoneInfo("Europe/Berlin"))
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1121,7 +1122,7 @@ def clear_item_next_appointment(item_id):
|
||||
|
||||
result = items.update_one(
|
||||
{'_id': ObjectId(item_id)},
|
||||
{'$unset': {'NextAppointment': ""}, '$set': {'LastUpdated': datetime.datetime.now()}}
|
||||
{'$unset': {'NextAppointment': ""}, '$set': {'LastUpdated': datetime.datetime.now(ZoneInfo("Europe/Berlin"))}}
|
||||
)
|
||||
|
||||
client.close()
|
||||
|
||||
@@ -23,6 +23,7 @@ from Web.modules.database.settings import MongoClient
|
||||
from bson.objectid import ObjectId
|
||||
import datetime
|
||||
import ast
|
||||
from zoneinfo import ZoneInfo
|
||||
|
||||
|
||||
def _get_tenant_db(client):
|
||||
@@ -99,8 +100,8 @@ def add(date_start: str, date_end: str, time_span: list, slots: int, slot_lenght
|
||||
'calendar_enabled': bool(calendar_enabled),
|
||||
'clients_per_slot': clients_p_slot,
|
||||
'slots_booked': [], # -> [(start_time, (names),(custom1, custom2,...)), ...]the list gets there indexes as the slot 1-defined so is can be counted without an extra variable
|
||||
'Created': datetime.datetime.now(),
|
||||
'LastUpdated': datetime.datetime.now()
|
||||
'Created': datetime.datetime.now(ZoneInfo("Europe/Berlin")),
|
||||
'LastUpdated': datetime.datetime.now(ZoneInfo("Europe/Berlin"))
|
||||
}
|
||||
result = items.insert_one(item)
|
||||
return result.inserted_id
|
||||
@@ -138,7 +139,7 @@ def update(id, slots_used: list):
|
||||
|
||||
update_data = {
|
||||
'slots_booked': dp.encrypt_text(str(slots_used)),
|
||||
'LastUpdated': datetime.datetime.now()
|
||||
'LastUpdated': datetime.datetime.now(ZoneInfo("Europe/Berlin"))
|
||||
}
|
||||
|
||||
result = items.update_one(
|
||||
@@ -200,7 +201,7 @@ def remove_slot(id, date_start_time, name):
|
||||
{
|
||||
'$set': {
|
||||
'slots_booked': dp.encrypt_text(str(updated_slots)),
|
||||
'LastUpdated': datetime.datetime.now()
|
||||
'LastUpdated': datetime.datetime.now(ZoneInfo("Europe/Berlin"))
|
||||
}
|
||||
}
|
||||
)
|
||||
|
||||
@@ -740,6 +740,87 @@ def get_user_by_student_ident(student_ident):
|
||||
|
||||
return None
|
||||
|
||||
|
||||
def get_user_by_student_name(student_name):
|
||||
"""Return user dict by student name by decrypting all cards and matching."""
|
||||
if not student_name:
|
||||
return None
|
||||
|
||||
# Normalisiere den Suchbegriff, den wir finden wollen
|
||||
normalized_target = str(student_name).strip()
|
||||
if not normalized_target:
|
||||
return None
|
||||
|
||||
client = MongoClient(cfg.MONGODB_HOST, cfg.MONGODB_PORT)
|
||||
try:
|
||||
db = _get_tenant_db(client)
|
||||
all_student_cards = db['student_cards'].find()
|
||||
|
||||
for user_doc in all_student_cards:
|
||||
encrypted_student_name = user_doc.get('SchülerName')
|
||||
|
||||
if encrypted_student_name:
|
||||
try:
|
||||
decrypted_ident = dp.decrypt_text(encrypted_student_name)
|
||||
|
||||
if decrypted_ident and str(decrypted_ident).strip() == normalized_target:
|
||||
return user_doc
|
||||
|
||||
except Exception as e:
|
||||
logger.error(f"Entschlüsselungsfehler bei ID {user_doc.get('_id')}: {e}")
|
||||
continue
|
||||
|
||||
except Exception as exc:
|
||||
logger.error(f"Datenbankfehler in get_user_by_student_name: {exc}")
|
||||
finally:
|
||||
client.close()
|
||||
|
||||
return None
|
||||
|
||||
def student_is_blocked(student_id):
|
||||
"""
|
||||
Überprüft, ob ein Schüler (Nutzer) im System gesperrt ist (z. B. aufgrund von überfälligen Ausleihen).
|
||||
Akzeptiert entweder den Benutzernamen oder die Schülerausweis-ID.
|
||||
|
||||
Rückgabewert:
|
||||
True, wenn der Nutzer gesperrt ist.
|
||||
False, wenn der Nutzer nicht gesperrt ist oder nicht gefunden wurde.
|
||||
"""
|
||||
if not student_id:
|
||||
return False
|
||||
|
||||
normalized_card_id = normalize_student_card_id(student_id)
|
||||
|
||||
client = MongoClient(cfg.MONGODB_HOST, cfg.MONGODB_PORT)
|
||||
try:
|
||||
db = _get_tenant_db(client)
|
||||
users = db['users']
|
||||
|
||||
# Suche nach dem Benutzer anhand des Benutzernamens (groß/klein) oder der StudentCardId
|
||||
query = {
|
||||
'$or': [
|
||||
{'Username': student_id},
|
||||
{'username': student_id},
|
||||
{'StudentCardId': normalized_card_id}
|
||||
]
|
||||
}
|
||||
|
||||
user_doc = users.find_one(query)
|
||||
|
||||
if user_doc:
|
||||
# Lese das Feld 'is_blocked' aus, standardmäßig False, falls es nicht existiert
|
||||
return bool(user_doc.get('is_blocked', False))
|
||||
|
||||
# Wenn kein Nutzer gefunden wurde, gehen wir sicherheitshalber davon aus, dass keine Sperre vorliegt
|
||||
return False
|
||||
|
||||
except Exception as e:
|
||||
logger.error(f"Datenbankfehler in student_is_blocked: {e}")
|
||||
# Im Fehlerfall False zurückgeben, um Systemblockaden durch Datenbankfehler zu vermeiden
|
||||
return False
|
||||
finally:
|
||||
client.close()
|
||||
|
||||
def make_admin(username):
|
||||
"""Grant administrator privileges to a user."""
|
||||
client = MongoClient(cfg.MONGODB_HOST, cfg.MONGODB_PORT)
|
||||
|
||||
Reference in New Issue
Block a user