server-ux/base_custom_filter/models/base.py
2022-06-29 20:41:04 +02:00

115 lines
4.3 KiB
Python

# Migrated to v14.0 by Ashish Hirpara (https://www.ashish-hirpara.com)
# Copyright 2021 ForgeFlow S.L. (https://www.forgeflow.com)
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
from lxml import etree
from flectra import api, models
class Base(models.AbstractModel):
_inherit = "base"
@api.model
def _add_grouped_filters(self, res, custom_filters):
arch = etree.fromstring(res["arch"])
node = arch.xpath("//search/filter[last()]")
if node:
node[0].addnext(etree.Element("separator"))
for custom_filter in custom_filters:
node = arch.xpath("//search/separator[last()]")
if node:
elem = etree.Element(
"filter",
{
"name": "ir_custom_filter_%s" % custom_filter.id,
"string": custom_filter.name,
"domain": custom_filter.domain,
},
)
node[0].addnext(elem)
res["arch"] = etree.tostring(arch)
return res
@api.model
def _add_grouped_groupby(self, res, custom_groupbys):
arch = etree.fromstring(res["arch"])
node = arch.xpath("//group/filter[last()]")
if node:
node[0].addnext(etree.Element("separator"))
for custom_groupby in custom_groupbys:
node = arch.xpath("//group/separator[last()]")
if node:
elem = etree.Element(
"filter",
{
"name": "ir_custom_filter_%s" % custom_groupby.id,
"string": custom_groupby.name,
"context": str(
{"group_by": custom_groupby.groupby_field.name}
),
},
)
node[0].addnext(elem)
res["arch"] = etree.tostring(arch)
return res
@api.model
def fields_view_get(
self, view_id=None, view_type="form", toolbar=False, submenu=False
):
"""Add filters in search views."""
res = super().fields_view_get(
view_id=view_id, view_type=view_type, toolbar=toolbar, submenu=submenu
)
if view_type == "search":
filter_groups = self.env["ir.filters.group"].search(
[
("model_id", "=", res.get("model")),
("filter_ids", "!=", False),
("type", "=", "filter"),
]
)
filters_no_group = self.env["ir.filters"].search(
[
("model_id", "=", res.get("model")),
("group_id", "=", False),
("type", "=", "filter"),
],
order="sequence desc",
)
groupby_groups = self.env["ir.filters.group"].search(
[
("model_id", "=", res.get("model")),
("filter_ids", "!=", False),
("type", "=", "groupby"),
]
)
groupbys_no_group = self.env["ir.filters"].search(
[
("model_id", "=", res.get("model")),
("group_id", "=", False),
("type", "=", "groupby"),
],
order="sequence desc",
)
# Add filter type
if filter_groups:
for filter_group in filter_groups:
res = self._add_grouped_filters(
res, filter_group.filter_ids.sorted("sequence", True)
)
if filters_no_group:
for filter_no_group in filters_no_group:
res = self._add_grouped_filters(res, filter_no_group)
# Add groupby type
if groupby_groups:
for groupby_group in groupby_groups:
res = self._add_grouped_groupby(
res, groupby_group.filter_ids.sorted("sequence", True)
)
if groupbys_no_group:
for groupby_no_group in groupbys_no_group:
res = self._add_grouped_groupby(res, groupby_no_group)
return res