diff --git a/frappe/desk/form/load.py b/frappe/desk/form/load.py index f1ea5aab9f..5770432530 100644 --- a/frappe/desk/form/load.py +++ b/frappe/desk/form/load.py @@ -12,7 +12,7 @@ import frappe.utils from frappe import _, _dict from frappe.desk.form.document_follow import is_document_followed from frappe.model.utils.user_settings import get_user_settings -from frappe.permissions import get_doc_permissions +from frappe.permissions import get_doc_permissions, has_permission from frappe.utils.data import cstr if typing.TYPE_CHECKING: @@ -128,6 +128,8 @@ def get_docinfo(doc=None, doctype=None, name=None): "is_document_followed": is_document_followed(doc.doctype, doc.name, frappe.session.user), "tags": get_tags(doc.doctype, doc.name), "document_email": get_document_email(doc.doctype, doc.name), + "error_log_exists": get_error_log_exists(doc), + "webhook_request_log_log_exists": get_webhook_request_log_exists(doc), } ) @@ -201,6 +203,20 @@ def get_versions(doc: "Document") -> list[dict]: ) +def get_error_log_exists(doc: "Document") -> bool: + if has_permission("Error Log"): + return frappe.db.exists("Error Log", {"reference_doctype": doc.doctype, "reference_name": doc.name}) + return False + + +def get_webhook_request_log_exists(doc: "Document") -> bool: + if has_permission("Webhook Request Log"): + return frappe.db.exists( + "Webhook Request Log", {"reference_doctype": doc.doctype, "reference_document": doc.name} + ) + return False + + @frappe.whitelist() def get_communications(doctype, name, start=0, limit=20): from frappe.utils import cint diff --git a/frappe/integrations/doctype/webhook/webhook.py b/frappe/integrations/doctype/webhook/webhook.py index 952d25d31f..8850f35009 100644 --- a/frappe/integrations/doctype/webhook/webhook.py +++ b/frappe/integrations/doctype/webhook/webhook.py @@ -153,7 +153,7 @@ def enqueue_webhook(doc, webhook) -> None: except Exception as e: frappe.logger().debug({"enqueue_webhook_error": e}) - log_request(webhook.name, doc.name, request_url, headers, data) + log_request(webhook.name, doc.doctype, doc.name, request_url, headers, data) return for i in range(3): @@ -167,16 +167,16 @@ def enqueue_webhook(doc, webhook) -> None: ) r.raise_for_status() frappe.logger().debug({"webhook_success": r.text}) - log_request(webhook.name, doc.name, request_url, headers, data, r) + log_request(webhook.name, doc.doctype, doc.name, request_url, headers, data, r) break except requests.exceptions.ReadTimeout as e: frappe.logger().debug({"webhook_error": e, "try": i + 1}) - log_request(webhook.name, doc.name, request_url, headers, data) + log_request(webhook.name, doc.doctype, doc.name, request_url, headers, data) except Exception as e: frappe.logger().debug({"webhook_error": e, "try": i + 1}) - log_request(webhook.name, doc.name, request_url, headers, data, r) + log_request(webhook.name, doc.doctype, doc.name, request_url, headers, data, r) sleep(3 * i + 1) if i != 2: continue @@ -184,6 +184,7 @@ def enqueue_webhook(doc, webhook) -> None: def log_request( webhook: str, + doctype: str, docname: str, url: str, headers: dict, @@ -194,6 +195,7 @@ def log_request( { "doctype": "Webhook Request Log", "webhook": webhook, + "reference_doctype": doctype, "reference_document": docname, "user": frappe.session.user if frappe.session.user else None, "url": url, diff --git a/frappe/integrations/doctype/webhook_request_log/webhook_request_log.json b/frappe/integrations/doctype/webhook_request_log/webhook_request_log.json index a932b624e0..1cdffff9e0 100644 --- a/frappe/integrations/doctype/webhook_request_log/webhook_request_log.json +++ b/frappe/integrations/doctype/webhook_request_log/webhook_request_log.json @@ -7,6 +7,7 @@ "engine": "InnoDB", "field_order": [ "webhook", + "reference_doctype", "reference_document", "headers", "data", @@ -74,12 +75,20 @@ "fieldtype": "Link", "label": "Webhook", "options": "Webhook" + }, + { + "fieldname": "reference_doctype", + "fieldtype": "Data", + "in_list_view": 1, + "in_standard_filter": 1, + "label": "Reference Doctype", + "read_only": 1 } ], "in_create": 1, "index_web_pages_for_search": 1, "links": [], - "modified": "2024-03-23 16:04:03.509383", + "modified": "2024-09-14 05:52:41.583612", "modified_by": "Administrator", "module": "Integrations", "name": "Webhook Request Log", @@ -102,4 +111,4 @@ "sort_field": "creation", "sort_order": "DESC", "states": [] -} \ No newline at end of file +} diff --git a/frappe/integrations/doctype/webhook_request_log/webhook_request_log.py b/frappe/integrations/doctype/webhook_request_log/webhook_request_log.py index 6f2df360cc..8add0da217 100644 --- a/frappe/integrations/doctype/webhook_request_log/webhook_request_log.py +++ b/frappe/integrations/doctype/webhook_request_log/webhook_request_log.py @@ -17,6 +17,7 @@ class WebhookRequestLog(Document): data: DF.Code | None error: DF.Text | None headers: DF.Code | None + reference_doctype: DF.Data | None reference_document: DF.Data | None response: DF.Code | None url: DF.Data | None diff --git a/frappe/public/js/frappe/db.js b/frappe/public/js/frappe/db.js index 2eff45cd04..3affd94f89 100644 --- a/frappe/public/js/frappe/db.js +++ b/frappe/public/js/frappe/db.js @@ -33,7 +33,7 @@ frappe.db = { r.message && r.message.name ? resolve(true) : resolve(false); }); } else if (typeof nameOrFilters === "object") { - frappe.db.count(doctype, { filters: filters, limit: 1 }).then((count) => { + frappe.db.count(doctype, { filters: nameOrFilters, limit: 1 }).then((count) => { resolve(count > 0); }); } diff --git a/frappe/public/js/frappe/form/sidebar/form_sidebar.js b/frappe/public/js/frappe/form/sidebar/form_sidebar.js index 4d36402fd4..a92c24f52c 100644 --- a/frappe/public/js/frappe/form/sidebar/form_sidebar.js +++ b/frappe/public/js/frappe/form/sidebar/form_sidebar.js @@ -35,6 +35,8 @@ frappe.ui.form.Sidebar = class { this.setup_keyboard_shortcuts(); this.show_auto_repeat_status(); + this.show_error_log_status(); + this.show_webhook_request_log_status(); frappe.ui.form.setup_user_image_event(this.frm); this.refresh(); @@ -144,11 +146,11 @@ frappe.ui.form.Sidebar = class { fieldname: ["frequency"], }, callback: function (res) { - me.sidebar - .find(".auto-repeat-status") - .removeClass("hidden") - .html(__("Repeats {0}", [__(res.message.frequency)])); - me.sidebar.find(".auto-repeat-status").on("click", function () { + let el = me.sidebar.find(".auto-repeat-status"); + el.find("span").html(__("Repeats {0}", [__(res.message.frequency)])); + el.closest(".sidebar-section").removeClass("hidden"); + el.show(); + el.on("click", function () { frappe.set_route("Form", "Auto Repeat", me.frm.doc.auto_repeat); }); }, @@ -156,6 +158,36 @@ frappe.ui.form.Sidebar = class { } } + show_error_log_status() { + const docinfo = this.frm.get_docinfo(); + if (docinfo.error_log_exists) { + let el = this.sidebar.find(".error-log-status"); + el.closest(".sidebar-section").removeClass("hidden"); + el.show(); + el.on("click", () => { + frappe.set_route("List", "Error Log", { + reference_doctype: this.frm.doc.doctype, + reference_name: this.frm.doc.name, + }); + }); + } + } + + show_webhook_request_log_status() { + const docinfo = this.frm.get_docinfo(); + if (docinfo.webhook_request_log_exists) { + let el = this.sidebar.find(".webhook-request-log-status"); + el.closest(".sidebar-section").removeClass("hidden"); + el.show(); + el.on("click", () => { + frappe.set_route("List", "Webhook Request Log", { + reference_doctype: this.frm.doc.doctype, + reference_document: this.frm.doc.name, + }); + }); + } + } + make_tags() { if (this.frm.meta.issingle) { this.sidebar.find(".form-tags").toggle(false); diff --git a/frappe/public/js/frappe/form/templates/form_sidebar.html b/frappe/public/js/frappe/form/templates/form_sidebar.html index c441b6e704..7d9553ca53 100644 --- a/frappe/public/js/frappe/form/templates/form_sidebar.html +++ b/frappe/public/js/frappe/form/templates/form_sidebar.html @@ -136,7 +136,9 @@