Files
ihrm/recruitment/decorators.py

148 lines
4.1 KiB
Python
Raw Normal View History

"""
decorators.py
Custom decorators for permission and manager checks in the application.
"""
2023-05-10 15:06:57 +05:30
from django.contrib import messages
from django.http import HttpResponse, HttpResponseRedirect
from django.shortcuts import render
from employee.models import Employee
from recruitment.models import Recruitment, Stage
def decorator_with_arguments(decorator):
"""
Decorator that allows decorators to accept arguments and keyword arguments.
Args:
decorator (function): The decorator function to be wrapped.
Returns:
function: The wrapper function.
"""
def wrapper(*args, **kwargs):
"""
Wrapper function that captures the arguments and keyword arguments.
Args:
*args: Variable length argument list.
**kwargs: Arbitrary keyword arguments.
Returns:
function: The inner wrapper function.
"""
def inner_wrapper(func):
"""
Inner wrapper function that applies the decorator to the function.
Args:
func (function): The function to be decorated.
Returns:
function: The decorated function.
"""
return decorator(func, *args, **kwargs)
return inner_wrapper
return wrapper
2023-05-10 15:06:57 +05:30
@decorator_with_arguments
def manager_can_enter(function, perm):
"""
Decorator that checks if the user has the specified permission or is a manager.
Args:
perm (str): The permission to check.
Returns:
function: The decorated function.
Raises:
None
2023-05-10 15:06:57 +05:30
"""
2023-05-10 15:06:57 +05:30
def _function(request, *args, **kwargs):
"""
Inner function that performs the permission and manager check.
Args:
request (HttpRequest): The request object.
*args: Variable length argument list.
**kwargs: Arbitrary keyword arguments.
Returns:
HttpResponse: The response from the decorated function.
"""
2023-05-10 15:06:57 +05:30
user = request.user
employee = Employee.objects.filter(employee_user_id=user).first()
is_manager = (
Stage.objects.filter(stage_managers=employee).exists()
or Recruitment.objects.filter(recruitment_managers=employee).exists()
)
2023-05-10 15:06:57 +05:30
if user.has_perm(perm) or is_manager:
return function(request, *args, **kwargs)
messages.info(request, "You dont have permission.")
previous_url = request.META.get("HTTP_REFERER", "/")
script = f'<script>window.location.href = "{previous_url}"</script>'
key = "HTTP_HX_REQUEST"
if key in request.META.keys():
return render(request, "decorator_404.html")
return HttpResponse(script)
2023-05-10 15:06:57 +05:30
return _function
2023-05-10 15:06:57 +05:30
@decorator_with_arguments
def recruitment_manager_can_enter(function, perm):
"""
Decorator that checks if the user has the specified permission or is a recruitment manager.
Args:
perm (str): The permission to check.
Returns:
function: The decorated function.
Raises:
None
2023-05-10 15:06:57 +05:30
"""
2023-05-10 15:06:57 +05:30
def _function(request, *args, **kwargs):
"""
Inner function that performs the permission and manager check.
Args:
request (HttpRequest): The request object.
*args: Variable length argument list.
**kwargs: Arbitrary keyword arguments.
Returns:
HttpResponse: The response from the decorated function.
"""
2023-05-10 15:06:57 +05:30
user = request.user
employee = Employee.objects.filter(employee_user_id=user).first()
is_manager = Recruitment.objects.filter(recruitment_managers=employee).exists()
if user.has_perm(perm) or is_manager:
return function(request, *args, **kwargs)
messages.info(request, "You dont have permission.")
previous_url = request.META.get("HTTP_REFERER", "/")
script = f'<script>window.location.href = "{previous_url}"</script>'
key = "HTTP_HX_REQUEST"
if key in request.META.keys():
return render(request, "decorator_404.html")
return HttpResponse(script)
2023-05-10 15:06:57 +05:30
return _function