From b9e757782f126d78fa871a9379de9b2912406259 Mon Sep 17 00:00:00 2001 From: Ankush Menat Date: Wed, 28 Sep 2022 15:49:15 +0530 Subject: [PATCH 01/11] fix: correct boilerplate for virtual doctypes (#18248) --- frappe/modules/utils.py | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/frappe/modules/utils.py b/frappe/modules/utils.py index aa4ef6cb68..09a91f21fd 100644 --- a/frappe/modules/utils.py +++ b/frappe/modules/utils.py @@ -305,13 +305,16 @@ def make_boilerplate( def db_update(self): pass - def get_list(self, args): + @staticmethod + def get_list(args): pass - def get_count(self, args): + @staticmethod + def get_count(args): pass - def get_stats(self, args): + @staticmethod + def get_stats(args): pass """ ), From 0e0e7f276ccf5355ba3a05223d158b08f994cf8d Mon Sep 17 00:00:00 2001 From: Ankush Menat Date: Thu, 29 Sep 2022 10:45:37 +0530 Subject: [PATCH 02/11] fix: dont assume issingle exists (#18236) --- frappe/model/base_document.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/frappe/model/base_document.py b/frappe/model/base_document.py index 5b6caf4f6e..3cdc2e4c1d 100644 --- a/frappe/model/base_document.py +++ b/frappe/model/base_document.py @@ -744,7 +744,7 @@ class BaseDocument: # don't cache if fetching other values too values = frappe.db.get_value(doctype, docname, values_to_fetch, as_dict=True) - if frappe.get_meta(doctype).issingle: + if getattr(frappe.get_meta(doctype), "issingle", 0): values.name = doctype if frappe.get_meta(doctype).get("is_virtual"): @@ -884,7 +884,7 @@ class BaseDocument: if frappe.flags.in_install: return - if self.meta.issingle: + if getattr(self.meta, "issingle", 0): # single doctype value type is mediumtext return From 66a31917f723e8bd11db8ed3b3f4b59500355365 Mon Sep 17 00:00:00 2001 From: Ritwik Puri Date: Thu, 29 Sep 2022 16:23:55 +0530 Subject: [PATCH 03/11] refactor(minor): reorder and remove unnecessary branches in set_new_name (#18243) --- frappe/model/naming.py | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/frappe/model/naming.py b/frappe/model/naming.py index 49a58da314..4eca50ea97 100644 --- a/frappe/model/naming.py +++ b/frappe/model/naming.py @@ -165,16 +165,7 @@ def set_new_name(doc): if not doc.name and autoname: set_name_from_naming_options(autoname, doc) - # if the autoname option is 'field:' and no name was derived, we need to - # notify - if not doc.name and autoname.startswith("field:"): - fieldname = autoname[6:] - frappe.throw(_("{0} is required").format(doc.meta.get_label(fieldname))) - # at this point, we fall back to name generation with the hash option - if not doc.name and autoname == "hash": - doc.name = make_autoname("hash", doc.doctype) - if not doc.name: doc.name = make_autoname("hash", doc.doctype) @@ -220,6 +211,13 @@ def set_name_from_naming_options(autoname, doc): if _autoname.startswith("field:"): doc.name = _field_autoname(autoname, doc) + + # if the autoname option is 'field:' and no name was derived, we need to + # notify + if not doc.name: + fieldname = autoname[6:] + frappe.throw(_("{0} is required").format(doc.meta.get_label(fieldname))) + elif _autoname.startswith("naming_series:"): set_name_by_naming_series(doc) elif _autoname.startswith("prompt"): From 7c423416b4ec84fc35f5aa98729771737c603752 Mon Sep 17 00:00:00 2001 From: Ankush Menat Date: Thu, 29 Sep 2022 19:35:38 +0530 Subject: [PATCH 04/11] fix: report generation - frappe monitor (#18259) - Identify original report name correctly. - If sending to background, don't log it. --- frappe/desk/query_report.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/frappe/desk/query_report.py b/frappe/desk/query_report.py index 2971dbe9e0..877fdbe5bc 100644 --- a/frappe/desk/query_report.py +++ b/frappe/desk/query_report.py @@ -252,11 +252,10 @@ def run( result = get_prepared_report_result(report, filters, dn, user) else: result = generate_report_result(report, filters, user, custom_columns, is_tree, parent_field) + add_data_to_monitor(report=report.reference_report or report.name) result["add_total_row"] = report.add_total_row and not result.get("skip_total_row", False) - add_data_to_monitor(report=report) - return result From 7b36265bad7e28d74ff5ad330ca31820c9afb813 Mon Sep 17 00:00:00 2001 From: Ankush Menat Date: Fri, 30 Sep 2022 11:58:18 +0530 Subject: [PATCH 05/11] style: whitespace --- frappe/public/js/frappe/widgets/quick_list_widget.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frappe/public/js/frappe/widgets/quick_list_widget.js b/frappe/public/js/frappe/widgets/quick_list_widget.js index 4fefbf4271..dbb26cb62c 100644 --- a/frappe/public/js/frappe/widgets/quick_list_widget.js +++ b/frappe/public/js/frappe/widgets/quick_list_widget.js @@ -26,7 +26,7 @@ export default class QuickListWidget extends Widget { setup_add_new_button() { this.add_new_button = $( - `
${frappe.utils.icon("add", "sm")} From 3162d192b87960b5705cb9c3d77d6175b4ab8fcc Mon Sep 17 00:00:00 2001 From: Shariq Ansari Date: Tue, 20 Sep 2022 19:10:31 +0530 Subject: [PATCH 06/11] fix: Chart filter not working if not operator is used --- frappe/desk/doctype/dashboard_chart/dashboard_chart.py | 1 - 1 file changed, 1 deletion(-) diff --git a/frappe/desk/doctype/dashboard_chart/dashboard_chart.py b/frappe/desk/doctype/dashboard_chart/dashboard_chart.py index 6f675831a7..fddf4f1120 100644 --- a/frappe/desk/doctype/dashboard_chart/dashboard_chart.py +++ b/frappe/desk/doctype/dashboard_chart/dashboard_chart.py @@ -215,7 +215,6 @@ def get_chart_config(chart, filters, timespan, timegrain, from_date, to_date): group_by="_unit", order_by="_unit asc", as_list=True, - ignore_ifnull=True, ) result = get_result(data, timegrain, from_date, to_date, chart.chart_type) From fc1e01555b7b2b815e5ca9e56b3964301bdf003a Mon Sep 17 00:00:00 2001 From: Shariq Ansari Date: Fri, 30 Sep 2022 16:25:45 +0530 Subject: [PATCH 07/11] fix: added missing operators --- frappe/model/db_query.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frappe/model/db_query.py b/frappe/model/db_query.py index e0748d8143..8694afbc21 100644 --- a/frappe/model/db_query.py +++ b/frappe/model/db_query.py @@ -642,7 +642,7 @@ class DatabaseQuery: f.value = date_range fallback = f"'{FallBackDateTimeStr}'" - if f.operator in (">", "<") and (f.fieldname in ("creation", "modified")): + if f.operator in (">", "<", ">=", "<=") and (f.fieldname in ("creation", "modified")): value = cstr(f.value) fallback = f"'{FallBackDateTimeStr}'" From af24bbff1bcf3614e310e80cfac52d01b5181044 Mon Sep 17 00:00:00 2001 From: Cleo Menezes Jr <54215258+CleoMenezesJr@users.noreply.github.com> Date: Fri, 30 Sep 2022 15:40:55 -0300 Subject: [PATCH 08/11] fix: Show Report button should appear only if the doc is saved (#18268) --- frappe/core/doctype/report/report.js | 43 +++++++++++++++------------- 1 file changed, 23 insertions(+), 20 deletions(-) diff --git a/frappe/core/doctype/report/report.js b/frappe/core/doctype/report/report.js index c912e217a6..0e0bfeea9a 100644 --- a/frappe/core/doctype/report/report.js +++ b/frappe/core/doctype/report/report.js @@ -8,26 +8,29 @@ frappe.ui.form.on("Report", { } let doc = frm.doc; - frm.add_custom_button( - __("Show Report"), - function () { - switch (doc.report_type) { - case "Report Builder": - frappe.set_route("List", doc.ref_doctype, "Report", doc.name); - break; - case "Query Report": - frappe.set_route("query-report", doc.name); - break; - case "Script Report": - frappe.set_route("query-report", doc.name); - break; - case "Custom Report": - frappe.set_route("query-report", doc.name); - break; - } - }, - "fa fa-table" - ); + if (!doc.__islocal) { + frm.add_custom_button( + __("Show Report"), + function () { + switch (doc.report_type) { + case "Report Builder": + frappe.set_route("List", doc.ref_doctype, "Report", doc.name); + break; + case "Query Report": + frappe.set_route("query-report", doc.name); + break; + case "Script Report": + frappe.set_route("query-report", doc.name); + break; + case "Custom Report": + frappe.set_route("query-report", doc.name); + break; + } + }, + "fa fa-table" + ); + } + if (doc.is_standard === "Yes" && frm.perm[0].write) { frm.add_custom_button( From 77be534e225aebaaa88828b08b067d1d2ba52d5b Mon Sep 17 00:00:00 2001 From: aliX40 <55487948+aliX40@users.noreply.github.com> Date: Sun, 2 Oct 2022 12:16:45 +0200 Subject: [PATCH 09/11] chore(translation): use Acceuil instead of Maison in fr translation (#18271) In French ``Maison`` means house, but here the word ``Acceuil`` is what we actually need --- frappe/translations/fr.csv | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/frappe/translations/fr.csv b/frappe/translations/fr.csv index beecd80ee2..da330d3534 100644 --- a/frappe/translations/fr.csv +++ b/frappe/translations/fr.csv @@ -3429,7 +3429,7 @@ Mention,Mention, Modules,Modules, Monthly Long,Long mensuel, Naming Series,Nom de série, -Navigate Home,Naviguer à la maison, +Navigate Home,Naviguer à l'accueil, Navigate list down,Naviguer dans la liste, Navigate list up,Naviguer dans la liste en haut, New Notification,Nouvelle notification, @@ -3554,7 +3554,7 @@ Showing only first {0} rows out of {1},Afficher uniquement les {0} premières li "Simple Python Expression, Example: Status in (""Invalid"")","Expression Python simple, Exemple: Statut dans ("non valide")", Skipping Untitled Column,Saut de colonne sans titre, Skipping column {0},Colonne ignorée {0}, -Social Home,Maison sociale, +Social Home,Accueil sociale, Some columns might get cut off when printing to PDF. Try to keep number of columns under 10.,Certaines colonnes peuvent être coupées lors de l'impression au format PDF. Essayez de garder le nombre de colonnes sous 10., Something went wrong during the token generation. Click on {0} to generate a new one.,Quelque chose s'est mal passé pendant la génération de jetons. Cliquez sur {0} pour en générer un nouveau., Submit After Import,Validation après importation, From 513321810db298297b4ffb3e715e81d9c14877d6 Mon Sep 17 00:00:00 2001 From: Raffael Meyer <14891507+barredterra@users.noreply.github.com> Date: Mon, 3 Oct 2022 10:57:42 +0530 Subject: [PATCH 10/11] fix(Data Import): don't validate empty values (#17923) * refactor: exclude header from column values earlier * fix: don't validate empty columns Co-authored-by: Ankush Menat --- frappe/core/doctype/data_import/importer.py | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/frappe/core/doctype/data_import/importer.py b/frappe/core/doctype/data_import/importer.py index 7ff25118b1..57849e5cfc 100644 --- a/frappe/core/doctype/data_import/importer.py +++ b/frappe/core/doctype/data_import/importer.py @@ -449,7 +449,7 @@ class ImportFile: continue if not header: - header = Header(i, row, self.doctype, self.raw_data, self.column_to_field_map) + header = Header(i, row, self.doctype, self.raw_data[1:], self.column_to_field_map) else: row_obj = Row(i, row, self.doctype, header, self.import_type) data.append(row_obj) @@ -981,9 +981,12 @@ class Column: if self.skip_import: return + if not any(self.column_values): + return + if self.df.fieldtype == "Link": # find all values that dont exist - values = list({cstr(v) for v in self.column_values[1:] if v}) + values = list({cstr(v) for v in self.column_values if v}) exists = [ cstr(d.name) for d in frappe.get_all(self.df.options, filters={"name": ("in", values)}) ] @@ -1022,7 +1025,7 @@ class Column: elif self.df.fieldtype == "Select": options = get_select_options(self.df) if options: - values = {cstr(v) for v in self.column_values[1:] if v} + values = {cstr(v) for v in self.column_values if v} invalid = values - set(options) if invalid: valid_values = ", ".join(frappe.bold(o) for o in options) From 35ba00a54ec1adc05afd2ae35c03bc0b8adbf346 Mon Sep 17 00:00:00 2001 From: Ankush Menat Date: Mon, 3 Oct 2022 12:05:55 +0530 Subject: [PATCH 11/11] fix: handle isatty correctly (#18277) sys.stdin can be `None` [skip ci] --- frappe/__init__.py | 2 +- frappe/utils/__init__.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/frappe/__init__.py b/frappe/__init__.py index 5ddf1c55a9..f8e4de34d1 100644 --- a/frappe/__init__.py +++ b/frappe/__init__.py @@ -452,7 +452,7 @@ def msgprint( if as_list and type(msg) in (list, tuple): out.as_list = 1 - if sys.stdin.isatty(): + if sys.stdin and sys.stdin.isatty(): msg = _strip_html_tags(out.message) if flags.print_messages and out.message: diff --git a/frappe/utils/__init__.py b/frappe/utils/__init__.py index 3e70f719da..47f083b638 100644 --- a/frappe/utils/__init__.py +++ b/frappe/utils/__init__.py @@ -557,7 +557,7 @@ def is_cli() -> bool: try: invoked_from_terminal = bool(os.get_terminal_size()) except Exception: - invoked_from_terminal = sys.stdin.isatty() + invoked_from_terminal = sys.stdin and sys.stdin.isatty() return invoked_from_terminal