konova/konova/decorators.py
mpeltriaux 26f402fd3b #31 API WIP
* adds support for GET /check on intervention to run checks automatically via API
2022-01-25 09:29:14 +01:00

149 lines
4.7 KiB
Python

"""
Author: Michel Peltriaux
Organization: Struktur- und Genehmigungsdirektion Nord, Rhineland-Palatinate, Germany
Contact: michel.peltriaux@sgdnord.rlp.de
Created on: 16.11.20
"""
from functools import wraps
from django.contrib import messages
from django.shortcuts import redirect, get_object_or_404
from django.urls import reverse
from django.utils.translation import gettext_lazy as _
from konova.settings import DEFAULT_GROUP, ETS_GROUP, ZB_GROUP
from konova.utils.message_templates import MISSING_GROUP_PERMISSION, DATA_UNSHARED
def staff_required(function):
"""
A decorator for functions which shall only be usable for staff members of the system
"""
@wraps(function)
def wrap(request, *args, **kwargs):
user = request.user
if user.is_staff:
return function(request, *args, **kwargs)
else:
messages.info(request, _("You need to be staff to perform this action!"))
return redirect(request.META.get("HTTP_REFERER", reverse("home")))
return wrap
def superuser_required(function):
"""
A decorator for functions which shall only be usable for superusers of the system
"""
@wraps(function)
def wrap(request, *args, **kwargs):
user = request.user
if user.is_superuser:
return function(request, *args, **kwargs)
else:
messages.info(request, _("You need to be administrator to perform this action!"))
return redirect(request.META.get("HTTP_REFERER", reverse("home")))
return wrap
def any_group_check(function):
"""
Checks for any group membership. Adds a message in case of having none.
"""
@wraps(function)
def wrap(request, *args, **kwargs):
user = request.user
# Inform user about missing group privileges!
groups = user.groups.all()
if not groups:
messages.info(
request,
_("+++ Attention: You are not part of any group. You won't be able to create, edit or do anything. Please contact an administrator. +++")
)
return function(request, *args, **kwargs)
return wrap
def default_group_required(function):
"""
A decorator for functions which shall only be usable for users of specific groups.
Group identifiers can be found in konova/settings.py
"""
@wraps(function)
def wrap(request, *args, **kwargs):
user = request.user
has_group = user.is_default_user()
if has_group:
return function(request, *args, **kwargs)
else:
messages.info(request, MISSING_GROUP_PERMISSION)
return redirect(request.META.get("HTTP_REFERER", reverse("home")))
return wrap
def registration_office_group_required(function):
"""
A decorator for functions which shall only be usable for users of specific groups.
Group identifiers can be found in konova/settings.py
"""
@wraps(function)
def wrap(request, *args, **kwargs):
user = request.user
has_group = user.is_zb_user()
if has_group:
return function(request, *args, **kwargs)
else:
messages.info(request, MISSING_GROUP_PERMISSION)
return redirect(request.META.get("HTTP_REFERER", reverse("home")))
return wrap
def conservation_office_group_required(function):
"""
A decorator for functions which shall only be usable for users of specific groups.
Group identifiers can be found in konova/settings.py
"""
@wraps(function)
def wrap(request, *args, **kwargs):
user = request.user
has_group = user.is_ets_user()
if has_group:
return function(request, *args, **kwargs)
else:
messages.info(request, MISSING_GROUP_PERMISSION)
return redirect(request.META.get("HTTP_REFERER", reverse("home")))
return wrap
def shared_access_required(obj_class, id_key):
""" Checks whether the data is shared with the requesting user
Args:
obj_class (Model): The object/model class
id_key (str): The name of the identifier attribute in **kwargs
Returns:
"""
def decorator(function):
@wraps(function)
def wrap(request, *args, **kwargs):
user = request.user
_id = kwargs.get(id_key, None)
if _id is not None:
obj = get_object_or_404(obj_class, id=_id)
is_shared = obj.is_shared_with(user)
if not is_shared:
messages.info(
request,
DATA_UNSHARED
)
return redirect("home")
return function(request, *args, **kwargs)
return wrap
return decorator