chore: add integration request doctype back (with utils)

This commit is contained in:
phot0n 2022-07-23 16:23:06 +05:30
parent 91b04c2154
commit f71562fd49
6 changed files with 264 additions and 0 deletions

View file

@ -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) {
}
});

View file

@ -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
}

View file

@ -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))

View file

@ -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

View file

@ -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)