From 9ed2271d1209c2591262d69ee1df962cd6ffbfb0 Mon Sep 17 00:00:00 2001 From: David Date: Mon, 22 Jul 2024 16:24:23 +0200 Subject: [PATCH] chore: adapt webhook preview --- .../integrations/doctype/webhook/webhook.js | 26 ++++++----- .../integrations/doctype/webhook/webhook.json | 43 ++----------------- .../integrations/doctype/webhook/webhook.py | 37 +++++++--------- 3 files changed, 34 insertions(+), 72 deletions(-) diff --git a/frappe/integrations/doctype/webhook/webhook.js b/frappe/integrations/doctype/webhook/webhook.js index 9fad6150ab..168b4be446 100644 --- a/frappe/integrations/doctype/webhook/webhook.js +++ b/frappe/integrations/doctype/webhook/webhook.js @@ -79,12 +79,27 @@ frappe.webhook = { }; frappe.ui.form.on("Webhook", { + onload: (frm) => { + frm.preview_fields = frm.doc.__onload.preview_fields; + }, refresh: (frm) => { frappe.webhook.set_fieldname_select(frm); frm.set_query( "background_jobs_queue", "frappe.integrations.doctype.webhook.webhook.get_all_queues" ); + + if (frm.doc.webhook_doctype) { + frm.add_custom_button(__("Preview"), () => { + const args = { + doc: frm.doc, + doctype: frm.doc.webhook_doctype, + preview_fields: frm.preview_fields, + }; + let dialog = new frappe.views.RenderPreviewer(args); + return dialog; + }); + } }, request_structure: (frm) => { @@ -98,17 +113,6 @@ frappe.ui.form.on("Webhook", { enable_security: (frm) => { frm.toggle_reqd("webhook_secret", frm.doc.enable_security); }, - - preview_document: (frm) => { - frappe.call({ - method: "generate_preview", - doc: frm.doc, - callback: (r) => { - frm.refresh_field("meets_condition"); - frm.refresh_field("preview_request_body"); - }, - }); - }, }); frappe.ui.form.on("Webhook Data", { diff --git a/frappe/integrations/doctype/webhook/webhook.json b/frappe/integrations/doctype/webhook/webhook.json index 5ce16026fa..884f4429ba 100644 --- a/frappe/integrations/doctype/webhook/webhook.json +++ b/frappe/integrations/doctype/webhook/webhook.json @@ -30,13 +30,7 @@ "webhook_headers", "sb_webhook_data", "webhook_data", - "webhook_json", - "preview_tab", - "preview_document", - "column_break_26", - "meets_condition", - "section_break_28", - "preview_request_body" + "webhook_json" ], "fields": [ { @@ -169,37 +163,6 @@ "options": "POST\nPUT\nDELETE", "reqd": 1 }, - { - "fieldname": "preview_tab", - "fieldtype": "Tab Break", - "label": "Preview" - }, - { - "fieldname": "preview_document", - "fieldtype": "Dynamic Link", - "label": "Select Document", - "options": "webhook_doctype" - }, - { - "fieldname": "preview_request_body", - "fieldtype": "Code", - "is_virtual": 1, - "label": "Request Body" - }, - { - "fieldname": "meets_condition", - "fieldtype": "Data", - "is_virtual": 1, - "label": "Meets Condition?" - }, - { - "fieldname": "column_break_26", - "fieldtype": "Column Break" - }, - { - "fieldname": "section_break_28", - "fieldtype": "Section Break" - }, { "default": "0", "description": "On checking this option, URL will be treated like a jinja template string", @@ -226,7 +189,7 @@ "link_fieldname": "webhook" } ], - "modified": "2024-03-23 16:04:03.108172", + "modified": "2024-07-22 09:23:32.642172", "modified_by": "Administrator", "module": "Integrations", "name": "Webhook", @@ -250,4 +213,4 @@ "sort_order": "DESC", "states": [], "track_changes": 1 -} \ No newline at end of file +} diff --git a/frappe/integrations/doctype/webhook/webhook.py b/frappe/integrations/doctype/webhook/webhook.py index 9d82dd34b1..8ee5df1a25 100644 --- a/frappe/integrations/doctype/webhook/webhook.py +++ b/frappe/integrations/doctype/webhook/webhook.py @@ -36,9 +36,6 @@ class Webhook(Document): enable_security: DF.Check enabled: DF.Check is_dynamic_url: DF.Check - meets_condition: DF.Data | None - preview_document: DF.DynamicLink | None - preview_request_body: DF.Code | None request_method: DF.Literal["POST", "PUT", "DELETE"] request_structure: DF.Literal["", "Form URL-Encoded", "JSON"] request_url: DF.SmallText @@ -59,6 +56,15 @@ class Webhook(Document): webhook_secret: DF.Password | None # end: auto-generated types + def onload(self): + self.set_onload( + "preview_fields", + [ + {"label": _("Meets Condition?"), "fieldtype": "Data", "method": "preview_meets_condition"}, + {"label": _("Request Body"), "fieldtype": "Code", "method": "preview_request_body"}, + ], + ) + def validate(self): self.validate_docevent() self.validate_condition() @@ -119,35 +125,24 @@ class Webhook(Document): frappe.throw(_("Invalid Webhook Secret")) @frappe.whitelist() - def generate_preview(self): - # This function doesn't need to do anything specific as virtual fields - # get evaluated automatically. - pass - - @property - def meets_condition(self): + def preview_meets_condition(self, preview_document): if not self.condition: return _("Yes") - - if not (self.preview_document and self.webhook_doctype): - return _("Select a document to check if it meets conditions.") - try: - doc = frappe.get_cached_doc(self.webhook_doctype, self.preview_document) + doc = frappe.get_cached_doc(self.webhook_doctype, preview_document) met_condition = frappe.safe_eval(self.condition, eval_locals=get_context(doc)) except Exception as e: + frappe.local.message_log = [] return _("Failed to evaluate conditions: {}").format(e) return _("Yes") if met_condition else _("No") - @property - def preview_request_body(self): - if not (self.preview_document and self.webhook_doctype): - return _("Select a document to preview request data") - + @frappe.whitelist() + def preview_request_body(self, preview_document): try: - doc = frappe.get_cached_doc(self.webhook_doctype, self.preview_document) + doc = frappe.get_cached_doc(self.webhook_doctype, preview_document) return frappe.as_json(get_webhook_data(doc, self)) except Exception as e: + frappe.local.message_log = [] return _("Failed to compute request body: {}").format(e)