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/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) 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( 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) 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 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 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}'" 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"): 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 """ ), 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, 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