diff --git a/base/models.py b/base/models.py index 3e68ec7c8..4c2e04e29 100644 --- a/base/models.py +++ b/base/models.py @@ -53,6 +53,8 @@ class Company(models.Model): Meta class to add additional options """ + verbose_name = _("Company") + verbose_name_plural = _("Companies") unique_together = ["company", "address"] def __str__(self) -> str: @@ -67,6 +69,10 @@ class Department(models.Model): department = models.CharField(max_length=50, blank=False, unique=True) objects = models.Manager() + class Meta: + verbose_name = _("Department") + verbose_name_plural = _("Departments") + def __str__(self): return str(self.department) @@ -86,6 +92,14 @@ class JobPosition(models.Model): ) objects = models.Manager() + class Meta: + """ + Meta class to add additional options + """ + + verbose_name = _("Job Position") + verbose_name_plural = _("Job Positions") + def __str__(self): return str(self.job_position) @@ -104,6 +118,8 @@ class JobRole(models.Model): Meta class to add additional options """ + verbose_name = _("Job Role") + verbose_name_plural = _("Job Roles") unique_together = ("job_position_id", "job_role") def __str__(self): @@ -118,6 +134,14 @@ class WorkType(models.Model): work_type = models.CharField(max_length=50) objects = models.Manager() + class Meta: + """ + Meta class to add additional options + """ + + verbose_name = _("Work Type") + verbose_name_plural = _("Work Types") + def __str__(self) -> str: return str(self.work_type) @@ -147,6 +171,14 @@ class RotatingWorkType(models.Model): ) objects = models.Manager() + class Meta: + """ + Meta class to add additional options + """ + + verbose_name = _("Rotating Work Type") + verbose_name_plural = _("Rotating Work Types") + def __str__(self) -> str: return str(self.name) @@ -216,6 +248,8 @@ class RotatingWorkTypeAssign(models.Model): Meta class to add additional options """ + verbose_name = _("Rotating Work Type Assign") + verbose_name_plural = _("Rotating Work Type Assigns") ordering = ["-next_change_date", "-employee_id__employee_first_name"] def clean(self): @@ -238,6 +272,14 @@ class EmployeeType(models.Model): employee_type = models.CharField(max_length=50) objects = models.Manager() + class Meta: + """ + Meta class to add additional options + """ + + verbose_name = _("Employee Type") + verbose_name_plural = _("Employee Types") + def __str__(self) -> str: return str(self.employee_type) @@ -250,6 +292,14 @@ class EmployeeShiftDay(models.Model): day = models.CharField(max_length=20, choices=DAY) objects = models.Manager() + class Meta: + """ + Meta class to add additional options + """ + + verbose_name = _("Employee Shift Day") + verbose_name_plural = _("Employee Shift Days") + def __str__(self) -> str: return str(_(self.day).capitalize()) @@ -277,6 +327,14 @@ class EmployeeShift(models.Model): ) objects = models.Manager() + class Meta: + """ + Meta class to add additional options + """ + + verbose_name = _("Employee Shift") + verbose_name_plural = _("Employee Shifts") + def __str__(self) -> str: return str(self.employee_shift) @@ -305,6 +363,8 @@ class EmployeeShiftSchedule(models.Model): Meta class to add additional options """ + verbose_name = _("Employee Shift Schedule") + verbose_name_plural = _("Employee Shift Schedules") unique_together = [["shift_id", "day"]] def __str__(self) -> str: @@ -339,6 +399,14 @@ class RotatingShift(models.Model): ) objects = models.Manager() + class Meta: + """ + Meta class to add additional options + """ + + verbose_name = _("Rotating Shift") + verbose_name_plural = _("Rotating Shifts") + def __str__(self) -> str: return str(self.name) @@ -389,6 +457,8 @@ class RotatingShiftAssign(models.Model): Meta class to add additional options """ + verbose_name = _("Rotating Shift Assign") + verbose_name_plural = _("Rotating Shift Assigns") ordering = ["-next_change_date", "-employee_id__employee_first_name"] def clean(self): @@ -450,6 +520,8 @@ class WorkTypeRequest(models.Model): Meta class to add additional options """ + verbose_name = _("Work Type Request") + verbose_name_plural = _("Work Type Requests") permissions = ( ("approve_worktyperequest", "Approve Work Type Request"), ("cancel_worktyperequest", "Cancel Work Type Request"), @@ -557,6 +629,8 @@ class ShiftRequest(models.Model): Meta class to add additional options """ + verbose_name = _("Shift Request") + verbose_name_plural = _("Shift Requests") permissions = ( ("approve_shiftrequest", "Approve Shift Request"), ("cancel_shiftrequest", "Cancel Shift Request"), diff --git a/base/urls.py b/base/urls.py index 38f1bc62e..72da2a013 100644 --- a/base/urls.py +++ b/base/urls.py @@ -1,5 +1,18 @@ from django.urls import path from base import views +from base.models import ( + Company, + Department, + EmployeeShift, + EmployeeShiftSchedule, + EmployeeType, + JobPosition, + JobRole, + RotatingShift, + RotatingWorkType, + WorkType, +) +from django.contrib.auth.models import Group urlpatterns = [ path("", views.home, name="home-page"), @@ -19,7 +32,10 @@ urlpatterns = [ name="user-group-update", ), path( - "user-group-delete//", views.user_group_delete, name="user-group-delete" + "user-group-delete//", + views.object_delete, + name="user-group-delete", + kwargs={"model": Group, "redirect": "/settings/user-group-create"}, ), path( "group-permission-remove///", @@ -55,7 +71,12 @@ urlpatterns = [ path( "settings/company-update//", views.company_update, name="company-update" ), - path("company-delete//", views.company_delete, name="company-delete"), + path( + "company-delete//", + views.object_delete, + name="company-delete", + kwargs={"model": Company, "redirect": "/settings/company-create"}, + ), path("settings/department-creation", views.department, name="department-creation"), path( "settings/department-update//", @@ -63,7 +84,10 @@ urlpatterns = [ name="department-update", ), path( - "department-delete//", views.department_delete, name="department-delete" + "department-delete//", + views.object_delete, + name="department-delete", + kwargs={"model": Department, "redirect": "/settings/department-creation"}, ), path( "settings/job-position-creation", @@ -77,8 +101,9 @@ urlpatterns = [ ), path( "job-position-delete//", - views.job_position_delete, + views.object_delete, name="job-position-delete", + kwargs={"model": JobPosition, "redirect": "/settings/job-position-creation"}, ), path("settings/job-role-create", views.job_role_create, name="job-role-create"), path( @@ -86,14 +111,24 @@ urlpatterns = [ views.job_role_update, name="job-role-update", ), - path("job-role-delete//", views.job_role_delete, name="job-role-delete"), + path( + "job-role-delete//", + views.object_delete, + name="job-role-delete", + kwargs={"model": JobRole, "redirect": "/settings/job-role-create"}, + ), path("settings/work-type-create", views.work_type_create, name="work-type-create"), path( "settings/work-type-update//", views.work_type_update, name="work-type-update", ), - path("work-type-delete//", views.work_type_delete, name="work-type-delete"), + path( + "work-type-delete//", + views.object_delete, + name="work-type-delete", + kwargs={"model": WorkType, "redirect": "/settings/work-type-create"}, + ), path( "settings/rotating-work-type-create", views.rotating_work_type_create, @@ -106,8 +141,12 @@ urlpatterns = [ ), path( "rotating-work-type-delete//", - views.rotating_work_type_delete, + views.object_delete, name="rotating-work-type-delete", + kwargs={ + "model": RotatingWorkType, + "redirect": "/settings/rotating-work-type-create", + }, ), path( "employee/rotating-work-type-assign", @@ -161,8 +200,12 @@ urlpatterns = [ ), path( "employee-type-delete//", - views.employee_type_delete, + views.object_delete, name="employee-type-delete", + kwargs={ + "model": EmployeeType, + "redirect": "/settings/employee-type-create", + }, ), path( "settings/employee-shift-create", @@ -176,8 +219,12 @@ urlpatterns = [ ), path( "employee-shift-delete//", - views.employee_shift_delete, + views.object_delete, name="employee-shift-delete", + kwargs={ + "model": EmployeeShift, + "redirect": "/settings/employee-shift-create", + }, ), path( "settings/employee-shift-schedule-create", @@ -191,8 +238,12 @@ urlpatterns = [ ), path( "employee-shift-schedule-delete//", - views.employee_shift_schedule_delete, + views.object_delete, name="employee-shift-schedule-delete", + kwargs={ + "model": EmployeeShiftSchedule, + "redirect": "/settings/employee-shift-schedule-create", + }, ), path( "settings/rotating-shift-create", @@ -206,8 +257,12 @@ urlpatterns = [ ), path( "rotating-shift-delete//", - views.rotating_shift_delete, + views.object_delete, name="rotating-shift-delete", + kwargs={ + "model": RotatingShift, + "redirect": "/settings/rotating-shift-create", + }, ), path( "employee/rotating-shift-assign", diff --git a/base/views.py b/base/views.py index 7da540cc2..c65202299 100644 --- a/base/views.py +++ b/base/views.py @@ -25,7 +25,12 @@ from base.decorators import ( work_type_request_change_permission, ) from notifications.signals import notify -from horilla.decorators import permission_required, login_required, manager_can_enter +from horilla.decorators import ( + delete_permission, + permission_required, + login_required, + manager_can_enter, +) from horilla.settings import EMAIL_HOST_USER from employee.models import Employee from base.forms import ( @@ -427,23 +432,30 @@ def user_group_update(request, id): @login_required -@permission_required("base.delete_group") -@require_http_methods(["POST"]) -def user_group_delete(request, id): - """ - This method is used to delete user group - args: - id : group instance id - - """ +@delete_permission() +@require_http_methods(["POST", "DELETE"]) +def object_delete(request, id, **kwargs): + model = kwargs["model"] + redirect_path = kwargs["redirect"] try: - user_group = Group.objects.get(id=id).delete() - messages.success(request, _("User group deleted.")) - except Group.DoesNotExist: - messages.error(request, _("User group not found.")) - except ProtectedError: - messages.error(request, _("You cannot delete this user group.")) - return redirect("/settings/user-group-create") + instance = model.objects.get(id=id) + instance.delete() + messages.success( + request, _("The {} has been deleted successfully.").format(instance) + ) + except model.DoesNotExist: + messages.error(request, _("{} not found.").format(model._meta.verbose_name)) + except ProtectedError as e: + model_verbose_names_set = set() + for obj in e.protected_objects: + model_verbose_names_set.add(_(obj._meta.verbose_name.capitalize())) + + model_names_str = ", ".join(model_verbose_names_set) + messages.error( + request, + _("This {} is already in use for {}.").format(instance, model_names_str), + ), + return redirect(redirect_path) @login_required @@ -492,35 +504,6 @@ def company_update(request, id): ) -@login_required -@permission_required("base.base.delete_company") -@require_http_methods(["POST"]) -def company_delete(request, id): - """ - This method is used to delete company - args: - id : company instance id - - """ - - try: - company = Company.objects.get(id=id).delete() - messages.success(request, _("Company deleted.")) - except Company.DoesNotExist: - messages.error(request, _("Company not found.")) - except ProtectedError as e: - model_verbose_names_set = set() - for obj in e.protected_objects: - model_verbose_names_set.add(_(obj._meta.verbose_name.capitalize())) - - model_names_str = ", ".join(model_verbose_names_set) - messages.error( - request, _("This company is already in use for {}.").format(model_names_str) - ) - - return redirect(company_create) - - @login_required @permission_required("base.add_department") def department(request): @@ -567,35 +550,6 @@ def department_update(request, id): ) -@login_required -@permission_required("base.delete_department") -@require_http_methods(["POST", "DELETE"]) -def department_delete(request, id): - """ - This method is used to delete department instance - args: - id : department instance id - """ - - try: - departments = Department.objects.get(id=id).delete() - messages.success(request, _("Department deleted.")) - except Department.DoesNotExist: - messages.error(request, _("Department not found.")) - except ProtectedError as e: - model_verbose_names_set = set() - for obj in e.protected_objects: - model_verbose_names_set.add(_(obj._meta.verbose_name.capitalize())) - - model_names_str = ", ".join(model_verbose_names_set) - messages.error( - request, - _("This department is already in use for {}.").format(model_names_str), - ), - - return redirect("/settings/department-creation") - - @login_required @permission_required("base.add_jobposition") def job_position(request): @@ -642,35 +596,6 @@ def job_position_update(request, id): ) -@login_required -@permission_required("base.delete_jobposition") -@require_http_methods(["POST"]) -def job_position_delete(request, id): - """ - This method is used to delete job position - args: - id : job position id - """ - - try: - job_position = JobPosition.objects.get(id=id).delete() - messages.success(request, _("Job Position Deleted.")) - except JobPosition.DoesNotExist: - messages.error(request, _("JobPosition not found.")) - except ProtectedError as e: - model_verbose_names_set = set() - for obj in e.protected_objects: - model_verbose_names_set.add(_(obj._meta.verbose_name.capitalize())) - model_names_str = ", ".join(model_verbose_names_set) - - messages.error( - request, - _("This job position is already in use for {}.").format(model_names_str), - ), - - return redirect("/settings/job-position-creation") - - @login_required @permission_required("base.add_jobrole") def job_role_create(request): @@ -716,35 +641,6 @@ def job_role_update(request, id): ) -@login_required -@permission_required("base.delete_jobrole") -@require_http_methods(["POST"]) -def job_role_delete(request, id): - """ - This method is used to delete job role - args: - id : job role instance id - """ - try: - job_role = JobRole.objects.get(id=id).delete() - messages.success(request, _("Job Role Deleted.")) - except JobRole.DoesNotExist: - messages.error(request, _("Job role not found.")) - except ProtectedError as e: - model_verbose_names_set = set() - for obj in e.protected_objects: - model_verbose_names_set.add(_(obj._meta.verbose_name.capitalize())) - - model_names_str = ", ".join(model_verbose_names_set) - - messages.error( - request, - _("This job role is already in use for {}.").format(model_names_str), - ), - - return redirect("/settings/job-role-create") - - @login_required @permission_required("base.add_worktype") def work_type_create(request): @@ -794,35 +690,6 @@ def work_type_update(request, id): ) -@login_required -@permission_required("base.delete_worktype") -@require_http_methods(["POST", "DELETE"]) -def work_type_delete(request, id): - """ - This method is used to delete work type instance - args: - id : work type instance id - """ - try: - work_type = WorkType.objects.get(id=id).delete() - messages.success(request, _("Work type deleted.")) - except WorkType.DoesNotExist: - messages.error(request, _("Work type not found.")) - except ProtectedError as e: - model_verbose_names_set = set() - for obj in e.protected_objects: - model_verbose_names_set.add(_(obj._meta.verbose_name.capitalize())) - - model_names_str = ", ".join(model_verbose_names_set) - - messages.error( - request, - _("This work type is already in use for {}.").format(model_names_str), - ), - - return redirect("/settings/work-type-create") - - @login_required @permission_required("base.add_rotatingworktype") def rotating_work_type_create(request): @@ -871,38 +738,6 @@ def rotating_work_type_update(request, id): ) -@login_required -@permission_required("base.delete_rotatingworktype") -@require_http_methods(["POST", "DELETE"]) -def rotating_work_type_delete(request, id): - """ - This method is used to delete rotating work type - args: - id : rotating work type id - - """ - try: - rotating_work_type = RotatingWorkType.objects.get(id=id).delete() - messages.success(request, _("Rotating work type deleted.")) - except RotatingWorkType.DoesNotExist: - messages.error(request, _("Rotating work type not found.")) - except ProtectedError as e: - model_verbose_names_set = set() - for obj in e.protected_objects: - model_verbose_names_set.add(_(obj._meta.verbose_name.capitalize())) - - model_names_str = ", ".join(model_verbose_names_set) - - messages.error( - request, - _("This rotating work type is already in use for {}.").format( - model_names_str - ), - ), - - return redirect("/settings/rotating-work-type-create") - - @login_required @manager_can_enter("base.view_rotatingworktypeassign") def rotating_work_type_assign(request): @@ -1261,35 +1096,6 @@ def employee_type_update(request, id): ) -@login_required -@permission_required("base.delete_employeetype") -@require_http_methods(["POST"]) -def employee_type_delete(request, id): - """ - This method is used to delete employee type - args: - id : employee type id - """ - try: - employee_type = EmployeeType.objects.get(id=id).delete() - messages.success(request, _("Employee type deleted.")) - except EmployeeType.DoesNotExist: - messages.error(request, _("Employee type not found.")) - except ProtectedError as e: - model_verbose_names_set = set() - for obj in e.protected_objects: - model_verbose_names_set.add(_(obj._meta.verbose_name.capitalize())) - - model_names_str = ", ".join(model_verbose_names_set) - - messages.error( - request, - _("This employee type is already in use for {}.").format(model_names_str), - ), - - return redirect("/settings/employee-type-create") - - @login_required @permission_required("base.add_employeeshift") def employee_shift_create(request): @@ -1333,34 +1139,6 @@ def employee_shift_update(request, id): ) -@login_required -@permission_required("base.delete_employeeshift") -@require_http_methods(["POST"]) -def employee_shift_delete(request, id): - """ - This method is used to delete shift - args: - id : employee shift instance id - """ - - try: - employee_shift = EmployeeShift.objects.get(id=id).delete() - messages.success(request, _("Employee shift deleted.")) - except EmployeeShift.DoesNotExist: - messages.error(request, _("This shift not found.")) - except ProtectedError as e: - model_verbose_names_set = set() - for obj in e.protected_objects: - model_verbose_names_set.add(_(obj._meta.verbose_name.capitalize())) - - model_names_str = ", ".join(model_verbose_names_set) - messages.error( - request, _("This shift is already in use for {}.").format(model_names_str) - ) - - return redirect("/settings/employee-shift-create") - - @login_required @permission_required("base.add_employeeshiftschedule") def employee_shift_schedule_create(request): @@ -1404,25 +1182,6 @@ def employee_shift_schedule_update(request, id): return render(request, "base/shift/schedule.html", {"form": form, "shifts": shifts}) -@login_required -@permission_required("base.delete_employeeshiftschedule") -@require_http_methods(["POST"]) -def employee_shift_schedule_delete(request, id): - """ - This method is used to delete employee shift instance - args: - id : employee shift instance id - """ - try: - employee_shift_schedule = EmployeeShiftSchedule.objects.get(id=id).delete() - messages.success(request, _("Shift schedule deleted.")) - except EmployeeShiftSchedule.DoesNotExist: - messages.error(request, _("Shift schedule not found.")) - except ProtectedError: - messages.error(request, _("You cannot delete this schedule")) - return redirect("/settings/employee-shift-schedule-create") - - @login_required @permission_required("base.add_rotatingshift") def rotating_shift_create(request): @@ -1474,35 +1233,6 @@ def rotating_shift_update(request, id): ) -@login_required -@permission_required("base.delete_rotatingshift") -@require_http_methods(["POST"]) -def rotating_shift_delete(request, id): - """ - This method is used to delete rotating shift - args: - id : rotating shift instance id - - """ - try: - rotating_shift = RotatingShift.objects.get(id=id).delete() - messages.success(request, _("Rotating shift deleted.")) - except RotatingShift.DoesNotExist: - messages.error(request, _("Rotating shift not found.")) - except ProtectedError as e: - model_verbose_names_set = set() - for obj in e.protected_objects: - model_verbose_names_set.add(_(obj._meta.verbose_name.capitalize())) - - model_names_str = ", ".join(model_verbose_names_set) - messages.error( - request, - _("This rotating shift is already in use for {}.").format(model_names_str), - ), - - return redirect(rotating_shift_create) - - @login_required @manager_can_enter("base.view_rotatingshiftassign") def rotating_shift_assign(request): diff --git a/horilla/decorators.py b/horilla/decorators.py index 4b721193c..394ad72ea 100755 --- a/horilla/decorators.py +++ b/horilla/decorators.py @@ -16,6 +16,19 @@ def permission_required(function, perm): 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): + if request.user.has_perm( kwargs["model"]._meta.app_label + ".delete_" + kwargs["model"]._meta.model_name): + return function(request, *args, **kwargs) + else: + messages.info(request,'You dont have permission for delete.') + return HttpResponseRedirect(request. META. get('HTTP_REFERER', '/')) + + return _function + + decorator_with_arguments = lambda decorator: lambda *args, **kwargs: lambda func: decorator(func, *args, **kwargs) @decorator_with_arguments