Enhance module management: add inventory module support in settings, update templates and app logic for module access control, and extend tenant management script for module configuration
This commit is contained in:
+46
-1
@@ -401,12 +401,42 @@ def _is_library_module_path(path):
|
||||
)
|
||||
return path.startswith(library_prefixes)
|
||||
|
||||
def _is_inventory_module_path(path):
|
||||
"""Return True when the current request path belongs to the inventory module."""
|
||||
if not path:
|
||||
return False
|
||||
|
||||
inventory_prefixes = (
|
||||
'/scanner',
|
||||
'/inventory',
|
||||
'/upload_admin',
|
||||
'/manage_filters',
|
||||
'/manage_locations',
|
||||
'/admin_borrowings',
|
||||
'/admin_damaged_items'
|
||||
)
|
||||
return path.startswith(inventory_prefixes)
|
||||
|
||||
@app.before_request
|
||||
def _enforce_module_access():
|
||||
endpoint = request.endpoint or ''
|
||||
if endpoint == 'static' or endpoint.startswith('static') or request.path.startswith('/api/'):
|
||||
return None
|
||||
|
||||
if not cfg.LIBRARY_MODULE_ENABLED and _is_library_module_path(request.path):
|
||||
return "Bibliotheks-Modul ist deaktiviert.", 403
|
||||
|
||||
if not cfg.INVENTORY_MODULE_ENABLED and _is_inventory_module_path(request.path):
|
||||
return "Inventar-Modul ist deaktiviert.", 403
|
||||
|
||||
def _get_current_module(path):
|
||||
"""Resolve the active UI module for navbar separation."""
|
||||
if cfg.LIBRARY_MODULE_ENABLED and _is_library_module_path(path):
|
||||
return 'library'
|
||||
return 'inventory'
|
||||
if cfg.INVENTORY_MODULE_ENABLED and _is_inventory_module_path(path):
|
||||
return 'inventory'
|
||||
# Default fallback:
|
||||
return 'library' if cfg.LIBRARY_MODULE_ENABLED else 'inventory'
|
||||
|
||||
|
||||
def _get_current_user_permissions():
|
||||
@@ -1118,6 +1148,7 @@ def inject_version():
|
||||
'csrf_token': csrf_token,
|
||||
'CURRENT_MODULE': current_module,
|
||||
'school_periods': SCHOOL_PERIODS,
|
||||
'inventory_module_enabled': cfg.INVENTORY_MODULE_ENABLED,
|
||||
'library_module_enabled': cfg.LIBRARY_MODULE_ENABLED,
|
||||
'student_cards_module_enabled': cfg.STUDENT_CARDS_MODULE_ENABLED,
|
||||
'is_admin': is_admin,
|
||||
@@ -2741,6 +2772,13 @@ def home():
|
||||
if 'username' not in session:
|
||||
flash('Bitte mit registriertem Konto anmelden!', 'error')
|
||||
return redirect(url_for('login'))
|
||||
|
||||
if not cfg.INVENTORY_MODULE_ENABLED:
|
||||
if cfg.LIBRARY_MODULE_ENABLED:
|
||||
return redirect(url_for('library_view'))
|
||||
else:
|
||||
return "Weder Inventar- noch Bibliotheks-Modul sind aktiviert.", 403
|
||||
|
||||
elif not us.check_admin(session['username']):
|
||||
return render_template(
|
||||
'main.html',
|
||||
@@ -2773,6 +2811,13 @@ def home_admin():
|
||||
if 'username' not in session:
|
||||
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'))
|
||||
|
||||
if not cfg.INVENTORY_MODULE_ENABLED:
|
||||
if cfg.LIBRARY_MODULE_ENABLED:
|
||||
return redirect(url_for('library_admin'))
|
||||
else:
|
||||
return "Weder Inventar- noch Bibliotheks-Modul sind aktiviert.", 403
|
||||
|
||||
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')
|
||||
return redirect(url_for('login'))
|
||||
|
||||
@@ -74,6 +74,9 @@ DEFAULTS = {
|
||||
"10": {"start": "16:00", "end": "16:45", "label": "10. Stunde (16:00 - 16:45)"}
|
||||
},
|
||||
'modules': {
|
||||
'inventory': {
|
||||
'enabled': True
|
||||
},
|
||||
'library': {
|
||||
'enabled': False
|
||||
},
|
||||
@@ -190,6 +193,7 @@ class _TenantAwareBool:
|
||||
return f"_TenantAwareBool(module_name={self.module_name!r}, value={self.resolve()!r})"
|
||||
|
||||
|
||||
INVENTORY_MODULE_ENABLED = _TenantAwareBool('inventory', _get(_conf, ['modules', 'inventory', 'enabled'], DEFAULTS['modules']['inventory']['enabled']))
|
||||
LIBRARY_MODULE_ENABLED = _TenantAwareBool('library', _get(_conf, ['modules', 'library', 'enabled'], DEFAULTS['modules']['library']['enabled']))
|
||||
STUDENT_CARDS_MODULE_ENABLED = _TenantAwareBool('student_cards', _get(_conf, ['modules', 'student_cards', 'enabled'], DEFAULTS['modules']['student_cards']['enabled']))
|
||||
STUDENT_DEFAULT_BORROW_DAYS = int(_get(_conf, ['modules', 'student_cards', 'default_borrow_days'], DEFAULTS['modules']['student_cards']['default_borrow_days']))
|
||||
|
||||
@@ -1010,14 +1010,18 @@
|
||||
<div class="module-selector-bar" id="moduleBar">
|
||||
<span class="module-label">Module:</span>
|
||||
<div class="module-tabs">
|
||||
{% if inventory_module_enabled %}
|
||||
<a href="{{ url_for('home') }}"
|
||||
class="module-tab {% if CURRENT_MODULE == 'inventory' %}active{% endif %}"
|
||||
id="inventoryModule"
|
||||
data-module="inventory">
|
||||
📦 Inventarsystem
|
||||
</a>
|
||||
{% if library_module_enabled %}
|
||||
{% endif %}
|
||||
{% if inventory_module_enabled and library_module_enabled %}
|
||||
<div class="module-separator"></div>
|
||||
{% endif %}
|
||||
{% if library_module_enabled %}
|
||||
<a href="{{ url_for('library_view') }}"
|
||||
class="module-tab {% if CURRENT_MODULE == 'library' %}active{% endif %}"
|
||||
id="libraryModule"
|
||||
@@ -1028,7 +1032,7 @@
|
||||
</div>
|
||||
</div>
|
||||
{% endif %}
|
||||
{% if CURRENT_MODULE != 'library' %}
|
||||
{% if CURRENT_MODULE != 'library' and inventory_module_enabled %}
|
||||
<nav class="navbar navbar-expand-lg navbar-dark" id="inventoryNavbar">
|
||||
<div class="container-fluid">
|
||||
<a class="navbar-brand" href="{{ url_for('home') }}" data-icon="📦">Inventarsystem</a>
|
||||
|
||||
Reference in New Issue
Block a user