seitime-frappe/frappe/desk/listview.py
Maxim Sysoev 557293adfe
feat: show link field title in sidebar filters if set (#26417)
* feat: In sidebar filter link field show Title of Field if set (#26413)

* fix: test_list_view_child_table_filter_with_created_by_filter

* fix tests

* fix: formatting

* fix: formatting

* refactor: cleanup logic slightly, reduce code repetition

Respect value of show_title_field_in_link

Signed-off-by: Akhil Narang <me@akhilnarang.dev>

---------

Signed-off-by: Akhil Narang <me@akhilnarang.dev>
Co-authored-by: Akhil Narang <me@akhilnarang.dev>
2024-05-15 12:48:05 +00:00

85 lines
2.3 KiB
Python

# Copyright (c) 2022, Frappe Technologies Pvt. Ltd. and Contributors
# License: MIT. See LICENSE
import frappe
from frappe.model import is_default_field
from frappe.query_builder import Order
from frappe.query_builder.functions import Count
from frappe.query_builder.terms import SubQuery
from frappe.query_builder.utils import DocType
@frappe.whitelist()
def get_list_settings(doctype):
try:
return frappe.get_cached_doc("List View Settings", doctype)
except frappe.DoesNotExistError:
frappe.clear_messages()
@frappe.whitelist()
def set_list_settings(doctype, values):
try:
doc = frappe.get_doc("List View Settings", doctype)
except frappe.DoesNotExistError:
doc = frappe.new_doc("List View Settings")
doc.name = doctype
frappe.clear_messages()
doc.update(frappe.parse_json(values))
doc.save()
@frappe.whitelist()
def get_group_by_count(doctype: str, current_filters: str, field: str) -> list[dict]:
current_filters = frappe.parse_json(current_filters)
if field == "assigned_to":
ToDo = DocType("ToDo")
User = DocType("User")
count = Count("*").as_("count")
filtered_records = frappe.qb.get_query(
doctype,
filters=current_filters,
fields=["name"],
validate_filters=True,
)
return (
frappe.qb.from_(ToDo)
.from_(User)
.select(ToDo.allocated_to.as_("name"), count)
.where(
(ToDo.status != "Cancelled")
& (ToDo.allocated_to == User.name)
& (User.user_type == "System User")
& (ToDo.reference_name.isin(SubQuery(filtered_records)))
)
.groupby(ToDo.allocated_to)
.orderby(count, order=Order.desc)
.limit(50)
.run(as_dict=True)
)
meta = frappe.get_meta(doctype)
if not meta.has_field(field) and not is_default_field(field):
raise ValueError("Field does not belong to doctype")
data = frappe.get_list(
doctype,
filters=current_filters,
group_by=f"`tab{doctype}`.{field}",
fields=["count(*) as count", f"`{field}` as name"],
order_by="count desc",
limit=50,
)
# Add in title if it's a link field and `show_title_field_in_link` is set
if (field_meta := meta.get_field(field)) and field_meta.fieldtype == "Link":
link_meta = frappe.get_meta(field_meta.options)
if link_meta.show_title_field_in_link:
title_field = link_meta.get_title_field()
for item in data:
item.title = frappe.get_value(field_meta.options, item.name, title_field)
return data