Files
ihrm/employee/policies.py
elchimeneas 641a4d4842 i18n: improve translations across horilla (#1014)
- Added trans() / _() translations to models, forms and templates.
- Updated Spanish locale (django.po).
- Fixed missing verbose_name translations.

Known issues:
- "Leave Type" label in horilla/leave/forms.py not translating.
- "Performance" and "Mails automations" still pending.
2025-12-23 11:10:04 +05:30

463 lines
14 KiB
Python

"""
policies.py
This module is used to write operation related to policies
"""
import datetime
import json
from datetime import timedelta
from urllib.parse import parse_qs
from django.contrib import messages
from django.contrib.auth.models import User
from django.http import HttpResponse, JsonResponse
from django.shortcuts import get_object_or_404, redirect, render
from django.utils.translation import gettext_lazy as _
from base.methods import (
eval_validate,
filtersubordinates,
get_key_instances,
paginator_qry,
)
from employee.filters import DisciplinaryActionFilter, PolicyFilter
from employee.forms import DisciplinaryActionForm, PolicyForm
from employee.models import (
Actiontype,
DisciplinaryAction,
Employee,
Policy,
PolicyMultipleFile,
)
from horilla.decorators import hx_request_required, login_required, permission_required
from notifications.signals import notify
@login_required
def view_policies(request):
"""
Method is used render template to view all the policy records
"""
policies = Policy.objects.all()
if not request.user.has_perm("employee.view_policy"):
policies = policies.filter(is_visible_to_all=True)
return render(
request,
"policies/view_policies.html",
{"policies": paginator_qry(policies, request.GET.get("page"))},
)
@login_required
@hx_request_required
@permission_required("employee.add_policy")
def create_policy(request):
"""
Method is used to create/update new policy
"""
instance_id = request.GET.get("instance_id")
instance = None
if isinstance(eval_validate(str(instance_id)), int):
instance = Policy.objects.filter(id=instance_id).first()
form = PolicyForm(instance=instance)
if request.method == "POST":
form = PolicyForm(request.POST, request.FILES, instance=instance)
if form.is_valid():
form.save()
messages.success(request, _("Policy saved"))
form = PolicyForm()
# return HttpResponse("<script>window.location.reload()</script>")
return render(request, "policies/form.html", {"form": form})
@login_required
@hx_request_required
def search_policies(request):
"""
This method is used to search in policies
"""
policies = PolicyFilter(request.GET).qs
if not request.user.has_perm("employee.view_policy"):
policies = policies.filter(is_visible_to_all=True)
return render(
request,
"policies/records.html",
{
"policies": paginator_qry(policies, request.GET.get("page")),
"pd": request.GET.urlencode(),
},
)
@login_required
@hx_request_required
def view_policy(request):
"""
This method is used to view the policy
"""
instance_id = request.GET["instance_id"]
policy = Policy.objects.filter(id=instance_id).first()
return render(
request,
"policies/view_policy.html",
{
"policy": policy,
},
)
@login_required
@permission_required("employee.delete_policy")
def delete_policies(request):
"""
This method is to delete policy
"""
try:
ids = request.GET.getlist("ids")
count, dict = Policy.objects.filter(id__in=ids).delete()
if count == 0:
messages.error(request, _("Policies Not Found"))
else:
messages.success(request, _("Policies deleted"))
except ValueError:
messages.error(request, _("Policies Not Found"))
return redirect(view_policies)
@login_required
@permission_required("employee.add_policymultiplefile")
def add_attachment(request):
"""
This method is used to add attachment to policy
"""
files = request.FILES.getlist("files")
policy_id = request.GET["policy_id"]
attachments = []
for file in files:
attachment = PolicyMultipleFile()
attachment.attachment = file
attachment.save()
attachments.append(attachment)
policy = Policy.objects.get(id=policy_id)
policy.attachments.add(*attachments)
messages.success(request, _("Attachments added"))
return render(request, "policies/attachments.html", {"policy": policy})
@login_required
@permission_required("employee.delete_policymultiplefile")
def remove_attachment(request):
"""
This method is used to remove the attachments
"""
ids = request.GET.getlist("ids")
policy_id = request.GET["policy_id"]
policy = Policy.objects.get(id=policy_id)
PolicyMultipleFile.objects.filter(id__in=ids).delete()
return render(request, "policies/attachments.html", {"policy": policy})
@login_required
def get_attachments(request):
"""
This method is used to view all the attachments inside the policy
"""
policy = request.GET["policy_id"]
policy = Policy.objects.get(id=policy)
return render(request, "policies/attachments.html", {"policy": policy})
@login_required
def disciplinary_actions(request):
"""
This method is used to view all Disciplinaryaction
"""
employee = Employee.objects.filter(employee_user_id=request.user).first()
if request.user.has_perm("employee.view_disciplinaryaction"):
dis_actions = DisciplinaryAction.objects.all()
else:
dis_actions = filtersubordinates(
request, DisciplinaryAction.objects.all(), "base.add_disciplinaryaction"
).distinct()
dis_actions = (
dis_actions
| DisciplinaryAction.objects.filter(employee_id=employee).distinct()
)
form = DisciplinaryActionFilter(request.GET, queryset=dis_actions)
page_number = request.GET.get("page")
page_obj = paginator_qry(form.qs, page_number)
previous_data = request.GET.urlencode()
return render(
request,
"disciplinary_actions/disciplinary_nav.html",
{
"data": page_obj,
"pd": previous_data,
"f": form,
},
)
def get_action_type(action_id):
"""
This function is used to get the action type by the selection of title in the form.
"""
action = Actiontype.objects.get(title=action_id["action"])
return action.action_type
def get_action_type_delete(action_id):
"""
This function is used to get the action type by the selection of title in the form.
"""
action = Actiontype.objects.get(title=action_id)
return action.action_type
def get_action_type(action_id):
"""
This function is used to get the action type by the selection of title in the form.
"""
action = Actiontype.objects.get(title=action_id["action"])
return action.action_type
def get_action_type_delete(action_id):
"""
This function is used to get the action type by the selection of title in the form.
"""
action = Actiontype.objects.get(title=action_id)
return action.action_type
def employee_account_block_unblock(emp_id, result):
employee = get_object_or_404(Employee, id=emp_id)
if not employee:
return redirect(disciplinary_actions)
user = get_object_or_404(User, id=employee.employee_user_id.id)
if not user:
return redirect(disciplinary_actions)
user.is_active = result
user.save()
return HttpResponse("<script>window.location.reload()</script>")
@login_required
@hx_request_required
@permission_required("employee.add_disciplinaryaction")
def create_actions(request):
"""
Method is used to create Disciplinaryaction
"""
form = DisciplinaryActionForm()
employees = []
dynamic = (
request.GET.get("dynamic") if request.GET.get("dynamic") != "None" else None
)
if request.GET:
form = DisciplinaryActionForm(request.GET)
if request.method == "POST":
form = DisciplinaryActionForm(request.POST, request.FILES)
if form.is_valid():
employee_ids = form.cleaned_data["employee_id"]
for employee in employee_ids:
user = employee.employee_user_id
employees.append(user)
form.save()
messages.success(request, _("Disciplinary action taken."))
notify.send(
request.user.employee_get,
recipient=employees,
verb="Disciplinary action is taken on you.",
verb_ar="تم اتخاذ إجراء disziplinarisch ضدك.",
verb_de="Disziplinarische Maßnahmen wurden gegen Sie ergriffen.",
verb_es="Se ha tomado acción disciplinaria en tu contra.",
verb_fr="Des mesures disciplinaires ont été prises à votre encontre.",
redirect="/employee/disciplinary-actions/",
icon="chatbox-ellipses",
)
dis = DisciplinaryAction.objects.all()
if len(dis) == 1:
return HttpResponse("<script>window.location.reload()</script>")
return render(
request, "disciplinary_actions/form.html", {"form": form, "dynamic": dynamic}
)
@login_required
@hx_request_required
@permission_required("employee.change_disciplinaryaction")
def update_actions(request, action_id):
"""
Method is used to update Disciplinaryaction
"""
action = DisciplinaryAction.objects.get(id=action_id)
form = DisciplinaryActionForm(instance=action)
employees = []
if request.method == "POST":
form = DisciplinaryActionForm(request.POST, request.FILES, instance=action)
if form.is_valid():
employee_ids = form.cleaned_data["employee_id"]
for employee in employee_ids:
name = employee.employee_user_id
employees.append(name)
form.save()
messages.success(request, _("Disciplinary action updated."))
notify.send(
request.user.employee_get,
recipient=employees,
verb="Disciplinary action is taken on you.",
verb_ar="تم اتخاذ إجراء disziplinarisch ضدك.",
verb_de="Disziplinarische Maßnahmen wurden gegen Sie ergriffen.",
verb_es="Se ha tomado acción disciplinaria en tu contra.",
verb_fr="Des mesures disciplinaires ont été prises à votre encontre.",
redirect="/employee/disciplinary-actions/",
icon="chatbox-ellipses",
)
return render(request, "disciplinary_actions/update_form.html", {"form": form})
@login_required
@hx_request_required
@permission_required("employee.change_disciplinaryaction")
def remove_employee_disciplinary_action(request, action_id, emp_id):
dis_action = DisciplinaryAction.objects.get(id=action_id)
employee = Employee.objects.get(id=emp_id)
action_type = get_action_type_delete(dis_action.action)
if action_type == "dismissal" or action_type == "suspension":
emp = get_object_or_404(Employee, id=emp_id)
user = get_object_or_404(User, id=emp.employee_user_id.id)
if user.is_active:
pass
else:
messages.warning(
request, _("Employees login credentials will be unblocked.")
)
user.is_active = True
user.save()
dis_action.employee_id.remove(employee)
employees = len(dis_action.employee_id.all())
if employees == 0:
dis_action.delete()
messages.success(
request, _("Employee removed from disciplinary action successfully.")
)
return redirect(f"/employee/disciplinary-filter-view?click_id={dis_action.id}")
@login_required
@hx_request_required
@permission_required("employee.delete_disciplinaryaction")
def delete_actions(request, action_id):
"""
This method is used to delete Disciplinary action
"""
dis = DisciplinaryAction.objects.get(id=action_id)
action_type = get_action_type_delete(dis.action)
for dis_emp in dis.employee_id.all():
if action_type == "dismissal" or action_type == "suspension":
employee = get_object_or_404(Employee, id=dis_emp.id)
user = get_object_or_404(User, id=employee.employee_user_id.id)
if user.is_active:
pass
else:
messages.warning(
request, _("Employees login credentials will be unblocked.")
)
user.is_active = True
user.save()
dis.delete()
messages.success(request, _("Disciplinary action deleted."))
dis_actions = DisciplinaryAction.objects.all()
if dis_actions.exists():
return redirect(disciplinary_filter_view)
return HttpResponse("<script>window.location.reload()</script>")
@login_required
def action_type_details(request):
"""
This method is used to get the action type by the selection of title in the form.
"""
action_id = request.POST["action_type"]
action = Actiontype.objects.get(id=action_id)
action_type = action.action_type
return JsonResponse({"action_type": action_type})
@login_required
def action_type_name(request):
"""
This method is used to get the action type name by the selection of type in the form.
"""
action_type = request.POST["action_type"]
return JsonResponse({"action_type": action_type})
@login_required
@hx_request_required
def disciplinary_filter_view(request):
"""
This method is used to filter Disciplinary Action.
"""
previous_data = request.GET.urlencode()
action_id = request.GET.get("click_id") if request.GET.get("click_id") else None
dis_filter = DisciplinaryActionFilter(request.GET).qs
page_number = request.GET.get("page")
page_obj = paginator_qry(dis_filter, page_number)
data_dict = parse_qs(previous_data)
get_key_instances(DisciplinaryAction, data_dict)
return render(
request,
"disciplinary_actions/disciplinary_records.html",
{
"data": page_obj,
"pd": previous_data,
"filter_dict": data_dict,
"dashboard": request.GET.get("dashboard"),
"action_id": action_id,
},
)
@login_required
def search_disciplinary(request):
"""
This method is used to search in Disciplinary Actions
"""
disciplinary = DisciplinaryActionFilter(request.GET).qs
return render(
request,
"disciplinary_actions/disciplinary_records.html",
{
"data": paginator_qry(disciplinary, request.GET.get("page")),
"pd": request.GET.urlencode(),
},
)