import logging, os from urllib.parse import urlencode from django.http import HttpResponse, HttpResponseRedirect from django.shortcuts import redirect from django.urls import reverse from django.utils.translation import gettext as _ from base.models import MultipleApprovalManagers from employee.models import Employee, EmployeeWorkInformation from django.contrib import messages from django.shortcuts import render from horilla.settings import TEMPLATES, BASE_DIR from horilla import settings from base.models import BiometricAttendance logger = logging.getLogger(__name__) TEMPLATES[0]["DIRS"] = [os.path.join(BASE_DIR, "templates")] decorator_with_arguments = ( lambda decorator: lambda *args, **kwargs: lambda func: decorator( func, *args, **kwargs ) ) def check_manager(employee, instance): try: if isinstance(instance, Employee): return instance.employee_work_info.reporting_manager_id == employee return employee == instance.employee_id.employee_work_info.reporting_manager_id except: return False @decorator_with_arguments def permission_required(function, perm): def _function(request, *args, **kwargs): if request.user.has_perm(perm): return function(request, *args, **kwargs) else: messages.info(request, "You dont have permission.") previous_url = request.META.get("HTTP_REFERER", "/") key = "HTTP_HX_REQUEST" if key in request.META.keys(): return render(request, "decorator_404.html") script = f'' return HttpResponse(script) return _function decorator_with_arguments = ( lambda decorator: lambda *args, **kwargs: lambda func: decorator( func, *args, **kwargs ) ) @decorator_with_arguments def delete_permission(function): def _function(request, *args, **kwargs): user = request.user employee = user.employee_get is_manager = EmployeeWorkInformation.objects.filter( reporting_manager_id=employee ).exists() if ( request.user.has_perm( kwargs["model"]._meta.app_label + ".delete_" + kwargs["model"]._meta.model_name ) or is_manager ): return function(request, *args, **kwargs) else: messages.info(request, "You dont have permission for delete.") previous_url = request.META.get("HTTP_REFERER", "/") key = "HTTP_HX_REQUEST" if key in request.META.keys(): return render(request, "decorator_404.html") script = f'' return HttpResponse(script) return _function decorator_with_arguments = ( lambda decorator: lambda *args, **kwargs: lambda func: decorator( func, *args, **kwargs ) ) @decorator_with_arguments def duplicate_permission(function): def _function(request, *args, **kwargs): user = request.user employee = user.employee_get is_manager = EmployeeWorkInformation.objects.filter( reporting_manager_id=employee ).exists() app_label = kwargs["model"]._meta.app_label model_name = kwargs["model"]._meta.model_name obj_id = kwargs["obj_id"] object_instance = kwargs["model"].objects.filter(pk=obj_id).first() try: if object_instance.employee_id == employee: return function(request, *args, **kwargs) except: pass permission = f"{app_label}.add_{model_name}" if request.user.has_perm(permission) or is_manager: return function(request, *args, **kwargs) else: messages.info(request, "You dont have permission for duplicate action.") previous_url = request.META.get("HTTP_REFERER", "/") key = "HTTP_HX_REQUEST" if key in request.META.keys(): return render(request, "decorator_404.html") script = f'' return HttpResponse(script) return _function decorator_with_arguments = ( lambda decorator: lambda *args, **kwargs: lambda func: decorator( func, *args, **kwargs ) ) @decorator_with_arguments def manager_can_enter(function, perm): """ This method is used to check permission to employee for enter to the function if the employee do not have permission also checks, has reporting manager. """ def _function(request, *args, **kwargs): leave_perm = [ "leave.view_leaverequest", "leave.change_leaverequest", "leave.delete_leaverequest", ] user = request.user employee = user.employee_get if perm in leave_perm: is_approval_manager = MultipleApprovalManagers.objects.filter( employee_id=employee.id ).exists() if is_approval_manager: return function(request, *args, **kwargs) is_manager = EmployeeWorkInformation.objects.filter( reporting_manager_id=employee ).exists() if user.has_perm(perm) or is_manager: return function(request, *args, **kwargs) else: messages.info(request, "You dont have permission.") previous_url = request.META.get("HTTP_REFERER", "/") script = f'' key = "HTTP_HX_REQUEST" if key in request.META.keys(): return render(request, "decorator_404.html") return HttpResponse(script) return _function def login_required(view_func): def wrapped_view(request, *args, **kwargs): path = request.path res = path.split("/", 2)[1].capitalize().replace("-", " ").upper() if res == "PMS": res = "Performance" request.session["title"] = res if path == "" or path == "/": request.session["title"] = "Dashboard".upper() if not request.user.is_authenticated: login_url = reverse("login") params = urlencode(request.GET) url = f"{login_url}?next={request.path}" if params: url += f"&{params}" return redirect(url) try: func = view_func(request, *args, **kwargs) except Exception as e: logger.exception(e) if not settings.DEBUG: return render(request, "went_wrong.html") return view_func(request, *args, **kwargs) return func return wrapped_view def hx_request_required(view_func): def wrapped_view(request, *args, **kwargs): key = "HTTP_HX_REQUEST" if key not in request.META.keys(): return HttpResponse("method not allowed...") return view_func(request, *args, **kwargs) return wrapped_view @decorator_with_arguments def owner_can_enter(function, perm: str, model: object, manager_access=False): """ Only the users with permission, or the owner, or employees manager can enter, If manager_access:True then all the managers can enter """ def _function(request, *args, **kwargs): instance_id = kwargs[list(kwargs.keys())[0]] if model == Employee: employee = Employee.objects.get(id=instance_id) else: employee = model.objects.get(id=instance_id).employee_id can_enter = ( request.user.employee_get == employee or request.user.has_perm(perm) or check_manager(request.user.employee_get, employee) or ( EmployeeWorkInformation.objects.filter( reporting_manager_id__employee_user_id=request.user ).exists() if manager_access else False ) ) if can_enter: return function(request, *args, **kwargs) return render(request, "no_perm.html") return _function def install_required(function): def _function(request, *args, **kwargs): object = BiometricAttendance.objects.all().first() if object.is_installed: return function(request, *args, **kwargs) else: messages.info( request, _( "Please activate the biometric attendance feature in the settings menu." ), ) return HttpResponseRedirect(request.META.get("HTTP_REFERER", "/")) return _function