64 lines
1.7 KiB
Python
64 lines
1.7 KiB
Python
# Copyright (c) 2022, Frappe Technologies Pvt. Ltd. and Contributors
|
|
# License: MIT. See LICENSE
|
|
|
|
import frappe
|
|
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.engine.build_conditions(doctype, current_filters).select("name")
|
|
|
|
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)
|
|
)
|
|
|
|
return 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,
|
|
)
|