From 02ecb10205d8432ee5d7591bededba3acc0ba64c Mon Sep 17 00:00:00 2001 From: Ankush Menat Date: Sun, 14 Dec 2025 12:41:45 +0530 Subject: [PATCH] fix!: Remove badly written default portal list views (#35182) * fix!: Remove badly written default portal list views * fix!: Remove guest permissions from web form list endpoint * test: cleanly terminate gunicorn int sometimes ends up leaving socket open --- frappe/commands/test_commands.py | 3 +- frappe/tests/test_webform.py | 17 ----- frappe/website/page_renderers/list_page.py | 12 --- frappe/website/path_resolver.py | 2 - frappe/www/list.html | 35 --------- frappe/www/list.py | 87 +--------------------- 6 files changed, 6 insertions(+), 150 deletions(-) delete mode 100644 frappe/website/page_renderers/list_page.py delete mode 100644 frappe/www/list.html diff --git a/frappe/commands/test_commands.py b/frappe/commands/test_commands.py index 7cdf26b1b4..d3498d8842 100644 --- a/frappe/commands/test_commands.py +++ b/frappe/commands/test_commands.py @@ -1086,7 +1086,8 @@ class TestGunicornWorker(IntegrationTestCase): self.addCleanup(self.kill_gunicorn) def kill_gunicorn(self): - self.handle.send_signal(signal.SIGINT) + time.sleep(1) + self.handle.send_signal(signal.SIGTERM) try: self.handle.communicate(timeout=1) except subprocess.TimeoutExpired: diff --git a/frappe/tests/test_webform.py b/frappe/tests/test_webform.py index 706fafb4d4..52b6670f4e 100644 --- a/frappe/tests/test_webform.py +++ b/frappe/tests/test_webform.py @@ -21,23 +21,6 @@ class TestWebform(IntegrationTestCase): response = get_response() self.assertEqual(response.status_code, 404) - def test_get_context_hook_of_webform(self): - create_custom_doctype() - create_webform() - - # check context for apps without any hook - context_list = get_list_context("", "Custom Doctype", "test-webform") - self.assertFalse(context_list) - - # create a hook to get webform_context - set_webform_hook( - "webform_list_context", - "frappe.www._test._test_webform.webform_list_context", - ) - # check context for apps with hook - context_list = get_list_context("", "Custom Doctype", "test-webform") - self.assertTrue(context_list) - def create_custom_doctype(): frappe.get_doc( diff --git a/frappe/website/page_renderers/list_page.py b/frappe/website/page_renderers/list_page.py deleted file mode 100644 index ad2616a03f..0000000000 --- a/frappe/website/page_renderers/list_page.py +++ /dev/null @@ -1,12 +0,0 @@ -import frappe -from frappe.website.page_renderers.template_page import TemplatePage - - -class ListPage(TemplatePage): - def can_render(self): - return frappe.db.exists("DocType", self.path, True) - - def render(self): - frappe.local.form_dict.doctype = self.path - self.set_standard_path("list") - return super().render() diff --git a/frappe/website/path_resolver.py b/frappe/website/path_resolver.py index 0b162f2619..2f71cc55be 100644 --- a/frappe/website/path_resolver.py +++ b/frappe/website/path_resolver.py @@ -6,7 +6,6 @@ from werkzeug.routing import Rule import frappe from frappe.website.page_renderers.document_page import DocumentPage -from frappe.website.page_renderers.list_page import ListPage from frappe.website.page_renderers.not_found_page import NotFoundPage from frappe.website.page_renderers.print_page import PrintPage from frappe.website.page_renderers.redirect_page import RedirectPage @@ -60,7 +59,6 @@ class PathResolver: WebFormPage, DocumentPage, TemplatePage, - ListPage, PrintPage, ] diff --git a/frappe/www/list.html b/frappe/www/list.html deleted file mode 100644 index 154a723cc6..0000000000 --- a/frappe/www/list.html +++ /dev/null @@ -1,35 +0,0 @@ -{% extends "templates/web.html" %} - -{% block title %} - {{ title or (_("{0} List").format(_(doctype))) }} -{% endblock %} - -{% block header %} -

{{ title or (_("{0} List").format(_(doctype))) }}

-{% endblock %} - -{% block breadcrumbs %} - {% include "templates/includes/breadcrumbs.html" %} -{% endblock %} - -{% block header_actions %} -{% if create_new %} -
- - {{ _("New") }} - -
-{% endif %} -{% endblock %} - -{% block footer %}{% endblock %} {# no footer #} - -{% block page_content %} - {% if introduction %}

{{ introduction }}

{% endif %} - {% include list_template or "templates/includes/list/list.html" %} - {% if list_footer %}{{ list_footer }}{% endif %} -{% endblock %} - -{% block script %} - -{% endblock %} diff --git a/frappe/www/list.py b/frappe/www/list.py index 39ec720011..4feb9a6943 100644 --- a/frappe/www/list.py +++ b/frappe/www/list.py @@ -5,83 +5,14 @@ import json import frappe from frappe import _ -from frappe.model.document import Document, get_controller -from frappe.utils import cint, quoted +from frappe.model.document import get_controller +from frappe.utils import cint from frappe.website.path_resolver import resolve_path no_cache = 1 -def get_context(context, **dict_params): - """Return context for a list standard list page. - - Also update `get_list_context` from the doctype module file.""" - frappe.local.form_dict.update(dict_params) - doctype = frappe.local.form_dict.doctype - context.parents = [{"route": "me", "title": _("My Account")}] - context.meta = frappe.get_meta(doctype) - context.update(get_list_context(context, doctype) or {}) - context.doctype = doctype - context.txt = frappe.local.form_dict.txt - context.update(get(**frappe.local.form_dict)) - - -@frappe.whitelist(allow_guest=True) -def get( - doctype: str, - txt: str | None = None, - limit_start: int = 0, - limit: int = 20, - pathname: str | None = None, - **kwargs, -): - """Return processed HTML page for a standard listing.""" - limit_start = cint(limit_start) - raw_result = get_list_data(doctype, txt, limit_start, limit=limit + 1, **kwargs) - show_more = len(raw_result) > limit - if show_more: - raw_result = raw_result[:-1] - - meta = frappe.get_meta(doctype) - list_context = frappe.flags.list_context - - if not raw_result: - return {"result": []} - - if txt: - list_context.default_subtitle = _('Filtered by "{0}"').format(txt) - - result = [] - row_template = list_context.row_template or "templates/includes/list/row_template.html" - list_view_fields = [df for df in meta.fields if df.in_list_view][:4] - - for doc in raw_result: - doc.doctype = doctype - new_context = frappe._dict(doc=doc, meta=meta, list_view_fields=list_view_fields) - - if not list_context.get_list and not isinstance(new_context.doc, Document): - new_context.doc = frappe.get_doc(doc.doctype, doc.name) - new_context.update(new_context.doc.as_dict()) - - if not frappe.in_test: - pathname = pathname or frappe.local.request.path - new_context["pathname"] = pathname.strip("/ ") - new_context.update(list_context) - set_route(new_context) - rendered_row = frappe.render_template(row_template, new_context, is_path=True) - result.append(rendered_row) - - from frappe.utils.response import json_handler - - return { - "raw_result": json.dumps(raw_result, default=json_handler), - "result": result, - "show_more": show_more, - "next_start": limit_start + limit, - } - - -@frappe.whitelist(allow_guest=True) +@frappe.whitelist() def get_list_data( doctype: str, txt: str | None = None, @@ -137,16 +68,6 @@ def get_list_data( return raw_result -def set_route(context): - """Set link for the list item""" - if context.web_form_name: - context.route = f"{context.pathname}?name={quoted(context.doc.name)}" - elif context.doc and getattr(context.doc, "route", None): - context.route = context.doc.route - else: - context.route = f"{context.pathname or quoted(context.doc.doctype)}/{quoted(context.doc.name)}" - - def prepare_filters(doctype, controller, kwargs): for key in kwargs.keys(): try: @@ -219,7 +140,7 @@ def get_list_context(context, doctype, web_form_name=None): list_context.row_template = meta.get_row_template() if not meta.custom and not list_context.list_template: - list_context.template = meta.get_list_template() or "www/list.html" + list_context.template = meta.get_list_template() return list_context