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
This commit is contained in:
Ankush Menat 2025-12-14 12:41:45 +05:30 committed by GitHub
parent 01ff456d48
commit 02ecb10205
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
6 changed files with 6 additions and 150 deletions

View file

@ -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:

View file

@ -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(

View file

@ -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()

View file

@ -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,
]

View file

@ -1,35 +0,0 @@
{% extends "templates/web.html" %}
{% block title %}
{{ title or (_("{0} List").format(_(doctype))) }}
{% endblock %}
{% block header %}
<h3 class="my-account-header">{{ title or (_("{0} List").format(_(doctype))) }}</h3>
{% endblock %}
{% block breadcrumbs %}
{% include "templates/includes/breadcrumbs.html" %}
{% endblock %}
{% block header_actions %}
{% if create_new %}
<div class="pull-right">
<a href="{{ create_new | abs_url }}" class="btn btn-primary btn-sm">
{{ _("New") }}
</a>
</div>
{% endif %}
{% endblock %}
{% block footer %}{% endblock %} {# no footer #}
{% block page_content %}
{% if introduction %}<p>{{ introduction }}</p>{% endif %}
{% include list_template or "templates/includes/list/list.html" %}
{% if list_footer %}{{ list_footer }}{% endif %}
{% endblock %}
{% block script %}
<script>{% include "templates/includes/list/list.js" %}</script>
{% endblock %}

View file

@ -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