From f59124fefa35f75e9ef7aa7b9a38e0ed99da6042 Mon Sep 17 00:00:00 2001 From: Sabu Siyad Date: Wed, 3 May 2023 19:15:42 +0530 Subject: [PATCH 1/4] feat(api): ticket: bulk insert --- helpdesk/api/ticket.py | 52 +++++++++++++++++++++++++++++------------- 1 file changed, 36 insertions(+), 16 deletions(-) diff --git a/helpdesk/api/ticket.py b/helpdesk/api/ticket.py index 8ad1d8f59..8d0c9ca70 100644 --- a/helpdesk/api/ticket.py +++ b/helpdesk/api/ticket.py @@ -1,21 +1,41 @@ import json -import frappe +import frappe +from frappe.automation.doctype.assignment_rule.assignment_rule import apply +from frappe.contacts.doctype.contact.contact import get_contact_name +from frappe.core.doctype.data_import.data_import import form_start_import +from frappe.handler import upload_file +from frappe.utils import datetime from frappe.website.utils import cleanup_page_name -from helpdesk.helpdesk.doctype.hd_ticket_activity.hd_ticket_activity import ( - log_ticket_activity, + +from helpdesk.helpdesk.doctype.hd_service_level_agreement.hd_service_level_agreement import ( + get_expected_time_for, ) from helpdesk.helpdesk.doctype.hd_ticket.hd_ticket import ( create_communication_via_contact, get_all_conversations, ) -from frappe.utils import datetime - -from helpdesk.helpdesk.doctype.hd_service_level_agreement.hd_service_level_agreement import ( - get_expected_time_for, +from helpdesk.helpdesk.doctype.hd_ticket_activity.hd_ticket_activity import ( + log_ticket_activity, ) -from frappe.automation.doctype.assignment_rule.assignment_rule import apply -from frappe.contacts.doctype.contact.contact import get_contact_name + + +@frappe.whitelist() +def bulk_insert(): + file = upload_file() + data_import_doc = frappe.get_doc( + { + "doctype": "Data Import", + "reference_doctype": "HD Ticket", + "import_type": "Insert New Records", + "import_file": file.file_url, + } + ) + + data_import_doc.save() + form_start_import(data_import_doc.name) + + return data_import_doc @frappe.whitelist() @@ -90,7 +110,7 @@ def bulk_insert_tickets(tickets, sla="Default"): ticket += [ t_idx, - t_name, # name TODO: folow naming series + t_name, # name TODO: folow naming series sla, resolution_by_wrt_priority[ticket[4]], resolution_by_wrt_priority[ticket[4]], @@ -100,7 +120,7 @@ def bulk_insert_tickets(tickets, sla="Default"): communication = [ c_idx, - c_name, # name TODO: folow naming series + c_name, # name TODO: folow naming series "Communication", "Email", "Received", @@ -495,11 +515,11 @@ def get_all_ticket_templates(): def activities(name): activities = frappe.db.sql( """ - SELECT action, creation, owner - FROM `tabTicket Activity` - WHERE ticket = %(ticket)s - ORDER BY creation DESC - """, + SELECT action, creation, owner + FROM `tabTicket Activity` + WHERE ticket = %(ticket)s + ORDER BY creation DESC + """, values={"ticket": name}, as_dict=1, ) From b7a3566bd3ea1a6ab866e59b7ec622600b17821f Mon Sep 17 00:00:00 2001 From: Sabu Siyad Date: Wed, 3 May 2023 19:38:44 +0530 Subject: [PATCH 2/4] fix: use `start_import` instead of `form_start_import` former is a background job while latter is not --- helpdesk/api/ticket.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/helpdesk/api/ticket.py b/helpdesk/api/ticket.py index 8d0c9ca70..47002fcdc 100644 --- a/helpdesk/api/ticket.py +++ b/helpdesk/api/ticket.py @@ -3,7 +3,7 @@ import frappe from frappe.automation.doctype.assignment_rule.assignment_rule import apply from frappe.contacts.doctype.contact.contact import get_contact_name -from frappe.core.doctype.data_import.data_import import form_start_import +from frappe.core.doctype.data_import.data_import import start_import from frappe.handler import upload_file from frappe.utils import datetime from frappe.website.utils import cleanup_page_name @@ -33,7 +33,7 @@ def bulk_insert(): ) data_import_doc.save() - form_start_import(data_import_doc.name) + start_import(data_import_doc.name) return data_import_doc From 20536bee6b3ab726244ef650b369e20130f0d033 Mon Sep 17 00:00:00 2001 From: Sabu Siyad Date: Thu, 4 May 2023 14:59:05 +0530 Subject: [PATCH 3/4] chore: make method more generic --- helpdesk/api/ticket.py | 21 ++++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/helpdesk/api/ticket.py b/helpdesk/api/ticket.py index 47002fcdc..20c96a1e0 100644 --- a/helpdesk/api/ticket.py +++ b/helpdesk/api/ticket.py @@ -5,6 +5,7 @@ from frappe.contacts.doctype.contact.contact import get_contact_name from frappe.core.doctype.data_import.data_import import start_import from frappe.handler import upload_file +from frappe.model.document import Document from frappe.utils import datetime from frappe.website.utils import cleanup_page_name @@ -21,13 +22,27 @@ @frappe.whitelist() -def bulk_insert(): +def bulk_insert( + target_doctype: str, import_type: str = "Insert New Records" +) -> Document: + """ + Upload a file and initiate an import against a DocType. File can be of any + type supported by data import tool. File should be in a form with key `file`. + + Caveats + - `doctype` can not be used as argument, since it is already used by `upload_file` + - `file` is not an explicit argument, but is required by `upload_file` + + :param target_doctype: DocType against which import should be performed + :param import_type: An import type supported by data import tool + :return: Newly created `Data Import` document + """ file = upload_file() data_import_doc = frappe.get_doc( { "doctype": "Data Import", - "reference_doctype": "HD Ticket", - "import_type": "Insert New Records", + "reference_doctype": target_doctype, + "import_type": import_type, "import_file": file.file_url, } ) From 35a6efba1d7c98bb3ad4fb01cb926924d7849750 Mon Sep 17 00:00:00 2001 From: Sabu Siyad Date: Thu, 4 May 2023 15:28:25 +0530 Subject: [PATCH 4/4] chore: move method to `extends.data_import` --- helpdesk/api/ticket.py | 67 ++++++++------------------------- helpdesk/extends/data_import.py | 36 ++++++++++++++++++ 2 files changed, 52 insertions(+), 51 deletions(-) create mode 100644 helpdesk/extends/data_import.py diff --git a/helpdesk/api/ticket.py b/helpdesk/api/ticket.py index 20c96a1e0..8ad1d8f59 100644 --- a/helpdesk/api/ticket.py +++ b/helpdesk/api/ticket.py @@ -1,56 +1,21 @@ import json - import frappe -from frappe.automation.doctype.assignment_rule.assignment_rule import apply -from frappe.contacts.doctype.contact.contact import get_contact_name -from frappe.core.doctype.data_import.data_import import start_import -from frappe.handler import upload_file -from frappe.model.document import Document -from frappe.utils import datetime -from frappe.website.utils import cleanup_page_name -from helpdesk.helpdesk.doctype.hd_service_level_agreement.hd_service_level_agreement import ( - get_expected_time_for, +from frappe.website.utils import cleanup_page_name +from helpdesk.helpdesk.doctype.hd_ticket_activity.hd_ticket_activity import ( + log_ticket_activity, ) from helpdesk.helpdesk.doctype.hd_ticket.hd_ticket import ( create_communication_via_contact, get_all_conversations, ) -from helpdesk.helpdesk.doctype.hd_ticket_activity.hd_ticket_activity import ( - log_ticket_activity, -) - - -@frappe.whitelist() -def bulk_insert( - target_doctype: str, import_type: str = "Insert New Records" -) -> Document: - """ - Upload a file and initiate an import against a DocType. File can be of any - type supported by data import tool. File should be in a form with key `file`. - - Caveats - - `doctype` can not be used as argument, since it is already used by `upload_file` - - `file` is not an explicit argument, but is required by `upload_file` - - :param target_doctype: DocType against which import should be performed - :param import_type: An import type supported by data import tool - :return: Newly created `Data Import` document - """ - file = upload_file() - data_import_doc = frappe.get_doc( - { - "doctype": "Data Import", - "reference_doctype": target_doctype, - "import_type": import_type, - "import_file": file.file_url, - } - ) - - data_import_doc.save() - start_import(data_import_doc.name) +from frappe.utils import datetime - return data_import_doc +from helpdesk.helpdesk.doctype.hd_service_level_agreement.hd_service_level_agreement import ( + get_expected_time_for, +) +from frappe.automation.doctype.assignment_rule.assignment_rule import apply +from frappe.contacts.doctype.contact.contact import get_contact_name @frappe.whitelist() @@ -125,7 +90,7 @@ def bulk_insert_tickets(tickets, sla="Default"): ticket += [ t_idx, - t_name, # name TODO: folow naming series + t_name, # name TODO: folow naming series sla, resolution_by_wrt_priority[ticket[4]], resolution_by_wrt_priority[ticket[4]], @@ -135,7 +100,7 @@ def bulk_insert_tickets(tickets, sla="Default"): communication = [ c_idx, - c_name, # name TODO: folow naming series + c_name, # name TODO: folow naming series "Communication", "Email", "Received", @@ -530,11 +495,11 @@ def get_all_ticket_templates(): def activities(name): activities = frappe.db.sql( """ - SELECT action, creation, owner - FROM `tabTicket Activity` - WHERE ticket = %(ticket)s - ORDER BY creation DESC - """, + SELECT action, creation, owner + FROM `tabTicket Activity` + WHERE ticket = %(ticket)s + ORDER BY creation DESC + """, values={"ticket": name}, as_dict=1, ) diff --git a/helpdesk/extends/data_import.py b/helpdesk/extends/data_import.py new file mode 100644 index 000000000..84734886a --- /dev/null +++ b/helpdesk/extends/data_import.py @@ -0,0 +1,36 @@ +import frappe + +from frappe.handler import upload_file +from frappe.model.document import Document + + +@frappe.whitelist() +def bulk_insert( + target_doctype: str, import_type: str = "Insert New Records" +) -> Document: + """ + Upload a file and initiate an import against a DocType. File can be of any + type supported by data import tool. File should be in a form with key `file`. + + Caveats + - `doctype` can not be used as argument, since it is already used by `upload_file` + - `file` is not an explicit argument, but is required by `upload_file` + + :param target_doctype: DocType against which import should be performed + :param import_type: An import type supported by data import tool + :return: Newly created `Data Import` document + """ + file = upload_file() + data_import_doc = frappe.get_doc( + { + "doctype": "Data Import", + "reference_doctype": target_doctype, + "import_type": import_type, + "import_file": file.file_url, + } + ) + + data_import_doc.save() + data_import_doc.start_import() + + return data_import_doc