[ADD] HORILLA API: Add Horilla API into master code base

This commit is contained in:
Horilla
2024-10-10 15:41:46 +05:30
parent f42ac1a391
commit 053964edd9
42 changed files with 7330 additions and 0 deletions

View 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

View 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