fix: convert filter dict to tuple to allow same filter key with multiple values
This commit is contained in:
parent
cfc2d9ea94
commit
49e57f749c
@ -4,6 +4,7 @@ from frappe import _
|
|||||||
from frappe.model.document import get_controller
|
from frappe.model.document import get_controller
|
||||||
from frappe.model import no_value_fields
|
from frappe.model import no_value_fields
|
||||||
from pypika import Criterion
|
from pypika import Criterion
|
||||||
|
from frappe.utils import make_filter_tuple
|
||||||
|
|
||||||
from crm.api.views import get_views
|
from crm.api.views import get_views
|
||||||
from crm.fcrm.doctype.crm_form_script.crm_form_script import get_form_script
|
from crm.fcrm.doctype.crm_form_script.crm_form_script import get_form_script
|
||||||
@ -336,15 +337,22 @@ def get_data(
|
|||||||
if kc.get("page_length"):
|
if kc.get("page_length"):
|
||||||
page_length = kc.get("page_length")
|
page_length = kc.get("page_length")
|
||||||
|
|
||||||
column_data = frappe.get_list(
|
order = kc.get("order")
|
||||||
doctype,
|
if order:
|
||||||
fields=rows,
|
column_data = get_records_based_on_order(doctype, rows, column_filters, page_length, order)
|
||||||
filters=column_filters,
|
else:
|
||||||
order_by=order_by,
|
column_data = frappe.get_list(
|
||||||
page_length=page_length,
|
doctype,
|
||||||
)
|
fields=rows,
|
||||||
|
filters=convert_filter_to_tuple(doctype, column_filters),
|
||||||
|
order_by=order_by,
|
||||||
|
page_length=page_length,
|
||||||
|
)
|
||||||
|
|
||||||
all_count = len(frappe.get_list(doctype, filters={ column_field: kc.get('name') }))
|
new_filters = filters.copy()
|
||||||
|
new_filters.update({ column_field: kc.get('name') })
|
||||||
|
|
||||||
|
all_count = len(frappe.get_list(doctype, filters=convert_filter_to_tuple(doctype, new_filters)))
|
||||||
|
|
||||||
kc["all_count"] = all_count
|
kc["all_count"] = all_count
|
||||||
kc["count"] = len(column_data)
|
kc["count"] = len(column_data)
|
||||||
@ -352,10 +360,10 @@ def get_data(
|
|||||||
for d in column_data:
|
for d in column_data:
|
||||||
getCounts(d, doctype)
|
getCounts(d, doctype)
|
||||||
|
|
||||||
if kc.get("order"):
|
if order:
|
||||||
column_data = sorted(
|
column_data = sorted(
|
||||||
column_data, key=lambda x: kc.get("order").index(x.get("name"))
|
column_data, key=lambda x: order.index(x.get("name"))
|
||||||
if x.get("name") in kc.get("order") else 0
|
if x.get("name") in order else len(order)
|
||||||
)
|
)
|
||||||
|
|
||||||
data.append({"column": kc, "fields": kanban_fields, "data": column_data})
|
data.append({"column": kc, "fields": kanban_fields, "data": column_data})
|
||||||
@ -446,6 +454,43 @@ def get_data(
|
|||||||
"view_type": view_type,
|
"view_type": view_type,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
def convert_filter_to_tuple(doctype, filters):
|
||||||
|
if isinstance(filters, dict):
|
||||||
|
filters_items = filters.items()
|
||||||
|
filters = []
|
||||||
|
for key, value in filters_items:
|
||||||
|
filters.append(make_filter_tuple(doctype, key, value))
|
||||||
|
return filters
|
||||||
|
|
||||||
|
|
||||||
|
def get_records_based_on_order(doctype, rows, filters, page_length, order):
|
||||||
|
records = []
|
||||||
|
filters = convert_filter_to_tuple(doctype, filters)
|
||||||
|
in_filters = filters.copy()
|
||||||
|
in_filters.append([doctype, "name", "in", order[:page_length]])
|
||||||
|
records = frappe.get_list(
|
||||||
|
doctype,
|
||||||
|
fields=rows,
|
||||||
|
filters=in_filters,
|
||||||
|
order_by="creation desc",
|
||||||
|
page_length=page_length,
|
||||||
|
)
|
||||||
|
|
||||||
|
if len(records) < page_length:
|
||||||
|
not_in_filters = filters.copy()
|
||||||
|
not_in_filters.append([doctype, "name", "not in", order])
|
||||||
|
remaining_records = frappe.get_list(
|
||||||
|
doctype,
|
||||||
|
fields=rows,
|
||||||
|
filters=not_in_filters,
|
||||||
|
order_by="creation desc",
|
||||||
|
page_length=page_length - len(records),
|
||||||
|
)
|
||||||
|
for record in remaining_records:
|
||||||
|
records.append(record)
|
||||||
|
|
||||||
|
return records
|
||||||
|
|
||||||
@frappe.whitelist()
|
@frappe.whitelist()
|
||||||
def get_fields_meta(doctype, restricted_fieldtypes=None, as_array=False):
|
def get_fields_meta(doctype, restricted_fieldtypes=None, as_array=False):
|
||||||
not_allowed_fieldtypes = [
|
not_allowed_fieldtypes = [
|
||||||
|
|||||||
@ -4,7 +4,7 @@
|
|||||||
:list="columns"
|
:list="columns"
|
||||||
item-key="column"
|
item-key="column"
|
||||||
@end="updateColumn"
|
@end="updateColumn"
|
||||||
class="flex sm:mx-2.5 mx-2 pb-3.5 overflow-x-auto h-full"
|
class="flex sm:mx-2.5 mx-2 pb-3.5 overflow-x-auto"
|
||||||
>
|
>
|
||||||
<template #item="{ element: column }">
|
<template #item="{ element: column }">
|
||||||
<div
|
<div
|
||||||
@ -65,12 +65,12 @@
|
|||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="overflow-y-auto flex flex-col gap-2">
|
<div class="overflow-y-auto flex flex-col gap-2 h-full">
|
||||||
<Draggable
|
<Draggable
|
||||||
:list="column.data"
|
:list="column.data"
|
||||||
group="fields"
|
group="fields"
|
||||||
item-key="name"
|
item-key="name"
|
||||||
class="flex flex-col gap-3.5"
|
class="flex flex-col gap-3.5 flex-1"
|
||||||
@end="updateColumn"
|
@end="updateColumn"
|
||||||
:data-column="column.column.name"
|
:data-column="column.column.name"
|
||||||
>
|
>
|
||||||
@ -207,6 +207,9 @@ function updateColumn({ item, from, to }) {
|
|||||||
columns.value.forEach((col) => {
|
columns.value.forEach((col) => {
|
||||||
if (col.delete) return
|
if (col.delete) return
|
||||||
col.column['order'] = col.data.map((d) => d.name)
|
col.column['order'] = col.data.map((d) => d.name)
|
||||||
|
if (col.column.page_length) {
|
||||||
|
delete col.column.page_length
|
||||||
|
}
|
||||||
_columns.push(col.column)
|
_columns.push(col.column)
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user