[ADD] HORILLA API: Add Horilla API into master code base
This commit is contained in:
101
horilla_api/api_decorators/base/decorators.py
Normal file
101
horilla_api/api_decorators/base/decorators.py
Normal file
@@ -0,0 +1,101 @@
|
||||
from rest_framework.permissions import BasePermission
|
||||
from base.models import MultipleApprovalManagers
|
||||
from employee.models import EmployeeWorkInformation
|
||||
from functools import wraps
|
||||
from rest_framework.response import Response
|
||||
from rest_framework import status
|
||||
|
||||
|
||||
class ManagerPermission(BasePermission):
|
||||
leave_perm = [
|
||||
"leave.view_leaverequest",
|
||||
"leave.change_leaverequest",
|
||||
"leave.delete_leaverequest",
|
||||
]
|
||||
|
||||
def has_permission(self, request, perm):
|
||||
user = request.user
|
||||
employee = user.employee_get
|
||||
if perm in self.leave_perm:
|
||||
is_approval_manager = MultipleApprovalManagers.objects.filter(
|
||||
employee_id=employee.id
|
||||
).exists()
|
||||
if is_approval_manager:
|
||||
return True
|
||||
|
||||
is_manager = EmployeeWorkInformation.objects.filter(
|
||||
reporting_manager_id=employee
|
||||
).exists()
|
||||
|
||||
if user.has_perm(perm) or is_manager:
|
||||
return True
|
||||
return False
|
||||
|
||||
|
||||
def manager_permission_required(perm):
|
||||
"""
|
||||
Decorator for views that checks whether the user has appropriate manager permissions.
|
||||
"""
|
||||
def decorator(func):
|
||||
@wraps(func)
|
||||
def wrapper(self, request, *args, **kwargs):
|
||||
permission = ManagerPermission()
|
||||
if permission.has_permission(request, perm):
|
||||
return func(self, request, *args, **kwargs)
|
||||
else:
|
||||
return Response(
|
||||
{"error": "You do not have permission to perform this action."},
|
||||
status=status.HTTP_403_FORBIDDEN,
|
||||
)
|
||||
return wrapper
|
||||
return decorator
|
||||
|
||||
|
||||
def manager_or_owner_permission_required(model_class, perm):
|
||||
"""
|
||||
Decorator for views that checks whether the user has either manager or owner permissions and a specific permission for a specific object for a given model class.
|
||||
"""
|
||||
def decorator(func):
|
||||
@wraps(func)
|
||||
def wrapper(self, request, pk=None, *args, **kwargs):
|
||||
if pk:
|
||||
try:
|
||||
obj = model_class.objects.get(pk=pk)
|
||||
# Check if the requesting user is the owner of the object
|
||||
if obj.employee_id == request.user.employee_get:
|
||||
return func(self, request, pk, *args, **kwargs)
|
||||
except model_class.DoesNotExist:
|
||||
return Response({"error": f"{model_class.__name__} does not exist"}, status=status.HTTP_404_NOT_FOUND)
|
||||
else:
|
||||
if request.data.get('employee_id', None) == request.user.employee_get.id:
|
||||
return func(self, request, *args, **kwargs)
|
||||
# If not the owner, check for manager permission
|
||||
permission = ManagerPermission()
|
||||
if permission.has_permission(request, perm) and pk:
|
||||
return func(self, request,pk, *args, **kwargs)
|
||||
elif permission.has_permission(request, perm) and pk == None:
|
||||
return func(self, request, *args, **kwargs)
|
||||
else:
|
||||
return Response(
|
||||
{"error": "You do not have permission to perform this action."},
|
||||
status=status.HTTP_403_FORBIDDEN,
|
||||
)
|
||||
|
||||
return wrapper
|
||||
|
||||
return decorator
|
||||
|
||||
|
||||
def check_approval_status(model, perm):
|
||||
""" checking the object approval status """
|
||||
def decorator(func):
|
||||
@wraps(func)
|
||||
def wrapper(self, request, pk, *args, **kwargs):
|
||||
object = model.objects.filter(id = pk).first()
|
||||
if object.approved:
|
||||
return Response({"error":f"Approved {model.__name__} can't preform this action "},status=400)
|
||||
if object.canceled:
|
||||
return Response({"error":f"Canceled {model.__name__} can't preform this action "},status=400)
|
||||
return func(self, request, pk ,*args, **kwargs)
|
||||
return wrapper
|
||||
return decorator
|
||||
19
horilla_api/api_decorators/employee/decorators.py
Normal file
19
horilla_api/api_decorators/employee/decorators.py
Normal file
@@ -0,0 +1,19 @@
|
||||
from functools import wraps
|
||||
from django.http import HttpResponseForbidden
|
||||
from django.utils.decorators import method_decorator
|
||||
|
||||
def or_condition(*decorators):
|
||||
"""
|
||||
Combines multiple decorators with OR logic.
|
||||
"""
|
||||
def decorator(view_func):
|
||||
@wraps(view_func)
|
||||
def _wrapped_view(request, *args, **kwargs):
|
||||
# Check if any of the decorators allow access
|
||||
for dec in decorators:
|
||||
if dec(view_func)(request, *args, **kwargs):
|
||||
return view_func(request, *args, **kwargs)
|
||||
# If none of the decorators allow access, return forbidden response
|
||||
return HttpResponseForbidden("You don't have permission to access this page.")
|
||||
return _wrapped_view
|
||||
return decorator
|
||||
Reference in New Issue
Block a user