@@ -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 = ( | |||
@@ -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() | |||
@@ -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) | |||
@@ -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( | |||
@@ -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 | |||
@@ -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": [] | |||
} |
@@ -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") |
@@ -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() | |||
@@ -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): | |||
@@ -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 | |||
@@ -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): | |||
@@ -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", | |||
@@ -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 | |||
@@ -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""" | |||
@@ -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( | |||
@@ -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 = { | |||
@@ -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() |
@@ -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() | |||
@@ -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(): | |||
@@ -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() | |||
@@ -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 |
@@ -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() | |||
@@ -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: | |||
@@ -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": | |||
@@ -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) | |||
@@ -70,6 +70,8 @@ data-web-form="{{ name }}" data-web-form-doctype="{{ doc_type }}" data-login-req | |||
<div class="comments" style="margin-top: 3rem;"> | |||
{% include 'templates/includes/comments/comments.html' %} | |||
</div> | |||
{%- else -%} | |||
<div style="height: 3rem"></div> | |||
{%- endif %} {# comments #} | |||
{% endblock page_content %} | |||