Compare commits

..

6 Commits

5 changed files with 90 additions and 67 deletions
View File
+79 -67
View File
@@ -1026,9 +1026,9 @@ def inject_version():
'csrf_token': csrf_token, 'csrf_token': csrf_token,
'CURRENT_MODULE': current_module, 'CURRENT_MODULE': current_module,
'school_periods': SCHOOL_PERIODS, 'school_periods': SCHOOL_PERIODS,
'inventory_module_enabled': cfg.INVENTORY_MODULE_ENABLED, 'inventory_module_enabled': cfg.MODULES.is_enabled('inventory'),
'library_module_enabled': cfg.LIBRARY_MODULE_ENABLED, 'library_module_enabled': cfg.MODULES.is_enabled('library'),
'student_cards_module_enabled': cfg.STUDENT_CARDS_MODULE_ENABLED, 'student_cards_module_enabled': cfg.MODULES.is_enabled('student_cards'),
'is_admin': is_admin, 'is_admin': is_admin,
'unread_notification_count': unread_notification_count, 'unread_notification_count': unread_notification_count,
'current_permissions': current_permissions, 'current_permissions': current_permissions,
@@ -1713,7 +1713,7 @@ def _upload_student_cards_excel():
flash('Administratorrechte erforderlich.', 'error') flash('Administratorrechte erforderlich.', 'error')
return redirect(url_for('home_admin')) return redirect(url_for('home_admin'))
if not cfg.STUDENT_CARDS_MODULE_ENABLED: if not cfg.MODULES.is_enabled('student_cards'):
flash('Schülerausweis-Modul ist deaktiviert.', 'error') flash('Schülerausweis-Modul ist deaktiviert.', 'error')
return redirect(url_for('home_admin')) return redirect(url_for('home_admin'))
@@ -1908,7 +1908,7 @@ def _upload_excel_items(scope='inventory'):
fallback_route = 'library_admin' if is_library_scope else 'upload_admin' fallback_route = 'library_admin' if is_library_scope else 'upload_admin'
if is_library_scope: if is_library_scope:
if not cfg.LIBRARY_MODULE_ENABLED: if not cfg.MODULES.is_enabled('library'):
flash('Bibliotheks-Modul ist deaktiviert.', 'error') flash('Bibliotheks-Modul ist deaktiviert.', 'error')
return redirect(url_for('home')) return redirect(url_for('home'))
@@ -2606,8 +2606,8 @@ def home():
flash('Bitte mit registriertem Konto anmelden!', 'error') flash('Bitte mit registriertem Konto anmelden!', 'error')
return redirect(url_for('login')) return redirect(url_for('login'))
if not cfg.INVENTORY_MODULE_ENABLED: if not cfg.MODULES.is_enabled('inventory'):
if cfg.LIBRARY_MODULE_ENABLED: if cfg.MODULES.is_enabled('library'):
return redirect(url_for('library_view')) return redirect(url_for('library_view'))
else: else:
return "Weder Inventar- noch Bibliotheks-Modul sind aktiviert.", 403 return "Weder Inventar- noch Bibliotheks-Modul sind aktiviert.", 403
@@ -2616,8 +2616,8 @@ def home():
return render_template( return render_template(
'main.html', 'main.html',
username=session['username'], username=session['username'],
library_module_enabled=cfg.LIBRARY_MODULE_ENABLED, library_module_enabled=cfg.MODULES.is_enabled('library'),
student_cards_module_enabled=cfg.STUDENT_CARDS_MODULE_ENABLED, student_cards_module_enabled=cfg.MODULES.is_enabled('student_cards'),
student_default_borrow_days=cfg.STUDENT_DEFAULT_BORROW_DAYS, student_default_borrow_days=cfg.STUDENT_DEFAULT_BORROW_DAYS,
student_max_borrow_days=cfg.STUDENT_MAX_BORROW_DAYS student_max_borrow_days=cfg.STUDENT_MAX_BORROW_DAYS
) )
@@ -2645,8 +2645,8 @@ def home_admin():
flash('Ihnen ist es nicht gestattet auf dieser Internetanwendung, die eben besuchte Adrrese zu nutzen, versuchen sie es erneut nach dem sie sich mit einem berechtigten Nutzer angemeldet haben!', 'error') flash('Ihnen ist es nicht gestattet auf dieser Internetanwendung, die eben besuchte Adrrese zu nutzen, versuchen sie es erneut nach dem sie sich mit einem berechtigten Nutzer angemeldet haben!', 'error')
return redirect(url_for('login')) return redirect(url_for('login'))
if not cfg.INVENTORY_MODULE_ENABLED: if not cfg.MODULES.is_enabled('inventory'):
if cfg.LIBRARY_MODULE_ENABLED: if cfg.MODULES.is_enabled('library'):
return redirect(url_for('library_admin')) return redirect(url_for('library_admin'))
else: else:
return "Weder Inventar- noch Bibliotheks-Modul sind aktiviert.", 403 return "Weder Inventar- noch Bibliotheks-Modul sind aktiviert.", 403
@@ -2657,8 +2657,8 @@ def home_admin():
return render_template( return render_template(
'main_admin.html', 'main_admin.html',
username=session['username'], username=session['username'],
library_module_enabled=cfg.LIBRARY_MODULE_ENABLED, library_module_enabled=cfg.MODULES.is_enabled('library'),
student_cards_module_enabled=cfg.STUDENT_CARDS_MODULE_ENABLED, student_cards_module_enabled=cfg.MODULES.is_enabled('student_cards'),
student_default_borrow_days=cfg.STUDENT_DEFAULT_BORROW_DAYS, student_default_borrow_days=cfg.STUDENT_DEFAULT_BORROW_DAYS,
student_max_borrow_days=cfg.STUDENT_MAX_BORROW_DAYS, student_max_borrow_days=cfg.STUDENT_MAX_BORROW_DAYS,
school_info=_get_school_info_for_export(), school_info=_get_school_info_for_export(),
@@ -2676,8 +2676,8 @@ def tutorial_page():
'tutorial.html', 'tutorial.html',
username=session['username'], username=session['username'],
is_admin=us.check_admin(session['username']), is_admin=us.check_admin(session['username']),
library_module_enabled=cfg.LIBRARY_MODULE_ENABLED, library_module_enabled=cfg.MODULES.is_enabled('library'),
student_cards_module_enabled=cfg.STUDENT_CARDS_MODULE_ENABLED, student_cards_module_enabled=cfg.MODULES.is_enabled('student_cards'),
student_default_borrow_days=cfg.STUDENT_DEFAULT_BORROW_DAYS, student_default_borrow_days=cfg.STUDENT_DEFAULT_BORROW_DAYS,
student_max_borrow_days=cfg.STUDENT_MAX_BORROW_DAYS student_max_borrow_days=cfg.STUDENT_MAX_BORROW_DAYS
) )
@@ -2695,16 +2695,16 @@ def library_view():
if 'username' not in session: if 'username' not in session:
flash('Bitte mit registriertem Konto anmelden!', 'error') flash('Bitte mit registriertem Konto anmelden!', 'error')
return redirect(url_for('login')) return redirect(url_for('login'))
if not cfg.LIBRARY_MODULE_ENABLED: if not cfg.MODULES.is_enabled('library'):
flash('Bibliotheks-Modul ist deaktiviert.', 'error') flash('Bibliotheks-Modul ist deaktiviert.', 'error')
return redirect(url_for('home')) return redirect(url_for('home'))
return render_template( return render_template(
'library_table.html', 'library_table.html',
username=session['username'], username=session['username'],
library_module_enabled=cfg.LIBRARY_MODULE_ENABLED, library_module_enabled=cfg.MODULES.is_enabled('library'),
is_admin=us.check_admin(session['username']), is_admin=us.check_admin(session['username']),
student_cards_module_enabled=cfg.STUDENT_CARDS_MODULE_ENABLED, student_cards_module_enabled=cfg.MODULES.is_enabled('student_cards'),
student_default_borrow_days=cfg.STUDENT_DEFAULT_BORROW_DAYS, student_default_borrow_days=cfg.STUDENT_DEFAULT_BORROW_DAYS,
student_max_borrow_days=cfg.STUDENT_MAX_BORROW_DAYS student_max_borrow_days=cfg.STUDENT_MAX_BORROW_DAYS
) )
@@ -2719,7 +2719,7 @@ def library_loans_admin():
if not us.check_admin(session['username']): if not us.check_admin(session['username']):
flash('Ihnen ist es nicht gestattet auf dieser Internetanwendung, die eben besuchte Adrrese zu nutzen, versuchen sie es erneut nach dem sie sich mit einem berechtigten Nutzer angemeldet haben!', 'error') flash('Ihnen ist es nicht gestattet auf dieser Internetanwendung, die eben besuchte Adrrese zu nutzen, versuchen sie es erneut nach dem sie sich mit einem berechtigten Nutzer angemeldet haben!', 'error')
return redirect(url_for('login')) return redirect(url_for('login'))
if not cfg.LIBRARY_MODULE_ENABLED: if not cfg.MODULES.is_enabled('library'):
flash('Bibliotheks-Modul ist deaktiviert.', 'error') flash('Bibliotheks-Modul ist deaktiviert.', 'error')
return redirect(url_for('home_admin')) return redirect(url_for('home_admin'))
@@ -2820,8 +2820,8 @@ def library_loans_admin():
'library_borrowings_admin.html', 'library_borrowings_admin.html',
loan_entries=loan_entries, loan_entries=loan_entries,
damaged_items=damaged_items, damaged_items=damaged_items,
library_module_enabled=cfg.LIBRARY_MODULE_ENABLED, library_module_enabled=cfg.MODULES.is_enabled('library'),
student_cards_module_enabled=cfg.STUDENT_CARDS_MODULE_ENABLED, student_cards_module_enabled=cfg.MODULES.is_enabled('student_cards'),
) )
except Exception as e: except Exception as e:
app.logger.error(f"Error loading library loans admin view: {e}") app.logger.error(f"Error loading library loans admin view: {e}")
@@ -2956,9 +2956,9 @@ def api_library_scan_action():
""" """
if 'username' not in session: if 'username' not in session:
return jsonify({'ok': False, 'message': 'Nicht angemeldet.'}), 401 return jsonify({'ok': False, 'message': 'Nicht angemeldet.'}), 401
if not cfg.LIBRARY_MODULE_ENABLED: if not cfg.MODULES.is_enabled('library'):
return jsonify({'ok': False, 'message': 'Bibliotheks-Modul ist deaktiviert.'}), 403 return jsonify({'ok': False, 'message': 'Bibliotheks-Modul ist deaktiviert.'}), 403
if not cfg.STUDENT_CARDS_MODULE_ENABLED: if not cfg.MODULES.is_enabled('student_cards'):
return jsonify({'ok': False, 'message': 'Schülerausweis-Modul ist deaktiviert.'}), 403 return jsonify({'ok': False, 'message': 'Schülerausweis-Modul ist deaktiviert.'}), 403
payload = request.get_json(silent=True) or {} payload = request.get_json(silent=True) or {}
@@ -3162,7 +3162,7 @@ def api_library_item_update(item_id):
return jsonify({'ok': False, 'message': 'Nicht angemeldet.'}), 401 return jsonify({'ok': False, 'message': 'Nicht angemeldet.'}), 401
if not us.check_admin(session['username']): if not us.check_admin(session['username']):
return jsonify({'ok': False, 'message': 'Administratorrechte erforderlich.'}), 403 return jsonify({'ok': False, 'message': 'Administratorrechte erforderlich.'}), 403
if not cfg.LIBRARY_MODULE_ENABLED: if not cfg.MODULES.is_enabled('library'):
return jsonify({'ok': False, 'message': 'Bibliotheks-Modul ist deaktiviert.'}), 403 return jsonify({'ok': False, 'message': 'Bibliotheks-Modul ist deaktiviert.'}), 403
payload = request.get_json(silent=True) or {} payload = request.get_json(silent=True) or {}
@@ -3293,8 +3293,8 @@ def upload_admin():
'upload_admin.html', 'upload_admin.html',
username=session['username'], username=session['username'],
duplicate_data=duplicate_data, duplicate_data=duplicate_data,
library_module_enabled=cfg.LIBRARY_MODULE_ENABLED, library_module_enabled=cfg.MODULES.is_enabled('library'),
student_cards_module_enabled=cfg.STUDENT_CARDS_MODULE_ENABLED, student_cards_module_enabled=cfg.MODULES.is_enabled('student_cards'),
show_library_features=False, show_library_features=False,
upload_mode='item', upload_mode='item',
page_title='Artikel hochladen', page_title='Artikel hochladen',
@@ -3315,7 +3315,7 @@ def library_admin():
if not _action_access_allowed(permissions, 'can_insert'): if not _action_access_allowed(permissions, 'can_insert'):
flash('Ihnen ist es nicht gestattet auf dieser Internetanwendung, die eben besuchte Adrrese zu nutzen, versuchen sie es erneut nach dem sie sich mit einem berechtigten Nutzer angemeldet haben!', 'error') flash('Ihnen ist es nicht gestattet auf dieser Internetanwendung, die eben besuchte Adrrese zu nutzen, versuchen sie es erneut nach dem sie sich mit einem berechtigten Nutzer angemeldet haben!', 'error')
return redirect(url_for('login')) return redirect(url_for('login'))
if not cfg.LIBRARY_MODULE_ENABLED: if not cfg.MODULES.is_enabled('library'):
flash('Bibliotheks-Modul ist deaktiviert.', 'error') flash('Bibliotheks-Modul ist deaktiviert.', 'error')
return redirect(url_for('home_admin')) return redirect(url_for('home_admin'))
@@ -3359,8 +3359,8 @@ def library_admin():
'upload_admin.html', 'upload_admin.html',
username=session['username'], username=session['username'],
duplicate_data=duplicate_data, duplicate_data=duplicate_data,
library_module_enabled=cfg.LIBRARY_MODULE_ENABLED, library_module_enabled=cfg.MODULES.is_enabled('library'),
student_cards_module_enabled=cfg.STUDENT_CARDS_MODULE_ENABLED, student_cards_module_enabled=cfg.MODULES.is_enabled('student_cards'),
show_library_features=True, show_library_features=True,
upload_mode='library', upload_mode='library',
page_title='Bücher hochladen', page_title='Bücher hochladen',
@@ -3380,7 +3380,7 @@ def student_cards_admin():
if not us.check_admin(session['username']): if not us.check_admin(session['username']):
flash('Ihnen ist es nicht gestattet auf dieser Internetanwendung, die eben besuchte Adrrese zu nutzen, versuchen sie es erneut nach dem sie sich mit einem berechtigten Nutzer angemeldet haben!', 'error') flash('Ihnen ist es nicht gestattet auf dieser Internetanwendung, die eben besuchte Adrrese zu nutzen, versuchen sie es erneut nach dem sie sich mit einem berechtigten Nutzer angemeldet haben!', 'error')
return redirect(url_for('login')) return redirect(url_for('login'))
if not cfg.STUDENT_CARDS_MODULE_ENABLED: if not cfg.MODULES.is_enabled('student_cards'):
flash('Schülerausweis-Modul ist deaktiviert.', 'error') flash('Schülerausweis-Modul ist deaktiviert.', 'error')
return redirect(url_for('home_admin')) return redirect(url_for('home_admin'))
@@ -3506,8 +3506,8 @@ def student_cards_admin():
edit_mode=edit_mode, edit_mode=edit_mode,
form_data=form_data, form_data=form_data,
config={'default': cfg.STUDENT_DEFAULT_BORROW_DAYS}, config={'default': cfg.STUDENT_DEFAULT_BORROW_DAYS},
library_module_enabled=cfg.LIBRARY_MODULE_ENABLED, library_module_enabled=cfg.MODULES.is_enabled('library'),
student_cards_module_enabled=cfg.STUDENT_CARDS_MODULE_ENABLED student_cards_module_enabled=cfg.MODULES.is_enabled('student_cards')
) )
@@ -3523,7 +3523,7 @@ def student_cards_print():
if not us.check_admin(session['username']): if not us.check_admin(session['username']):
flash('Ihnen ist es nicht gestattet auf dieser Internetanwendung, die eben besuchte Adrrese zu nutzen, versuchen sie es erneut nach dem sie sich mit einem berechtigten Nutzer angemeldet haben!', 'error') flash('Ihnen ist es nicht gestattet auf dieser Internetanwendung, die eben besuchte Adrrese zu nutzen, versuchen sie es erneut nach dem sie sich mit einem berechtigten Nutzer angemeldet haben!', 'error')
return redirect(url_for('login')) return redirect(url_for('login'))
if not cfg.STUDENT_CARDS_MODULE_ENABLED: if not cfg.MODULES.is_enabled('student_cards'):
flash('Schülerausweis-Modul ist deaktiviert.', 'error') flash('Schülerausweis-Modul ist deaktiviert.', 'error')
return redirect(url_for('home_admin')) return redirect(url_for('home_admin'))
@@ -3555,7 +3555,7 @@ def student_card_barcode_print():
if not us.check_admin(session['username']): if not us.check_admin(session['username']):
flash('Ihnen ist es nicht gestattet auf dieser Internetanwendung, die eben besuchte Adrrese zu nutzen, versuchen sie es erneut nach dem sie sich mit einem berechtigten Nutzer angemeldet haben!', 'error') flash('Ihnen ist es nicht gestattet auf dieser Internetanwendung, die eben besuchte Adrrese zu nutzen, versuchen sie es erneut nach dem sie sich mit einem berechtigten Nutzer angemeldet haben!', 'error')
return redirect(url_for('login')) return redirect(url_for('login'))
if not cfg.STUDENT_CARDS_MODULE_ENABLED: if not cfg.MODULES.is_enabled('student_cards'):
flash('Schülerausweis-Modul ist deaktiviert.', 'error') flash('Schülerausweis-Modul ist deaktiviert.', 'error')
return redirect(url_for('home_admin')) return redirect(url_for('home_admin'))
@@ -3586,7 +3586,7 @@ def student_card_barcode_download():
if not us.check_admin(session['username']): if not us.check_admin(session['username']):
flash('Zugriff verweigert.', 'error') flash('Zugriff verweigert.', 'error')
return redirect(url_for('login')) return redirect(url_for('login'))
if not cfg.STUDENT_CARDS_MODULE_ENABLED: if not cfg.MODULES.is_enabled('student_cards'):
flash('Schülerausweis-Modul ist deaktiviert.', 'error') flash('Schülerausweis-Modul ist deaktiviert.', 'error')
return redirect(url_for('home_admin')) return redirect(url_for('home_admin'))
@@ -3760,7 +3760,7 @@ def student_card_single_barcode_download(card_id):
if not us.check_admin(session['username']): if not us.check_admin(session['username']):
flash('Zugriff verweigert.', 'error') flash('Zugriff verweigert.', 'error')
return redirect(url_for('login')) return redirect(url_for('login'))
if not cfg.STUDENT_CARDS_MODULE_ENABLED: if not cfg.MODULES.is_enabled('student_cards'):
flash('Schülerausweis-Modul ist deaktiviert.', 'error') flash('Schülerausweis-Modul ist deaktiviert.', 'error')
return redirect(url_for('home_admin')) return redirect(url_for('home_admin'))
@@ -4629,7 +4629,7 @@ def upload_item():
item_isbn = '' item_isbn = ''
item_type = 'general' item_type = 'general'
if cfg.LIBRARY_MODULE_ENABLED: if cfg.MODULES.is_enabled('library'):
item_isbn = normalize_and_validate_isbn(isbn_raw) item_isbn = normalize_and_validate_isbn(isbn_raw)
if isbn_raw and not item_isbn: if isbn_raw and not item_isbn:
error_msg = 'Ungültige ISBN. Bitte ISBN-10 oder ISBN-13 verwenden.' error_msg = 'Ungültige ISBN. Bitte ISBN-10 oder ISBN-13 verwenden.'
@@ -4641,7 +4641,7 @@ def upload_item():
item_type = 'book' item_type = 'book'
if upload_mode == 'library': if upload_mode == 'library':
if not cfg.LIBRARY_MODULE_ENABLED: if not cfg.MODULES.is_enabled('library'):
error_msg = 'Bibliotheks-Modul ist deaktiviert.' error_msg = 'Bibliotheks-Modul ist deaktiviert.'
if is_mobile: if is_mobile:
return jsonify({'success': False, 'message': error_msg}), 400 return jsonify({'success': False, 'message': error_msg}), 400
@@ -4671,6 +4671,10 @@ def upload_item():
if is_mobile: if is_mobile:
return jsonify({'success': False, 'message': error_msg}), 400 return jsonify({'success': False, 'message': error_msg}), 400
else: else:
conflicting_items = it.get_item_by_code_4(code_4[0])
if conflicting_items:
flash('Der Code wird bereits verwendet. Das existierende Element wurde geöffnet.', 'info')
return redirect(url_for(success_redirect_endpoint, open_item_modal=str(conflicting_items[0]['_id'])))
flash(error_msg, 'error') flash(error_msg, 'error')
return redirect(url_for(success_redirect_endpoint)) return redirect(url_for(success_redirect_endpoint))
@@ -4695,6 +4699,10 @@ def upload_item():
error_msg = f'Der Einzelcode "{specific_code}" wird bereits verwendet.' error_msg = f'Der Einzelcode "{specific_code}" wird bereits verwendet.'
if is_mobile: if is_mobile:
return jsonify({'success': False, 'message': error_msg}), 400 return jsonify({'success': False, 'message': error_msg}), 400
conflicting_items = it.get_item_by_code_4(specific_code)
if conflicting_items:
flash(f'Der Einzelcode "{specific_code}" wird bereits verwendet. Das existierende Element wurde geöffnet.', 'info')
return redirect(url_for(success_redirect_endpoint, open_item_modal=str(conflicting_items[0]['_id'])))
flash(error_msg, 'error') flash(error_msg, 'error')
return redirect(url_for(success_redirect_endpoint)) return redirect(url_for(success_redirect_endpoint))
@@ -5816,7 +5824,7 @@ def edit_item(id):
item_isbn = '' item_isbn = ''
item_type = 'general' item_type = 'general'
if cfg.LIBRARY_MODULE_ENABLED: if cfg.MODULES.is_enabled('library'):
item_isbn = normalize_and_validate_isbn(isbn_raw) item_isbn = normalize_and_validate_isbn(isbn_raw)
if isbn_raw and not item_isbn: if isbn_raw and not item_isbn:
flash('Ungültige ISBN. Bitte ISBN-10 oder ISBN-13 verwenden.', 'error') flash('Ungültige ISBN. Bitte ISBN-10 oder ISBN-13 verwenden.', 'error')
@@ -5826,6 +5834,10 @@ def edit_item(id):
# Check if code is unique (excluding the current item) # Check if code is unique (excluding the current item)
if code_4 and not it.is_code_unique(code_4, exclude_id=id): if code_4 and not it.is_code_unique(code_4, exclude_id=id):
conflicting_items = it.get_item_by_code_4(code_4)
if conflicting_items:
flash('Der Code wird bereits verwendet. Das existierende Element wurde stattdessen geöffnet.', 'info')
return redirect(url_for('home_admin', open_item_modal=str(conflicting_items[0]['_id'])))
flash('Der Code wird bereits verwendet. Bitte wählen Sie einen anderen Code.', 'error') flash('Der Code wird bereits verwendet. Bitte wählen Sie einen anderen Code.', 'error')
return redirect(url_for('home_admin')) return redirect(url_for('home_admin'))
@@ -6099,7 +6111,7 @@ def ausleihen(id):
username = session['username'] username = session['username']
requested_return_to = (request.form.get('return_to') or '').strip().lower() requested_return_to = (request.form.get('return_to') or '').strip().lower()
if requested_return_to == 'library' and cfg.LIBRARY_MODULE_ENABLED: if requested_return_to == 'library' and cfg.MODULES.is_enabled('library'):
redirect_target = 'library_view' redirect_target = 'library_view'
else: else:
redirect_target = 'home_admin' if us.check_admin(username) else 'home' redirect_target = 'home_admin' if us.check_admin(username) else 'home'
@@ -6117,7 +6129,7 @@ def ausleihen(id):
# Library media can only be borrowed with a valid student card. # Library media can only be borrowed with a valid student card.
if is_library_item: if is_library_item:
if not cfg.STUDENT_CARDS_MODULE_ENABLED: if not cfg.MODULES.is_enabled('student_cards'):
flash('Bibliotheksmedien können nur mit aktivem Schülerausweis-Modul ausgeliehen werden.', 'error') flash('Bibliotheksmedien können nur mit aktivem Schülerausweis-Modul ausgeliehen werden.', 'error')
return redirect(url_for(redirect_target)) return redirect(url_for(redirect_target))
if not student_card_id: if not student_card_id:
@@ -6146,7 +6158,7 @@ def ausleihen(id):
if client: if client:
client.close() client.close()
if cfg.STUDENT_CARDS_MODULE_ENABLED: if cfg.MODULES.is_enabled('student_cards'):
duration_raw = (request.form.get('borrow_duration_days') or '').strip() duration_raw = (request.form.get('borrow_duration_days') or '').strip()
if duration_raw: if duration_raw:
try: try:
@@ -7066,8 +7078,8 @@ def register():
return redirect(url_for('home')) return redirect(url_for('home'))
return render_template( return render_template(
'register.html', 'register.html',
library_module_enabled=cfg.LIBRARY_MODULE_ENABLED, library_module_enabled=cfg.MODULES.is_enabled('library'),
student_cards_module_enabled=cfg.STUDENT_CARDS_MODULE_ENABLED, student_cards_module_enabled=cfg.MODULES.is_enabled('student_cards'),
student_default_borrow_days=cfg.STUDENT_DEFAULT_BORROW_DAYS, student_default_borrow_days=cfg.STUDENT_DEFAULT_BORROW_DAYS,
student_max_borrow_days=cfg.STUDENT_MAX_BORROW_DAYS student_max_borrow_days=cfg.STUDENT_MAX_BORROW_DAYS
) )
@@ -7133,8 +7145,8 @@ def user_del():
return render_template( return render_template(
'user_del.html', 'user_del.html',
users=users_list, users=users_list,
library_module_enabled=cfg.LIBRARY_MODULE_ENABLED, library_module_enabled=cfg.MODULES.is_enabled('library'),
student_cards_module_enabled=cfg.STUDENT_CARDS_MODULE_ENABLED student_cards_module_enabled=cfg.MODULES.is_enabled('student_cards')
) )
@@ -7274,8 +7286,8 @@ def admin_borrowings():
return render_template( return render_template(
'admin_borrowings.html', 'admin_borrowings.html',
entries=entries, entries=entries,
library_module_enabled=cfg.LIBRARY_MODULE_ENABLED, library_module_enabled=cfg.MODULES.is_enabled('library'),
student_cards_module_enabled=cfg.STUDENT_CARDS_MODULE_ENABLED student_cards_module_enabled=cfg.MODULES.is_enabled('student_cards')
) )
"""-----------------------------------------------------------Audit Routes-------------------------------------------------------""" """-----------------------------------------------------------Audit Routes-------------------------------------------------------"""
@@ -7336,8 +7348,8 @@ def admin_audit_dashboard():
'admin_audit.html', 'admin_audit.html',
verify_result=verify_result, verify_result=verify_result,
audit_rows=audit_rows, audit_rows=audit_rows,
library_module_enabled=cfg.LIBRARY_MODULE_ENABLED, library_module_enabled=cfg.MODULES.is_enabled('library'),
student_cards_module_enabled=cfg.STUDENT_CARDS_MODULE_ENABLED, student_cards_module_enabled=cfg.MODULES.is_enabled('student_cards'),
) )
except Exception as exc: except Exception as exc:
app.logger.error(f"Error loading audit dashboard: {exc}") app.logger.error(f"Error loading audit dashboard: {exc}")
@@ -8083,7 +8095,7 @@ def library_item_invoices(item_id):
if 'username' not in session or not us.check_admin(session['username']): if 'username' not in session or not us.check_admin(session['username']):
flash('Ihnen ist es nicht gestattet auf dieser Internetanwendung, die eben besuchte Adrrese zu nutzen, versuchen sie es erneut nach dem sie sich mit einem berechtigten Nutzer angemeldet haben!', 'error') flash('Ihnen ist es nicht gestattet auf dieser Internetanwendung, die eben besuchte Adrrese zu nutzen, versuchen sie es erneut nach dem sie sich mit einem berechtigten Nutzer angemeldet haben!', 'error')
return redirect(url_for('login')) return redirect(url_for('login'))
if not cfg.LIBRARY_MODULE_ENABLED: if not cfg.MODULES.is_enabled('library'):
flash('Bibliotheks-Modul ist deaktiviert.', 'error') flash('Bibliotheks-Modul ist deaktiviert.', 'error')
return redirect(url_for('home_admin')) return redirect(url_for('home_admin'))
@@ -8151,8 +8163,8 @@ def library_item_invoices(item_id):
'isbn': item_doc.get('ISBN', ''), 'isbn': item_doc.get('ISBN', ''),
}, },
invoices=entries, invoices=entries,
library_module_enabled=cfg.LIBRARY_MODULE_ENABLED, library_module_enabled=cfg.MODULES.is_enabled('library'),
student_cards_module_enabled=cfg.STUDENT_CARDS_MODULE_ENABLED, student_cards_module_enabled=cfg.MODULES.is_enabled('student_cards'),
) )
except Exception as e: except Exception as e:
app.logger.error(f"Error loading invoice history for item {item_id}: {e}") app.logger.error(f"Error loading invoice history for item {item_id}: {e}")
@@ -8478,8 +8490,8 @@ def logs():
return render_template( return render_template(
'logs.html', 'logs.html',
items=formatted_items, items=formatted_items,
library_module_enabled=cfg.LIBRARY_MODULE_ENABLED, library_module_enabled=cfg.MODULES.is_enabled('library'),
student_cards_module_enabled=cfg.STUDENT_CARDS_MODULE_ENABLED student_cards_module_enabled=cfg.MODULES.is_enabled('student_cards')
) )
@@ -8544,8 +8556,8 @@ def manage_filters():
'manage_filters.html', 'manage_filters.html',
filter1_values=filter1_values, filter1_values=filter1_values,
filter2_values=filter2_values, filter2_values=filter2_values,
library_module_enabled=cfg.LIBRARY_MODULE_ENABLED, library_module_enabled=cfg.MODULES.is_enabled('library'),
student_cards_module_enabled=cfg.STUDENT_CARDS_MODULE_ENABLED student_cards_module_enabled=cfg.MODULES.is_enabled('student_cards')
) )
@app.route('/add_filter_value/<int:filter_num>', methods=['POST']) @app.route('/add_filter_value/<int:filter_num>', methods=['POST'])
@@ -8676,7 +8688,7 @@ def fetch_book_info(isbn):
if 'username' not in session or not us.check_admin(session['username']): if 'username' not in session or not us.check_admin(session['username']):
return jsonify({"error": "Not authorized"}), 403 return jsonify({"error": "Not authorized"}), 403
if not cfg.LIBRARY_MODULE_ENABLED: if not cfg.MODULES.is_enabled('library'):
return jsonify({"error": "Bibliotheks-Modul ist deaktiviert."}), 403 return jsonify({"error": "Bibliotheks-Modul ist deaktiviert."}), 403
try: try:
@@ -8771,7 +8783,7 @@ def download_book_cover():
return jsonify({"error": "Not authorized"}), 403 return jsonify({"error": "Not authorized"}), 403
if not us.check_admin(session['username']): if not us.check_admin(session['username']):
return jsonify({"error": "Admin privileges required"}), 403 return jsonify({"error": "Admin privileges required"}), 403
if not cfg.LIBRARY_MODULE_ENABLED: if not cfg.MODULES.is_enabled('library'):
return jsonify({"error": "Bibliotheks-Modul ist deaktiviert."}), 403 return jsonify({"error": "Bibliotheks-Modul ist deaktiviert."}), 403
try: try:
@@ -9138,8 +9150,8 @@ def notifications_view():
user_notifications=user_notifications, user_notifications=user_notifications,
admin_notifications=admin_notifications, admin_notifications=admin_notifications,
is_admin_user=is_admin_user, is_admin_user=is_admin_user,
library_module_enabled=cfg.LIBRARY_MODULE_ENABLED, library_module_enabled=cfg.MODULES.is_enabled('library'),
student_cards_module_enabled=cfg.STUDENT_CARDS_MODULE_ENABLED, student_cards_module_enabled=cfg.MODULES.is_enabled('student_cards'),
) )
except Exception as exc: except Exception as exc:
app.logger.error(f"Error loading notifications: {exc}") app.logger.error(f"Error loading notifications: {exc}")
@@ -9370,8 +9382,8 @@ def admin_damaged_items():
return render_template( return render_template(
'admin_damaged_items.html', 'admin_damaged_items.html',
damaged_items=damaged_rows, damaged_items=damaged_rows,
library_module_enabled=cfg.LIBRARY_MODULE_ENABLED, library_module_enabled=cfg.MODULES.is_enabled('library'),
student_cards_module_enabled=cfg.STUDENT_CARDS_MODULE_ENABLED, student_cards_module_enabled=cfg.MODULES.is_enabled('student_cards'),
) )
except Exception as exc: except Exception as exc:
app.logger.error(f"Error loading damaged-items admin view: {exc}") app.logger.error(f"Error loading damaged-items admin view: {exc}")
@@ -9474,8 +9486,8 @@ def manage_locations():
return render_template( return render_template(
'manage_locations.html', 'manage_locations.html',
location_values=location_values, location_values=location_values,
library_module_enabled=cfg.LIBRARY_MODULE_ENABLED, library_module_enabled=cfg.MODULES.is_enabled('library'),
student_cards_module_enabled=cfg.STUDENT_CARDS_MODULE_ENABLED student_cards_module_enabled=cfg.MODULES.is_enabled('student_cards')
) )
@@ -9583,8 +9595,8 @@ def admin_school_settings():
school_info=current_school, school_info=current_school,
tenant_id=tenant_id, tenant_id=tenant_id,
tenant_db=tenant_db, tenant_db=tenant_db,
library_module_enabled=cfg.LIBRARY_MODULE_ENABLED, library_module_enabled=cfg.MODULES.is_enabled('library'),
student_cards_module_enabled=cfg.STUDENT_CARDS_MODULE_ENABLED, student_cards_module_enabled=cfg.MODULES.is_enabled('student_cards'),
) )
@app.route('/check_code_unique/<code>') @app.route('/check_code_unique/<code>')
+1
View File
@@ -230,6 +230,7 @@ MODULES.register('library', LIBRARY_MODULE_ENABLED, _match_library)
MODULES.register('student_cards', STUDENT_CARDS_MODULE_ENABLED, _match_student_cards) MODULES.register('student_cards', STUDENT_CARDS_MODULE_ENABLED, _match_student_cards)
STUDENT_DEFAULT_BORROW_DAYS = int(_get(_conf, ['modules', 'student_cards', 'default_borrow_days'], DEFAULTS['modules']['student_cards']['default_borrow_days'])) STUDENT_DEFAULT_BORROW_DAYS = int(_get(_conf, ['modules', 'student_cards', 'default_borrow_days'], DEFAULTS['modules']['student_cards']['default_borrow_days']))
STUDENT_MAX_BORROW_DAYS = int(_get(_conf, ["modules", "student_cards", "max_borrow_days"], DEFAULTS["modules"]["student_cards"]["max_borrow_days"]))
# Upload/paths # Upload/paths
ALLOWED_EXTENSIONS = set(_get(_conf, ['allowed_extensions'], DEFAULTS['upload']['allowed_extensions'])) ALLOWED_EXTENSIONS = set(_get(_conf, ['allowed_extensions'], DEFAULTS['upload']['allowed_extensions']))
+6
View File
@@ -3252,6 +3252,12 @@ document.addEventListener('DOMContentLoaded', ()=>{
} }
document.addEventListener('DOMContentLoaded', function() { document.addEventListener('DOMContentLoaded', function() {
const urlParams = new URLSearchParams(window.location.search);
const openItem = urlParams.get('open_item_modal');
if (openItem) {
openEditModalFromServer(openItem);
}
// Load saved filters // Load saved filters
loadFilterState(); loadFilterState();
+4
View File
@@ -97,6 +97,10 @@ def get_tenant_config(tenant_id=None):
if tenant_id in TENANT_REGISTRY: if tenant_id in TENANT_REGISTRY:
return TENANT_REGISTRY[tenant_id] or {} return TENANT_REGISTRY[tenant_id] or {}
for alias in _tenant_db_aliases(tenant_id):
if alias in TENANT_REGISTRY:
return TENANT_REGISTRY[alias] or {}
return TENANT_REGISTRY.get('default', {}) or {} return TENANT_REGISTRY.get('default', {}) or {}