From 786df3fbeb1876639cdfa84de7908f33b7a9c990 Mon Sep 17 00:00:00 2001 From: Ankush Menat Date: Sun, 21 Aug 2022 14:31:10 +0530 Subject: [PATCH] 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,