From 4a35ff0e5763d4a124de0d84be6a1dce288e1a37 Mon Sep 17 00:00:00 2001 From: Rucha Mahabal Date: Tue, 13 Jun 2023 12:03:55 +0530 Subject: [PATCH] fix: savepoint policy assignment submission, log errors & inform the user about failures (#35507) --- .../leave_policy_assignment.py | 50 ++++++++++++++++--- .../leave_policy_assignment_list.js | 2 +- 2 files changed, 44 insertions(+), 8 deletions(-) diff --git a/erpnext/hr/doctype/leave_policy_assignment/leave_policy_assignment.py b/erpnext/hr/doctype/leave_policy_assignment/leave_policy_assignment.py index 2330541813e..83c0b4dceba 100644 --- a/erpnext/hr/doctype/leave_policy_assignment/leave_policy_assignment.py +++ b/erpnext/hr/doctype/leave_policy_assignment/leave_policy_assignment.py @@ -8,7 +8,15 @@ from math import ceil import frappe from frappe import _, bold from frappe.model.document import Document -from frappe.utils import date_diff, flt, formatdate, get_last_day, get_link_to_form, getdate +from frappe.utils import ( + comma_and, + date_diff, + flt, + formatdate, + get_last_day, + get_link_to_form, + getdate, +) from six import string_types @@ -207,7 +215,6 @@ def add_current_month_if_applicable(months_passed, date_of_joining, based_on_doj @frappe.whitelist() def create_assignment_for_multiple_employees(employees, data): - if isinstance(employees, string_types): employees = json.loads(employees) @@ -215,6 +222,8 @@ def create_assignment_for_multiple_employees(employees, data): data = frappe._dict(json.loads(data)) docs_name = [] + failed = [] + for employee in employees: assignment = frappe.new_doc("Leave Policy Assignment") assignment.employee = employee @@ -225,18 +234,45 @@ def create_assignment_for_multiple_employees(employees, data): assignment.leave_period = data.leave_period or None assignment.carry_forward = data.carry_forward assignment.save() - try: - assignment.submit() - except frappe.exceptions.ValidationError: - continue - frappe.db.commit() + savepoint = "before_assignment_submission" + + try: + frappe.db.savepoint(savepoint) + assignment.submit() + except Exception as e: + frappe.db.rollback(save_point=savepoint) + frappe.log_error(title=f"Leave Policy Assignment submission failed for {assignment.name}") + failed.append(assignment.name) docs_name.append(assignment.name) + if failed: + show_assignment_submission_status(failed) + return docs_name +def show_assignment_submission_status(failed): + frappe.clear_messages() + assignment_list = [get_link_to_form("Leave Policy Assignment", entry) for entry in failed] + + msg = _("Failed to submit some leave policy assignments:") + msg += " " + comma_and(assignment_list, False) + "
" + msg += ( + _("Check {0} for more details") + .format("{0}") + .format(_("Error Log")) + ) + + frappe.msgprint( + msg, + indicator="red", + title=_("Submission Failed"), + is_minimizable=True, + ) + + def get_leave_type_details(): leave_type_details = frappe._dict() leave_types = frappe.get_all( diff --git a/erpnext/hr/doctype/leave_policy_assignment/leave_policy_assignment_list.js b/erpnext/hr/doctype/leave_policy_assignment/leave_policy_assignment_list.js index 6b75817cba9..fd038ded691 100644 --- a/erpnext/hr/doctype/leave_policy_assignment/leave_policy_assignment_list.js +++ b/erpnext/hr/doctype/leave_policy_assignment/leave_policy_assignment_list.js @@ -52,7 +52,7 @@ frappe.listview_settings['Leave Policy Assignment'] = { get_query() { let filters = {"is_active": 1}; if (cur_dialog.fields_dict.company.value) - filters["company"] = cur_dialog.fields_dict.company.value; + filters["company"] = cur_dialog?.fields_dict?.company?.value; return { filters: filters