From 57a55e4225821c6b9034b8633fe86eac624c002b Mon Sep 17 00:00:00 2001 From: Rushabh Mehta Date: Mon, 18 Apr 2022 15:19:25 +0530 Subject: [PATCH 1/8] feat(minor): Add document reference to Error Log and doc.log_error --- frappe/__init__.py | 29 ++- .../doctype/auto_repeat/auto_repeat.py | 2 +- .../doctype/communication/communication.py | 3 +- frappe/core/doctype/communication/email.py | 2 +- .../core/doctype/data_import/data_import.py | 2 +- frappe/core/doctype/error_log/error_log.json | 203 ++++++------------ frappe/core/doctype/file/file.py | 4 +- .../prepared_report/prepared_report.py | 2 +- frappe/core/doctype/user/user.py | 2 +- frappe/desk/desktop.py | 8 +- .../notification_log/notification_log.py | 2 +- .../system_console/system_console.json | 8 + frappe/desk/query_report.py | 2 +- .../auto_email_report/auto_email_report.py | 3 +- .../doctype/email_account/email_account.py | 9 +- .../email/doctype/email_queue/email_queue.py | 15 +- frappe/email/doctype/newsletter/newsletter.py | 10 +- .../doctype/notification/notification.py | 8 +- frappe/email/queue.py | 2 +- frappe/email/receive.py | 4 +- .../doctype/event_consumer/event_consumer.py | 2 +- frappe/model/document.py | 8 + frappe/model/workflow.py | 5 +- .../energy_point_rule/energy_point_rule.py | 4 + frappe/utils/print_format.py | 6 +- .../doctype/web_form/templates/web_form.html | 2 + 26 files changed, 152 insertions(+), 195 deletions(-) diff --git a/frappe/__init__.py b/frappe/__init__.py index 10c8afbf23..07a580944f 100644 --- a/frappe/__init__.py +++ b/frappe/__init__.py @@ -2068,26 +2068,33 @@ def logger( ) -def log_error(message=None, title=_("Error")): - """Log error to Error Log""" +def log_error(title=None, message=None, reference_doctype=None, reference_name=None): + '''Log error to Error Log''' - # AI ALERT: + # Parameter ALERT: # the title and message may be swapped # the better API for this is log_error(title, message), and used in many cases this way # this hack tries to be smart about whats a title (single line ;-)) and fixes it if message: - if "\n" in title: - error, title = title, message + if '\n' in title: # traceback sent as title + traceback, title = title, message else: - error = message - else: - error = get_traceback() + traceback = message - return get_doc(dict(doctype="Error Log", error=as_unicode(error), method=title)).insert( - ignore_permissions=True - ) + if not traceback: + traceback = get_traceback() + if not title: + title = 'Error' + + return get_doc(dict( + doctype='Error Log', + error=as_unicode(traceback), + method=title, + reference_doctype=reference_doctype, + reference_name=reference_name + )).insert(ignore_permissions=True) def get_desk_link(doctype, name): html = ( diff --git a/frappe/automation/doctype/auto_repeat/auto_repeat.py b/frappe/automation/doctype/auto_repeat/auto_repeat.py index 5ff9e9f3ab..4b2f83f4b6 100644 --- a/frappe/automation/doctype/auto_repeat/auto_repeat.py +++ b/frappe/automation/doctype/auto_repeat/auto_repeat.py @@ -189,7 +189,7 @@ class AutoRepeat(Document): if self.notify_by_email and self.recipients: self.send_notification(new_doc) except Exception: - error_log = frappe.log_error(frappe.get_traceback(), _("Auto Repeat Document Creation Failure")) + error_log = self.log_error('Auto repeat failed') self.disable_auto_repeat() diff --git a/frappe/core/doctype/communication/communication.py b/frappe/core/doctype/communication/communication.py index 409c4c0956..eeddb7c7a1 100644 --- a/frappe/core/doctype/communication/communication.py +++ b/frappe/core/doctype/communication/communication.py @@ -450,8 +450,7 @@ def get_contacts(email_strings: List[str], auto_create_contact=False) -> List[st contact.insert(ignore_permissions=True) contact_name = contact.name except Exception: - traceback = frappe.get_traceback() - frappe.log_error(traceback) + contact.log_error('Unable to add contact') if contact_name: contacts.append(contact_name) diff --git a/frappe/core/doctype/communication/email.py b/frappe/core/doctype/communication/email.py index 5737572194..d47b15d360 100755 --- a/frappe/core/doctype/communication/email.py +++ b/frappe/core/doctype/communication/email.py @@ -248,7 +248,7 @@ def mark_email_as_seen(name: str = None): frappe.db.commit() # nosemgrep: this will be called in a GET request except Exception: - frappe.log_error(frappe.get_traceback()) + frappe.log_error('Unable to mark as seen', None, 'Communication', name) finally: frappe.response.update( diff --git a/frappe/core/doctype/data_import/data_import.py b/frappe/core/doctype/data_import/data_import.py index 295f7e79ba..3693ea53a4 100644 --- a/frappe/core/doctype/data_import/data_import.py +++ b/frappe/core/doctype/data_import/data_import.py @@ -113,7 +113,7 @@ def start_import(data_import): except Exception: frappe.db.rollback() data_import.db_set("status", "Error") - frappe.log_error(title=data_import.name) + data_import.log_error('Data import failed') finally: frappe.flags.in_import = False diff --git a/frappe/core/doctype/error_log/error_log.json b/frappe/core/doctype/error_log/error_log.json index 35ca3ceeef..e643bbb090 100644 --- a/frappe/core/doctype/error_log/error_log.json +++ b/frappe/core/doctype/error_log/error_log.json @@ -1,148 +1,75 @@ { - "allow_copy": 0, - "allow_guest_to_view": 0, - "allow_import": 0, - "allow_rename": 0, - "autoname": "", - "beta": 0, - "creation": "2013-01-16 13:09:40", - "custom": 0, - "description": "Log of Scheduler Errors", - "docstatus": 0, - "doctype": "DocType", - "document_type": "System", - "editable_grid": 0, - "engine": "MyISAM", + "actions": [], + "creation": "2013-01-16 13:09:40", + "doctype": "DocType", + "document_type": "System", + "engine": "MyISAM", + "field_order": [ + "seen", + "method", + "error", + "reference_doctype", + "reference_name" + ], "fields": [ { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "default": "0", - "fieldname": "seen", - "fieldtype": "Check", - "hidden": 1, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Seen", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "unique": 0 - }, + "default": "0", + "fieldname": "seen", + "fieldtype": "Check", + "hidden": 1, + "label": "Seen" + }, { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "method", - "fieldtype": "Data", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 1, - "in_standard_filter": 0, - "label": "Title", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 1, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "unique": 0 - }, + "fieldname": "method", + "fieldtype": "Data", + "in_list_view": 1, + "label": "Title", + "read_only": 1 + }, { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "error", - "fieldtype": "Code", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Error", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 1, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "unique": 0 + "fieldname": "error", + "fieldtype": "Code", + "label": "Error", + "read_only": 1 + }, + { + "fieldname": "reference_doctype", + "fieldtype": "Link", + "in_list_view": 1, + "in_standard_filter": 1, + "label": "Reference DocType", + "options": "DocType", + "search_index": 1 + }, + { + "fieldname": "reference_name", + "fieldtype": "Data", + "label": "Reference Name" } - ], - "has_web_view": 0, - "hide_heading": 0, - "hide_toolbar": 0, - "icon": "fa fa-warning-sign", - "idx": 1, - "image_view": 0, - "in_create": 0, - "is_submittable": 0, - "issingle": 0, - "istable": 0, - "max_attachments": 0, - "modified": "2021-10-25 12:21:44.292471", - "modified_by": "Administrator", - "module": "Core", - "name": "Error Log", - "owner": "Administrator", + ], + "icon": "fa fa-warning-sign", + "idx": 1, + "links": [], + "modified": "2022-04-18 14:51:30.604304", + "modified_by": "Administrator", + "module": "Core", + "name": "Error Log", + "owner": "Administrator", "permissions": [ { - "amend": 0, - "apply_user_permissions": 0, - "cancel": 0, - "create": 1, - "delete": 1, - "email": 1, - "export": 0, - "if_owner": 0, - "import": 0, - "permlevel": 0, - "print": 1, - "read": 1, - "report": 1, - "role": "System Manager", - "set_user_permissions": 0, - "share": 1, - "submit": 0, + "create": 1, + "delete": 1, + "email": 1, + "print": 1, + "read": 1, + "report": 1, + "role": "System Manager", + "share": 1, "write": 1 } - ], - "quick_entry": 1, - "read_only": 0, - "read_only_onload": 0, - "show_name_in_global_search": 0, - "sort_order": "ASC", - "track_seen": 0 -} + ], + "quick_entry": 1, + "sort_field": "modified", + "sort_order": "ASC", + "states": [] +} \ No newline at end of file diff --git a/frappe/core/doctype/file/file.py b/frappe/core/doctype/file/file.py index d8b45cf043..3547a03832 100755 --- a/frappe/core/doctype/file/file.py +++ b/frappe/core/doctype/file/file.py @@ -1043,7 +1043,7 @@ def attach_files_to_document(doc, event): ): return - frappe.get_doc( + file_doc = frappe.get_doc( doctype="File", file_url=value, attached_to_name=doc.name, @@ -1052,4 +1052,4 @@ def attach_files_to_document(doc, event): folder="Home/Attachments", ).insert() except Exception: - frappe.log_error(title=_("Error Attaching File")) + file_doc.log_error("Error Attaching File") diff --git a/frappe/core/doctype/prepared_report/prepared_report.py b/frappe/core/doctype/prepared_report/prepared_report.py index c3122fe52f..dbdba19fbe 100644 --- a/frappe/core/doctype/prepared_report/prepared_report.py +++ b/frappe/core/doctype/prepared_report/prepared_report.py @@ -47,7 +47,7 @@ def run_background(prepared_report): instance.save(ignore_permissions=True) except Exception: - frappe.log_error(frappe.get_traceback()) + report.log_error('Prepared report failed') instance = frappe.get_doc("Prepared Report", prepared_report) instance.status = "Error" instance.error_message = frappe.get_traceback() diff --git a/frappe/core/doctype/user/user.py b/frappe/core/doctype/user/user.py index c90cbf1fce..ec7374d72a 100644 --- a/frappe/core/doctype/user/user.py +++ b/frappe/core/doctype/user/user.py @@ -265,7 +265,7 @@ class User(Document): except frappe.OutgoingEmailError: # email server not set, don't send email - frappe.log_error(frappe.get_traceback()) + self.log_error('Unable to send new password notification') @Document.hook def validate_reset_password(self): diff --git a/frappe/desk/desktop.py b/frappe/desk/desktop.py index 385151f754..ae34cf3df2 100644 --- a/frappe/desk/desktop.py +++ b/frappe/desk/desktop.py @@ -338,7 +338,7 @@ def get_desktop_page(page): "onboardings": workspace.onboardings, } except DoesNotExistError: - frappe.log_error(frappe.get_traceback()) + frappe.log_error('Workspace Missing') return {} @@ -469,10 +469,8 @@ def save_new_widget(doc, page, blocks, new_widgets): page: {0} config: {1} exception: {2} - """.format( - page, json_config, e - ) - frappe.log_error(log, _("Could not save customization")) + """.format(page, json_config, e) + doc.log_error("Could not save customization", log) return False return True diff --git a/frappe/desk/doctype/notification_log/notification_log.py b/frappe/desk/doctype/notification_log/notification_log.py index 1a466ea78b..011f3e22ff 100644 --- a/frappe/desk/doctype/notification_log/notification_log.py +++ b/frappe/desk/doctype/notification_log/notification_log.py @@ -20,7 +20,7 @@ class NotificationLog(Document): try: send_notification_email(self) except frappe.OutgoingEmailError: - frappe.log_error(message=frappe.get_traceback(), title=_("Failed to send notification email")) + self.log_error(_("Failed to send notification email")) def get_permission_query_conditions(for_user): diff --git a/frappe/desk/doctype/system_console/system_console.json b/frappe/desk/doctype/system_console/system_console.json index c92b2005ed..bbb815e30e 100644 --- a/frappe/desk/doctype/system_console/system_console.json +++ b/frappe/desk/doctype/system_console/system_console.json @@ -1,7 +1,11 @@ { "actions": [ { +<<<<<<< HEAD "action": "app/console-log", +======= + "action": "/app/console-log", +>>>>>>> 6d82805831 (feat(minor): Add document reference to Error Log and doc.log_error) "action_type": "Route", "label": "Logs" }, @@ -86,7 +90,11 @@ "index_web_pages_for_search": 1, "issingle": 1, "links": [], +<<<<<<< HEAD "modified": "2022-04-09 16:35:32.345542", +======= + "modified": "2022-04-15 14:15:58.398590", +>>>>>>> 6d82805831 (feat(minor): Add document reference to Error Log and doc.log_error) "modified_by": "Administrator", "module": "Desk", "name": "System Console", diff --git a/frappe/desk/query_report.py b/frappe/desk/query_report.py index 7de8ccabbf..d1f63a6199 100644 --- a/frappe/desk/query_report.py +++ b/frappe/desk/query_report.py @@ -314,7 +314,7 @@ def get_prepared_report_result(report, filters, dn="", user=None): latest_report_data = {"columns": columns, "result": data} except Exception: - frappe.log_error(frappe.get_traceback()) + doc.log_error(frappe.get_traceback()) frappe.delete_doc("Prepared Report", doc.name) frappe.db.commit() doc = None diff --git a/frappe/email/doctype/auto_email_report/auto_email_report.py b/frappe/email/doctype/auto_email_report/auto_email_report.py index f4fdcf4275..108cc46792 100644 --- a/frappe/email/doctype/auto_email_report/auto_email_report.py +++ b/frappe/email/doctype/auto_email_report/auto_email_report.py @@ -255,8 +255,7 @@ def send_daily(): try: auto_email_report.send() except Exception as e: - frappe.log_error(e, _("Failed to send {0} Auto Email Report").format(auto_email_report.name)) - + auto_email_report.log_error('Failed to send {0} Auto Email Report'.format(auto_email_report.name)) def send_monthly(): """Check reports to be sent monthly""" diff --git a/frappe/email/doctype/email_account/email_account.py b/frappe/email/doctype/email_account/email_account.py index e60be0d965..65586de31d 100755 --- a/frappe/email/doctype/email_account/email_account.py +++ b/frappe/email/doctype/email_account/email_account.py @@ -473,7 +473,7 @@ class EmailAccount(Document): frappe.db.rollback() except Exception: frappe.db.rollback() - frappe.log_error(title="EmailAccount.receive") + self.log_error(title="EmailAccount.receive") if self.use_imap: self.handle_bad_emails(mail.uid, mail.raw_message, frappe.get_traceback()) exceptions.append(frappe.get_traceback()) @@ -521,7 +521,7 @@ class EmailAccount(Document): # close connection to mailserver email_server.logout() except Exception: - frappe.log_error(title=_("Error while connecting to email account {0}").format(self.name)) + self.log_error(title=_("Error while connecting to email account {0}").format(self.name)) return [] return mails @@ -667,7 +667,7 @@ class EmailAccount(Document): try: email_server = self.get_incoming_server(in_receive=True) except Exception: - frappe.log_error(title=_("Error while connecting to email account {0}").format(self.name)) + self.log_error(title=_("Error while connecting to email account {0}").format(self.name)) if not email_server: return @@ -679,8 +679,7 @@ class EmailAccount(Document): message = safe_encode(message) email_server.imap.append("Sent", "\\Seen", imaplib.Time2Internaldate(time.time()), message) except Exception: - frappe.log_error(title="EmailAccount.append_email_to_sent_folder") - + self.log_error(title="EmailAccount.append_email_to_sent_folder") @frappe.whitelist() def get_append_to( diff --git a/frappe/email/doctype/email_queue/email_queue.py b/frappe/email/doctype/email_queue/email_queue.py index 38577eeb97..b3e52ef1e2 100644 --- a/frappe/email/doctype/email_queue/email_queue.py +++ b/frappe/email/doctype/email_queue/email_queue.py @@ -198,10 +198,7 @@ class SendMailContext: traceback_string = "".join(traceback.format_tb(exc_tb)) traceback_string += f"\n Queue Name: {self.queue_doc.name}" - if self.is_background_task: - frappe.log_error(title="frappe.email.queue.flush", message=traceback_string) - else: - frappe.log_error(message=traceback_string) + self.queue_doc.log_error('Email sending failed', traceback_string) @property def smtp_session(self): @@ -625,12 +622,10 @@ class QueueBuilder: mail_to_string = cstr(mail.as_string()) except frappe.InvalidEmailAddressError: # bad Email Address - don't add to queue - frappe.log_error( - "Invalid Email ID Sender: {0}, Recipients: {1}, \nTraceback: {2} ".format( - self.sender, ", ".join(self.final_recipients()), traceback.format_exc() - ), - "Email Not Sent", - ) + self.log_error( + title = 'Invalid email address', + message = 'Invalid email address Sender: {0}, Recipients: {1}, \nTraceback: {2} ' + .format(self.sender, ', '.join(self.final_recipients()), traceback.format_exc())) return d = { diff --git a/frappe/email/doctype/newsletter/newsletter.py b/frappe/email/doctype/newsletter/newsletter.py index 45a4539866..e3726ed5a6 100644 --- a/frappe/email/doctype/newsletter/newsletter.py +++ b/frappe/email/doctype/newsletter/newsletter.py @@ -329,19 +329,25 @@ def send_scheduled_email(): pluck="name", ) - for newsletter in scheduled_newsletter: + for newsletter_name in scheduled_newsletter: try: - frappe.get_doc("Newsletter", newsletter).queue_all() + newsletter = frappe.get_doc("Newsletter", newsletter_name) + newsletter.queue_all() except Exception: frappe.db.rollback() # wasn't able to send emails :( +<<<<<<< HEAD frappe.db.set_value("Newsletter", newsletter, "email_sent", 0) message = ( f"Newsletter {newsletter} failed to send" "\n\n" f"Traceback: {frappe.get_traceback()}" ) frappe.log_error(title="Send Newsletter", message=message) +======= + frappe.db.set_value("Newsletter", newsletter_name, "email_sent", 0) + newsletter.log_error('Failed to send newsletter') +>>>>>>> 6d82805831 (feat(minor): Add document reference to Error Log and doc.log_error) if not frappe.flags.in_test: frappe.db.commit() diff --git a/frappe/email/doctype/notification/notification.py b/frappe/email/doctype/notification/notification.py index 5c27eb95eb..e868c0ceb6 100644 --- a/frappe/email/doctype/notification/notification.py +++ b/frappe/email/doctype/notification/notification.py @@ -141,7 +141,7 @@ def get_context(context): self.create_system_notification(doc, context) except: - frappe.log_error(title="Failed to send notification", message=frappe.get_traceback()) + self.log_error('Failed to send Notification') if self.set_property_after_alert: allow_update = True @@ -168,7 +168,7 @@ def get_context(context): doc.save(ignore_permissions=True) doc.flags.in_notification_update = False except Exception: - frappe.log_error(title="Document update failed", message=frappe.get_traceback()) + self.log_error('Document update failed') def create_system_notification(self, doc, context): subject = self.subject @@ -432,8 +432,8 @@ def evaluate_alert(doc, alert, event): if event == "Value Change" and not doc.is_new(): if not frappe.db.has_column(doc.doctype, alert.value_changed): - alert.db_set("enabled", 0) - frappe.log_error("Notification {0} has been disabled due to missing field".format(alert.name)) + alert.db_set('enabled', 0) + alert.log_error('Notification {0} has been disabled due to missing field'.format(alert.name)) return doc_before_save = doc.get_doc_before_save() diff --git a/frappe/email/queue.py b/frappe/email/queue.py index b0a3b0583b..ac873182a7 100755 --- a/frappe/email/queue.py +++ b/frappe/email/queue.py @@ -170,7 +170,7 @@ def flush(from_test=False): is_background_task = not from_test func(email_queue_name=row.name, is_background_task=is_background_task) except Exception: - frappe.log_error() + frappe.get_doc('Email Queue', row.name).log_error() def get_queue(): diff --git a/frappe/email/receive.py b/frappe/email/receive.py index 4a6db65a84..80c413faa1 100644 --- a/frappe/email/receive.py +++ b/frappe/email/receive.py @@ -123,7 +123,7 @@ class EmailServer: except _socket.error: # log performs rollback and logs error in Error Log - frappe.log_error("receive.connect_pop") + self.log_error("POP: Unable to connect") # Invalid mail server -- due to refusing connection frappe.msgprint(_("Invalid Mail Server. Please rectify and try again.")) @@ -306,7 +306,7 @@ class EmailServer: else: # log performs rollback and logs error in Error Log - frappe.log_error("receive.get_messages", self.make_error_msg(msg_num, incoming_mail)) + self.log_error("Unable to fetch email", self.make_error_msg(msg_num, incoming_mail)) self.errors = True frappe.db.rollback() diff --git a/frappe/event_streaming/doctype/event_consumer/event_consumer.py b/frappe/event_streaming/doctype/event_consumer/event_consumer.py index 287a1fca03..dd3d2ec74c 100644 --- a/frappe/event_streaming/doctype/event_consumer/event_consumer.py +++ b/frappe/event_streaming/doctype/event_consumer/event_consumer.py @@ -213,5 +213,5 @@ def has_consumer_access(consumer, update_log): else: return frappe.safe_eval(condition, frappe._dict(doc=doc)) except Exception as e: - frappe.log_error(title="has_consumer_access error", message=e) + consumer.log_error('has_consumer_access error') return False diff --git a/frappe/model/document.py b/frappe/model/document.py index 58c406607d..a7b59ae749 100644 --- a/frappe/model/document.py +++ b/frappe/model/document.py @@ -1362,6 +1362,14 @@ class Document(BaseDocument): ).insert(ignore_permissions=True) frappe.local.flags.commit = True + def log_error(self, title=None, message=None): + '''Helper function to create an Error Log''' + return frappe.log_error( + message = message, + title = title, + reference_doctype = self.doctype, + reference_name = self.name) + def get_signature(self): """Returns signature (hash) for private URL.""" return hashlib.sha224(get_datetime_str(self.creation).encode()).hexdigest() diff --git a/frappe/model/workflow.py b/frappe/model/workflow.py index 0edffaf2fb..092ad4f764 100644 --- a/frappe/model/workflow.py +++ b/frappe/model/workflow.py @@ -254,8 +254,9 @@ def bulk_workflow_approval(docnames, doctype, action): frappe.db.rollback() frappe.log_error( - frappe.get_traceback(), - "Workflow {0} threw an error for {1} {2}".format(action, doctype, docname), + title = "Workflow {0} threw an error for {1} {2}".format(action, doctype, docname), + reference_doctype = 'Workflow', + reference_name = action ) finally: if not message_dict: diff --git a/frappe/social/doctype/energy_point_rule/energy_point_rule.py b/frappe/social/doctype/energy_point_rule/energy_point_rule.py index a36581ec4c..3767a9564e 100644 --- a/frappe/social/doctype/energy_point_rule/energy_point_rule.py +++ b/frappe/social/doctype/energy_point_rule/energy_point_rule.py @@ -57,7 +57,11 @@ class EnergyPointRule(Document): self.apply_only_once, ) except Exception as e: +<<<<<<< HEAD frappe.log_error(frappe.get_traceback(), "apply_energy_point") +======= + self.log_error('Energy points failed') +>>>>>>> 6d82805831 (feat(minor): Add document reference to Error Log and doc.log_error) def rule_condition_satisfied(self, doc): if self.for_doc_event == "New": diff --git a/frappe/utils/print_format.py b/frappe/utils/print_format.py index 35842217d1..2488fae0c9 100644 --- a/frappe/utils/print_format.py +++ b/frappe/utils/print_format.py @@ -92,7 +92,11 @@ def download_multi_pdf(doctype, name, format=None, no_letterhead=False, options= pdf_options=options, ) except Exception: - frappe.log_error("Permission Error on doc {} of doctype {}".format(doc_name, doctype_name)) + frappe.log_error( + title = 'Error in Multi PDF download', + message = "Permission Error on doc {} of doctype {}".format(doc_name, doctype_name), + reference_doctype = doctype_name, + reference_name = doc_name) frappe.local.response.filename = "{}.pdf".format(name) frappe.local.response.filecontent = read_multi_pdf(output) diff --git a/frappe/website/doctype/web_form/templates/web_form.html b/frappe/website/doctype/web_form/templates/web_form.html index 2a02aa5f2b..6e0374abdb 100644 --- a/frappe/website/doctype/web_form/templates/web_form.html +++ b/frappe/website/doctype/web_form/templates/web_form.html @@ -70,6 +70,8 @@ data-web-form="{{ name }}" data-web-form-doctype="{{ doc_type }}" data-login-req
{% include 'templates/includes/comments/comments.html' %}
+{%- else -%} +
{%- endif %} {# comments #} {% endblock page_content %} From d55986d56dbd78497dd42c48e3e02dedb0be16e5 Mon Sep 17 00:00:00 2001 From: Rushabh Mehta Date: Mon, 18 Apr 2022 15:47:05 +0530 Subject: [PATCH 2/8] fix(conflicts): fix conflicts' --- frappe/desk/doctype/system_console/system_console.json | 10 +--------- frappe/desk/query_report.py | 2 +- frappe/email/doctype/newsletter/newsletter.py | 10 +--------- .../doctype/energy_point_rule/energy_point_rule.py | 6 +----- 4 files changed, 4 insertions(+), 24 deletions(-) diff --git a/frappe/desk/doctype/system_console/system_console.json b/frappe/desk/doctype/system_console/system_console.json index bbb815e30e..a851831909 100644 --- a/frappe/desk/doctype/system_console/system_console.json +++ b/frappe/desk/doctype/system_console/system_console.json @@ -1,11 +1,7 @@ { "actions": [ { -<<<<<<< HEAD - "action": "app/console-log", -======= "action": "/app/console-log", ->>>>>>> 6d82805831 (feat(minor): Add document reference to Error Log and doc.log_error) "action_type": "Route", "label": "Logs" }, @@ -90,11 +86,7 @@ "index_web_pages_for_search": 1, "issingle": 1, "links": [], -<<<<<<< HEAD - "modified": "2022-04-09 16:35:32.345542", -======= "modified": "2022-04-15 14:15:58.398590", ->>>>>>> 6d82805831 (feat(minor): Add document reference to Error Log and doc.log_error) "modified_by": "Administrator", "module": "Desk", "name": "System Console", @@ -114,4 +106,4 @@ "sort_order": "DESC", "states": [], "track_changes": 1 -} \ No newline at end of file +} diff --git a/frappe/desk/query_report.py b/frappe/desk/query_report.py index d1f63a6199..894e82d117 100644 --- a/frappe/desk/query_report.py +++ b/frappe/desk/query_report.py @@ -314,7 +314,7 @@ def get_prepared_report_result(report, filters, dn="", user=None): latest_report_data = {"columns": columns, "result": data} except Exception: - doc.log_error(frappe.get_traceback()) + doc.log_error("Prepared report failed") frappe.delete_doc("Prepared Report", doc.name) frappe.db.commit() doc = None diff --git a/frappe/email/doctype/newsletter/newsletter.py b/frappe/email/doctype/newsletter/newsletter.py index e3726ed5a6..6aa881ed5c 100644 --- a/frappe/email/doctype/newsletter/newsletter.py +++ b/frappe/email/doctype/newsletter/newsletter.py @@ -338,16 +338,8 @@ def send_scheduled_email(): frappe.db.rollback() # wasn't able to send emails :( -<<<<<<< HEAD - frappe.db.set_value("Newsletter", newsletter, "email_sent", 0) - message = ( - f"Newsletter {newsletter} failed to send" "\n\n" f"Traceback: {frappe.get_traceback()}" - ) - frappe.log_error(title="Send Newsletter", message=message) -======= frappe.db.set_value("Newsletter", newsletter_name, "email_sent", 0) - newsletter.log_error('Failed to send newsletter') ->>>>>>> 6d82805831 (feat(minor): Add document reference to Error Log and doc.log_error) + newsletter.log_error("Failed to send newsletter") if not frappe.flags.in_test: frappe.db.commit() diff --git a/frappe/social/doctype/energy_point_rule/energy_point_rule.py b/frappe/social/doctype/energy_point_rule/energy_point_rule.py index 3767a9564e..9d393dde48 100644 --- a/frappe/social/doctype/energy_point_rule/energy_point_rule.py +++ b/frappe/social/doctype/energy_point_rule/energy_point_rule.py @@ -57,11 +57,7 @@ class EnergyPointRule(Document): self.apply_only_once, ) except Exception as e: -<<<<<<< HEAD - frappe.log_error(frappe.get_traceback(), "apply_energy_point") -======= - self.log_error('Energy points failed') ->>>>>>> 6d82805831 (feat(minor): Add document reference to Error Log and doc.log_error) + self.log_error("Energy points failed") def rule_condition_satisfied(self, doc): if self.for_doc_event == "New": From fca6c3d305fc64458c070eedf1ea49e44dc50e96 Mon Sep 17 00:00:00 2001 From: Rushabh Mehta Date: Mon, 18 Apr 2022 15:59:38 +0530 Subject: [PATCH 3/8] fix(minor): circular imports? --- frappe/cache_manager.py | 1 - frappe/model/naming.py | 6 +++++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/frappe/cache_manager.py b/frappe/cache_manager.py index b15f8f2234..01ccc03753 100644 --- a/frappe/cache_manager.py +++ b/frappe/cache_manager.py @@ -5,7 +5,6 @@ import json import frappe from frappe.desk.notifications import clear_notifications, delete_notification_count_for -from frappe.model.document import Document common_default_keys = ["__default", "__global"] diff --git a/frappe/model/naming.py b/frappe/model/naming.py index 9d1079d995..aa502f5a4c 100644 --- a/frappe/model/naming.py +++ b/frappe/model/naming.py @@ -6,7 +6,6 @@ from typing import TYPE_CHECKING, Optional, Union import frappe from frappe import _ -from frappe.database.sequence import get_next_val, set_next_val from frappe.model import log_types from frappe.query_builder import DocType from frappe.utils import cint, cstr, now_datetime @@ -36,6 +35,8 @@ def set_new_name(doc): doc.name = None if is_autoincremented(doc.doctype, meta): + from frappe.database.sequence import get_next_val + doc.name = get_next_val(doc.doctype) return @@ -322,11 +323,14 @@ def get_default_naming_series(doctype): def validate_name(doctype: str, name: Union[int, str], case: Optional[str] = None): + if not name: frappe.throw(_("No Name Specified for {0}").format(doctype)) if isinstance(name, int): if is_autoincremented(doctype): + from frappe.database.sequence import set_next_val + # this will set the sequence val to be the provided name and set it to be used # so that the sequence will start from the next val of the setted val(name) set_next_val(doctype, name, is_val_used=True) From 6e6fe9521e403aadb73df5e0b20eb683b3f30617 Mon Sep 17 00:00:00 2001 From: Rushabh Mehta Date: Mon, 18 Apr 2022 16:14:24 +0530 Subject: [PATCH 4/8] fix(linting): no single quotes :'| --- frappe/__init__.py | 23 +++++++++++-------- .../doctype/auto_repeat/auto_repeat.py | 2 +- .../doctype/communication/communication.py | 2 +- frappe/core/doctype/communication/email.py | 2 +- .../core/doctype/data_import/data_import.py | 2 +- .../prepared_report/prepared_report.py | 2 +- frappe/core/doctype/user/user.py | 2 +- frappe/desk/desktop.py | 6 +++-- .../auto_email_report/auto_email_report.py | 5 +++- .../email/doctype/email_queue/email_queue.py | 10 ++++---- .../doctype/notification/notification.py | 8 +++---- .../doctype/event_consumer/event_consumer.py | 2 +- frappe/model/document.py | 8 +++---- frappe/model/workflow.py | 6 ++--- frappe/utils/print_format.py | 9 ++++---- 15 files changed, 49 insertions(+), 40 deletions(-) diff --git a/frappe/__init__.py b/frappe/__init__.py index 07a580944f..dcc401c036 100644 --- a/frappe/__init__.py +++ b/frappe/__init__.py @@ -2069,7 +2069,7 @@ def logger( def log_error(title=None, message=None, reference_doctype=None, reference_name=None): - '''Log error to Error Log''' + """Log error to Error Log""" # Parameter ALERT: # the title and message may be swapped @@ -2077,7 +2077,7 @@ def log_error(title=None, message=None, reference_doctype=None, reference_name=N # this hack tries to be smart about whats a title (single line ;-)) and fixes it if message: - if '\n' in title: # traceback sent as title + if "\n" in title: # traceback sent as title traceback, title = title, message else: traceback = message @@ -2086,15 +2086,18 @@ def log_error(title=None, message=None, reference_doctype=None, reference_name=N traceback = get_traceback() if not title: - title = 'Error' + title = "Error" + + return get_doc( + dict( + doctype="Error Log", + error=as_unicode(traceback), + method=title, + reference_doctype=reference_doctype, + reference_name=reference_name, + ) + ).insert(ignore_permissions=True) - return get_doc(dict( - doctype='Error Log', - error=as_unicode(traceback), - method=title, - reference_doctype=reference_doctype, - reference_name=reference_name - )).insert(ignore_permissions=True) def get_desk_link(doctype, name): html = ( diff --git a/frappe/automation/doctype/auto_repeat/auto_repeat.py b/frappe/automation/doctype/auto_repeat/auto_repeat.py index 4b2f83f4b6..d3399f7726 100644 --- a/frappe/automation/doctype/auto_repeat/auto_repeat.py +++ b/frappe/automation/doctype/auto_repeat/auto_repeat.py @@ -189,7 +189,7 @@ class AutoRepeat(Document): if self.notify_by_email and self.recipients: self.send_notification(new_doc) except Exception: - error_log = self.log_error('Auto repeat failed') + error_log = self.log_error("Auto repeat failed") self.disable_auto_repeat() diff --git a/frappe/core/doctype/communication/communication.py b/frappe/core/doctype/communication/communication.py index eeddb7c7a1..f0e80c2207 100644 --- a/frappe/core/doctype/communication/communication.py +++ b/frappe/core/doctype/communication/communication.py @@ -450,7 +450,7 @@ def get_contacts(email_strings: List[str], auto_create_contact=False) -> List[st contact.insert(ignore_permissions=True) contact_name = contact.name except Exception: - contact.log_error('Unable to add contact') + contact.log_error("Unable to add contact") if contact_name: contacts.append(contact_name) diff --git a/frappe/core/doctype/communication/email.py b/frappe/core/doctype/communication/email.py index d47b15d360..464bc35a1c 100755 --- a/frappe/core/doctype/communication/email.py +++ b/frappe/core/doctype/communication/email.py @@ -248,7 +248,7 @@ def mark_email_as_seen(name: str = None): frappe.db.commit() # nosemgrep: this will be called in a GET request except Exception: - frappe.log_error('Unable to mark as seen', None, 'Communication', name) + frappe.log_error("Unable to mark as seen", None, "Communication", name) finally: frappe.response.update( diff --git a/frappe/core/doctype/data_import/data_import.py b/frappe/core/doctype/data_import/data_import.py index 3693ea53a4..06282e5831 100644 --- a/frappe/core/doctype/data_import/data_import.py +++ b/frappe/core/doctype/data_import/data_import.py @@ -113,7 +113,7 @@ def start_import(data_import): except Exception: frappe.db.rollback() data_import.db_set("status", "Error") - data_import.log_error('Data import failed') + data_import.log_error("Data import failed") finally: frappe.flags.in_import = False diff --git a/frappe/core/doctype/prepared_report/prepared_report.py b/frappe/core/doctype/prepared_report/prepared_report.py index dbdba19fbe..e35ec43565 100644 --- a/frappe/core/doctype/prepared_report/prepared_report.py +++ b/frappe/core/doctype/prepared_report/prepared_report.py @@ -47,7 +47,7 @@ def run_background(prepared_report): instance.save(ignore_permissions=True) except Exception: - report.log_error('Prepared report failed') + report.log_error("Prepared report failed") instance = frappe.get_doc("Prepared Report", prepared_report) instance.status = "Error" instance.error_message = frappe.get_traceback() diff --git a/frappe/core/doctype/user/user.py b/frappe/core/doctype/user/user.py index ec7374d72a..e81f5ecd99 100644 --- a/frappe/core/doctype/user/user.py +++ b/frappe/core/doctype/user/user.py @@ -265,7 +265,7 @@ class User(Document): except frappe.OutgoingEmailError: # email server not set, don't send email - self.log_error('Unable to send new password notification') + self.log_error("Unable to send new password notification") @Document.hook def validate_reset_password(self): diff --git a/frappe/desk/desktop.py b/frappe/desk/desktop.py index ae34cf3df2..4c82fe8c73 100644 --- a/frappe/desk/desktop.py +++ b/frappe/desk/desktop.py @@ -338,7 +338,7 @@ def get_desktop_page(page): "onboardings": workspace.onboardings, } except DoesNotExistError: - frappe.log_error('Workspace Missing') + frappe.log_error("Workspace Missing") return {} @@ -469,7 +469,9 @@ def save_new_widget(doc, page, blocks, new_widgets): page: {0} config: {1} exception: {2} - """.format(page, json_config, e) + """.format( + page, json_config, e + ) doc.log_error("Could not save customization", log) return False diff --git a/frappe/email/doctype/auto_email_report/auto_email_report.py b/frappe/email/doctype/auto_email_report/auto_email_report.py index 108cc46792..7a9af6149a 100644 --- a/frappe/email/doctype/auto_email_report/auto_email_report.py +++ b/frappe/email/doctype/auto_email_report/auto_email_report.py @@ -255,7 +255,10 @@ def send_daily(): try: auto_email_report.send() except Exception as e: - auto_email_report.log_error('Failed to send {0} Auto Email Report'.format(auto_email_report.name)) + auto_email_report.log_error( + "Failed to send {0} Auto Email Report".format(auto_email_report.name) + ) + def send_monthly(): """Check reports to be sent monthly""" diff --git a/frappe/email/doctype/email_queue/email_queue.py b/frappe/email/doctype/email_queue/email_queue.py index b3e52ef1e2..61d730829b 100644 --- a/frappe/email/doctype/email_queue/email_queue.py +++ b/frappe/email/doctype/email_queue/email_queue.py @@ -198,7 +198,7 @@ class SendMailContext: traceback_string = "".join(traceback.format_tb(exc_tb)) traceback_string += f"\n Queue Name: {self.queue_doc.name}" - self.queue_doc.log_error('Email sending failed', traceback_string) + self.queue_doc.log_error("Email sending failed", traceback_string) @property def smtp_session(self): @@ -623,9 +623,11 @@ class QueueBuilder: except frappe.InvalidEmailAddressError: # bad Email Address - don't add to queue self.log_error( - title = 'Invalid email address', - message = 'Invalid email address Sender: {0}, Recipients: {1}, \nTraceback: {2} ' - .format(self.sender, ', '.join(self.final_recipients()), traceback.format_exc())) + title="Invalid email address", + message="Invalid email address Sender: {0}, Recipients: {1}, \nTraceback: {2} ".format( + self.sender, ", ".join(self.final_recipients()), traceback.format_exc() + ), + ) return d = { diff --git a/frappe/email/doctype/notification/notification.py b/frappe/email/doctype/notification/notification.py index e868c0ceb6..5543ae6b5d 100644 --- a/frappe/email/doctype/notification/notification.py +++ b/frappe/email/doctype/notification/notification.py @@ -141,7 +141,7 @@ def get_context(context): self.create_system_notification(doc, context) except: - self.log_error('Failed to send Notification') + self.log_error("Failed to send Notification") if self.set_property_after_alert: allow_update = True @@ -168,7 +168,7 @@ def get_context(context): doc.save(ignore_permissions=True) doc.flags.in_notification_update = False except Exception: - self.log_error('Document update failed') + self.log_error("Document update failed") def create_system_notification(self, doc, context): subject = self.subject @@ -432,8 +432,8 @@ def evaluate_alert(doc, alert, event): if event == "Value Change" and not doc.is_new(): if not frappe.db.has_column(doc.doctype, alert.value_changed): - alert.db_set('enabled', 0) - alert.log_error('Notification {0} has been disabled due to missing field'.format(alert.name)) + alert.db_set("enabled", 0) + alert.log_error("Notification {0} has been disabled due to missing field".format(alert.name)) return doc_before_save = doc.get_doc_before_save() diff --git a/frappe/event_streaming/doctype/event_consumer/event_consumer.py b/frappe/event_streaming/doctype/event_consumer/event_consumer.py index dd3d2ec74c..bcd3d3be39 100644 --- a/frappe/event_streaming/doctype/event_consumer/event_consumer.py +++ b/frappe/event_streaming/doctype/event_consumer/event_consumer.py @@ -213,5 +213,5 @@ def has_consumer_access(consumer, update_log): else: return frappe.safe_eval(condition, frappe._dict(doc=doc)) except Exception as e: - consumer.log_error('has_consumer_access error') + consumer.log_error("has_consumer_access error") return False diff --git a/frappe/model/document.py b/frappe/model/document.py index a7b59ae749..67e1de0932 100644 --- a/frappe/model/document.py +++ b/frappe/model/document.py @@ -1363,12 +1363,10 @@ class Document(BaseDocument): frappe.local.flags.commit = True def log_error(self, title=None, message=None): - '''Helper function to create an Error Log''' + """Helper function to create an Error Log""" return frappe.log_error( - message = message, - title = title, - reference_doctype = self.doctype, - reference_name = self.name) + message=message, title=title, reference_doctype=self.doctype, reference_name=self.name + ) def get_signature(self): """Returns signature (hash) for private URL.""" diff --git a/frappe/model/workflow.py b/frappe/model/workflow.py index 092ad4f764..96fd710d91 100644 --- a/frappe/model/workflow.py +++ b/frappe/model/workflow.py @@ -254,9 +254,9 @@ def bulk_workflow_approval(docnames, doctype, action): frappe.db.rollback() frappe.log_error( - title = "Workflow {0} threw an error for {1} {2}".format(action, doctype, docname), - reference_doctype = 'Workflow', - reference_name = action + title="Workflow {0} threw an error for {1} {2}".format(action, doctype, docname), + reference_doctype="Workflow", + reference_name=action, ) finally: if not message_dict: diff --git a/frappe/utils/print_format.py b/frappe/utils/print_format.py index 2488fae0c9..87fb646f47 100644 --- a/frappe/utils/print_format.py +++ b/frappe/utils/print_format.py @@ -93,10 +93,11 @@ def download_multi_pdf(doctype, name, format=None, no_letterhead=False, options= ) except Exception: frappe.log_error( - title = 'Error in Multi PDF download', - message = "Permission Error on doc {} of doctype {}".format(doc_name, doctype_name), - reference_doctype = doctype_name, - reference_name = doc_name) + title="Error in Multi PDF download", + message="Permission Error on doc {} of doctype {}".format(doc_name, doctype_name), + reference_doctype=doctype_name, + reference_name=doc_name, + ) frappe.local.response.filename = "{}.pdf".format(name) frappe.local.response.filecontent = read_multi_pdf(output) From d9fbee3b9c77587960fcce2b1f7817ff2267c465 Mon Sep 17 00:00:00 2001 From: Rushabh Mehta Date: Mon, 18 Apr 2022 16:19:46 +0530 Subject: [PATCH 5/8] fix(minor): frappe.log_error --- frappe/__init__.py | 1 + 1 file changed, 1 insertion(+) diff --git a/frappe/__init__.py b/frappe/__init__.py index dcc401c036..e3a3769480 100644 --- a/frappe/__init__.py +++ b/frappe/__init__.py @@ -2076,6 +2076,7 @@ def log_error(title=None, message=None, reference_doctype=None, reference_name=N # the better API for this is log_error(title, message), and used in many cases this way # this hack tries to be smart about whats a title (single line ;-)) and fixes it + traceback = None if message: if "\n" in title: # traceback sent as title traceback, title = title, message From 626ef14e1ef03d2f02e17a83c4c04bb1ad1da927 Mon Sep 17 00:00:00 2001 From: Rushabh Mehta Date: Mon, 18 Apr 2022 16:23:11 +0530 Subject: [PATCH 6/8] fix(linting): fix quotes --- frappe/email/doctype/email_account/email_account.py | 5 +++-- frappe/email/queue.py | 2 +- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/frappe/email/doctype/email_account/email_account.py b/frappe/email/doctype/email_account/email_account.py index 65586de31d..73ab13b851 100755 --- a/frappe/email/doctype/email_account/email_account.py +++ b/frappe/email/doctype/email_account/email_account.py @@ -667,7 +667,7 @@ class EmailAccount(Document): try: email_server = self.get_incoming_server(in_receive=True) except Exception: - self.log_error(title=_("Error while connecting to email account {0}").format(self.name)) + self.log_error("Email Connection Error") if not email_server: return @@ -679,7 +679,8 @@ class EmailAccount(Document): message = safe_encode(message) email_server.imap.append("Sent", "\\Seen", imaplib.Time2Internaldate(time.time()), message) except Exception: - self.log_error(title="EmailAccount.append_email_to_sent_folder") + self.log_error("Unable to add to Sent folder") + @frappe.whitelist() def get_append_to( diff --git a/frappe/email/queue.py b/frappe/email/queue.py index ac873182a7..b92dea3e65 100755 --- a/frappe/email/queue.py +++ b/frappe/email/queue.py @@ -170,7 +170,7 @@ def flush(from_test=False): is_background_task = not from_test func(email_queue_name=row.name, is_background_task=is_background_task) except Exception: - frappe.get_doc('Email Queue', row.name).log_error() + frappe.get_doc("Email Queue", row.name).log_error() def get_queue(): From 930ae45fb8669aae8c2f9fb2bd89e08f4fb170c0 Mon Sep 17 00:00:00 2001 From: Rushabh Mehta Date: Mon, 18 Apr 2022 17:27:33 +0530 Subject: [PATCH 7/8] fix(test): add a test for Error Log --- frappe/core/doctype/error_log/error_log.json | 5 +++-- frappe/core/doctype/error_log/test_error_log.py | 6 +++++- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/frappe/core/doctype/error_log/error_log.json b/frappe/core/doctype/error_log/error_log.json index e643bbb090..b2ab516bba 100644 --- a/frappe/core/doctype/error_log/error_log.json +++ b/frappe/core/doctype/error_log/error_log.json @@ -50,7 +50,7 @@ "icon": "fa fa-warning-sign", "idx": 1, "links": [], - "modified": "2022-04-18 14:51:30.604304", + "modified": "2022-04-18 17:25:47.406873", "modified_by": "Administrator", "module": "Core", "name": "Error Log", @@ -71,5 +71,6 @@ "quick_entry": 1, "sort_field": "modified", "sort_order": "ASC", - "states": [] + "states": [], + "title_field": "method" } \ No newline at end of file diff --git a/frappe/core/doctype/error_log/test_error_log.py b/frappe/core/doctype/error_log/test_error_log.py index e20ac92650..a8511b238e 100644 --- a/frappe/core/doctype/error_log/test_error_log.py +++ b/frappe/core/doctype/error_log/test_error_log.py @@ -9,4 +9,8 @@ import frappe class TestErrorLog(unittest.TestCase): - pass + def test_error_log(self): + """let's do an error log on error log?""" + doc = frappe.new_doc("Error Log") + error = doc.log_error("This is an error") + self.assertEqual(error.doctype, "Error Log") From 248c3555e3537c874b448e7c62b2af7a5a6bc751 Mon Sep 17 00:00:00 2001 From: Rushabh Mehta Date: Wed, 20 Apr 2022 15:16:44 +0530 Subject: [PATCH 8/8] fix(minor): add error_log for failed webhooks and web pages --- frappe/integrations/doctype/webhook/webhook.py | 2 +- frappe/public/scss/website/my_account.scss | 1 + frappe/website/serve.py | 1 + 3 files changed, 3 insertions(+), 1 deletion(-) diff --git a/frappe/integrations/doctype/webhook/webhook.py b/frappe/integrations/doctype/webhook/webhook.py index 04a1c6c21e..3f1b60d903 100644 --- a/frappe/integrations/doctype/webhook/webhook.py +++ b/frappe/integrations/doctype/webhook/webhook.py @@ -105,7 +105,7 @@ def enqueue_webhook(doc, webhook): if i != 2: continue else: - raise e + webhook.log_error("Webhook failed") def log_request(url, headers, data, res): diff --git a/frappe/public/scss/website/my_account.scss b/frappe/public/scss/website/my_account.scss index 58075580a2..82c4164a31 100644 --- a/frappe/public/scss/website/my_account.scss +++ b/frappe/public/scss/website/my_account.scss @@ -30,6 +30,7 @@ .my-account-container { max-width: 800px; margin: auto; + margin-bottom: 4rem; } .account-info { diff --git a/frappe/website/serve.py b/frappe/website/serve.py index b30f3f1047..2c33b5df51 100644 --- a/frappe/website/serve.py +++ b/frappe/website/serve.py @@ -20,6 +20,7 @@ def get_response(path=None, http_status_code=200): except frappe.PermissionError as e: response = NotPermittedPage(endpoint, http_status_code, exception=e).render() except Exception as e: + frappe.log_error(f"{path} failed") response = ErrorPage(exception=e).render() return response