From f71562fd49ba917cffaba2b4d93e15705a672b35 Mon Sep 17 00:00:00 2001 From: phot0n Date: Sat, 23 Jul 2022 16:23:06 +0530 Subject: [PATCH] chore: add integration request doctype back (with utils) --- .../doctype/integration_request/__init__.py | 0 .../integration_request.js | 8 + .../integration_request.json | 154 ++++++++++++++++++ .../integration_request.py | 37 +++++ .../test_integration_request.py | 11 ++ frappe/integrations/utils.py | 54 ++++++ 6 files changed, 264 insertions(+) create mode 100644 frappe/integrations/doctype/integration_request/__init__.py create mode 100644 frappe/integrations/doctype/integration_request/integration_request.js create mode 100644 frappe/integrations/doctype/integration_request/integration_request.json create mode 100644 frappe/integrations/doctype/integration_request/integration_request.py create mode 100644 frappe/integrations/doctype/integration_request/test_integration_request.py diff --git a/frappe/integrations/doctype/integration_request/__init__.py b/frappe/integrations/doctype/integration_request/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/frappe/integrations/doctype/integration_request/integration_request.js b/frappe/integrations/doctype/integration_request/integration_request.js new file mode 100644 index 0000000000..4b3b9a2de7 --- /dev/null +++ b/frappe/integrations/doctype/integration_request/integration_request.js @@ -0,0 +1,8 @@ +// Copyright (c) 2016, Frappe Technologies and contributors +// For license information, please see license.txt + +frappe.ui.form.on('Integration Request', { + refresh: function(frm) { + + } +}); diff --git a/frappe/integrations/doctype/integration_request/integration_request.json b/frappe/integrations/doctype/integration_request/integration_request.json new file mode 100644 index 0000000000..98db8ea748 --- /dev/null +++ b/frappe/integrations/doctype/integration_request/integration_request.json @@ -0,0 +1,154 @@ +{ + "actions": [], + "creation": "2022-03-28 12:25:29.929952", + "doctype": "DocType", + "editable_grid": 1, + "engine": "InnoDB", + "field_order": [ + "request_id", + "integration_request_service", + "is_remote_request", + "column_break_5", + "request_description", + "status", + "section_break_8", + "url", + "request_headers", + "data", + "response_section", + "output", + "error", + "reference_section", + "reference_doctype", + "column_break_16", + "reference_docname" + ], + "fields": [ + { + "fieldname": "integration_request_service", + "fieldtype": "Data", + "label": "Service", + "read_only": 1 + }, + { + "default": "Queued", + "fieldname": "status", + "fieldtype": "Select", + "in_list_view": 1, + "in_standard_filter": 1, + "label": "Status", + "options": "\nQueued\nAuthorized\nCompleted\nCancelled\nFailed", + "read_only": 1 + }, + { + "fieldname": "data", + "fieldtype": "Code", + "label": "Request Data", + "read_only": 1 + }, + { + "fieldname": "output", + "fieldtype": "Code", + "label": "Output", + "read_only": 1 + }, + { + "fieldname": "error", + "fieldtype": "Code", + "label": "Error", + "read_only": 1 + }, + { + "fieldname": "reference_doctype", + "fieldtype": "Link", + "label": "Reference Document Type", + "options": "DocType", + "read_only": 1 + }, + { + "fieldname": "reference_docname", + "fieldtype": "Dynamic Link", + "label": "Reference Document Name", + "options": "reference_doctype", + "read_only": 1 + }, + { + "default": "0", + "fieldname": "is_remote_request", + "fieldtype": "Check", + "label": "Is Remote Request?", + "read_only": 1 + }, + { + "fieldname": "request_description", + "fieldtype": "Data", + "label": "Request Description", + "read_only": 1 + }, + { + "fieldname": "request_id", + "fieldtype": "Data", + "label": "Request ID", + "read_only": 1 + }, + { + "fieldname": "column_break_5", + "fieldtype": "Column Break" + }, + { + "fieldname": "section_break_8", + "fieldtype": "Section Break" + }, + { + "fieldname": "url", + "fieldtype": "Data", + "label": "URL", + "read_only": 1 + }, + { + "fieldname": "response_section", + "fieldtype": "Section Break", + "label": "Response" + }, + { + "depends_on": "eval:doc.reference_doctype", + "fieldname": "reference_section", + "fieldtype": "Section Break", + "label": "Reference" + }, + { + "fieldname": "column_break_16", + "fieldtype": "Column Break" + }, + { + "fieldname": "request_headers", + "fieldtype": "Code", + "label": "Request Headers", + "read_only": 1 + } + ], + "in_create": 1, + "links": [], + "modified": "2022-04-07 11:32:27.557548", + "modified_by": "Administrator", + "module": "Integrations", + "name": "Integration Request", + "owner": "Administrator", + "permissions": [ + { + "delete": 1, + "email": 1, + "export": 1, + "print": 1, + "read": 1, + "report": 1, + "role": "System Manager", + "share": 1 + } + ], + "sort_field": "modified", + "sort_order": "DESC", + "states": [], + "title_field": "integration_request_service", + "track_changes": 1 +} \ No newline at end of file diff --git a/frappe/integrations/doctype/integration_request/integration_request.py b/frappe/integrations/doctype/integration_request/integration_request.py new file mode 100644 index 0000000000..334736bc9b --- /dev/null +++ b/frappe/integrations/doctype/integration_request/integration_request.py @@ -0,0 +1,37 @@ +# Copyright (c) 2015, Frappe Technologies and contributors +# License: MIT. See LICENSE + +import json + +import frappe +from frappe.integrations.utils import json_handler +from frappe.model.document import Document + + +class IntegrationRequest(Document): + def autoname(self): + if self.flags._name: + self.name = self.flags._name + + def update_status(self, params, status): + data = json.loads(self.data) + data.update(params) + + self.data = json.dumps(data) + self.status = status + self.save(ignore_permissions=True) + frappe.db.commit() + + def handle_success(self, response): + """update the output field with the response along with the relevant status""" + if isinstance(response, str): + response = json.loads(response) + self.db_set("status", "Completed") + self.db_set("output", json.dumps(response, default=json_handler)) + + def handle_failure(self, response): + """update the error field with the response along with the relevant status""" + if isinstance(response, str): + response = json.loads(response) + self.db_set("status", "Failed") + self.db_set("error", json.dumps(response, default=json_handler)) diff --git a/frappe/integrations/doctype/integration_request/test_integration_request.py b/frappe/integrations/doctype/integration_request/test_integration_request.py new file mode 100644 index 0000000000..45963d5096 --- /dev/null +++ b/frappe/integrations/doctype/integration_request/test_integration_request.py @@ -0,0 +1,11 @@ +# Copyright (c) 2015, Frappe Technologies and Contributors +# License: MIT. See LICENSE +import unittest + +import frappe + +# test_records = frappe.get_test_records('Integration Request') + + +class TestIntegrationRequest(unittest.TestCase): + pass diff --git a/frappe/integrations/utils.py b/frappe/integrations/utils.py index 8d3d23bb85..b05d2ef74d 100644 --- a/frappe/integrations/utils.py +++ b/frappe/integrations/utils.py @@ -2,6 +2,7 @@ # License: MIT. See LICENSE import datetime +import json from urllib.parse import parse_qs import frappe @@ -36,6 +37,59 @@ def make_post_request(url, **kwargs): def make_put_request(url, **kwargs): return make_request("PUT", url, **kwargs) +def create_request_log( + data, + integration_type=None, + service_name=None, + name=None, + error=None, + request_headers=None, + output=None, + **kwargs, +): + """ + DEPRECATED: The parameter integration_type will be removed in the next major release. + Use is_remote_request instead. + """ + if integration_type == "Remote": + kwargs["is_remote_request"] = 1 + + elif integration_type == "Subscription Notification": + kwargs["request_description"] = integration_type + + reference_doctype = reference_docname = None + if "reference_doctype" not in kwargs: + if isinstance(data, str): + data = json.loads(data) + + reference_doctype = data.get("reference_doctype") + reference_docname = data.get("reference_docname") + + integration_request = frappe.get_doc( + { + "doctype": "Integration Request", + "integration_request_service": service_name, + "request_headers": get_json(request_headers), + "data": get_json(data), + "output": get_json(output), + "error": get_json(error), + "reference_doctype": reference_doctype, + "reference_docname": reference_docname, + **kwargs, + } + ) + + if name: + integration_request.flags._name = name + + integration_request.insert(ignore_permissions=True) + frappe.db.commit() + + return integration_request + +def get_json(obj): + return obj if isinstance(obj, str) else frappe.as_json(obj, indent=1) + def json_handler(obj): if isinstance(obj, (datetime.date, datetime.timedelta, datetime.datetime)): return str(obj)