From c4e8d77a7ca0a322f34cbe972394e89b9068e368 Mon Sep 17 00:00:00 2001 From: Horilla Date: Wed, 21 May 2025 19:48:50 +0530 Subject: [PATCH] [UPDT] EMPLOYEE: Optimize bulk_create operations in Employee module with batch_size=1000 for improved performance on large imports --- employee/methods/methods.py | 17 ++++++++++------- employee/static/employee/actions.js | 12 ++++++++++-- employee/views.py | 18 +++++++++++++++++- 3 files changed, 37 insertions(+), 10 deletions(-) diff --git a/employee/methods/methods.py b/employee/methods/methods.py index 57f7fed42..71332dc43 100644 --- a/employee/methods/methods.py +++ b/employee/methods/methods.py @@ -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"): diff --git a/employee/static/employee/actions.js b/employee/static/employee/actions.js index 98c4fe4da..14a61e03d 100644 --- a/employee/static/employee/actions.js +++ b/employee/static/employee/actions.js @@ -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")); diff --git a/employee/views.py b/employee/views.py index c80e8e304..ab5dfc604 100755 --- a/employee/views.py +++ b/employee/views.py @@ -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 )