From 5226b32f2f42c9320caa8748b267ebe8b4c09d72 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Bernd=20Oliver=20S=C3=BCnderhauf?=
<46800703+bosue@users.noreply.github.com>
Date: Tue, 31 Oct 2023 11:42:15 +0100
Subject: [PATCH 001/105] test: Add reliably failing UI test: Awesomebar
filtering current doclist
---
cypress/integration/awesome_bar.js | 49 ++++++++++++++++++++++++------
1 file changed, 39 insertions(+), 10 deletions(-)
diff --git a/cypress/integration/awesome_bar.js b/cypress/integration/awesome_bar.js
index 03ef96783a..dff04a5693 100644
--- a/cypress/integration/awesome_bar.js
+++ b/cypress/integration/awesome_bar.js
@@ -2,7 +2,11 @@ context("Awesome Bar", () => {
before(() => {
cy.visit("/login");
cy.login();
- cy.visit("/app/website");
+ cy.visit("/app/todo"); // Make sure ToDo filters are cleared.
+ cy.clear_filters();
+ cy.visit("/app/blog-post"); // Make sure Blog Post filters are cleared.
+ cy.clear_filters();
+ cy.visit("/app/website"); // Go to some other page.
});
beforeEach(() => {
@@ -11,36 +15,61 @@ context("Awesome Bar", () => {
cy.get("@awesome_bar").type("{selectall}");
});
+ after(() => {
+ cy.visit("/app/todo"); // Make sure we're not bleeding any filters to the next spec.
+ cy.clear_filters();
+ });
+
it("navigates to doctype list", () => {
cy.get("@awesome_bar").type("todo");
- cy.wait(100);
+ cy.wait(100); // Wait a bit before hitting enter.
cy.get(".awesomplete").findByRole("listbox").should("be.visible");
cy.get("@awesome_bar").type("{enter}");
cy.get(".title-text").should("contain", "To Do");
cy.location("pathname").should("eq", "/app/todo");
});
- it("find text in doctype list", () => {
+ it("finds text in doctype list", () => {
cy.get("@awesome_bar").type("test in todo");
- cy.wait(100);
+ cy.wait(150); // Wait a bit before hitting enter.
cy.get("@awesome_bar").type("{enter}");
cy.get(".title-text").should("contain", "To Do");
- cy.wait(200);
- const name_filter = cy.get('[data-original-title="ID"] > input');
- name_filter.should("have.value", "%test%");
- cy.clear_filters();
+ cy.wait(200); // Wait a bit longer before checking the filter.
+ cy.get('[data-original-title="ID"] > input').should("have.value", "%test%");
+ });
+
+ it("filter preserved, now finds something else", () => {
+ cy.visit("/app/todo");
+ cy.get(".title-text").should("contain", "To Do");
+ cy.wait(200); // Wait a bit longer before checking the filter.
+ cy.get('[data-original-title="ID"] > input').as("filter");
+ cy.get("@filter").should("have.value", "%test%");
+ cy.get("@awesome_bar").type("anothertest in todo");
+ cy.wait(200); // Wait a bit longer before hitting enter.
+ cy.get("@awesome_bar").type("{enter}");
+ cy.wait(200); // Wait a bit longer before checking the filter.
+ cy.get("@filter").should("have.value", "%anothertest%");
+ });
+
+ it("navigates to another doctype, filter not bleeding", () => {
+ cy.get("@awesome_bar").type("blog post");
+ cy.wait(150); // Wait a bit before hitting enter.
+ cy.get("@awesome_bar").type("{enter}");
+ cy.get(".title-text").should("contain", "Blog Post");
+ cy.wait(200); // Wait a bit longer before checking the filter.
+ cy.location("search").should("be.empty");
});
it("navigates to new form", () => {
cy.get("@awesome_bar").type("new blog post");
- cy.wait(100);
+ cy.wait(150); // Wait a bit before hitting enter
cy.get("@awesome_bar").type("{enter}");
cy.get(".title-text:visible").should("have.text", "New Blog Post");
});
it("calculates math expressions", () => {
cy.get("@awesome_bar").type("55 + 32");
- cy.wait(100);
+ cy.wait(150); // Wait a bit before hitting enter
cy.get("@awesome_bar").type("{downarrow}{enter}");
cy.get(".modal-title").should("contain", "Result");
cy.get(".msgprint").should("contain", "55 + 32 = 87");
From c3adc13206ef44a0d50f2a00d7514690b2a71df6 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Bernd=20Oliver=20S=C3=BCnderhauf?=
<46800703+bosue@users.noreply.github.com>
Date: Tue, 31 Oct 2023 23:01:09 +0100
Subject: [PATCH 002/105] fix!: Make router always take query parameters into
account.
---
frappe/public/js/frappe/router.js | 21 ++++++++++++++++-----
1 file changed, 16 insertions(+), 5 deletions(-)
diff --git a/frappe/public/js/frappe/router.js b/frappe/public/js/frappe/router.js
index 2631c6374e..3b50791aa7 100644
--- a/frappe/public/js/frappe/router.js
+++ b/frappe/public/js/frappe/router.js
@@ -368,7 +368,11 @@ frappe.router = {
window.open(sub_path, "_blank");
frappe.open_in_new_tab = false;
} else {
- this.push_state(sub_path);
+ const route_options = frappe.route_options || {};
+ const query_params = Object.entries(route_options)
+ .map(([key, value]) => `${key}=` + encodeURIComponent(JSON.stringify(value)))
+ .join("&");
+ this.push_state(sub_path, query_params ? `?${query_params}` : "");
}
setTimeout(() => {
frappe.after_ajax &&
@@ -469,12 +473,19 @@ frappe.router = {
return "/app/" + (path_string || default_page);
},
- push_state(url) {
- // change the URL and call the router
- if (window.location.pathname !== url) {
+ /**
+ * Changes the URL and calls the router.
+ *
+ * @param {string} path - The desired URI path to replace or push,
+ * without query string. Example: "/app/todo"
+ * @param {string} query_params - The desired query parameter string.
+ * @returns {void}
+ */
+ push_state(path, query_params = "") {
+ if (window.location.pathname !== path || window.location.search !== query_params) {
// push/replace state so the browser looks fine
const method = frappe.route_flags.replace_route ? "replaceState" : "pushState";
- history[method](null, null, url);
+ history[method](null, null, path);
// now process the route
this.route();
From f991b0be0f56a5577844200a259c475fe5960ab4 Mon Sep 17 00:00:00 2001
From: barredterra <14891507+barredterra@users.noreply.github.com>
Date: Tue, 7 Nov 2023 19:15:09 +0100
Subject: [PATCH 003/105] fix: max-width of email attachment filename
---
.../public/js/frappe/views/communication.js | 21 +++++++++++++------
1 file changed, 15 insertions(+), 6 deletions(-)
diff --git a/frappe/public/js/frappe/views/communication.js b/frappe/public/js/frappe/views/communication.js
index 9b69ebee3c..c415da95b8 100755
--- a/frappe/public/js/frappe/views/communication.js
+++ b/frappe/public/js/frappe/views/communication.js
@@ -522,18 +522,27 @@ frappe.views.CommunicationComposer = class {
get_attachment_row(attachment, checked) {
return $(`
-
`);
}
From 4203c3b13da0821419f0f513121ba9926da7cd00 Mon Sep 17 00:00:00 2001
From: HarryPaulo
Date: Mon, 20 Nov 2023 22:31:12 -0300
Subject: [PATCH 004/105] fix: load languages that have capital letters
---
frappe/translate.py | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/frappe/translate.py b/frappe/translate.py
index cc0771583e..2f3341fd35 100644
--- a/frappe/translate.py
+++ b/frappe/translate.py
@@ -200,7 +200,7 @@ def get_translations_from_apps(lang, apps=None):
translations = {}
for app in apps or frappe.get_installed_apps(_ensure_on_bench=True):
- path = frappe.get_app_path(app, "translations", lang + ".csv")
+ path = os.path.join(frappe.get_app_path(app, "translations"), lang + ".csv")
translations.update(get_translation_dict_from_file(path, lang, app) or {})
if "-" in lang:
parent = lang.split("-", 1)[0]
From 89dbb42f6fb0369a40a7d3a236ca56366d00a344 Mon Sep 17 00:00:00 2001
From: RitvikSardana
Date: Thu, 23 Nov 2023 13:12:16 +0530
Subject: [PATCH 005/105] fix: link field shown only for Link fieldtype
---
frappe/public/js/form_builder/components/Field.vue | 9 +++++++--
.../js/form_builder/components/FieldProperties.vue | 6 +++++-
frappe/public/js/form_builder/store.js | 8 ++++++--
3 files changed, 18 insertions(+), 5 deletions(-)
diff --git a/frappe/public/js/form_builder/components/Field.vue b/frappe/public/js/form_builder/components/Field.vue
index 08e65473ee..92825e2375 100644
--- a/frappe/public/js/form_builder/components/Field.vue
+++ b/frappe/public/js/form_builder/components/Field.vue
@@ -174,8 +174,13 @@ function edit_filters() {
}
function is_filter_applied() {
- if (props.field.df.link_filters && JSON.parse(props.field.df.link_filters).length > 0) {
- return "btn-filter-applied";
+ if (props.field.df.link_filters) {
+ try {
+ JSON.parse(props.field.df.link_filters).length > 0;
+ return "btn-filter-applied";
+ } catch (error) {
+ return "";
+ }
}
}
diff --git a/frappe/public/js/form_builder/components/FieldProperties.vue b/frappe/public/js/form_builder/components/FieldProperties.vue
index 7132bfeba9..5f903ed36c 100644
--- a/frappe/public/js/form_builder/components/FieldProperties.vue
+++ b/frappe/public/js/form_builder/components/FieldProperties.vue
@@ -51,6 +51,11 @@ let docfield_df = computed(() => {
}
}
+ // show link_filters docfield only when link field is selected
+ if (df.fieldname === "link_filters" && store.form.selected_field.fieldtype !== "Link") {
+ return false;
+ }
+
if (search_text.value) {
if (
df.label.toLowerCase().includes(search_text.value.toLowerCase()) ||
@@ -62,7 +67,6 @@ let docfield_df = computed(() => {
}
return true;
});
-
return [...fields];
});
diff --git a/frappe/public/js/form_builder/store.js b/frappe/public/js/form_builder/store.js
index 069cd10540..97aa89b58c 100644
--- a/frappe/public/js/form_builder/store.js
+++ b/frappe/public/js/form_builder/store.js
@@ -202,14 +202,18 @@ export const useStore = defineStore("form-builder-store", () => {
);
}
- // check if link_filters format is correct or not
+ if (df.link_filters === "") {
+ delete df.link_filters;
+ }
+ // check if link_filters format is correct or not
if (df.link_filters) {
try {
let link_filters = JSON.parse(df.link_filters);
} catch (e) {
error_message = __(
- `Invalid Filter Format. Try using filter icon on the field to set it correctly`
+ "Invalid Filter Format for field {0} of type {1}. Try using filter icon on the field to set it correctly",
+ get_field_data(df)
);
}
}
From 9e7a0b73edb7444581863e6a5f5744c2bfa1bf69 Mon Sep 17 00:00:00 2001
From: Shadrak Gurupnor
Date: Thu, 23 Nov 2023 13:18:08 +0530
Subject: [PATCH 006/105] fix: show fieldname if field label is not set
---
frappe/public/js/frappe/ui/group_by/group_by.js | 7 +++++--
1 file changed, 5 insertions(+), 2 deletions(-)
diff --git a/frappe/public/js/frappe/ui/group_by/group_by.js b/frappe/public/js/frappe/ui/group_by/group_by.js
index 2f218678ac..46b85a05cb 100644
--- a/frappe/public/js/frappe/ui/group_by/group_by.js
+++ b/frappe/public/js/frappe/ui/group_by/group_by.js
@@ -147,10 +147,13 @@ frappe.ui.GroupBy = class {
doctype_fields.forEach((field) => {
// pick numeric fields for sum / avg
if (frappe.model.is_numeric_field(field.fieldtype)) {
+ let field_label = field.label
+ ? field.label
+ : frappe.model.unscrub(field.fieldname);
let option_text =
doctype == this.doctype
- ? field.label
- : `${field.label} (${__(doctype)})`;
+ ? field_label
+ : `${field_label} (${__(doctype)})`;
this.aggregate_on_html += ``;
}
From 71201675ba5e5f9c2d65b4442dc6ffb3058fe05f Mon Sep 17 00:00:00 2001
From: RitvikSardana
Date: Thu, 23 Nov 2023 13:33:15 +0530
Subject: [PATCH 007/105] fix: add back if condition
---
frappe/public/js/form_builder/components/Field.vue | 5 +++--
1 file changed, 3 insertions(+), 2 deletions(-)
diff --git a/frappe/public/js/form_builder/components/Field.vue b/frappe/public/js/form_builder/components/Field.vue
index 92825e2375..26d488cdf8 100644
--- a/frappe/public/js/form_builder/components/Field.vue
+++ b/frappe/public/js/form_builder/components/Field.vue
@@ -176,8 +176,9 @@ function edit_filters() {
function is_filter_applied() {
if (props.field.df.link_filters) {
try {
- JSON.parse(props.field.df.link_filters).length > 0;
- return "btn-filter-applied";
+ if (JSON.parse(props.field.df.link_filters).length > 0) {
+ return "btn-filter-applied";
+ }
} catch (error) {
return "";
}
From 43ffd175590f1d5c0072764ac292fec11e1d1096 Mon Sep 17 00:00:00 2001
From: Shadrak Gurupnor
Date: Thu, 23 Nov 2023 14:26:29 +0530
Subject: [PATCH 008/105] chore: translation
---
frappe/public/js/frappe/ui/group_by/group_by.js | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/frappe/public/js/frappe/ui/group_by/group_by.js b/frappe/public/js/frappe/ui/group_by/group_by.js
index 46b85a05cb..2f62904813 100644
--- a/frappe/public/js/frappe/ui/group_by/group_by.js
+++ b/frappe/public/js/frappe/ui/group_by/group_by.js
@@ -153,7 +153,7 @@ frappe.ui.GroupBy = class {
let option_text =
doctype == this.doctype
? field_label
- : `${field_label} (${__(doctype)})`;
+ : `${__(field_label)} (${__(doctype)})`;
this.aggregate_on_html += ``;
}
From 06fbe6df20efc69714b778aa588dd14761ada5ab Mon Sep 17 00:00:00 2001
From: barredterra <14891507+barredterra@users.noreply.github.com>
Date: Thu, 23 Nov 2023 16:51:23 +0100
Subject: [PATCH 009/105] fix: default Email Group in system language
---
frappe/email/doctype/newsletter/newsletter.py | 13 ++++++++++---
1 file changed, 10 insertions(+), 3 deletions(-)
diff --git a/frappe/email/doctype/newsletter/newsletter.py b/frappe/email/doctype/newsletter/newsletter.py
index 5aabe3d85e..efe93bf5ed 100644
--- a/frappe/email/doctype/newsletter/newsletter.py
+++ b/frappe/email/doctype/newsletter/newsletter.py
@@ -308,11 +308,11 @@ def confirmed_unsubscribe(email, group):
@frappe.whitelist(allow_guest=True)
@rate_limit(limit=10, seconds=60 * 60)
-def subscribe(email, email_group=None): # noqa
+def subscribe(email, email_group=None):
"""API endpoint to subscribe an email to a particular email group. Triggers a confirmation email."""
if email_group is None:
- email_group = _("Website")
+ email_group = get_default_email_group()
# build subscription confirmation URL
api_endpoint = frappe.utils.get_url(
@@ -355,13 +355,16 @@ def subscribe(email, email_group=None): # noqa
@frappe.whitelist(allow_guest=True)
-def confirm_subscription(email, email_group=_("Website")): # noqa
+def confirm_subscription(email, email_group=None):
"""API endpoint to confirm email subscription.
This endpoint is called when user clicks on the link sent to their mail.
"""
if not verify_request():
return
+ if email_group is None:
+ email_group = get_default_email_group()
+
if not frappe.db.exists("Email Group", email_group):
frappe.get_doc({"doctype": "Email Group", "title": email_group}).insert(ignore_permissions=True)
@@ -438,3 +441,7 @@ def newsletter_email_read(recipient_email=None, reference_doctype=None, referenc
finally:
frappe.response.update(frappe.utils.get_imaginary_pixel_response())
+
+
+def get_default_email_group():
+ return _("Website", lang=frappe.db.get_default("language"))
From a99bf561603f8e9f17c373bc7ed9ff7df6bfde50 Mon Sep 17 00:00:00 2001
From: barredterra <14891507+barredterra@users.noreply.github.com>
Date: Fri, 24 Nov 2023 00:59:22 +0100
Subject: [PATCH 010/105] fix: german translations for timespan
---
frappe/translations/de.csv | 20 +++++++++++++-------
1 file changed, 13 insertions(+), 7 deletions(-)
diff --git a/frappe/translations/de.csv b/frappe/translations/de.csv
index 9a9154467b..7977b4d716 100644
--- a/frappe/translations/de.csv
+++ b/frappe/translations/de.csv
@@ -1428,6 +1428,7 @@ Landing Page,Zielseite,
Language,Sprache,
Language Code,Sprachcode,
"Language, Date and Time settings","Einstellungen zu Sprache, Datum und Uhrzeit",
+Last 6 months,Vergangene zwei Quartale,
Last Active,Zuletzt aktiv,
Last IP,Letzte IP,
Last Known Versions,Letzte bekannte Versionen,
@@ -1436,14 +1437,14 @@ Last Message,Letzte Nachricht,
Last Modified By,Zuletzt geändert durch,
Last Modified Date,Zuletzt geändertes Datum,
Last Modified On,Zuletzt geändert am,
-Last Month,Im vergangenen Monat,
+Last Month,Vergangener Monat,
Last Point Allocation Date,Datum der letzten Punktzuweisung,
-Last Quarter,Letztes Quartal,
+Last Quarter,Vergangenes Quartal,
Last Synced On,Zuletzt synchronisiert am,
Last Updated By,Zuletzt aktualisiert von,
Last Updated On,Zuletzt aktualisiert am,
Last User,Letzter Benutzer,
-Last Week,Letzte Woche,
+Last Week,Vergangene Woche,
Last Year,Vergangenes Jahr,
Last synced {0},Zuletzt synchronisiert {0},
Learn more,Mehr erfahren,
@@ -1641,6 +1642,11 @@ Next Scheduled Date,Nächstes geplantes Datum,
Next State,Nächster Status,
Next Sync Token,Nächstes Sync-Token,
Next actions,Nächste Aktionen,
+Next Week,Kommende Woche,
+Next Month,Kommender Monat,
+Next Quarter,Kommendes Quartal,
+Next 6 months,Kommende zwei Quartale,
+Next Year,Kommendes Jahr,
No Active Sessions,Keine aktiven Sessions,
No Copy,Keine Kopie,
No Email Account,Kein E-Mail-Konto,
@@ -4213,10 +4219,10 @@ Google Snippet Preview,Google Snippet-Vorschau,
This is an example Google SERP Preview.,Dies ist ein Beispiel für die Google SERP-Vorschau.,
Add Gray Background,Fügen Sie grauen Hintergrund hinzu,
Hide Block,Block ausblenden,
-This Week,Diese Woche,
-This Month,Diesen Monat,
-This Quarter,Dieses Quartal,
-This Year,Dieses Jahr,
+This Week,Aktuelle Woche,
+This Month,Aktueller Monat,
+This Quarter,Aktuelles Quartal,
+This Year,Aktuelles Jahr,
All Time,Alle Zeit,
Select From Date,Wählen Sie Von Datum,
since yesterday,seit gestern,
From 770598df4998304611d59bcabf949c0ca7665379 Mon Sep 17 00:00:00 2001
From: Ankush Menat
Date: Fri, 24 Nov 2023 10:18:29 +0530
Subject: [PATCH 011/105] Revert "refactor: remove code that manually prevents
bulk refresh (#23138)"
This reverts commit 60d99eb20c8c49a976b3b48c829d9c8d9f1c5919.
---
frappe/public/js/frappe/list/list_view.js | 35 ++++++++++++++++++-----
1 file changed, 28 insertions(+), 7 deletions(-)
diff --git a/frappe/public/js/frappe/list/list_view.js b/frappe/public/js/frappe/list/list_view.js
index 893c212f23..58f8a7606c 100644
--- a/frappe/public/js/frappe/list/list_view.js
+++ b/frappe/public/js/frappe/list/list_view.js
@@ -1520,8 +1520,9 @@ frappe.views.ListView = class ListView extends frappe.views.BaseList {
if (this.filter_area.is_being_edited()) {
return true;
}
- // this flag is left for backward compatibility, there's no need to prevent realtime
- // refresh. They are by default debounced now and there's no way to bypass that.
+ // this is set when a bulk operation is called from a list view which might update the list view
+ // this is to avoid the list view from refreshing a lot of times
+ // the list view is updated once after the bulk operation is complete
if (this.disable_list_update) {
return true;
}
@@ -1723,6 +1724,7 @@ frappe.views.ListView = class ListView extends frappe.views.BaseList {
get_workflow_action_menu_items() {
const workflow_actions = [];
+ const me = this;
if (frappe.model.has_workflow(this.doctype)) {
const actions = frappe.workflow.get_all_transition_actions(this.doctype);
@@ -1731,11 +1733,16 @@ frappe.views.ListView = class ListView extends frappe.views.BaseList {
label: __(action),
name: action,
action: () => {
- frappe.xcall("frappe.model.workflow.bulk_workflow_approval", {
- docnames: this.get_checked_items(true),
- doctype: this.doctype,
- action: action,
- });
+ me.disable_list_update = true;
+ frappe
+ .xcall("frappe.model.workflow.bulk_workflow_approval", {
+ docnames: this.get_checked_items(true),
+ doctype: this.doctype,
+ action: action,
+ })
+ .finally(() => {
+ me.disable_list_update = false;
+ });
},
is_workflow_action: true,
});
@@ -1796,7 +1803,9 @@ frappe.views.ListView = class ListView extends frappe.views.BaseList {
return {
label: __("Assign To", null, "Button in list view actions menu"),
action: () => {
+ this.disable_list_update = true;
bulk_operations.assign(this.get_checked_items(true), () => {
+ this.disable_list_update = false;
this.clear_checked_items();
this.refresh();
});
@@ -1809,7 +1818,9 @@ frappe.views.ListView = class ListView extends frappe.views.BaseList {
return {
label: __("Apply Assignment Rule", null, "Button in list view actions menu"),
action: () => {
+ this.disable_list_update = true;
bulk_operations.apply_assignment_rule(this.get_checked_items(true), () => {
+ this.disable_list_update = false;
this.clear_checked_items();
this.refresh();
});
@@ -1822,7 +1833,9 @@ frappe.views.ListView = class ListView extends frappe.views.BaseList {
return {
label: __("Add Tags", null, "Button in list view actions menu"),
action: () => {
+ this.disable_list_update = true;
bulk_operations.add_tags(this.get_checked_items(true), () => {
+ this.disable_list_update = false;
this.clear_checked_items();
this.refresh();
});
@@ -1859,7 +1872,9 @@ frappe.views.ListView = class ListView extends frappe.views.BaseList {
);
}
frappe.confirm(message, () => {
+ this.disable_list_update = true;
bulk_operations.delete(docnames, () => {
+ this.disable_list_update = false;
this.clear_checked_items();
this.refresh();
});
@@ -1882,7 +1897,9 @@ frappe.views.ListView = class ListView extends frappe.views.BaseList {
"Title of confirmation dialog"
),
() => {
+ this.disable_list_update = true;
bulk_operations.submit_or_cancel(docnames, "cancel", () => {
+ this.disable_list_update = false;
this.clear_checked_items();
this.refresh();
});
@@ -1907,7 +1924,9 @@ frappe.views.ListView = class ListView extends frappe.views.BaseList {
"Title of confirmation dialog"
),
() => {
+ this.disable_list_update = true;
bulk_operations.submit_or_cancel(docnames, "submit", () => {
+ this.disable_list_update = false;
this.clear_checked_items();
this.refresh();
});
@@ -1931,7 +1950,9 @@ frappe.views.ListView = class ListView extends frappe.views.BaseList {
}
});
+ this.disable_list_update = true;
bulk_operations.edit(this.get_checked_items(true), field_mappings, () => {
+ this.disable_list_update = false;
this.refresh();
});
},
From 62529f3d74dc4fea87a09cce6a50928b2d2a1d9b Mon Sep 17 00:00:00 2001
From: Ankush Menat
Date: Fri, 24 Nov 2023 10:25:12 +0530
Subject: [PATCH 012/105] chore(telemetry): track logged errors (#23390)
Also includes unhandled errors
---
frappe/utils/error.py | 5 ++++-
1 file changed, 4 insertions(+), 1 deletion(-)
diff --git a/frappe/utils/error.py b/frappe/utils/error.py
index 7d4e5c7c16..fa78697d88 100644
--- a/frappe/utils/error.py
+++ b/frappe/utils/error.py
@@ -38,6 +38,7 @@ def log_error(
):
"""Log error to Error Log"""
from frappe.monitor import get_trace_id
+ from frappe.utils.telemetry import capture
# Parameter ALERT:
# the title and message may be swapped
@@ -58,14 +59,16 @@ def log_error(
print(f"Failed to log error in db: {title}")
return
+ trace_id = get_trace_id()
error_log = frappe.get_doc(
doctype="Error Log",
error=traceback,
method=title,
reference_doctype=reference_doctype,
reference_name=reference_name,
- trace_id=get_trace_id(),
+ trace_id=trace_id,
)
+ capture("error_logged", "frappe", properties={"title": title, "trace_id": trace_id})
if frappe.flags.read_only or defer_insert:
error_log.deferred_insert()
From 01fb455a76716836a90289dc904c03216785c1f8 Mon Sep 17 00:00:00 2001
From: Shariq Ansari
Date: Fri, 24 Nov 2023 11:29:29 +0530
Subject: [PATCH 013/105] fix: webform banner_image name replacing navbar
banner_image
---
frappe/website/doctype/web_form/templates/web_form.html | 8 ++++----
frappe/website/doctype/web_form/web_form.py | 3 +++
2 files changed, 7 insertions(+), 4 deletions(-)
diff --git a/frappe/website/doctype/web_form/templates/web_form.html b/frappe/website/doctype/web_form/templates/web_form.html
index 1d663933c3..e30284e1ca 100644
--- a/frappe/website/doctype/web_form/templates/web_form.html
+++ b/frappe/website/doctype/web_form/templates/web_form.html
@@ -7,9 +7,9 @@
{% block breadcrumbs %}{% endblock %}
{% block header %}
- {% if banner_image %}
+ {% if webform_banner_image %}
-
+
{% endif %}
{% endblock %}
@@ -51,7 +51,7 @@
- {% if not banner_image and has_header and login_required and show_list %}
+ {% if not webform_banner_image and has_header and login_required and show_list %}
{% include "templates/includes/breadcrumbs.html" %}
{% else %}
@@ -59,7 +59,7 @@
- {% if banner_image and has_header and login_required and show_list %}
+ {% if webform_banner_image and has_header and login_required and show_list %}
{% include "templates/includes/breadcrumbs.html" %}
{% endif %}