This commit introduces significant changes to the architecture of the Horilla HRMS system by decoupling interdependent modules. The following modifications were made: 1. **Module Independence**: Each module has been refactored to eliminate reliance on other modules, promoting a more modular and maintainable codebase. 2. **Refactored Imports and Dependencies**: Adjusted import statements and dependency injections to support independent module operation. 3. **Compatibility and Functionality**: Ensured that all modules are compatible with existing systems and maintain their intended functionality both independently and when integrated with other modules. These changes enhance the modularity, maintainability, and scalability of the Horilla HRMS, allowing developers to work on individual modules without affecting the entire system. Future development and deployment will be more efficient and less prone to issues arising from tightly coupled code. **NOTE** For existing Horilla users, if you face any issues during the migrations, please run the following command and try again the migrations. - `python3 manage.py makemigrations` - `python3 manage.py migrate base` - `python3 manage.py migrate` * [IMP] ASSET: Asset module dependency removal from other Horilla apps * [IMP] ATTENDANCE: Attendance module dependency removal from other Horilla apps * [IMP] BASE: Base module dependency removal from other Horilla apps * [IMP] EMPLOYEE: Employee module dependency removal from other Horilla apps * [IMP] HELPDESK: Helpdesk module dependency removal from other Horilla apps * [IMP] HORILLA AUDIT: Horilla Audit module dependency removal from other Horilla apps * [IMP] HORILLA CRUMBS: Horilla Crumbs module dependency removal from other Horilla apps * [IMP] HORILLA AUTOMATIONS: Horilla Automations module dependency removal from other Horilla apps * [IMP] HORILLA VIEWS: Horilla Views module dependency removal from other Horilla apps * [IMP] LEAVE: Leave module dependency removal from other Horilla apps * [IMP] OFFBOARDING: Offboarding module dependency removal from other Horilla apps * [IMP] ONBOARDING: Onboarding module dependency removal from other Horilla apps * [IMP] PMS: PMS module dependency removal from other Horilla apps * [IMP] PAYROLL: Payroll module dependency removal from other Horilla apps * [IMP] RECRUITMENT: Recruitment module dependency removal from other Horilla apps * [IMP] HORILLA: Dependency removal updates * [IMP] TEMPLATES: Dependency removal updates * [IMP] STATIC: Dependency removal updates * [IMP] HORILLA DOCUMENTS: Horilla Documents module dependency removal from other Horilla apps * [ADD] HORILLA: methods.py * [UPDT] HORILLA: Settings.py * [FIX] EMPLOYEE: About tab issue * Update horilla_settings.py * Remove dummy db init password
489 lines
16 KiB
Python
489 lines
16 KiB
Python
"""
|
|
search.py
|
|
|
|
This is moduel is used to register end point related to the search filter functionalities
|
|
"""
|
|
|
|
import json
|
|
from datetime import datetime
|
|
from urllib.parse import parse_qs
|
|
|
|
from django.http import JsonResponse
|
|
from django.shortcuts import render
|
|
from django.utils.translation import gettext_lazy as _
|
|
|
|
from attendance.filters import (
|
|
AttendanceActivityFilter,
|
|
AttendanceFilters,
|
|
AttendanceOverTimeFilter,
|
|
LateComeEarlyOutFilter,
|
|
)
|
|
from attendance.forms import AttendanceOverTimeForm
|
|
from attendance.models import (
|
|
Attendance,
|
|
AttendanceActivity,
|
|
AttendanceLateComeEarlyOut,
|
|
AttendanceOverTime,
|
|
AttendanceValidationCondition,
|
|
)
|
|
from attendance.views.views import paginator_qry, strtime_seconds
|
|
from base.methods import filtersubordinates, get_key_instances, sortby
|
|
from horilla.decorators import hx_request_required, login_required, manager_can_enter
|
|
from horilla.group_by import group_by_queryset
|
|
|
|
|
|
@login_required
|
|
@hx_request_required
|
|
@manager_can_enter("attendance.view_attendance")
|
|
def attendance_search(request):
|
|
"""
|
|
This method is used to search attendances
|
|
"""
|
|
month_name = ""
|
|
params = [
|
|
"employee_id",
|
|
"attendance_validated",
|
|
"attendance_date__gte",
|
|
"attendance_date__lte",
|
|
]
|
|
remove_params = []
|
|
if params == list(request.GET.keys()):
|
|
remove_params = [param for param in params if param != "employee_id"]
|
|
previous_data = request.GET.urlencode()
|
|
field = request.GET.get("field")
|
|
minot = strtime_seconds("00:00")
|
|
condition = AttendanceValidationCondition.objects.first()
|
|
all_attendances = Attendance.objects.all()
|
|
if request.GET.get("sortby"):
|
|
all_attendances = sortby(request, all_attendances, "sortby")
|
|
|
|
if condition is not None and condition.minimum_overtime_to_approve is not None:
|
|
minot = strtime_seconds(condition.minimum_overtime_to_approve)
|
|
|
|
validate_attendances = all_attendances.filter(attendance_validated=False)
|
|
attendances = all_attendances.filter(attendance_validated=True)
|
|
ot_attendances = all_attendances.filter(
|
|
overtime_second__gte=minot,
|
|
attendance_validated=True,
|
|
)
|
|
|
|
validate_attendances = AttendanceFilters(request.GET, validate_attendances).qs
|
|
attendances = AttendanceFilters(request.GET, attendances).qs
|
|
ot_attendances = AttendanceFilters(request.GET, ot_attendances).qs
|
|
|
|
if not request.user.has_perm("attendance.view_attendance"):
|
|
attendances = filtersubordinates(
|
|
request, attendances, "attendance.view_attendance"
|
|
)
|
|
validate_attendances = filtersubordinates(
|
|
request, validate_attendances, "attendance.view_attendance"
|
|
)
|
|
ot_attendances = filtersubordinates(
|
|
request, ot_attendances, "attendance.view_attendance"
|
|
)
|
|
data_dict = parse_qs(previous_data)
|
|
get_key_instances(Attendance, data_dict)
|
|
keys_to_remove = [
|
|
key
|
|
for key, value in data_dict.items()
|
|
if value == ["unknown"] or key in remove_params
|
|
]
|
|
for key in keys_to_remove:
|
|
data_dict.pop(key)
|
|
if params == list(request.GET.keys()):
|
|
ot_attendances = validate_attendances = attendances
|
|
template = "attendance/attendance/validate_attendance.html"
|
|
if not attendances:
|
|
date_object = datetime.strptime(
|
|
request.GET.get("attendance_date__gte"), "%Y-%m-%d"
|
|
)
|
|
month_name = _(date_object.strftime("%B"))
|
|
template = "attendance/attendance/validate_attendance_empty.html"
|
|
|
|
template = "attendance/attendance/tab_content.html"
|
|
validate_attendances_ids, ot_attendances_ids, attendances_ids = [], [], []
|
|
if field != "" and field is not None:
|
|
attendances = group_by_queryset(
|
|
attendances, field, request.GET.get("page"), "page"
|
|
)
|
|
list_values = [entry["list"] for entry in attendances]
|
|
id_list = []
|
|
for value in list_values:
|
|
for instance in value.object_list:
|
|
id_list.append(instance.id)
|
|
attendances_ids = json.dumps(list(id_list))
|
|
|
|
validate_attendances = group_by_queryset(
|
|
validate_attendances, field, request.GET.get("vpage"), "vpage"
|
|
)
|
|
list_values = [entry["list"] for entry in validate_attendances]
|
|
id_list = []
|
|
for value in list_values:
|
|
for instance in value.object_list:
|
|
id_list.append(instance.id)
|
|
validate_attendances_ids = json.dumps(list(id_list))
|
|
|
|
ot_attendances = group_by_queryset(
|
|
ot_attendances, field, request.GET.get("opage"), "opage"
|
|
)
|
|
list_values = [entry["list"] for entry in ot_attendances]
|
|
id_list = []
|
|
for value in list_values:
|
|
for instance in value.object_list:
|
|
id_list.append(instance.id)
|
|
ot_attendances_ids = json.dumps(list(id_list))
|
|
|
|
template = "attendance/attendance/group_by.html"
|
|
else:
|
|
validate_attendances = paginator_qry(
|
|
validate_attendances, request.GET.get("vpage")
|
|
)
|
|
ot_attendances = paginator_qry(ot_attendances, request.GET.get("opage"))
|
|
attendances = paginator_qry(attendances, request.GET.get("page"))
|
|
validate_attendances_ids = json.dumps(
|
|
[instance.id for instance in validate_attendances.object_list]
|
|
)
|
|
ot_attendances_ids = json.dumps(
|
|
[instance.id for instance in ot_attendances.object_list]
|
|
)
|
|
attendances_ids = json.dumps(
|
|
[instance.id for instance in attendances.object_list]
|
|
)
|
|
return render(
|
|
request,
|
|
template,
|
|
{
|
|
"validate_attendances": validate_attendances,
|
|
"attendances": attendances,
|
|
"overtime_attendances": ot_attendances,
|
|
"validate_attendances_ids": validate_attendances_ids,
|
|
"ot_attendances_ids": ot_attendances_ids,
|
|
"attendances_ids": attendances_ids,
|
|
"pd": previous_data,
|
|
"field": field,
|
|
"filter_dict": data_dict,
|
|
"month_name": month_name,
|
|
},
|
|
)
|
|
|
|
|
|
@login_required
|
|
def attendance_overtime_search(request):
|
|
"""
|
|
This method is used to search attendance overtime account by employee.
|
|
"""
|
|
field = request.GET.get("field")
|
|
previous_data = request.GET.urlencode()
|
|
|
|
accounts = AttendanceOverTimeFilter(request.GET).qs
|
|
form = AttendanceOverTimeForm()
|
|
template = "attendance/attendance_account/overtime_list.html"
|
|
self_account = accounts.filter(employee_id__employee_user_id=request.user)
|
|
accounts = sortby(request, accounts, "sortby")
|
|
accounts = filtersubordinates(
|
|
request, accounts, "attendance.view_attendanceovertime"
|
|
)
|
|
accounts = accounts | self_account
|
|
accounts = accounts.distinct()
|
|
data_dict = parse_qs(previous_data)
|
|
get_key_instances(AttendanceOverTime, data_dict)
|
|
keys_to_remove = [key for key, value in data_dict.items() if value == ["unknown"]]
|
|
for key in keys_to_remove:
|
|
data_dict.pop(key)
|
|
if field != "" and field is not None:
|
|
accounts = group_by_queryset(accounts, field, request.GET.get("page"), "page")
|
|
template = "attendance/attendance_account/group_by.html"
|
|
else:
|
|
accounts = paginator_qry(accounts, request.GET.get("page"))
|
|
return render(
|
|
request,
|
|
template,
|
|
{
|
|
"accounts": accounts,
|
|
"form": form,
|
|
"pd": previous_data,
|
|
"field": field,
|
|
"filter_dict": data_dict,
|
|
},
|
|
)
|
|
|
|
|
|
@login_required
|
|
@hx_request_required
|
|
def attendance_activity_search(request):
|
|
"""
|
|
This method is used to search attendance activity
|
|
"""
|
|
previous_data = request.GET.urlencode()
|
|
field = request.GET.get("field")
|
|
attendance_activities = AttendanceActivityFilter(
|
|
request.GET,
|
|
).qs
|
|
self_attendance_activities = attendance_activities.filter(
|
|
employee_id__employee_user_id=request.user
|
|
)
|
|
attendance_activities = filtersubordinates(
|
|
request, attendance_activities, "attendance.view_attendanceovertime"
|
|
)
|
|
attendance_activities = attendance_activities | self_attendance_activities
|
|
attendance_activities = attendance_activities.distinct()
|
|
template = "attendance/attendance_activity/activity_list.html"
|
|
attendance_activities = sortby(request, attendance_activities, "orderby")
|
|
if field != "" and field is not None:
|
|
attendance_activities = group_by_queryset(
|
|
attendance_activities, field, request.GET.get("page"), "page"
|
|
)
|
|
list_values = [entry["list"] for entry in attendance_activities]
|
|
id_list = []
|
|
for value in list_values:
|
|
for instance in value.object_list:
|
|
id_list.append(instance.id)
|
|
activity_ids = json.dumps(list(id_list))
|
|
template = "attendance/attendance_activity/group_by.html"
|
|
else:
|
|
attendance_activities = paginator_qry(
|
|
attendance_activities, request.GET.get("page")
|
|
)
|
|
activity_ids = json.dumps(
|
|
[instance.id for instance in paginator_qry(attendance_activities, None)]
|
|
)
|
|
data_dict = parse_qs(previous_data)
|
|
get_key_instances(AttendanceActivity, data_dict)
|
|
keys_to_remove = [key for key, value in data_dict.items() if value == ["unknown"]]
|
|
for key in keys_to_remove:
|
|
data_dict.pop(key)
|
|
return render(
|
|
request,
|
|
template,
|
|
{
|
|
"data": attendance_activities,
|
|
"pd": previous_data,
|
|
"field": field,
|
|
"filter_dict": data_dict,
|
|
"activity_ids": activity_ids,
|
|
},
|
|
)
|
|
|
|
|
|
@login_required
|
|
@hx_request_required
|
|
def late_come_early_out_search(request):
|
|
"""
|
|
This method is used to search late come early out by employee.
|
|
Also include filter and pagination.
|
|
"""
|
|
field = request.GET.get("field")
|
|
previous_data = request.GET.urlencode()
|
|
reports = LateComeEarlyOutFilter(
|
|
request.GET,
|
|
).qs
|
|
self_reports = reports.filter(employee_id__employee_user_id=request.user)
|
|
|
|
reports = filtersubordinates(
|
|
request, reports, "attendance.view_attendancelatecomeearlyout"
|
|
)
|
|
reports = reports | self_reports
|
|
reports.distinct()
|
|
reports = sortby(request, reports, "sortby")
|
|
template = "attendance/late_come_early_out/report_list.html"
|
|
if field != "" and field is not None:
|
|
template = "attendance/late_come_early_out/group_by.html"
|
|
reports = group_by_queryset(reports, field, request.GET.get("page"), "page")
|
|
list_values = [entry["list"] for entry in reports]
|
|
id_list = []
|
|
for value in list_values:
|
|
for instance in value.object_list:
|
|
id_list.append(instance.id)
|
|
late_in_early_out_ids = json.dumps(list(id_list))
|
|
else:
|
|
reports = paginator_qry(reports, request.GET.get("page"))
|
|
late_in_early_out_ids = json.dumps(
|
|
[instance.id for instance in reports.object_list]
|
|
)
|
|
|
|
data_dict = parse_qs(previous_data)
|
|
get_key_instances(AttendanceLateComeEarlyOut, data_dict)
|
|
keys_to_remove = [key for key, value in data_dict.items() if value == ["unknown"]]
|
|
for key in keys_to_remove:
|
|
data_dict.pop(key)
|
|
|
|
return render(
|
|
request,
|
|
template,
|
|
{
|
|
"data": reports,
|
|
"pd": previous_data,
|
|
"field": field,
|
|
"filter_dict": data_dict,
|
|
"late_in_early_out_ids": late_in_early_out_ids,
|
|
},
|
|
)
|
|
|
|
|
|
@login_required
|
|
@hx_request_required
|
|
def filter_own_attendance(request):
|
|
"""
|
|
This method is used to filter own attendances
|
|
"""
|
|
params = [
|
|
"employee_id",
|
|
"attendance_validated",
|
|
"attendance_date__gte",
|
|
"attendance_date__lte",
|
|
]
|
|
remove_params = []
|
|
if params == list(request.GET.keys()):
|
|
remove_params = [
|
|
param
|
|
for param in params
|
|
if param != "attendance_date__gte" and param != "attendance_date__lte"
|
|
]
|
|
|
|
attendances = Attendance.objects.filter(employee_id=request.user.employee_get)
|
|
attendances = AttendanceFilters(request.GET, queryset=attendances).qs
|
|
previous_data = request.GET.urlencode()
|
|
data_dict = parse_qs(previous_data)
|
|
field = request.GET.get("field")
|
|
template = "attendance/own_attendance/attendances.html"
|
|
previous_data = request.GET.urlencode()
|
|
keys_to_remove = [
|
|
key
|
|
for key, value in data_dict.items()
|
|
if value == ["unknown"] or key in remove_params
|
|
]
|
|
for key in keys_to_remove:
|
|
data_dict.pop(key)
|
|
attendances_ids = json.dumps(
|
|
[
|
|
instance.id
|
|
for instance in paginator_qry(
|
|
attendances, request.GET.get("page")
|
|
).object_list
|
|
]
|
|
)
|
|
if field != "" and field is not None:
|
|
attendances = group_by_queryset(
|
|
attendances, field, request.GET.get("page"), "page"
|
|
)
|
|
template = "attendance/own_attendance/group_by.html"
|
|
attendances_ids = []
|
|
return render(
|
|
request,
|
|
template,
|
|
{
|
|
"attendances": paginator_qry(attendances, request.GET.get("page")),
|
|
"filter_dict": data_dict,
|
|
"attendances_ids": attendances_ids,
|
|
"pd": previous_data,
|
|
"field": field,
|
|
},
|
|
)
|
|
|
|
|
|
@login_required
|
|
@hx_request_required
|
|
def own_attendance_sort(request):
|
|
"""
|
|
This method is used to sort out attendances
|
|
"""
|
|
attendances = Attendance.objects.filter(employee_id=request.user.employee_get)
|
|
previous_data = request.GET.urlencode()
|
|
attendances = sortby(request, attendances, "orderby")
|
|
return render(
|
|
request,
|
|
"attendance/own_attendance/attendances.html",
|
|
{
|
|
"attendances": paginator_qry(attendances, request.GET.get("page")),
|
|
"pd": previous_data,
|
|
},
|
|
)
|
|
|
|
|
|
@login_required
|
|
@hx_request_required
|
|
def search_attendance_requests(request):
|
|
field = request.GET.get("field")
|
|
all_attendance = Attendance.objects.all()
|
|
if request.GET.get("sortby"):
|
|
all_attendance = sortby(request, all_attendance, "sortby")
|
|
|
|
requests = all_attendance.filter(
|
|
is_validate_request=True, employee_id__is_active=True
|
|
)
|
|
requests = filtersubordinates(
|
|
request=request,
|
|
perm="attendance.view_attendance",
|
|
queryset=requests,
|
|
)
|
|
requests = requests | all_attendance.filter(
|
|
employee_id__employee_user_id=request.user,
|
|
is_validate_request=True,
|
|
)
|
|
requests = AttendanceFilters(request.GET, requests).qs
|
|
attendances = filtersubordinates(
|
|
request=request,
|
|
perm="attendance.view_attendance",
|
|
queryset=all_attendance.all(),
|
|
)
|
|
attendances = attendances | all_attendance.filter(
|
|
employee_id__employee_user_id=request.user
|
|
)
|
|
attendances = AttendanceFilters(request.GET, attendances).qs
|
|
previous_data = request.GET.urlencode()
|
|
data_dict = parse_qs(previous_data)
|
|
get_key_instances(Attendance, data_dict)
|
|
|
|
keys_to_remove = [key for key, value in data_dict.items() if value == ["unknown"]]
|
|
for key in keys_to_remove:
|
|
data_dict.pop(key)
|
|
|
|
template = "requests/attendance/request_lines.html"
|
|
requests_ids = json.dumps(
|
|
[
|
|
instance.id
|
|
for instance in paginator_qry(
|
|
requests, request.GET.get("rpage")
|
|
).object_list
|
|
]
|
|
)
|
|
attendances_ids = json.dumps(
|
|
[
|
|
instance.id
|
|
for instance in paginator_qry(
|
|
attendances, request.GET.get("page")
|
|
).object_list
|
|
]
|
|
)
|
|
if field != "" and field is not None:
|
|
requests = group_by_queryset(requests, field, request.GET.get("rpage"), "rpage")
|
|
attendances = group_by_queryset(
|
|
attendances, field, request.GET.get("page"), "page"
|
|
)
|
|
template = "requests/attendance/group_by.html"
|
|
else:
|
|
requests = paginator_qry(requests, request.GET.get("rpage"))
|
|
attendances = paginator_qry(attendances, request.GET.get("page"))
|
|
return render(
|
|
request,
|
|
template,
|
|
{
|
|
"requests": requests,
|
|
"attendances": attendances,
|
|
"requests_ids": requests_ids,
|
|
"attendances_ids": attendances_ids,
|
|
"pd": previous_data,
|
|
"filter_dict": data_dict,
|
|
"field": field,
|
|
},
|
|
)
|
|
|
|
|
|
@login_required
|
|
def widget_filter(request):
|
|
"""
|
|
This method is used to return all the ids of the employees
|
|
"""
|
|
ids = AttendanceFilters(request.GET).qs.values_list("id", flat=True)
|
|
return JsonResponse({"ids": list(ids)})
|