From d67b69e93f815c21620dde20e3e1b68f2800d032 Mon Sep 17 00:00:00 2001 From: barredterra <14891507+barredterra@users.noreply.github.com> Date: Tue, 19 Mar 2024 01:53:36 +0100 Subject: [PATCH 01/23] refactor: align list style to frappe-ui --- frappe/public/scss/desk/list.scss | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/frappe/public/scss/desk/list.scss b/frappe/public/scss/desk/list.scss index 30907f5058..20e13029a5 100644 --- a/frappe/public/scss/desk/list.scss +++ b/frappe/public/scss/desk/list.scss @@ -63,7 +63,6 @@ display: flex; flex-direction: column; outline: none; - padding: 4px 5px; &:focus { .list-row { @@ -160,8 +159,7 @@ cursor: default; background-color: var(--subtle-fg); height: 30px; - padding: 8px, 10px, 8px, 0px; - margin: 8px 5px 0px 5px; + margin: 0.5rem 0; border-radius: var(--border-radius-md); .list-check-all { @@ -250,6 +248,7 @@ input.list-row-checkbox { margin-top: 0px; margin-bottom: 0px; --checkbox-right-margin: calc(var(--checkbox-size) / 2 + #{$level-margin-right}); + background-color: var(--card-bg); } input.list-check-all { From b7c6b9f197332c8021fe48e82185fab648019a01 Mon Sep 17 00:00:00 2001 From: barredterra <14891507+barredterra@users.noreply.github.com> Date: Tue, 19 Mar 2024 21:37:23 +0100 Subject: [PATCH 02/23] fix: align rows with filters --- frappe/public/scss/desk/list.scss | 3 ++- frappe/public/scss/desk/page.scss | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/frappe/public/scss/desk/list.scss b/frappe/public/scss/desk/list.scss index 20e13029a5..7c5d3c2940 100644 --- a/frappe/public/scss/desk/list.scss +++ b/frappe/public/scss/desk/list.scss @@ -63,6 +63,7 @@ display: flex; flex-direction: column; outline: none; + padding: 0 var(--padding-xs); &:focus { .list-row { @@ -159,7 +160,7 @@ cursor: default; background-color: var(--subtle-fg); height: 30px; - margin: 0.5rem 0; + margin: 0.5rem var(--padding-xs); border-radius: var(--border-radius-md); .list-check-all { diff --git a/frappe/public/scss/desk/page.scss b/frappe/public/scss/desk/page.scss index 0b07523495..d2c391ebbb 100644 --- a/frappe/public/scss/desk/page.scss +++ b/frappe/public/scss/desk/page.scss @@ -110,7 +110,7 @@ .page-form { margin: 0; - padding: var(--padding-sm); + padding: var(--padding-xs); display: flex; flex-wrap: wrap; background-color: var(--card-bg); From 2e47f66d4e5aabbcdea92bd4369f1fd371733318 Mon Sep 17 00:00:00 2001 From: Shariq Ansari Date: Wed, 20 Mar 2024 13:55:41 +0530 Subject: [PATCH 03/23] fix: row border was leaking --- frappe/public/js/frappe/list/list_view.js | 1 + frappe/public/scss/desk/list.scss | 10 +++++++++- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/frappe/public/js/frappe/list/list_view.js b/frappe/public/js/frappe/list/list_view.js index f20e2d351a..484532900b 100644 --- a/frappe/public/js/frappe/list/list_view.js +++ b/frappe/public/js/frappe/list/list_view.js @@ -740,6 +740,7 @@ frappe.views.ListView = class ListView extends frappe.views.BaseList { ${right} +
`; } diff --git a/frappe/public/scss/desk/list.scss b/frappe/public/scss/desk/list.scss index 7c5d3c2940..4a5cb53441 100644 --- a/frappe/public/scss/desk/list.scss +++ b/frappe/public/scss/desk/list.scss @@ -59,7 +59,6 @@ } .list-row-container { - border-bottom: 1px solid $border-color; display: flex; flex-direction: column; outline: none; @@ -70,6 +69,15 @@ background-color: var(--highlight-color); } } + + .list-row-border { + border-bottom: 1px solid $border-color; + margin: 0 10px; + } + + &:last-child .list-row-border { + display: none; + } } .list-row { From a12fc118f4b4ad85e28e7c1a866614d0e50f2c89 Mon Sep 17 00:00:00 2001 From: Ankush Menat Date: Thu, 21 Mar 2024 11:47:23 +0530 Subject: [PATCH 04/23] perf: remove useless sorting on docstatus (#25571) --- frappe/model/db_query.py | 5 ----- 1 file changed, 5 deletions(-) diff --git a/frappe/model/db_query.py b/frappe/model/db_query.py index f1a36d79b2..b73e691245 100644 --- a/frappe/model/db_query.py +++ b/frappe/model/db_query.py @@ -1089,11 +1089,6 @@ class DatabaseQuery: f"`tab{self.doctype}`.`{sort_field or 'modified'}` {sort_order or 'desc'}" ) - # draft docs always on top - if hasattr(self.doctype_meta, "is_submittable") and self.doctype_meta.is_submittable: - if self.order_by: - args.order_by = f"`tab{self.doctype}`.docstatus asc, {args.order_by}" - def validate_order_by_and_group_by(self, parameters: str): """Check order by, group by so that atleast one column is selected and does not have subquery""" if not parameters: From 6613ed76fe6a70f33db2b4419c2cb82f1e49461c Mon Sep 17 00:00:00 2001 From: Ankush Menat Date: Thu, 21 Mar 2024 16:48:29 +0530 Subject: [PATCH 05/23] fix: ensure that prepared report is set even on timeout (#25565) * fix: ensure that prepared report is set even on timeout Under following condition prepared report is never enabled: - Process takes too much time and is killed - HTTP timeout Fix: - We spawn a thread and ask it to wait till prepared report threshold time is elapsed and set prepared report on it. - Condvar is used to immdiately wake up and end the thread if report finsihed early. * refactor: use threading.Timer No need to implement it ourselves --- frappe/core/doctype/report/report.py | 26 ++++++++++++++++++-------- 1 file changed, 18 insertions(+), 8 deletions(-) diff --git a/frappe/core/doctype/report/report.py b/frappe/core/doctype/report/report.py index c108c8ee6e..ed42a61747 100644 --- a/frappe/core/doctype/report/report.py +++ b/frappe/core/doctype/report/report.py @@ -2,6 +2,7 @@ # License: MIT. See LICENSE import datetime import json +import threading import frappe import frappe.desk.query_report @@ -15,6 +16,8 @@ from frappe.modules.export_file import export_to_files from frappe.utils import cint, cstr from frappe.utils.safe_exec import check_safe_sql_query, safe_exec +PREPARED_REPORT_THRESHOLD = 20 # seconds + class Report(Document): # begin: auto-generated types @@ -153,21 +156,24 @@ class Report(Document): def execute_script_report(self, filters): # save the timestamp to automatically set to prepared - threshold = 15 - start_time = datetime.datetime.now() + if not self.prepared_report: + set_prepared_report = threading.Timer( + interval=PREPARED_REPORT_THRESHOLD, + function=enable_prepared_report, + kwargs={"report": self.name, "site": frappe.local.site}, + ) + set_prepared_report.start() + # The JOB if self.is_standard == "Yes": res = self.execute_module(filters) else: res = self.execute_script(filters) - # automatically set as prepared + set_prepared_report.cancel() execution_time = (datetime.datetime.now() - start_time).total_seconds() - if execution_time > threshold and not self.prepared_report: - frappe.enqueue(enable_prepared_report, report=self.name) - frappe.cache.hset("report_execution_time", self.name, execution_time) return res @@ -414,5 +420,9 @@ def get_group_by_column_label(args, meta): return label -def enable_prepared_report(report: str): - frappe.db.set_value("Report", report, "prepared_report", 1) +def enable_prepared_report(*, site: str, report: str): + frappe.init(site) + frappe.connect() + frappe.db.set_value("Report", report, "prepared_report", 1, update_modified=True) + frappe.db.commit() + frappe.destroy() From a9ebf58bd922fabe91be38284ba19b595c81d9aa Mon Sep 17 00:00:00 2001 From: Ankush Menat Date: Thu, 21 Mar 2024 19:00:54 +0530 Subject: [PATCH 06/23] fix: diff after converting to html to text (#25582) --- .../js/frappe/form/footer/version_timeline_content_builder.js | 1 + 1 file changed, 1 insertion(+) diff --git a/frappe/public/js/frappe/form/footer/version_timeline_content_builder.js b/frappe/public/js/frappe/form/footer/version_timeline_content_builder.js index 3302e4d250..03936d9a1f 100644 --- a/frappe/public/js/frappe/form/footer/version_timeline_content_builder.js +++ b/frappe/public/js/frappe/form/footer/version_timeline_content_builder.js @@ -283,6 +283,7 @@ function format_content_for_timeline(content) { // limits content to 40 characters // escapes HTML // and makes it bold + content = frappe.utils.html2text(content); content = frappe.ellipsis(content, 40) || '""'; content = frappe.utils.escape_html(content); return content.bold(); From f2561c46efad0951aeb297f9b67e91cc25e8cbf1 Mon Sep 17 00:00:00 2001 From: "Nihantra C. Patel" <141945075+Nihantra-Patel@users.noreply.github.com> Date: Thu, 21 Mar 2024 23:48:55 +0530 Subject: [PATCH 07/23] fix: depend on condition in "Allow in Quick Entry" (#25579) * fix: depend on condition in "Allow in Quick Entry" * remove section break and column break from the condition --- frappe/core/doctype/docfield/docfield.json | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/frappe/core/doctype/docfield/docfield.json b/frappe/core/doctype/docfield/docfield.json index 7b188569d7..e383e51dce 100644 --- a/frappe/core/doctype/docfield/docfield.json +++ b/frappe/core/doctype/docfield/docfield.json @@ -186,6 +186,7 @@ }, { "default": "0", + "depends_on": "eval:!in_list(['Tab Break', 'Table'], doc.fieldtype)", "fieldname": "allow_in_quick_entry", "fieldtype": "Check", "label": "Allow in Quick Entry" @@ -581,7 +582,7 @@ "index_web_pages_for_search": 1, "istable": 1, "links": [], - "modified": "2024-02-01 15:55:44.007917", + "modified": "2024-03-21 17:35:32.602933", "modified_by": "Administrator", "module": "Core", "name": "DocField", @@ -591,4 +592,4 @@ "sort_field": "modified", "sort_order": "ASC", "states": [] -} \ No newline at end of file +} From 30082da7af3f02846b26247b9c260f0355499b3d Mon Sep 17 00:00:00 2001 From: Suraj Shetty Date: Fri, 22 Mar 2024 15:06:12 +0530 Subject: [PATCH 08/23] feat: Option to make webform embeddable - If Web Form is rendered in Iframe all unnecessary elements from the web form view is hidden --- .../doctype/web_form/templates/web_form.html | 17 +++++++++++++++++ frappe/website/doctype/web_form/web_form.js | 10 ++++++++++ 2 files changed, 27 insertions(+) diff --git a/frappe/website/doctype/web_form/templates/web_form.html b/frappe/website/doctype/web_form/templates/web_form.html index 9b0f23e185..310b06c0a7 100644 --- a/frappe/website/doctype/web_form/templates/web_form.html +++ b/frappe/website/doctype/web_form/templates/web_form.html @@ -164,6 +164,23 @@ frappe._messages = {{ translated_messages }}; frappe.web_form_doc = {{ web_form_doc | json }}; frappe.reference_doc = {{ reference_doc | json }}; + function in_iframe() { + try { + return window.self !== window.top; + } catch (e) { + return true; + } + } + if (in_iframe()) { + // hide everything except the form and fix styles + $('nav').hide(); + $('.web-form-header').hide(); + $('.page-footer').hide(); + $('footer').hide(); + $('.page-breadcrumbs').hide(); + $('.web-form').css('border', 'none').css('padding', 'unset'); + $('.page_content').css('padding-left', 'unset').css('padding-right', 'unset'); + } {{ include_script("web_form.bundle.js") }} diff --git a/frappe/website/doctype/web_form/web_form.js b/frappe/website/doctype/web_form/web_form.js index 90bb4221af..25a245fb52 100644 --- a/frappe/website/doctype/web_form/web_form.js +++ b/frappe/website/doctype/web_form/web_form.js @@ -24,6 +24,16 @@ frappe.ui.form.on("Web Form", { }, refresh: function (frm) { + // get iframe url for web form + frm.sidebar + .add_user_action(__("Copy Embed Code")) + .attr("href", "#") + .on("click", () => { + const url = frappe.urllib.get_full_url(frm.doc.route); + const code = ``; + frappe.utils.copy_to_clipboard(code, __("Embed code copied")); + }); + if (frm.doc.is_standard && !frappe.boot.developer_mode) { frm.disable_form(); frappe.show_alert( From 766d2ae778b69c67b59989ed30528516301087ae Mon Sep 17 00:00:00 2001 From: Akhil Narang Date: Fri, 22 Mar 2024 15:41:14 +0530 Subject: [PATCH 09/23] feat: allow setting a custom rate limit for `login via email link` feature Signed-off-by: Akhil Narang --- .../core/doctype/system_settings/system_settings.json | 10 +++++++++- frappe/core/doctype/system_settings/system_settings.py | 1 + frappe/www/login.py | 6 +++++- 3 files changed, 15 insertions(+), 2 deletions(-) diff --git a/frappe/core/doctype/system_settings/system_settings.json b/frappe/core/doctype/system_settings/system_settings.json index c00ecb27df..51fcb692d4 100644 --- a/frappe/core/doctype/system_settings/system_settings.json +++ b/frappe/core/doctype/system_settings/system_settings.json @@ -40,6 +40,7 @@ "column_break_uhqk", "login_with_email_link", "login_with_email_link_expiry", + "rate_limit_email_link_login", "brute_force_security", "allow_consecutive_login_attempts", "column_break_34", @@ -656,12 +657,19 @@ "fieldname": "store_attached_pdf_document", "fieldtype": "Check", "label": "Store Attached PDF Document" + }, + { + "depends_on": "login_with_email_link", + "description": "You can set a high value here if multiple users will be logging in from the same network.", + "fieldname": "rate_limit_email_link_login", + "fieldtype": "Int", + "label": "Rate limit for email link login" } ], "icon": "fa fa-cog", "issingle": 1, "links": [], - "modified": "2024-03-14 15:18:01.465057", + "modified": "2024-03-22 15:43:48.347441", "modified_by": "Administrator", "module": "Core", "name": "System Settings", diff --git a/frappe/core/doctype/system_settings/system_settings.py b/frappe/core/doctype/system_settings/system_settings.py index 6a444fd5d6..87ed3c8ea9 100644 --- a/frappe/core/doctype/system_settings/system_settings.py +++ b/frappe/core/doctype/system_settings/system_settings.py @@ -82,6 +82,7 @@ class SystemSettings(Document): ] otp_issuer_name: DF.Data | None password_reset_limit: DF.Int + rate_limit_email_link_login: DF.Int reset_password_link_expiry_duration: DF.Duration | None reset_password_template: DF.Link | None rounding_method: DF.Literal["Banker's Rounding (legacy)", "Banker's Rounding", "Commercial Rounding"] diff --git a/frappe/www/login.py b/frappe/www/login.py index b4a43e2a1a..c988efd2f4 100644 --- a/frappe/www/login.py +++ b/frappe/www/login.py @@ -155,8 +155,12 @@ def _generate_temporary_login_link(email: str, expiry: int): return get_url(f"/api/method/frappe.www.login.login_via_key?key={key}") +def get_login_with_email_link_ratelimit() -> int: + return frappe.get_system_settings("rate_limit_email_link_login") or 5 + + @frappe.whitelist(allow_guest=True, methods=["GET"]) -@rate_limit(limit=5, seconds=60 * 60) +@rate_limit(limit=get_login_with_email_link_ratelimit, seconds=60 * 60) def login_via_key(key: str): cache_key = f"one_time_login_key:{key}" email = frappe.cache.get_value(cache_key) From 0f138daf60f5aaf82fbf849da9cd2976736f2e95 Mon Sep 17 00:00:00 2001 From: Frappe PR Bot Date: Fri, 22 Mar 2024 17:50:29 +0530 Subject: [PATCH 10/23] fix: Spanish translations (#25608) --- frappe/locale/es.po | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/frappe/locale/es.po b/frappe/locale/es.po index 592b39bc23..d5e83f18f3 100644 --- a/frappe/locale/es.po +++ b/frappe/locale/es.po @@ -3,7 +3,7 @@ msgstr "" "Project-Id-Version: frappe\n" "Report-Msgid-Bugs-To: developers@frappe.io\n" "POT-Creation-Date: 2024-03-17 09:33+0000\n" -"PO-Revision-Date: 2024-03-20 11:37\n" +"PO-Revision-Date: 2024-03-22 11:38\n" "Last-Translator: developers@frappe.io\n" "Language-Team: Spanish\n" "MIME-Version: 1.0\n" @@ -13910,7 +13910,7 @@ msgstr "Google" #: website/doctype/website_settings/website_settings.json msgctxt "Website Settings" msgid "Google Analytics ID" -msgstr "" +msgstr "ID de Google Analytics" #. Label of a Check field in DocType 'Website Settings' #: website/doctype/website_settings/website_settings.json @@ -15014,19 +15014,19 @@ msgstr "" #. Name of a DocType #: email/doctype/imap_folder/imap_folder.json msgid "IMAP Folder" -msgstr "" +msgstr "Carpeta IMAP" #. Label of a Data field in DocType 'Communication' #: core/doctype/communication/communication.json msgctxt "Communication" msgid "IMAP Folder" -msgstr "" +msgstr "Carpeta IMAP" #. Label of a Table field in DocType 'Email Account' #: email/doctype/email_account/email_account.json msgctxt "Email Account" msgid "IMAP Folder" -msgstr "" +msgstr "Carpeta IMAP" #. Label of a Data field in DocType 'Activity Log' #: core/doctype/activity_log/activity_log.json @@ -15892,7 +15892,7 @@ msgstr "Incluir símbolos, números y letras mayúsculas en la contraseña" #: email/doctype/email_account/email_account.json msgctxt "Email Account" msgid "Incoming (POP/IMAP) Settings" -msgstr "" +msgstr "Configuración entrante (POP/IMAP)" #. Label of a Data field in DocType 'Email Account' #: email/doctype/email_account/email_account.json @@ -28056,7 +28056,7 @@ msgstr "Buscar en un tipo de documento." #: public/js/frappe/ui/toolbar/navbar.html:29 msgid "Search or type a command ({0})" -msgstr "" +msgstr "Buscar o escribir un comando ({0})" #: templates/includes/search_box.html:8 msgid "Search results for" From bad3b9e6e70ea7c423c205545bf3ec4c41638ffe Mon Sep 17 00:00:00 2001 From: Ankush Menat Date: Fri, 22 Mar 2024 17:51:27 +0530 Subject: [PATCH 11/23] perf: Faster "show title in link field" on list view (#25597) Ideally, this query should be converted to "Top N" variant and just pick first 20 records, join only them with other table and send data back. Currently we always group by `name` in list view. This makes "show title in link field" join queries insanely slow as it first queries entire table and then applies limit. --- frappe/public/js/frappe/list/base_list.js | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/frappe/public/js/frappe/list/base_list.js b/frappe/public/js/frappe/list/base_list.js index c2c965c2f8..228e9eb7bf 100644 --- a/frappe/public/js/frappe/list/base_list.js +++ b/frappe/public/js/frappe/list/base_list.js @@ -462,15 +462,22 @@ frappe.views.BaseList = class BaseList { } get_args() { + let filters = this.get_filters_for_args(); + let group_by = this.get_group_by(); + let group_by_required = + Array.isArray(filters) && + filters.some((filter) => { + return filter[0] !== this.doctype; + }); return { doctype: this.doctype, fields: this.get_fields(), - filters: this.get_filters_for_args(), + filters, order_by: this.sort_selector && this.sort_selector.get_sql_string(), start: this.start, page_length: this.page_length, view: this.view, - group_by: this.get_group_by(), + group_by: group_by_required ? group_by : null, }; } From 4c8562687f1e3278b08e203dd6d7d7af60350991 Mon Sep 17 00:00:00 2001 From: Raffael Meyer <14891507+barredterra@users.noreply.github.com> Date: Fri, 22 Mar 2024 13:23:53 +0100 Subject: [PATCH 12/23] feat: add option to set default email recipients (#25555) * feat: add option to set default email recipients * fix: don't crash if no events communication.js:206 Uncaught TypeError: Cannot read properties of undefined (reading 'events') at frappe.views.CommunicationComposer.get_default_recipients (communication.js:206:16) at frappe.views.CommunicationComposer.get_fields (communication.js:57:19) at frappe.views.CommunicationComposer.make (communication.js:25:17) at new frappe.views.CommunicationComposer (communication.js:16:8) at Object.primary_action (communication__list_js:34:3) at HTMLButtonElement. (list_view.js:1432:19) at HTMLButtonElement.dispatch (jquery.js:5135:27) at elemData.handle (jquery.js:4939:28) Signed-off-by: Akhil Narang --------- Signed-off-by: Akhil Narang Co-authored-by: Akhil Narang --- frappe/public/js/frappe/views/communication.js | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/frappe/public/js/frappe/views/communication.js b/frappe/public/js/frappe/views/communication.js index 6f3cd52efd..0f201f8b36 100755 --- a/frappe/public/js/frappe/views/communication.js +++ b/frappe/public/js/frappe/views/communication.js @@ -54,6 +54,7 @@ frappe.views.CommunicationComposer = class { fieldtype: "MultiSelect", reqd: 0, fieldname: "recipients", + default: this.get_default_recipients("recipients"), }, { fieldtype: "Button", @@ -72,11 +73,13 @@ frappe.views.CommunicationComposer = class { label: __("CC"), fieldtype: "MultiSelect", fieldname: "cc", + default: this.get_default_recipients("cc"), }, { label: __("BCC"), fieldtype: "MultiSelect", fieldname: "bcc", + default: this.get_default_recipients("bcc"), }, { label: __("Schedule Send At"), @@ -199,6 +202,14 @@ frappe.views.CommunicationComposer = class { return fields; } + get_default_recipients(fieldname) { + if (this.frm?.events.get_email_recipients) { + return (this.frm.events.get_email_recipients(this.frm, fieldname) || []).join(", "); + } else { + return ""; + } + } + guess_language() { // when attach print for print format changes try to guess language // if print format has language then set that else boot lang. From 2af42f5501763dfdd5d21ea17e4b3e4e6e79c71b Mon Sep 17 00:00:00 2001 From: Akhil Narang Date: Fri, 22 Mar 2024 18:58:17 +0530 Subject: [PATCH 13/23] fix(webhook): `r` is referenced here before its initialized Broke in #21064 Sentry: FRAPPE-2SH Signed-off-by: Akhil Narang --- frappe/integrations/doctype/webhook/webhook.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frappe/integrations/doctype/webhook/webhook.py b/frappe/integrations/doctype/webhook/webhook.py index a425537be7..154b0695b0 100644 --- a/frappe/integrations/doctype/webhook/webhook.py +++ b/frappe/integrations/doctype/webhook/webhook.py @@ -156,7 +156,7 @@ def get_context(doc): def enqueue_webhook(doc, webhook) -> None: - request_url = headers = data = None + request_url = headers = data = r = None try: webhook: Webhook = frappe.get_doc("Webhook", webhook.get("name")) request_url = webhook.request_url From bcdce09dbac60cbf1699f622693d05557a2d7a6f Mon Sep 17 00:00:00 2001 From: barredterra <14891507+barredterra@users.noreply.github.com> Date: Fri, 22 Mar 2024 17:28:15 +0100 Subject: [PATCH 14/23] fix(Contact form): make email translatable --- frappe/www/contact.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/frappe/www/contact.py b/frappe/www/contact.py index 4e791ca067..78743bb138 100644 --- a/frappe/www/contact.py +++ b/frappe/www/contact.py @@ -34,10 +34,13 @@ def send_message(sender, message, subject="Website Query"): if forward_to_email := frappe.db.get_single_value("Contact Us Settings", "forward_to_email"): frappe.sendmail(recipients=forward_to_email, reply_to=sender, content=message, subject=subject) + reply = _( + "Thank you for reaching out to us. We will get back to you at the earliest.\n\n\nYour query:\n\n{0}" + ).format(message) frappe.sendmail( recipients=sender, - content=f"
Thank you for reaching out to us. We will get back to you at the earliest.\n\n\nYour query:\n\n{message}
", - subject="We've received your query!", + content=f"
{reply}
", + subject=_("We've received your query!"), ) # for clearing outgoing email error message From b440eab24f1a83f8835eacb00dd4b82fb6a347cc Mon Sep 17 00:00:00 2001 From: barredterra <14891507+barredterra@users.noreply.github.com> Date: Fri, 22 Mar 2024 17:44:37 +0100 Subject: [PATCH 15/23] fix(Contact form): make title and options translatable --- frappe/www/contact.html | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/frappe/www/contact.html b/frappe/www/contact.html index a6672d63d2..d34c63589d 100644 --- a/frappe/www/contact.html +++ b/frappe/www/contact.html @@ -1,7 +1,7 @@ {% extends "templates/web.html" %} {% set title = heading or "Contact Us" %} -{% block header %}

{{ heading or "Contact Us" }}

{% endblock %} +{% block header %}

{{ heading or _("Contact Us") }}

{% endblock %} {% block page_content %}