diff --git a/exact/exact/administration/permissions.py b/exact/exact/administration/permissions.py new file mode 100644 index 00000000..7a039411 --- /dev/null +++ b/exact/exact/administration/permissions.py @@ -0,0 +1,24 @@ +# administration/permissions.py +from functools import wraps +from django.http import HttpResponseForbidden +from django.shortcuts import redirect +from django.urls import reverse + +def site_admin_required(view_func): + """ + Allows access only to authenticated users with user.prefs.site_admin == True. + Returns 403 for AJAX/JSON requests; redirects to login for anonymous users. + """ + @wraps(view_func) + def _wrapped(request, *args, **kwargs): + user = request.user + if not user.is_authenticated: + # If you prefer 401 JSON instead, adjust here. + return redirect(f"{reverse('login')}?next={request.path}") + + prefs = getattr(user, "prefs", None) + if not prefs or not getattr(prefs, "is_site_admin", False): + return HttpResponseForbidden("Site admin permission required.") + return view_func(request, *args, **kwargs) + + return _wrapped diff --git a/exact/exact/administration/templates/administration/user_management.html b/exact/exact/administration/templates/administration/user_management.html new file mode 100644 index 00000000..6c6b218f --- /dev/null +++ b/exact/exact/administration/templates/administration/user_management.html @@ -0,0 +1,735 @@ +{% extends 'base/base.html' %} +{% load static %} +{% load i18n %} + +{% block taggerimports %} + + +{% endblock taggerimports %} + +{% block additional_js %} + +{% endblock additional_js %} + +{% block bodyblock %} + +
You are not a member of any team.
+ {% endif %} +