[UPDT] EMPLOYEE: Optimize bulk_create operations in Employee module with batch_size=1000 for improved performance on large imports

This commit is contained in:
Horilla
2025-05-21 19:48:50 +05:30
parent 97f1843db2
commit c4e8d77a7c
3 changed files with 37 additions and 10 deletions

View File

@@ -401,7 +401,7 @@ def bulk_create_user_import(success_lists):
user_obj_list.append(user_obj)
result = []
if user_obj_list:
result = User.objects.bulk_create(user_obj_list)
result = User.objects.bulk_create(user_obj_list, batch_size=1000)
return result
@@ -440,7 +440,7 @@ def bulk_create_employee_import(success_lists):
employee_obj_list.append(employee_obj)
result = []
if employee_obj_list:
result = Employee.objects.bulk_create(employee_obj_list)
result = Employee.objects.bulk_create(employee_obj_list, batch_size=1000)
return result
@@ -740,8 +740,13 @@ def bulk_create_work_info_import(success_lists):
reporting_manager_dict = optimize_reporting_manager_lookup()
for work_info in success_lists:
email = work_info["Email"]
badge_id = work_info["Badge ID"]
employee_obj = existing_employees.get(badge_id)
if not employee_obj:
continue
email = work_info["Email"]
employee_work_info = existing_employee_work_infos.get(employee_obj)
department_obj = existing_departments.get(work_info.get("Department"))
job_position_key = (
@@ -791,9 +796,6 @@ def bulk_create_work_info_import(success_lists):
else 0
)
employee_obj = existing_employees.get(badge_id)
employee_work_info = existing_employee_work_infos.get(employee_obj)
if employee_work_info is None:
# Create a new instance
employee_work_info = EmployeeWorkInformation(
@@ -841,7 +843,7 @@ def bulk_create_work_info_import(success_lists):
update_work_info_list.append(employee_work_info)
if new_work_info_list:
EmployeeWorkInformation.objects.bulk_create(new_work_info_list)
EmployeeWorkInformation.objects.bulk_create(new_work_info_list, batch_size=1000)
if update_work_info_list:
EmployeeWorkInformation.objects.bulk_update(
update_work_info_list,
@@ -861,6 +863,7 @@ def bulk_create_work_info_import(success_lists):
"basic_salary",
"salary_hour",
],
batch_size=1000,
)
if apps.is_installed("payroll"):

View File

@@ -37,6 +37,14 @@ var noRowMessages = {
fr: "Aucune ligne n'a été sélectionnée pour supprimer des employés.",
};
var noRowUpdateMessages = {
"ar": "لم يتم تحديد أي صفوف لتحديث الموظفين.",
"de": "Es wurden keine Zeilen ausgewählt, um Mitarbeiter zu aktualisieren.",
"es": "No se han seleccionado filas para actualizar empleados.",
"en": "No rows have been selected to update employees.",
"fr": "Aucune ligne n'a été sélectionnée pour mettre à jour des employés."
};
var rowMessages = {
ar: " تم الاختيار",
de: " Ausgewählt",
@@ -335,8 +343,8 @@ $("#employeeBulkUpdateId").click(function (e) {
var languageCode = null;
languageCode = $("#main-section-data").attr("data-lang");
var textMessage =
noRowMessages[languageCode] ||
((languageCode = "en"), noRowMessages[languageCode]);
noRowUpdateMessages[languageCode] ||
((languageCode = "en"), noRowUpdateMessages[languageCode]);
ids = [];
ids.push($("#selectedInstances").attr("data-ids"));
ids = JSON.parse($("#selectedInstances").attr("data-ids"));

View File

@@ -298,7 +298,23 @@ def employee_view_individual(request, obj_id, **kwargs):
"""
This method is used to view profile of an employee.
"""
employee = Employee.objects.get(id=obj_id)
try:
employee = Employee.objects.get(id=obj_id)
except ObjectDoesNotExist:
try:
employee = Employee.objects.entire().get(id=obj_id)
company = getattr(
getattr(employee, "employee_work_info", None), "company_id", None
)
company_id = getattr(company, "pk", None)
if company_id != request.session["selected_company"]:
messages.error(
request, "Employee is not working in the selected company."
)
return redirect("employee-view")
except Exception as e:
return render(request, "404.html", status=404)
employee_leaves = (
employee.available_leave.all() if apps.is_installed("leave") else None
)