From d3da57cee2364ed92bf297554bf00a3b86f51443 Mon Sep 17 00:00:00 2001 From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com> Date: Sat, 20 Aug 2022 19:51:04 +0530 Subject: [PATCH 01/10] fix: Turkey number format corrected (#17886) (#17888) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit (cherry picked from commit b0a808b2c4c156c8374664f32b8a1a0106eb3b90) Co-authored-by: Türker Tunalı [skip ci] --- frappe/geo/country_info.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frappe/geo/country_info.json b/frappe/geo/country_info.json index ed44b1c7f8..f308dc63e3 100644 --- a/frappe/geo/country_info.json +++ b/frappe/geo/country_info.json @@ -2723,7 +2723,7 @@ "currency_fraction": "Kuru\u015f", "currency_fraction_units": 100, "currency_symbol": "\u20ba", - "number_format": "#,###.##", + "number_format": "#.###,##", "timezones": [ "Europe/Istanbul" ], From 69a8027935c264d55982ad559f8a681265e2ebf2 Mon Sep 17 00:00:00 2001 From: Ankush Menat Date: Sun, 21 Aug 2022 13:00:34 +0530 Subject: [PATCH 02/10] fix: jump to field shows column/section breaks --- frappe/public/js/frappe/form/layout.js | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/frappe/public/js/frappe/form/layout.js b/frappe/public/js/frappe/form/layout.js index 770df2a5a9..3bd9e451db 100644 --- a/frappe/public/js/frappe/form/layout.js +++ b/frappe/public/js/frappe/form/layout.js @@ -278,7 +278,10 @@ frappe.ui.form.Layout = class Layout { make_section(df = {}) { this.section_count++; - if (!df.fieldname) df.fieldname = `__section_${this.section_count}`; + if (!df.fieldname) { + df.fieldname = `__section_${this.section_count}`; + df.fieldtype = "Section Break"; + } this.section = new Section( this.current_tab ? this.current_tab.wrapper : this.page, @@ -300,7 +303,10 @@ frappe.ui.form.Layout = class Layout { make_column(df = {}) { this.column_count++; - if (!df.fieldname) df.fieldname = `__column_${this.section_count}`; + if (!df.fieldname) { + df.fieldname = `__column_${this.section_count}`; + df.fieldtype = "Column Break"; + } this.column = new Column(this.section, df); if (df && df.fieldname) { From 04aeeabb2bf4730399adf3985b8f448293debb8b Mon Sep 17 00:00:00 2001 From: Ankush Menat Date: Sun, 21 Aug 2022 16:42:26 +0530 Subject: [PATCH 03/10] fix(recorder): make whole order button clickable --- frappe/public/js/frappe/recorder/RequestDetail.vue | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/frappe/public/js/frappe/recorder/RequestDetail.vue b/frappe/public/js/frappe/recorder/RequestDetail.vue index c07e6220a9..8ee6ff631b 100644 --- a/frappe/public/js/frappe/recorder/RequestDetail.vue +++ b/frappe/public/js/frappe/recorder/RequestDetail.vue @@ -25,8 +25,8 @@
  • {{ column.label }}
  • - From 786df3fbeb1876639cdfa84de7908f33b7a9c990 Mon Sep 17 00:00:00 2001 From: Ankush Menat Date: Sun, 21 Aug 2022 14:31:10 +0530 Subject: [PATCH 04/10] perf: ~33% faster Desk response - hardcode `/app` resolution - use cached website settings everywhere. It was mixing cache and DB everywhere and re-quering same thing (why ?) --- .../website_settings/website_settings.py | 22 ++++++++++--------- .../doctype/website_theme/website_theme.py | 4 ++-- frappe/website/page_renderers/static_page.py | 2 ++ frappe/website/path_resolver.py | 7 ++++++ 4 files changed, 23 insertions(+), 12 deletions(-) diff --git a/frappe/website/doctype/website_settings/website_settings.py b/frappe/website/doctype/website_settings/website_settings.py index fffbd94684..be9b155314 100644 --- a/frappe/website/doctype/website_settings/website_settings.py +++ b/frappe/website/doctype/website_settings/website_settings.py @@ -103,12 +103,12 @@ class WebsiteSettings(Document): def get_website_settings(context=None): hooks = frappe.get_hooks() context = frappe._dict(context or {}) - settings: "WebsiteSettings" = frappe.get_single("Website Settings") + settings: "WebsiteSettings" = frappe.get_cached_doc("Website Settings") context = context.update( { - "top_bar_items": get_items("top_bar_items"), - "footer_items": get_items("footer_items"), + "top_bar_items": modify_header_footer_items(settings.top_bar_items), + "footer_items": modify_header_footer_items(settings.footer_items), "post_login": [ {"label": _("My Account"), "url": "/me"}, {"label": _("Log out"), "url": "/?cmd=web_logout"}, @@ -203,22 +203,24 @@ def get_items(parentfield: str) -> list[dict]: order_by="idx asc", fields="*", ) - top_items = _items.copy() + return modify_header_footer_items(_items) + +def modify_header_footer_items(items: list): + top_items = items.copy() # attach child items to top bar - for item in _items: - if not item["parent_label"]: + for item in items: + if not item.parent_label: continue for top_bar_item in top_items: - if top_bar_item["label"] != item["parent_label"]: + if top_bar_item.label != item.parent_label: continue - if "child_items" not in top_bar_item: + if not top_bar_item.get("child_items"): top_bar_item["child_items"] = [] - top_bar_item["child_items"].append(item) - + top_bar_item.child_items.append(item) break return top_items diff --git a/frappe/website/doctype/website_theme/website_theme.py b/frappe/website/doctype/website_theme/website_theme.py index 442ebe284b..e7636445c2 100644 --- a/frappe/website/doctype/website_theme/website_theme.py +++ b/frappe/website/doctype/website_theme/website_theme.py @@ -133,9 +133,9 @@ class WebsiteTheme(Document): def get_active_theme() -> Optional["WebsiteTheme"]: - if website_theme := frappe.db.get_single_value("Website Settings", "website_theme"): + if website_theme := frappe.get_website_settings("website_theme"): try: - return frappe.get_doc("Website Theme", website_theme) + return frappe.get_cached_doc("Website Theme", website_theme) except frappe.DoesNotExistError: pass diff --git a/frappe/website/page_renderers/static_page.py b/frappe/website/page_renderers/static_page.py index eb862d42bd..1f26de1514 100644 --- a/frappe/website/page_renderers/static_page.py +++ b/frappe/website/page_renderers/static_page.py @@ -12,6 +12,8 @@ UNSUPPORTED_STATIC_PAGE_TYPES = ("html", "md", "js", "xml", "css", "txt", "py", class StaticPage(BaseRenderer): + __slots__ = ("path", "file_path") + def __init__(self, path, http_status_code=None): super().__init__(path=path, http_status_code=http_status_code) self.set_file_path() diff --git a/frappe/website/path_resolver.py b/frappe/website/path_resolver.py index 9015bc7566..36490f5e30 100644 --- a/frappe/website/path_resolver.py +++ b/frappe/website/path_resolver.py @@ -17,6 +17,8 @@ from frappe.website.utils import can_cache, get_home_page class PathResolver: + __slots__ = ("path",) + def __init__(self, path): self.path = path.strip("/ ") @@ -36,6 +38,11 @@ class PathResolver: return frappe.flags.redirect_location, RedirectPage(self.path) endpoint = resolve_path(self.path) + + # WARN: Hardcoded for better performance + if endpoint == "app": + return endpoint, TemplatePage(endpoint, 200) + custom_renderers = self.get_custom_page_renderers() renderers = custom_renderers + [ StaticPage, From 61a9349789607f31cc657e7bbdc652f7b2a77b70 Mon Sep 17 00:00:00 2001 From: Ankush Menat Date: Sun, 21 Aug 2022 16:14:09 +0530 Subject: [PATCH 05/10] perf: use is_virtual_doctype and remove limit This reduces 1 query for each child table read Removed limit cause with 1000+ doctypes in frappe+erpnext this cache will just keep getting trashed for no reason. There's clear upper bound on size so no need to limit it here. --- frappe/model/document.py | 7 ++----- frappe/model/utils/__init__.py | 2 +- 2 files changed, 3 insertions(+), 6 deletions(-) diff --git a/frappe/model/document.py b/frappe/model/document.py index 5add5fba4e..2a82b5af9a 100644 --- a/frappe/model/document.py +++ b/frappe/model/document.py @@ -15,6 +15,7 @@ from frappe.model import optional_fields, table_fields from frappe.model.base_document import BaseDocument, get_controller from frappe.model.docstatus import DocStatus from frappe.model.naming import set_new_name, validate_name +from frappe.model.utils import is_virtual_doctype from frappe.model.workflow import set_workflow_state_on_action, validate_workflow from frappe.utils import cstr, date_diff, file_lock, flt, get_datetime_str, now from frappe.utils.data import get_absolute_url @@ -154,11 +155,7 @@ class Document(BaseDocument): # Make sure not to query the DB for a child table, if it is a virtual one. # During frappe is installed, the property "is_virtual" is not available in tabDocType, so # we need to filter those cases for the access to frappe.db.get_value() as it would crash otherwise. - if ( - hasattr(self, "doctype") - and not hasattr(self, "module") - and frappe.db.get_value("DocType", df.options, "is_virtual", cache=True) - ): + if hasattr(self, "doctype") and not hasattr(self, "module") and is_virtual_doctype(df.options): self.set(df.fieldname, []) continue diff --git a/frappe/model/utils/__init__.py b/frappe/model/utils/__init__.py index 2220b3904f..bf6804ad05 100644 --- a/frappe/model/utils/__init__.py +++ b/frappe/model/utils/__init__.py @@ -128,6 +128,6 @@ def get_fetch_values(doctype, fieldname, value): return result -@site_cache(maxsize=128) +@site_cache() def is_virtual_doctype(doctype): return frappe.db.get_value("DocType", doctype, "is_virtual") From 48869d506fc705a1f8d1fee1f80c5134df93c96e Mon Sep 17 00:00:00 2001 From: Ankush Menat Date: Sun, 21 Aug 2022 15:45:13 +0530 Subject: [PATCH 06/10] perf: dont order by for uniq searches --- frappe/desk/doctype/tag/tag.py | 2 +- frappe/desk/form/load.py | 4 +++- frappe/utils/user.py | 2 +- frappe/website/path_resolver.py | 2 +- frappe/www/app.py | 4 +++- 5 files changed, 9 insertions(+), 5 deletions(-) diff --git a/frappe/desk/doctype/tag/tag.py b/frappe/desk/doctype/tag/tag.py index ca167c148e..84239fae6d 100644 --- a/frappe/desk/doctype/tag/tag.py +++ b/frappe/desk/doctype/tag/tag.py @@ -192,4 +192,4 @@ def get_documents_for_tag(tag): @frappe.whitelist() def get_tags_list_for_awesomebar(): - return [t.name for t in frappe.get_list("Tag")] + return frappe.get_list("Tag", pluck="name", order_by=None) diff --git a/frappe/desk/form/load.py b/frappe/desk/form/load.py index d68aab927a..36dfd948f7 100644 --- a/frappe/desk/form/load.py +++ b/frappe/desk/form/load.py @@ -452,7 +452,9 @@ def get_title_values_for_link_and_dynamic_link_fields(doc, link_fields=None): if not meta or not (meta.title_field and meta.show_title_field_in_link): continue - link_title = frappe.db.get_value(doctype, doc.get(field.fieldname), meta.title_field, cache=True) + link_title = frappe.db.get_value( + doctype, doc.get(field.fieldname), meta.title_field, cache=True, order_by=None + ) link_titles.update({doctype + "::" + doc.get(field.fieldname): link_title}) return link_titles diff --git a/frappe/utils/user.py b/frappe/utils/user.py index a9bec0affa..28918f437d 100644 --- a/frappe/utils/user.py +++ b/frappe/utils/user.py @@ -273,7 +273,7 @@ def get_user_fullname(user: str) -> str: def get_fullname_and_avatar(user: str) -> _dict: first_name, last_name, avatar, name = frappe.db.get_value( - "User", user, ["first_name", "last_name", "user_image", "name"] + "User", user, ["first_name", "last_name", "user_image", "name"], order_by=None ) return _dict( { diff --git a/frappe/website/path_resolver.py b/frappe/website/path_resolver.py index 36490f5e30..071b5f9be1 100644 --- a/frappe/website/path_resolver.py +++ b/frappe/website/path_resolver.py @@ -105,7 +105,7 @@ def resolve_redirect(path, query_string=None): ] """ redirects = frappe.get_hooks("website_redirects") - redirects += frappe.db.get_all("Website Route Redirect", ["source", "target"]) + redirects += frappe.get_all("Website Route Redirect", ["source", "target"], order_by=None) if not redirects: return diff --git a/frappe/www/app.py b/frappe/www/app.py index f75fe05c03..6f6b4c88c2 100644 --- a/frappe/www/app.py +++ b/frappe/www/app.py @@ -18,7 +18,9 @@ CLOSING_SCRIPT_TAG_PATTERN = re.compile(r"") def get_context(context): if frappe.session.user == "Guest": frappe.throw(_("Log in to access this page."), frappe.PermissionError) - elif frappe.db.get_value("User", frappe.session.user, "user_type") == "Website User": + elif ( + frappe.db.get_value("User", frappe.session.user, "user_type", order_by=None) == "Website User" + ): frappe.throw(_("You are not permitted to access this page."), frappe.PermissionError) hooks = frappe.get_hooks() From 4241f8c8c0761344eeccf219d125324b0b232f6f Mon Sep 17 00:00:00 2001 From: Ankush Menat Date: Sun, 21 Aug 2022 18:30:14 +0530 Subject: [PATCH 07/10] perf: simpler/faster preload header computation We parse entire response to find preload headers, instead just use include_style and include_script to include assets directly into preload headers. This shaves off ~13% overhead in response. --- frappe/__init__.py | 1 + frappe/utils/jinja_globals.py | 24 ++++++++++++++++++++++-- frappe/website/utils.py | 30 ++++++++++-------------------- 3 files changed, 33 insertions(+), 22 deletions(-) diff --git a/frappe/__init__.py b/frappe/__init__.py index a796db9a83..53bc1018da 100644 --- a/frappe/__init__.py +++ b/frappe/__init__.py @@ -240,6 +240,7 @@ def init(site: str, sites_path: str = ".", new_site: bool = False) -> None: local.document_cache = {} local.meta_cache = {} local.form_dict = _dict() + local.preload_assets = {"style": [], "script": []} local.session = _dict() local.dev_server = _dev_server local.qb = get_query_builder(local.conf.db_type or "mariadb") diff --git a/frappe/utils/jinja_globals.py b/frappe/utils/jinja_globals.py index 44835be352..1265bd4d42 100644 --- a/frappe/utils/jinja_globals.py +++ b/frappe/utils/jinja_globals.py @@ -95,13 +95,33 @@ def get_dom_id(seed=None): return "id-" + generate_hash(seed, 12) -def include_script(path): +def include_script(path, preload=True): + """Get path of bundled script files. + + If preload is specified the path will be added to preload headers so browsers can prefetch + assets.""" path = bundled_asset(path) + + if preload: + import frappe + + frappe.local.preload_assets["script"].append(path) + return f'' -def include_style(path, rtl=None): +def include_style(path, rtl=None, preload=True): + """Get path of bundled style files. + + If preload is specified the path will be added to preload headers so browsers can prefetch + assets.""" path = bundled_asset(path) + + if preload: + import frappe + + frappe.local.preload_assets["style"].append(path) + return f'' diff --git a/frappe/website/utils.py b/frappe/website/utils.py index 508026f064..bfb600a8c4 100644 --- a/frappe/website/utils.py +++ b/frappe/website/utils.py @@ -527,7 +527,8 @@ def build_response(path, data, http_status_code, headers: dict | None = None): response.headers["X-Page-Name"] = path.encode("ascii", errors="xmlcharrefreplace") response.headers["X-From-Cache"] = frappe.local.response.from_cache or False - add_preload_headers(response) + add_preload_for_bundled_assets(response) + if headers: for key, val in headers.items(): response.headers[key] = val.encode("ascii", errors="xmlcharrefreplace") @@ -557,29 +558,18 @@ def set_content_type(response, data, path): return data -def add_preload_headers(response): - from bs4 import BeautifulSoup, SoupStrainer +def add_preload_for_bundled_assets(response): - try: - preload = [] - strainer = SoupStrainer(re.compile("script|link")) - soup = BeautifulSoup(response.data, "html.parser", parse_only=strainer) - for elem in soup.find_all("script", src=re.compile(".*")): - preload.append(("script", elem.get("src"))) + links = [] - for elem in soup.find_all("link", rel="stylesheet"): - preload.append(("style", elem.get("href"))) + for css in frappe.local.preload_assets["style"]: + links.append(f"<{css}>; rel=preload; as=style") - links = [] - for _type, link in preload: - links.append(f"<{link}>; rel=preload; as={_type}") + for js in frappe.local.preload_assets["script"]: + links.append(f"<{js}>; rel=preload; as=script") - if links: - response.headers["Link"] = ",".join(links) - except Exception: - import traceback - - traceback.print_exc() + if links: + response.headers["Link"] = ",".join(links) @lru_cache From 2eec621e95564c359ad22da79501a855c1f32b03 Mon Sep 17 00:00:00 2001 From: Ankush Menat Date: Sun, 21 Aug 2022 20:02:10 +0530 Subject: [PATCH 08/10] chore: db.get_all -> get_all Reduces 1 pointless function call. Function calls are also not "super cheap" in python. --- frappe/__init__.py | 2 +- frappe/automation/doctype/auto_repeat/auto_repeat.py | 8 ++++---- .../doctype/auto_repeat/test_auto_repeat.py | 2 +- frappe/boot.py | 2 +- frappe/cache_manager.py | 2 +- .../core/doctype/activity_log/test_activity_log.py | 2 +- frappe/core/doctype/data_import/exporter.py | 2 +- frappe/core/doctype/data_import/importer.py | 12 ++++++------ frappe/core/doctype/data_import/test_importer.py | 2 +- frappe/core/doctype/doctype/doctype.py | 2 +- frappe/core/doctype/file/test_file.py | 2 +- frappe/core/doctype/language/language.py | 2 +- .../core/doctype/package_release/package_release.py | 2 +- frappe/core/doctype/server_script/server_script.py | 2 +- frappe/core/doctype/translation/translation.py | 2 +- frappe/core/doctype/user/user.py | 2 +- .../core/doctype/user_permission/user_permission.py | 2 +- .../patches/convert_web_forms_to_doctype_layout.py | 2 +- frappe/desk/desktop.py | 2 +- .../desk/doctype/dashboard_chart/dashboard_chart.py | 2 +- frappe/desk/doctype/desktop_icon/desktop_icon.py | 8 ++++---- .../doctype/notification_log/notification_log.py | 2 +- .../notification_log/test_notification_log.py | 2 +- frappe/desk/form/assign_to.py | 4 ++-- frappe/desk/form/linked_with.py | 12 +++++------- frappe/desk/form/load.py | 4 ++-- frappe/desk/form/meta.py | 2 +- frappe/desk/leaderboard.py | 4 ++-- frappe/desk/page/user_profile/user_profile.py | 6 +++--- frappe/email/doctype/email_account/email_account.py | 2 +- frappe/email/doctype/email_group/email_group.py | 6 +++--- frappe/email/doctype/newsletter/test_newsletter.py | 4 ++-- frappe/integrations/doctype/webhook/test_webhook.py | 2 +- frappe/model/meta.py | 4 ++-- frappe/model/rename_doc.py | 2 +- .../v12_0/change_existing_dashboard_chart_filters.py | 2 +- .../v12_0/create_notification_settings_for_user.py | 2 +- .../patches/v12_0/set_default_incoming_email_port.py | 6 ++---- .../v13_0/generate_theme_files_in_public_folder.py | 2 +- .../v13_0/set_existing_dashboard_charts_as_public.py | 2 +- frappe/patches/v14_0/delete_data_migration_tool.py | 2 +- .../update_color_names_in_kanban_board_column.py | 2 +- frappe/patches/v14_0/update_multistep_webforms.py | 2 +- frappe/patches/v14_0/update_webforms.py | 2 +- frappe/permissions.py | 6 +++--- frappe/printing/doctype/print_format/print_format.py | 2 +- .../print_format_field_template.py | 2 +- frappe/share.py | 4 ++-- frappe/tests/test_db_query.py | 8 ++++---- frappe/tests/test_sitemap.py | 2 +- frappe/tests/ui_test_helpers.py | 10 +++++----- frappe/website/doctype/web_template/web_template.py | 2 +- frappe/website/router.py | 2 +- frappe/www/unsubscribe.py | 2 +- 54 files changed, 89 insertions(+), 93 deletions(-) diff --git a/frappe/__init__.py b/frappe/__init__.py index a796db9a83..1c9d1f6d93 100644 --- a/frappe/__init__.py +++ b/frappe/__init__.py @@ -2328,7 +2328,7 @@ def get_version(doctype, name, limit=None, head=False, raise_err=True): """ meta = get_meta(doctype) if meta.track_changes: - names = db.get_all( + names = get_all( "Version", filters={ "ref_doctype": doctype, diff --git a/frappe/automation/doctype/auto_repeat/auto_repeat.py b/frappe/automation/doctype/auto_repeat/auto_repeat.py index 0442be0976..4c09cb01bd 100644 --- a/frappe/automation/doctype/auto_repeat/auto_repeat.py +++ b/frappe/automation/doctype/auto_repeat/auto_repeat.py @@ -241,7 +241,7 @@ class AutoRepeat(Document): def set_auto_repeat_period(self, new_doc): mcount = month_map.get(self.frequency) if mcount and new_doc.meta.get_field("from_date") and new_doc.meta.get_field("to_date"): - last_ref_doc = frappe.db.get_all( + last_ref_doc = frappe.get_all( doctype=self.reference_doctype, fields=["name", "from_date", "to_date"], filters=[ @@ -470,7 +470,7 @@ def create_repeated_entries(data): def get_auto_repeat_entries(date=None): if not date: date = getdate(today()) - return frappe.db.get_all( + return frappe.get_all( "Auto Repeat", filters=[["next_schedule_date", "<=", date], ["status", "=", "Active"]] ) @@ -504,7 +504,7 @@ def make_auto_repeat(doctype, docname, frequency="Daily", start_date=None, end_d @frappe.whitelist() @frappe.validate_and_sanitize_search_inputs def get_auto_repeat_doctypes(doctype, txt, searchfield, start, page_len, filters): - res = frappe.db.get_all( + res = frappe.get_all( "Property Setter", { "property": "allow_auto_repeat", @@ -514,7 +514,7 @@ def get_auto_repeat_doctypes(doctype, txt, searchfield, start, page_len, filters ) docs = [r.doc_type for r in res] - res = frappe.db.get_all( + res = frappe.get_all( "DocType", { "allow_auto_repeat": 1, diff --git a/frappe/automation/doctype/auto_repeat/test_auto_repeat.py b/frappe/automation/doctype/auto_repeat/test_auto_repeat.py index 21ed7f2aa1..128bcc90cc 100644 --- a/frappe/automation/doctype/auto_repeat/test_auto_repeat.py +++ b/frappe/automation/doctype/auto_repeat/test_auto_repeat.py @@ -227,7 +227,7 @@ class TestAutoRepeat(FrappeTestCase): data = get_auto_repeat_entries(current_date) create_repeated_entries(data) - docnames = frappe.db.get_all( + docnames = frappe.get_all( doc.reference_doctype, filters={"auto_repeat": doc.name}, fields=["docstatus"], limit=1 ) self.assertEqual(docnames[0].docstatus, 1) diff --git a/frappe/boot.py b/frappe/boot.py index 5121215106..0fe5f93c3e 100644 --- a/frappe/boot.py +++ b/frappe/boot.py @@ -336,7 +336,7 @@ def get_success_action(): def get_link_preview_doctypes(): from frappe.utils import cint - link_preview_doctypes = [d.name for d in frappe.db.get_all("DocType", {"show_preview_popup": 1})] + link_preview_doctypes = [d.name for d in frappe.get_all("DocType", {"show_preview_popup": 1})] customizations = frappe.get_all( "Property Setter", fields=["doc_type", "value"], filters={"property": "show_preview_popup"} ) diff --git a/frappe/cache_manager.py b/frappe/cache_manager.py index 01ccc03753..868329ec1e 100644 --- a/frappe/cache_manager.py +++ b/frappe/cache_manager.py @@ -134,7 +134,7 @@ def clear_doctype_cache(doctype=None): # clear all parent doctypes - for dt in frappe.db.get_all( + for dt in frappe.get_all( "DocField", "parent", dict(fieldtype=["in", frappe.model.table_fields], options=doctype) ): clear_single(dt.parent) diff --git a/frappe/core/doctype/activity_log/test_activity_log.py b/frappe/core/doctype/activity_log/test_activity_log.py index f29c690bf8..df3f113a85 100644 --- a/frappe/core/doctype/activity_log/test_activity_log.py +++ b/frappe/core/doctype/activity_log/test_activity_log.py @@ -41,7 +41,7 @@ class TestActivityLog(FrappeTestCase): frappe.local.form_dict = frappe._dict() def get_auth_log(self, operation="Login"): - names = frappe.db.get_all( + names = frappe.get_all( "Activity Log", filters={ "user": "Administrator", diff --git a/frappe/core/doctype/data_import/exporter.py b/frappe/core/doctype/data_import/exporter.py index 8c73391bd0..9c793767e3 100644 --- a/frappe/core/doctype/data_import/exporter.py +++ b/frappe/core/doctype/data_import/exporter.py @@ -183,7 +183,7 @@ class Exporter: child_fields = ["name", "idx", "parent", "parentfield"] + list( {format_column_name(df) for df in self.fields if df.parent == child_table_doctype} ) - data = frappe.db.get_all( + data = frappe.get_all( child_table_doctype, filters={ "parent": ("in", parent_names), diff --git a/frappe/core/doctype/data_import/importer.py b/frappe/core/doctype/data_import/importer.py index 89c03fd4d5..378044c219 100644 --- a/frappe/core/doctype/data_import/importer.py +++ b/frappe/core/doctype/data_import/importer.py @@ -50,7 +50,7 @@ class Importer: def get_data_for_import_preview(self): out = self.import_file.get_data_for_import_preview() - out.import_log = frappe.db.get_all( + out.import_log = frappe.get_all( "Data Import Log", fields=["row_indexes", "success"], filters={"data_import": self.data_import.name}, @@ -90,7 +90,7 @@ class Importer: # setup import log import_log = ( - frappe.db.get_all( + frappe.get_all( "Data Import Log", fields=["row_indexes", "success", "log_index"], filters={"data_import": self.data_import.name}, @@ -204,7 +204,7 @@ class Importer: # Logs are db inserted directly so will have to be fetched again import_log = ( - frappe.db.get_all( + frappe.get_all( "Data Import Log", fields=["row_indexes", "success", "log_index"], filters={"data_import": self.data_import.name}, @@ -297,7 +297,7 @@ class Importer: return import_log = ( - frappe.db.get_all( + frappe.get_all( "Data Import Log", fields=["row_indexes", "success"], filters={"data_import": self.data_import.name}, @@ -327,7 +327,7 @@ class Importer: if not self.data_import: return - import_log = frappe.db.get_all( + import_log = frappe.get_all( "Data Import Log", fields=["row_indexes", "success", "messages", "exception", "docname"], filters={"data_import": self.data_import.name}, @@ -985,7 +985,7 @@ class Column: # find all values that dont exist values = list({cstr(v) for v in self.column_values[1:] if v}) exists = [ - cstr(d.name) for d in frappe.db.get_all(self.df.options, filters={"name": ("in", values)}) + cstr(d.name) for d in frappe.get_all(self.df.options, filters={"name": ("in", values)}) ] not_exists = list(set(values) - set(exists)) if not_exists: diff --git a/frappe/core/doctype/data_import/test_importer.py b/frappe/core/doctype/data_import/test_importer.py index 1edaf5c1ed..af8c711ab5 100644 --- a/frappe/core/doctype/data_import/test_importer.py +++ b/frappe/core/doctype/data_import/test_importer.py @@ -67,7 +67,7 @@ class TestImporter(FrappeTestCase): data_import.start_import() data_import.reload() - import_log = frappe.db.get_all( + import_log = frappe.get_all( "Data Import Log", fields=["row_indexes", "success", "messages", "exception", "docname"], filters={"data_import": data_import.name}, diff --git a/frappe/core/doctype/doctype/doctype.py b/frappe/core/doctype/doctype/doctype.py index e90a62f0a2..f5700bd0e6 100644 --- a/frappe/core/doctype/doctype/doctype.py +++ b/frappe/core/doctype/doctype/doctype.py @@ -325,7 +325,7 @@ class DocType(Document): """Change the timestamp of parent DocType if the current one is a child to clear caches.""" if frappe.flags.in_import: return - parent_list = frappe.db.get_all( + parent_list = frappe.get_all( "DocField", "parent", dict(fieldtype=["in", frappe.model.table_fields], options=self.name) ) for p in parent_list: diff --git a/frappe/core/doctype/file/test_file.py b/frappe/core/doctype/file/test_file.py index d496eec219..8997fb3a35 100644 --- a/frappe/core/doctype/file/test_file.py +++ b/frappe/core/doctype/file/test_file.py @@ -238,7 +238,7 @@ class TestFile(FrappeTestCase): pass def delete_test_data(self): - test_file_data = frappe.db.get_all( + test_file_data = frappe.get_all( "File", pluck="name", filters={"is_home_folder": 0, "is_attachments_folder": 0}, diff --git a/frappe/core/doctype/language/language.py b/frappe/core/doctype/language/language.py index efac7b0d77..0c5ee2d840 100644 --- a/frappe/core/doctype/language/language.py +++ b/frappe/core/doctype/language/language.py @@ -30,7 +30,7 @@ def validate_with_regex(name, label): def export_languages_json(): """Export list of all languages""" - languages = frappe.db.get_all("Language", fields=["name", "language_name"]) + languages = frappe.get_all("Language", fields=["name", "language_name"]) languages = [{"name": d.language_name, "code": d.name} for d in languages] languages.sort(key=lambda a: a["code"]) diff --git a/frappe/core/doctype/package_release/package_release.py b/frappe/core/doctype/package_release/package_release.py index 58fdc2ab86..d56023ca0d 100644 --- a/frappe/core/doctype/package_release/package_release.py +++ b/frappe/core/doctype/package_release/package_release.py @@ -60,7 +60,7 @@ class PackageRelease(Document): self.make_tarfile(package) def export_modules(self): - for m in frappe.db.get_all("Module Def", dict(package=self.package)): + for m in frappe.get_all("Module Def", dict(package=self.package)): module = frappe.get_doc("Module Def", m.name) for l in module.meta.links: if l.link_doctype == "Module Def": diff --git a/frappe/core/doctype/server_script/server_script.py b/frappe/core/doctype/server_script/server_script.py index fda5ca8591..dc502e4683 100644 --- a/frappe/core/doctype/server_script/server_script.py +++ b/frappe/core/doctype/server_script/server_script.py @@ -129,7 +129,7 @@ class ServerScript(Document): Returns: list: Returns list of autocompletion items. - For e.g., ["frappe.utils.cint", "frappe.db.get_all", ...] + For e.g., ["frappe.utils.cint", "frappe.get_all", ...] """ def get_keys(obj): diff --git a/frappe/core/doctype/translation/translation.py b/frappe/core/doctype/translation/translation.py index b08198eb13..d8b17986fe 100644 --- a/frappe/core/doctype/translation/translation.py +++ b/frappe/core/doctype/translation/translation.py @@ -39,7 +39,7 @@ def create_translations(translation_map, language): # first create / update local user translations for source_id, translation_dict in translation_map.items(): translation_dict = frappe._dict(translation_dict) - existing_doc_name = frappe.db.get_all( + existing_doc_name = frappe.get_all( "Translation", { "source_text": translation_dict.source_text, diff --git a/frappe/core/doctype/user/user.py b/frappe/core/doctype/user/user.py index a982403935..50f8697296 100644 --- a/frappe/core/doctype/user/user.py +++ b/frappe/core/doctype/user/user.py @@ -621,7 +621,7 @@ class User(Document): if login_with_username: or_filters.append({"username": user_name}) - users = frappe.db.get_all("User", fields=["name", "enabled"], or_filters=or_filters, limit=1) + users = frappe.get_all("User", fields=["name", "enabled"], or_filters=or_filters, limit=1) if not users: return diff --git a/frappe/core/doctype/user_permission/user_permission.py b/frappe/core/doctype/user_permission/user_permission.py index 2dfd7863b1..7020640da4 100644 --- a/frappe/core/doctype/user_permission/user_permission.py +++ b/frappe/core/doctype/user_permission/user_permission.py @@ -27,7 +27,7 @@ class UserPermission(Document): def validate_user_permission(self): """checks for duplicate user permission records""" - duplicate_exists = frappe.db.get_all( + duplicate_exists = frappe.get_all( self.doctype, filters={ "allow": self.allow, diff --git a/frappe/custom/doctype/doctype_layout/patches/convert_web_forms_to_doctype_layout.py b/frappe/custom/doctype/doctype_layout/patches/convert_web_forms_to_doctype_layout.py index 59cdfffb21..7d22ee3c7d 100644 --- a/frappe/custom/doctype/doctype_layout/patches/convert_web_forms_to_doctype_layout.py +++ b/frappe/custom/doctype/doctype_layout/patches/convert_web_forms_to_doctype_layout.py @@ -2,7 +2,7 @@ import frappe def execute(): - for web_form_name in frappe.db.get_all("Web Form", pluck="name"): + for web_form_name in frappe.get_all("Web Form", pluck="name"): web_form = frappe.get_doc("Web Form", web_form_name) doctype_layout = frappe.get_doc( dict( diff --git a/frappe/desk/desktop.py b/frappe/desk/desktop.py index a90950f411..70fd3235fe 100644 --- a/frappe/desk/desktop.py +++ b/frappe/desk/desktop.py @@ -172,7 +172,7 @@ class Workspace: if not exists and frappe.db.exists(name): if not frappe.db.get_value("DocType", name, "issingle"): - exists = bool(frappe.db.get_all(name, limit=1)) + exists = bool(frappe.get_all(name, limit=1)) else: exists = True self.table_counts[name] = exists diff --git a/frappe/desk/doctype/dashboard_chart/dashboard_chart.py b/frappe/desk/doctype/dashboard_chart/dashboard_chart.py index aa76932050..fbf542f855 100644 --- a/frappe/desk/doctype/dashboard_chart/dashboard_chart.py +++ b/frappe/desk/doctype/dashboard_chart/dashboard_chart.py @@ -249,7 +249,7 @@ def get_heatmap_chart_config(chart, filters, heatmap_year): timestamp_field = f"extract(epoch from timestamp {datefield})" data = dict( - frappe.db.get_all( + frappe.get_all( doctype, fields=[ timestamp_field, diff --git a/frappe/desk/doctype/desktop_icon/desktop_icon.py b/frappe/desk/doctype/desktop_icon/desktop_icon.py index 5602f4da24..63fa12b8fb 100644 --- a/frappe/desk/doctype/desktop_icon/desktop_icon.py +++ b/frappe/desk/doctype/desktop_icon/desktop_icon.py @@ -61,7 +61,7 @@ def get_desktop_icons(user=None): blocked_doctypes = [d.get("name") for d in blocked_doctypes] - standard_icons = frappe.db.get_all("Desktop Icon", fields=fields, filters={"standard": 1}) + standard_icons = frappe.get_all("Desktop Icon", fields=fields, filters={"standard": 1}) standard_map = {} for icon in standard_icons: @@ -69,7 +69,7 @@ def get_desktop_icons(user=None): icon.blocked = 1 standard_map[icon.module_name] = icon - user_icons = frappe.db.get_all( + user_icons = frappe.get_all( "Desktop Icon", fields=fields, filters={"standard": 0, "owner": user} ) @@ -430,7 +430,7 @@ def get_context(context): context.user = frappe.session.user if "System Manager" in frappe.get_roles(): - context.users = frappe.db.get_all( + context.users = frappe.get_all( "User", filters={"user_type": "System User", "enabled": 1}, fields=["name", "first_name", "last_name"], @@ -443,7 +443,7 @@ def get_module_icons(user=None): frappe.only_for("System Manager") if not user: - icons = frappe.db.get_all("Desktop Icon", fields="*", filters={"standard": 1}, order_by="idx") + icons = frappe.get_all("Desktop Icon", fields="*", filters={"standard": 1}, order_by="idx") else: frappe.cache().hdel("desktop_icons", user) icons = get_user_icons(user) diff --git a/frappe/desk/doctype/notification_log/notification_log.py b/frappe/desk/doctype/notification_log/notification_log.py index 482f404e65..e3112b08a6 100644 --- a/frappe/desk/doctype/notification_log/notification_log.py +++ b/frappe/desk/doctype/notification_log/notification_log.py @@ -151,7 +151,7 @@ def get_notification_logs(limit=20): @frappe.whitelist() def mark_all_as_read(): - unread_docs_list = frappe.db.get_all( + unread_docs_list = frappe.get_all( "Notification Log", filters={"read": 0, "for_user": frappe.session.user} ) unread_docnames = [doc.name for doc in unread_docs_list] diff --git a/frappe/desk/doctype/notification_log/test_notification_log.py b/frappe/desk/doctype/notification_log/test_notification_log.py index 6606edcb25..a43455149f 100644 --- a/frappe/desk/doctype/notification_log/test_notification_log.py +++ b/frappe/desk/doctype/notification_log/test_notification_log.py @@ -37,7 +37,7 @@ class TestNotificationLog(FrappeTestCase): def get_last_email_queue(): - res = frappe.db.get_all("Email Queue", fields=["message"], order_by="creation desc", limit=1) + res = frappe.get_all("Email Queue", fields=["message"], order_by="creation desc", limit=1) return res[0] diff --git a/frappe/desk/form/assign_to.py b/frappe/desk/form/assign_to.py index 7853e807b8..72265dce1f 100644 --- a/frappe/desk/form/assign_to.py +++ b/frappe/desk/form/assign_to.py @@ -138,7 +138,7 @@ def add_multiple(args=None): def close_all_assignments(doctype, name): - assignments = frappe.db.get_all( + assignments = frappe.get_all( "ToDo", fields=["allocated_to"], filters=dict(reference_type=doctype, reference_name=name, status=("!=", "Cancelled")), @@ -189,7 +189,7 @@ def clear(doctype, name): """ Clears assignments, return False if not assigned. """ - assignments = frappe.db.get_all( + assignments = frappe.get_all( "ToDo", fields=["allocated_to"], filters=dict(reference_type=doctype, reference_name=name) ) if not assignments: diff --git a/frappe/desk/form/linked_with.py b/frappe/desk/form/linked_with.py index b60c11774f..cb2b5508ce 100644 --- a/frappe/desk/form/linked_with.py +++ b/frappe/desk/form/linked_with.py @@ -136,7 +136,7 @@ class SubmittableDocumentTree: def get_submittable_doctypes(self) -> list[str]: """Returns list of submittable doctypes.""" if not self._submittable_doctypes: - self._submittable_doctypes = frappe.db.get_all("DocType", {"is_submittable": 1}, pluck="name") + self._submittable_doctypes = frappe.get_all("DocType", {"is_submittable": 1}, pluck="name") return self._submittable_doctypes @@ -288,9 +288,7 @@ def get_references_across_doctypes_by_dynamic_link_field( for doctype, fieldname, doctype_fieldname in links: try: filters = [[doctype_fieldname, "in", to_doctypes]] if to_doctypes else [] - for linked_to in frappe.db.get_all( - doctype, pluck=doctype_fieldname, filters=filters, distinct=1 - ): + for linked_to in frappe.get_all(doctype, pluck=doctype_fieldname, filters=filters, distinct=1): if linked_to: links_by_doctype[linked_to].append( {"doctype": doctype, "fieldname": fieldname, "doctype_fieldname": doctype_fieldname} @@ -330,17 +328,17 @@ def get_referencing_documents( if not link_info.get("is_child"): filters.extend(parent_filters or []) - return {from_table: frappe.db.get_all(from_table, filters, pluck="name")} + return {from_table: frappe.get_all(from_table, filters, pluck="name")} filters.extend(child_filters or []) - res = frappe.db.get_all(from_table, filters=filters, fields=["name", "parenttype", "parent"]) + res = frappe.get_all(from_table, filters=filters, fields=["name", "parenttype", "parent"]) documents = defaultdict(list) for parent, rows in itertools.groupby(res, key=lambda row: row["parenttype"]): if allowed_parents and parent not in allowed_parents: continue filters = (parent_filters or []) + [["name", "in", tuple(row.parent for row in rows)]] - documents[parent].extend(frappe.db.get_all(parent, filters=filters, pluck="name") or []) + documents[parent].extend(frappe.get_all(parent, filters=filters, pluck="name") or []) return documents diff --git a/frappe/desk/form/load.py b/frappe/desk/form/load.py index d68aab927a..bb48c8c4ed 100644 --- a/frappe/desk/form/load.py +++ b/frappe/desk/form/load.py @@ -178,7 +178,7 @@ def add_comments(doc, docinfo): def get_milestones(doctype, name): - return frappe.db.get_all( + return frappe.get_all( "Milestone", fields=["creation", "owner", "track_field", "value"], filters=dict(reference_type=doctype, reference_name=name), @@ -249,7 +249,7 @@ def get_comments( def get_point_logs(doctype, docname): - return frappe.db.get_all( + return frappe.get_all( "Energy Point Log", filters={"reference_doctype": doctype, "reference_name": docname, "type": ["!=", "Review"]}, fields=["*"], diff --git a/frappe/desk/form/meta.py b/frappe/desk/form/meta.py index 5a426b4c63..ae7262e1b5 100644 --- a/frappe/desk/form/meta.py +++ b/frappe/desk/form/meta.py @@ -146,7 +146,7 @@ class FormMeta(Meta): """embed all require files""" # custom script client_scripts = ( - frappe.db.get_all( + frappe.get_all( "Client Script", filters={"dt": self.name, "enabled": 1}, fields=["name", "script", "view"], diff --git a/frappe/desk/leaderboard.py b/frappe/desk/leaderboard.py index a5f5de3117..65d6aaf785 100644 --- a/frappe/desk/leaderboard.py +++ b/frappe/desk/leaderboard.py @@ -16,7 +16,7 @@ def get_leaderboards(): @frappe.whitelist() def get_energy_point_leaderboard(date_range, company=None, field=None, limit=None): - all_users = frappe.db.get_all( + all_users = frappe.get_all( "User", filters={ "name": ["not in", ["Administrator", "Guest"]], @@ -31,7 +31,7 @@ def get_energy_point_leaderboard(date_range, company=None, field=None, limit=Non if date_range: date_range = frappe.parse_json(date_range) filters.append(["creation", "between", [date_range[0], date_range[1]]]) - energy_point_users = frappe.db.get_all( + energy_point_users = frappe.get_all( "Energy Point Log", fields=["user as name", "sum(points) as value"], filters=filters, diff --git a/frappe/desk/page/user_profile/user_profile.py b/frappe/desk/page/user_profile/user_profile.py index f9c8d98869..117ed5f560 100644 --- a/frappe/desk/page/user_profile/user_profile.py +++ b/frappe/desk/page/user_profile/user_profile.py @@ -31,7 +31,7 @@ def get_energy_points_heatmap_data(user, date): @frappe.whitelist() def get_energy_points_percentage_chart_data(user, field): - result = frappe.db.get_all( + result = frappe.get_all( "Energy Point Log", filters={"user": user, "type": ["!=", "Review"]}, group_by=field, @@ -49,7 +49,7 @@ def get_energy_points_percentage_chart_data(user, field): @frappe.whitelist() def get_user_rank(user): month_start = datetime.today().replace(day=1) - monthly_rank = frappe.db.get_all( + monthly_rank = frappe.get_all( "Energy Point Log", group_by="user", filters={"creation": [">", month_start], "type": ["!=", "Review"]}, @@ -58,7 +58,7 @@ def get_user_rank(user): as_list=True, ) - all_time_rank = frappe.db.get_all( + all_time_rank = frappe.get_all( "Energy Point Log", group_by="user", filters={"type": ["!=", "Review"]}, diff --git a/frappe/email/doctype/email_account/email_account.py b/frappe/email/doctype/email_account/email_account.py index 15eba0faa5..b3dc72dfe5 100755 --- a/frappe/email/doctype/email_account/email_account.py +++ b/frappe/email/doctype/email_account/email_account.py @@ -846,7 +846,7 @@ def get_max_email_uid(email_account): # get maximum uid of emails max_uid = 1 - result = frappe.db.get_all( + result = frappe.get_all( "Communication", filters={ "communication_medium": "Email", diff --git a/frappe/email/doctype/email_group/email_group.py b/frappe/email/doctype/email_group/email_group.py index ea62a6e9ec..cbe47eaa81 100755 --- a/frappe/email/doctype/email_group/email_group.py +++ b/frappe/email/doctype/email_group/email_group.py @@ -9,10 +9,10 @@ from frappe.utils import parse_addr, validate_email_address class EmailGroup(Document): def onload(self): - singles = [d.name for d in frappe.db.get_all("DocType", "name", {"issingle": 1})] + singles = [d.name for d in frappe.get_all("DocType", "name", {"issingle": 1})] self.get("__onload").import_types = [ {"value": d.parent, "label": f"{d.parent} ({d.label})"} - for d in frappe.db.get_all("DocField", ("parent", "label"), {"options": "Email"}) + for d in frappe.get_all("DocField", ("parent", "label"), {"options": "Email"}) if d.parent not in singles ] @@ -27,7 +27,7 @@ class EmailGroup(Document): unsubscribed_field = "unsubscribed" if meta.get_field("unsubscribed") else None added = 0 - for user in frappe.db.get_all(doctype, [email_field, unsubscribed_field or "name"]): + for user in frappe.get_all(doctype, [email_field, unsubscribed_field or "name"]): try: email = parse_addr(user.get(email_field))[1] if user.get(email_field) else None if email: diff --git a/frappe/email/doctype/newsletter/test_newsletter.py b/frappe/email/doctype/newsletter/test_newsletter.py index 524289db7f..c020c26454 100644 --- a/frappe/email/doctype/newsletter/test_newsletter.py +++ b/frappe/email/doctype/newsletter/test_newsletter.py @@ -107,7 +107,7 @@ class TestNewsletterMixin: "content_type": "Rich Text", "message": "Testing my news.", } - similar_newsletters = frappe.db.get_all(doctype, newsletter_content, pluck="name") + similar_newsletters = frappe.get_all(doctype, newsletter_content, pluck="name") for similar_newsletter in similar_newsletters: frappe.delete_doc(doctype, similar_newsletter) @@ -180,7 +180,7 @@ class TestNewsletter(TestNewsletterMixin, FrappeTestCase): newsletter.save = MagicMock() self.assertFalse(newsletter.save.called) # check if the test email is in the queue - email_queue = frappe.db.get_all( + email_queue = frappe.get_all( "Email Queue", filters=[ ["reference_doctype", "=", "Newsletter"], diff --git a/frappe/integrations/doctype/webhook/test_webhook.py b/frappe/integrations/doctype/webhook/test_webhook.py index 9c008b2e47..8284db7fd3 100644 --- a/frappe/integrations/doctype/webhook/test_webhook.py +++ b/frappe/integrations/doctype/webhook/test_webhook.py @@ -177,7 +177,7 @@ class TestWebhook(FrappeTestCase): webhook = frappe.get_doc("Webhook", {"webhook_doctype": "User"}) enqueue_webhook(user, webhook) - self.assertTrue(frappe.db.get_all("Webhook Request Log", pluck="name")) + self.assertTrue(frappe.get_all("Webhook Request Log", pluck="name")) def test_webhook_with_array_body(self): """Check if array request body are supported.""" diff --git a/frappe/model/meta.py b/frappe/model/meta.py index 51f9241e58..906b5cf04c 100644 --- a/frappe/model/meta.py +++ b/frappe/model/meta.py @@ -666,7 +666,7 @@ def is_single(doctype): def get_parent_dt(dt): - parent_dt = frappe.db.get_all( + parent_dt = frappe.get_all( "DocField", "parent", dict(fieldtype=["in", frappe.model.table_fields], options=dt), limit=1 ) return parent_dt and parent_dt[0].parent or "" @@ -764,7 +764,7 @@ def trim_tables(doctype=None, dry_run=False, quiet=False): if doctype: filters["name"] = doctype - for doctype in frappe.db.get_all("DocType", filters=filters, pluck="name"): + for doctype in frappe.get_all("DocType", filters=filters, pluck="name"): try: dropped_columns = trim_table(doctype, dry_run=dry_run) if dropped_columns: diff --git a/frappe/model/rename_doc.py b/frappe/model/rename_doc.py index 2a04ee7e11..0a832580cd 100644 --- a/frappe/model/rename_doc.py +++ b/frappe/model/rename_doc.py @@ -237,7 +237,7 @@ def update_assignments(old: str, new: str, doctype: str) -> None: for user in common_assignments: # delete todos linked to old doc - todos = frappe.db.get_all( + todos = frappe.get_all( "ToDo", { "owner": user, diff --git a/frappe/patches/v12_0/change_existing_dashboard_chart_filters.py b/frappe/patches/v12_0/change_existing_dashboard_chart_filters.py index 19f976084b..b1770ae577 100644 --- a/frappe/patches/v12_0/change_existing_dashboard_chart_filters.py +++ b/frappe/patches/v12_0/change_existing_dashboard_chart_filters.py @@ -7,7 +7,7 @@ def execute(): if not frappe.db.table_exists("Dashboard Chart"): return - charts_to_modify = frappe.db.get_all( + charts_to_modify = frappe.get_all( "Dashboard Chart", fields=["name", "filters_json", "document_type"], filters={"chart_type": ["not in", ["Report", "Custom"]]}, diff --git a/frappe/patches/v12_0/create_notification_settings_for_user.py b/frappe/patches/v12_0/create_notification_settings_for_user.py index eb6858967b..50c4b12787 100644 --- a/frappe/patches/v12_0/create_notification_settings_for_user.py +++ b/frappe/patches/v12_0/create_notification_settings_for_user.py @@ -8,6 +8,6 @@ def execute(): frappe.reload_doc("desk", "doctype", "notification_settings") frappe.reload_doc("desk", "doctype", "notification_subscribed_document") - users = frappe.db.get_all("User", fields=["name"]) + users = frappe.get_all("User", fields=["name"]) for user in users: create_notification_settings(user.name) diff --git a/frappe/patches/v12_0/set_default_incoming_email_port.py b/frappe/patches/v12_0/set_default_incoming_email_port.py index 822ce06f70..766e31fe67 100644 --- a/frappe/patches/v12_0/set_default_incoming_email_port.py +++ b/frappe/patches/v12_0/set_default_incoming_email_port.py @@ -15,9 +15,7 @@ def execute(): def setup_incoming_email_port_in_email_domains(): - email_domains = frappe.db.get_all( - "Email Domain", ["incoming_port", "use_imap", "use_ssl", "name"] - ) + email_domains = frappe.get_all("Email Domain", ["incoming_port", "use_imap", "use_ssl", "name"]) for domain in email_domains: if not domain.incoming_port: incoming_port = get_port(domain) @@ -33,7 +31,7 @@ def setup_incoming_email_port_in_email_domains(): def setup_incoming_email_port_in_email_accounts(): - email_accounts = frappe.db.get_all( + email_accounts = frappe.get_all( "Email Account", ["incoming_port", "use_imap", "use_ssl", "name", "enable_incoming"] ) diff --git a/frappe/patches/v13_0/generate_theme_files_in_public_folder.py b/frappe/patches/v13_0/generate_theme_files_in_public_folder.py index 29ddca1108..f05cf46c74 100644 --- a/frappe/patches/v13_0/generate_theme_files_in_public_folder.py +++ b/frappe/patches/v13_0/generate_theme_files_in_public_folder.py @@ -6,7 +6,7 @@ import frappe def execute(): frappe.reload_doc("website", "doctype", "website_theme_ignore_app") - themes = frappe.db.get_all( + themes = frappe.get_all( "Website Theme", filters={"theme_url": ("not like", "/files/website_theme/%")} ) for theme in themes: diff --git a/frappe/patches/v13_0/set_existing_dashboard_charts_as_public.py b/frappe/patches/v13_0/set_existing_dashboard_charts_as_public.py index 11015033b9..54140ee7bf 100644 --- a/frappe/patches/v13_0/set_existing_dashboard_charts_as_public.py +++ b/frappe/patches/v13_0/set_existing_dashboard_charts_as_public.py @@ -15,7 +15,7 @@ def execute(): ) users = [item.parent for item in users_with_permission] - charts = frappe.db.get_all("Dashboard Chart", filters={"owner": ["in", users]}) + charts = frappe.get_all("Dashboard Chart", filters={"owner": ["in", users]}) for chart in charts: frappe.db.set_value("Dashboard Chart", chart.name, "is_public", 1) diff --git a/frappe/patches/v14_0/delete_data_migration_tool.py b/frappe/patches/v14_0/delete_data_migration_tool.py index d0416cb1e7..9ecd714c86 100644 --- a/frappe/patches/v14_0/delete_data_migration_tool.py +++ b/frappe/patches/v14_0/delete_data_migration_tool.py @@ -5,7 +5,7 @@ import frappe def execute(): - doctypes = frappe.db.get_all("DocType", {"module": "Data Migration", "custom": 0}, pluck="name") + doctypes = frappe.get_all("DocType", {"module": "Data Migration", "custom": 0}, pluck="name") for doctype in doctypes: frappe.delete_doc("DocType", doctype, ignore_missing=True) diff --git a/frappe/patches/v14_0/update_color_names_in_kanban_board_column.py b/frappe/patches/v14_0/update_color_names_in_kanban_board_column.py index b568151273..c68015b43d 100644 --- a/frappe/patches/v14_0/update_color_names_in_kanban_board_column.py +++ b/frappe/patches/v14_0/update_color_names_in_kanban_board_column.py @@ -17,6 +17,6 @@ def execute(): "yellow": "Yellow", "lightblue": "Light Blue", } - for d in frappe.db.get_all("Kanban Board Column", fields=["name", "indicator"]): + for d in frappe.get_all("Kanban Board Column", fields=["name", "indicator"]): color_name = indicator_map.get(d.indicator, "Gray") frappe.db.set_value("Kanban Board Column", d.name, "indicator", color_name) diff --git a/frappe/patches/v14_0/update_multistep_webforms.py b/frappe/patches/v14_0/update_multistep_webforms.py index 678e7a5c17..a4a2885c4a 100644 --- a/frappe/patches/v14_0/update_multistep_webforms.py +++ b/frappe/patches/v14_0/update_multistep_webforms.py @@ -4,7 +4,7 @@ import frappe def execute(): frappe.reload_doctype("Web Form") - for web_form in frappe.db.get_all("Web Form", filters={"is_multi_step_form": 1}): + for web_form in frappe.get_all("Web Form", filters={"is_multi_step_form": 1}): web_form_fields = frappe.get_doc("Web Form", web_form.name).web_form_fields for web_form_field in web_form_fields: if web_form_field.fieldtype == "Section Break" and web_form_field.idx != 1: diff --git a/frappe/patches/v14_0/update_webforms.py b/frappe/patches/v14_0/update_webforms.py index 46918f216e..40d90c426b 100644 --- a/frappe/patches/v14_0/update_webforms.py +++ b/frappe/patches/v14_0/update_webforms.py @@ -9,6 +9,6 @@ def execute(): frappe.reload_doc("website", "doctype", "web_form_list_column") frappe.reload_doctype("Web Form") - for web_form in frappe.db.get_all("Web Form", fields=["*"]): + for web_form in frappe.get_all("Web Form", fields=["*"]): if web_form.allow_multiple and not web_form.show_list: frappe.db.set_value("Web Form", web_form.name, "show_list", True) diff --git a/frappe/permissions.py b/frappe/permissions.py index 2d9768b582..0307952c62 100644 --- a/frappe/permissions.py +++ b/frappe/permissions.py @@ -451,13 +451,13 @@ def get_doctype_roles(doctype, access_type="read"): def get_perms_for(roles, perm_doctype="DocPerm"): """Get perms for given roles""" filters = {"permlevel": 0, "docstatus": 0, "role": ["in", roles]} - return frappe.db.get_all(perm_doctype, fields=["*"], filters=filters) + return frappe.get_all(perm_doctype, fields=["*"], filters=filters) def get_doctypes_with_custom_docperms(): """Returns all the doctypes with Custom Docperms""" - doctypes = frappe.db.get_all("Custom DocPerm", fields=["parent"], distinct=1) + doctypes = frappe.get_all("Custom DocPerm", fields=["parent"], distinct=1) return [d.parent for d in doctypes] @@ -525,7 +525,7 @@ def clear_user_permissions_for_doctype(doctype, user=None): filters = {"allow": doctype} if user: filters["user"] = user - user_permissions_for_doctype = frappe.db.get_all("User Permission", filters=filters) + user_permissions_for_doctype = frappe.get_all("User Permission", filters=filters) for d in user_permissions_for_doctype: frappe.delete_doc("User Permission", d.name) diff --git a/frappe/printing/doctype/print_format/print_format.py b/frappe/printing/doctype/print_format/print_format.py index 5bf4b83ec0..9b1715f15f 100644 --- a/frappe/printing/doctype/print_format/print_format.py +++ b/frappe/printing/doctype/print_format/print_format.py @@ -13,7 +13,7 @@ from frappe.utils.weasyprint import download_pdf, get_html class PrintFormat(Document): def onload(self): - templates = frappe.db.get_all( + templates = frappe.get_all( "Print Format Field Template", fields=["template", "field", "name"], filters={"document_type": self.doc_type}, diff --git a/frappe/printing/doctype/print_format_field_template/print_format_field_template.py b/frappe/printing/doctype/print_format_field_template/print_format_field_template.py index 428979b3ad..cc938da34f 100644 --- a/frappe/printing/doctype/print_format_field_template/print_format_field_template.py +++ b/frappe/printing/doctype/print_format_field_template/print_format_field_template.py @@ -27,7 +27,7 @@ class PrintFormatFieldTemplate(Document): filters = {"document_type": self.document_type, "field": self.field} if not self.is_new(): filters.update({"name": ("!=", self.name)}) - result = frappe.db.get_all("Print Format Field Template", filters=filters, limit=1) + result = frappe.get_all("Print Format Field Template", filters=filters, limit=1) if result: frappe.throw( _("A template already exists for field {0} of {1}").format( diff --git a/frappe/share.py b/frappe/share.py index dfb4836995..b142a5060e 100644 --- a/frappe/share.py +++ b/frappe/share.py @@ -101,7 +101,7 @@ def set_permission(doctype, name, user, permission_to, value=1, everyone=0): @frappe.whitelist() def get_users(doctype, name): """Get list of users with which this document is shared""" - return frappe.db.get_all( + return frappe.get_all( "DocShare", fields=[ "`name`", @@ -137,7 +137,7 @@ def get_shared(doctype, user=None, rights=None): if user != "Guest": or_filters += [["everyone", "=", 1]] - shared_docs = frappe.db.get_all( + shared_docs = frappe.get_all( "DocShare", fields=["share_name"], filters=filters, or_filters=or_filters ) diff --git a/frappe/tests/test_db_query.py b/frappe/tests/test_db_query.py index 09eb326c6c..331b8eb8b8 100644 --- a/frappe/tests/test_db_query.py +++ b/frappe/tests/test_db_query.py @@ -42,7 +42,7 @@ class TestReportview(FrappeTestCase): content="test", seen_by=[{"user": "Administrator"}], ).insert() - result = frappe.db.get_all( + result = frappe.get_all( "Note", filters={"name": note.name}, fields=["name", "seen_by.user as seen_by"], @@ -125,8 +125,8 @@ class TestReportview(FrappeTestCase): ).insert() # test query - results1 = frappe.db.get_all("Parent DocType 1", fields=["name", "child.title as child_title"]) - results2 = frappe.db.get_all("Parent DocType 2", fields=["name", "child.title as child_title"]) + results1 = frappe.get_all("Parent DocType 1", fields=["name", "child.title as child_title"]) + results2 = frappe.get_all("Parent DocType 2", fields=["name", "child.title as child_title"]) # check both parents have same name self.assertEqual(results1[0].name, results2[0].name) # check both parents have different number of child records @@ -141,7 +141,7 @@ class TestReportview(FrappeTestCase): todo = frappe.get_doc( doctype="ToDo", description="Test ToDo", allocated_to="Administrator" ).insert() - result = frappe.db.get_all( + result = frappe.get_all( "ToDo", filters={"name": todo.name}, fields=["name", "allocated_to.email as allocated_user_email"], diff --git a/frappe/tests/test_sitemap.py b/frappe/tests/test_sitemap.py index 248e20dd2c..ce01ae706a 100644 --- a/frappe/tests/test_sitemap.py +++ b/frappe/tests/test_sitemap.py @@ -8,7 +8,7 @@ class TestSitemap(FrappeTestCase): from frappe.test_runner import make_test_records make_test_records("Blog Post") - blogs = frappe.db.get_all("Blog Post", {"published": 1}, ["route"], limit=1) + blogs = frappe.get_all("Blog Post", {"published": 1}, ["route"], limit=1) xml = get_html_for_route("sitemap.xml") self.assertTrue("/about" in xml) self.assertTrue("/contact" in xml) diff --git a/frappe/tests/ui_test_helpers.py b/frappe/tests/ui_test_helpers.py index b0ef472cbd..c43ec2e98a 100644 --- a/frappe/tests/ui_test_helpers.py +++ b/frappe/tests/ui_test_helpers.py @@ -38,7 +38,7 @@ def create_if_not_exists(doc): @frappe.whitelist() def create_todo_records(): - if frappe.db.get_all("ToDo", {"description": "this is first todo"}): + if frappe.get_all("ToDo", {"description": "this is first todo"}): return frappe.get_doc( @@ -80,7 +80,7 @@ def setup_workflow(): @frappe.whitelist() def create_contact_phone_nos_records(): - if frappe.db.get_all("Contact", {"first_name": "Test Contact"}): + if frappe.get_all("Contact", {"first_name": "Test Contact"}): return doc = frappe.new_doc("Contact") @@ -127,7 +127,7 @@ def create_child_doctype(name, fields): @frappe.whitelist() def create_contact_records(): - if frappe.db.get_all("Contact", {"first_name": "Test Form Contact 1"}): + if frappe.get_all("Contact", {"first_name": "Test Form Contact 1"}): return insert_contact("Test Form Contact 1", "12345") @@ -137,7 +137,7 @@ def create_contact_records(): @frappe.whitelist() def create_multiple_todo_records(): - if frappe.db.get_all("ToDo", {"description": "Multiple ToDo 1"}): + if frappe.get_all("ToDo", {"description": "Multiple ToDo 1"}): return values = [(f"100{i}", f"Multiple ToDo {i}") for i in range(1, 1002)] @@ -291,7 +291,7 @@ def update_child_table(name): @frappe.whitelist() def insert_doctype_with_child_table_record(name): - if frappe.db.get_all(name, {"title": "Test Grid Search"}): + if frappe.get_all(name, {"title": "Test Grid Search"}): return def insert_child(doc, data, barcode, check, rating, duration, date): diff --git a/frappe/website/doctype/web_template/web_template.py b/frappe/website/doctype/web_template/web_template.py index a21affafc9..a0eb7be16a 100644 --- a/frappe/website/doctype/web_template/web_template.py +++ b/frappe/website/doctype/web_template/web_template.py @@ -33,7 +33,7 @@ class WebTemplate(Document): def on_update(self): """Clear cache for all Web Pages in which this template is used""" - routes = frappe.db.get_all( + routes = frappe.get_all( "Web Page", filters=[ ["Web Page Block", "web_template", "=", self.name], diff --git a/frappe/website/router.py b/frappe/website/router.py index aa1e15d4c9..34c3de05f3 100644 --- a/frappe/website/router.py +++ b/frappe/website/router.py @@ -33,7 +33,7 @@ def get_page_info_from_web_page_with_dynamic_routes(path): def get_page_info_from_web_form(path): """Query published web forms and evaluate if the route matches""" rules, page_info = [], {} - web_forms = frappe.db.get_all("Web Form", ["name", "route", "modified"], {"published": 1}) + web_forms = frappe.get_all("Web Form", ["name", "route", "modified"], {"published": 1}) for d in web_forms: rules.append(Rule(f"/{d.route}", endpoint=d.name)) rules.append(Rule(f"/{d.route}/list", endpoint=d.name)) diff --git a/frappe/www/unsubscribe.py b/frappe/www/unsubscribe.py index d679bb3319..a052d96986 100644 --- a/frappe/www/unsubscribe.py +++ b/frappe/www/unsubscribe.py @@ -40,7 +40,7 @@ def get_email_groups(user_email): def get_current_groups(name): # Return current group by which the mail has been sent. - return frappe.db.get_all( + return frappe.get_all( "Newsletter Email Group", fields=["email_group"], filters={"parent": name, "parenttype": "Newsletter"}, From 1de22b6082a4262d6b1d9d51dddd52de0ea4eca6 Mon Sep 17 00:00:00 2001 From: Ankush Menat Date: Sun, 21 Aug 2022 20:04:17 +0530 Subject: [PATCH 09/10] chore: ignore fluff change in blame [skip ci] --- .git-blame-ignore-revs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.git-blame-ignore-revs b/.git-blame-ignore-revs index 2a39cef3a6..5a96c3fea8 100644 --- a/.git-blame-ignore-revs +++ b/.git-blame-ignore-revs @@ -31,3 +31,6 @@ c0c5b2ebdddbe8898ce2d5e5365f4931ff73b6bf # format JS files with pretter 40f27f908a3890c9a90d2d96794fc31fcea63c59 + +# db.get_all -> get_all +2eec621e95564c359ad22da79501a855c1f32b03 From b30a78aa404b879271b09055645f6b5f657f7a7f Mon Sep 17 00:00:00 2001 From: Ankush Menat Date: Mon, 22 Aug 2022 11:39:18 +0530 Subject: [PATCH 10/10] perf: install hiredis for faster response parsing (#17893) --- pyproject.toml | 1 + 1 file changed, 1 insertion(+) diff --git a/pyproject.toml b/pyproject.toml index 99e3205412..285db69689 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -58,6 +58,7 @@ dependencies = [ "pytz==2022.1", "rauth~=0.7.3", "redis~=3.5.3", + "hiredis~=2.0.0", "requests-oauthlib~=1.3.0", "requests~=2.27.1", "rq~=1.10.1",