seitime-frappe/frappe/www/portal.py

88 lines
2.7 KiB
Python

import json
import frappe
from frappe import _, cint
from frappe.model.document import Document
from frappe.utils.data import quoted
from frappe.www.list import get_list_context, get_list_data
def get_context(context, **dict_params):
frappe.local.form_dict.update(dict_params)
context.show_sidebar = True
doctype = frappe.local.form_dict.doctype
if doctype:
meta = frappe.get_meta(doctype)
if frappe.session.user == "Guest" and not meta.allow_guest_to_view:
frappe.throw(_("Login to view"), frappe.PermissionError)
context.meta = meta
context.update(get_list_context(context, doctype) or {})
context.update(get(**frappe.local.form_dict))
context.home_page = "/portal"
context.doctype = frappe.local.form_dict.doctype
return context
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 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": [], "txt": txt}
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,
"txt": txt,
}