[IMP] web_edit_user_filter: black, isort, prettier

pull/2017/head
Roberto Fichera 2021-09-05 12:49:58 +02:00
parent b288df563c
commit c97e91ebd8
8 changed files with 116 additions and 118 deletions

View File

@ -0,0 +1 @@
../../../../web_edit_user_filter

View File

@ -0,0 +1,6 @@
import setuptools
setuptools.setup(
setup_requires=['setuptools-odoo'],
odoo_addon=True,
)

View File

@ -2,21 +2,15 @@
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
{ {
'name': 'Edit User Filters', "name": "Edit User Filters",
'category': 'Extra Tools', "category": "Extra Tools",
'version': '12.0.1.0.2', "version": "12.0.1.0.2",
'development_status': 'Production/Stable', "development_status": "Production/Stable",
'author': 'Onestein,Odoo Community Association (OCA)', "author": "Onestein,Odoo Community Association (OCA)",
'license': 'AGPL-3', "license": "AGPL-3",
'website': 'https://github.com/OCA/web', "website": "https://github.com/OCA/web",
'depends': [ "depends": ["web"],
'web' "data": ["templates/assets.xml"],
], "qweb": ["static/src/xml/backend.xml"],
'data': [ "installable": True,
'templates/assets.xml'
],
'qweb': [
'static/src/xml/backend.xml'
],
'installable': True,
} }

View File

@ -5,19 +5,17 @@ from odoo import api, fields, models
class IrFilters(models.Model): class IrFilters(models.Model):
_inherit = 'ir.filters' _inherit = "ir.filters"
facet = fields.Text() facet = fields.Text()
@api.model @api.model
def get_filters(self, model, action_id=None): def get_filters(self, model, action_id=None):
res = super().get_filters(model, action_id) res = super().get_filters(model, action_id)
ids = map(lambda f: f['id'], res) ids = map(lambda f: f["id"], res)
# Browse filters that are in res # Browse filters that are in res
filters = self.browse(ids) filters = self.browse(ids)
for i, res_filter in enumerate(res): for i, res_filter in enumerate(res):
# Add the field 'facet' to the result # Add the field 'facet' to the result
res[i]['facet'] = filters.filtered( res[i]["facet"] = filters.filtered(lambda f: f.id == res_filter["id"]).facet
lambda f: f.id == res_filter['id']
).facet
return res return res

View File

@ -1,18 +1,16 @@
/* Copyright 2019 Onestein /* Copyright 2019 Onestein
* License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). */ * License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). */
odoo.define('web_edit_user_filter', function (require) { odoo.define("web_edit_user_filter", function (require) {
"use strict"; "use strict";
var FavoriteMenu = require('web.FavoriteMenu'), var FavoriteMenu = require("web.FavoriteMenu"),
core = require('web.core'), core = require("web.core"),
SearchView = require('web.SearchView'); SearchView = require("web.SearchView");
var qweb = core.qweb; var qweb = core.qweb;
var _t = core._t; var _t = core._t;
FavoriteMenu.include({ FavoriteMenu.include({
/** /**
* Adds the facets data to the filter. * Adds the facets data to the filter.
* *
@ -24,18 +22,21 @@ odoo.define('web_edit_user_filter', function (require) {
this.query.each(function (facet) { this.query.each(function (facet) {
var json_facet = facet.attributes; var json_facet = facet.attributes;
json_facet.values = facet.get('values'); json_facet.values = facet.get("values");
_.each(json_facet.values, function (value, i) { _.each(json_facet.values, function (value, i) {
if (typeof value.value === 'object' && value.value !== null && if (
'attrs' in value.value) { typeof value.value === "object" &&
value.value !== null &&
"attrs" in value.value
) {
json_facet.values[i] = { json_facet.values[i] = {
attrs: value.value.attrs, attrs: value.value.attrs,
}; };
} }
}); });
if ('field' in json_facet) { if ("field" in json_facet) {
json_facet.field = { json_facet.field = {
attrs: json_facet.field.attrs, attrs: json_facet.field.attrs,
}; };
@ -58,15 +59,17 @@ odoo.define('web_edit_user_filter', function (require) {
var self = this; var self = this;
var res = this._super(filter); var res = this._super(filter);
var key = this.key_for(filter); var key = this.key_for(filter);
this.$filters[key].append($('<span>', { this.$filters[key].append(
class: 'fa fa-pencil o-edit-user-filter', $("<span>", {
class: "fa fa-pencil o-edit-user-filter",
on: { on: {
click: function (event) { click: function (event) {
event.stopImmediatePropagation(); event.stopImmediatePropagation();
self._unpackFilter(filter); self._unpackFilter(filter);
}, },
}, },
})); })
);
return res; return res;
}, },
@ -83,58 +86,61 @@ odoo.define('web_edit_user_filter', function (require) {
this.query.reset([]); this.query.reset([]);
_.each(facets, function (segment) { _.each(facets, function (segment) {
if (segment.cat === 'groupByCategory') { if (segment.cat === "groupByCategory") {
_.each(segment.values, function (value) { _.each(segment.values, function (value) {
var groupBy = _.find( var groupBy = _.find(self.searchview.groupbysMapping, function (
self.searchview.groupbysMapping, mapping
function (mapping) { ) {
return mapping.groupby.attrs.context === value.attrs.context; return (
} mapping.groupby.attrs.context === value.attrs.context
); );
});
var eventData = { var eventData = {
category: 'groupByCategory', category: "groupByCategory",
itemId: groupBy.groupbyId, itemId: groupBy.groupbyId,
isActive: true, isActive: true,
groupId: groupBy.groupId, groupId: groupBy.groupId,
}; };
self.trigger_up('menu_item_toggled', eventData); self.trigger_up("menu_item_toggled", eventData);
}); });
} else if (segment.cat === 'filterCategory') { } else if (segment.cat === "filterCategory") {
var new_filters = []; var new_filters = [];
_.each(segment.values, function (value) { _.each(segment.values, function (value) {
if (value.attrs.name) { if (value.attrs.name) {
var filterDomain = _.find( var filterDomain = _.find(
self.searchview.filtersMapping, self.searchview.filtersMapping,
function (mapping) { function (mapping) {
return mapping.filter.attrs.name === value.attrs.name; return (
mapping.filter.attrs.name === value.attrs.name
);
} }
); );
var eventData = { var eventData = {
category: 'filterCategory', category: "filterCategory",
itemId: filterDomain.filterId, itemId: filterDomain.filterId,
isActive: true, isActive: true,
groupId: filterDomain.groupId, groupId: filterDomain.groupId,
}; };
self.trigger_up('menu_item_toggled', eventData); self.trigger_up("menu_item_toggled", eventData);
} else { } else {
new_filters.push({ new_filters.push({
groupId: null, groupId: null,
filter: { filter: {
tag: 'filter', tag: "filter",
attrs: value.attrs attrs: value.attrs,
}, },
itemId: _.uniqueId('__filter__') itemId: _.uniqueId("__filter__"),
}); });
} }
}); });
self.trigger_up('new_filters', new_filters); self.trigger_up("new_filters", new_filters);
} else { } else {
var search_widget = _.find( var search_widget = _.find(self.searchview.search_fields, function (
self.searchview.search_fields, function (f) { f
) {
return f.attrs.name === segment.field.attrs.name; return f.attrs.name === segment.field.attrs.name;
} });
);
new_facets.push({ new_facets.push({
category: segment.category, category: segment.category,
field: search_widget, field: search_widget,
@ -148,7 +154,6 @@ odoo.define('web_edit_user_filter', function (require) {
}); });
SearchView.include({ SearchView.include({
/** /**
* Removes a value from a facet. * Removes a value from a facet.
* *
@ -158,7 +163,7 @@ odoo.define('web_edit_user_filter', function (require) {
*/ */
_removeValue: function (model, value) { _removeValue: function (model, value) {
var toRemove = model.values.filter(function (v) { var toRemove = model.values.filter(function (v) {
if (typeof v.attributes.value === 'object') { if (typeof v.attributes.value === "object") {
return v.attributes.value.attrs.domain === value; return v.attributes.value.attrs.domain === value;
} }
@ -176,23 +181,25 @@ odoo.define('web_edit_user_filter', function (require) {
*/ */
_renderPopover: function ($facet, model) { _renderPopover: function ($facet, model) {
var self = this; var self = this;
var $content = $(qweb.render('web_edit_user_filter.Popover', { var $content = $(
values: model.get('values'), qweb.render("web_edit_user_filter.Popover", {
})); values: model.get("values"),
})
);
// Cannot use Widget.events here because renderFacets is // Cannot use Widget.events here because renderFacets is
// triggered apart from renderElement // triggered apart from renderElement
$content.find('.list-group-item').click(function () { $content.find(".list-group-item").click(function () {
self._removeValue(model, $(this).attr('data-value')); self._removeValue(model, $(this).attr("data-value"));
}); });
$facet.popover({ $facet.popover({
title: _t('Edit Facet'), title: _t("Edit Facet"),
template: qweb.render('web_edit_user_filter.PopoverTemplate'), template: qweb.render("web_edit_user_filter.PopoverTemplate"),
content: $content, content: $content,
container: this.$el, container: this.$el,
html: true, html: true,
trigger: 'manual', trigger: "manual",
placement: 'bottom', placement: "bottom",
animation: false, animation: false,
}); });
}, },
@ -203,7 +210,7 @@ odoo.define('web_edit_user_filter', function (require) {
* @private * @private
*/ */
_hidePopovers: function () { _hidePopovers: function () {
this.$el.find('.popover').popover('hide'); this.$el.find(".popover").popover("hide");
}, },
/** /**
@ -213,20 +220,22 @@ odoo.define('web_edit_user_filter', function (require) {
var self = this; var self = this;
var res = this._super.apply(this, arguments); var res = this._super.apply(this, arguments);
this.$el.find('.o-edit-user-filter-popover').remove(); this.$el.find(".o-edit-user-filter-popover").remove();
_.each(this.input_subviews, function (input_subview) { _.each(this.input_subviews, function (input_subview) {
if (!input_subview.model || if (
input_subview.model.attributes.is_custom_filter) { !input_subview.model ||
input_subview.model.attributes.is_custom_filter
) {
return; return;
} }
input_subview.$el.addClass('o-edit-user-filter-editable'); input_subview.$el.addClass("o-edit-user-filter-editable");
self._renderPopover(input_subview.$el, input_subview.model); self._renderPopover(input_subview.$el, input_subview.model);
input_subview.$el.click(function () { input_subview.$el.click(function () {
self._hidePopovers(); self._hidePopovers();
input_subview.$el.popover('show'); input_subview.$el.popover("show");
}); });
}); });
return res; return res;
@ -238,7 +247,7 @@ odoo.define('web_edit_user_filter', function (require) {
start: function () { start: function () {
var self = this; var self = this;
var res = this._super.apply(this, arguments); var res = this._super.apply(this, arguments);
this._proxyHidePopovers = this.proxy('_hidePopovers'); this._proxyHidePopovers = this.proxy("_hidePopovers");
$(document).click(this._proxyHidePopovers); $(document).click(this._proxyHidePopovers);
return res; return res;
}, },
@ -248,8 +257,8 @@ odoo.define('web_edit_user_filter', function (require) {
*/ */
destroy: function () { destroy: function () {
var res = this._super.apply(this, arguments); var res = this._super.apply(this, arguments);
$(document).unbind('click', this._proxyHidePopovers); $(document).unbind("click", this._proxyHidePopovers);
return res; return res;
} },
}); });
}); });

View File

@ -1,16 +1,17 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8" ?>
<!-- Copyright 2019 Onestein <!-- Copyright 2019 Onestein
License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). --> License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). -->
<template> <template>
<div t-name="web_edit_user_filter.Popover"> <div t-name="web_edit_user_filter.Popover">
<div class="list-group"> <div class="list-group">
<t t-foreach="values" t-as="value"> <t t-foreach="values" t-as="value">
<a class="list-group-item list-group-item-action" <a
t-attf-data-value="#{typeof value.value === 'object' ? value.value.attrs.domain : value.value}"> class="list-group-item list-group-item-action"
t-attf-data-value="#{typeof value.value === 'object' ? value.value.attrs.domain : value.value}"
>
<span> <span>
<t t-esc="value.label"/> <t t-esc="value.label" />
</span> </span>
<button class="btn btn-sm btn-link pull-right"> <button class="btn btn-sm btn-link pull-right">
<span class="fa fa-close" /> <span class="fa fa-close" />
@ -22,9 +23,9 @@
<t t-name="web_edit_user_filter.PopoverTemplate"> <t t-name="web_edit_user_filter.PopoverTemplate">
<div class="popover o-edit-user-filter-popover" role="tooltip"> <div class="popover o-edit-user-filter-popover" role="tooltip">
<h3 class="popover-header"></h3> <h3 class="popover-header" />
<div class="arrow"></div> <div class="arrow" />
<div class="popover-body"></div> <div class="popover-body" />
</div> </div>
</t> </t>
</template> </template>

View File

@ -1,16 +1,17 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8" ?>
<!-- Copyright 2019 Onestein <!-- Copyright 2019 Onestein
License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). --> License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). -->
<odoo> <odoo>
<template id="assets_backend" inherit_id="web.assets_backend"> <template id="assets_backend" inherit_id="web.assets_backend">
<xpath expr="."> <xpath expr=".">
<script src="/web_edit_user_filter/static/src/js/backend.js"></script> <script src="/web_edit_user_filter/static/src/js/backend.js" />
</xpath> </xpath>
<xpath expr="//link[last()]"> <xpath expr="//link[last()]">
<link href="/web_edit_user_filter/static/src/scss/backend.scss" <link
href="/web_edit_user_filter/static/src/scss/backend.scss"
rel="stylesheet" rel="stylesheet"
type="text/scss"/> type="text/scss"
/>
</xpath> </xpath>
</template> </template>
</odoo> </odoo>

View File

@ -7,26 +7,14 @@ from odoo.tests.common import SingleTransactionCase, post_install
@post_install(True) @post_install(True)
class TestEditUserFilter(SingleTransactionCase): class TestEditUserFilter(SingleTransactionCase):
def test_filter_facet_inclusion(self): def test_filter_facet_inclusion(self):
self.env['ir.filters'].create({ self.env["ir.filters"].create(
'name': 'any2', {"name": "any2", "model_id": "ir.filters", "domain": "[]", "facet": "test2"}
'model_id': 'ir.filters', )
'domain': '[]', new_filter = self.env["ir.filters"].create(
'facet': 'test2' {"name": "any", "model_id": "ir.filters", "domain": "[]", "facet": "test"}
}) )
new_filter = self.env['ir.filters'].create({ res = self.env["ir.filters"].get_filters("ir.filters")
'name': 'any', self.assertTrue("facet" in res[0])
'model_id': 'ir.filters',
'domain': '[]',
'facet': 'test'
})
res = self.env['ir.filters'].get_filters('ir.filters')
self.assertTrue('facet' in res[0])
self.assertEqual( self.assertEqual(
list( list(filter(lambda f: f["id"] == new_filter.id, res))[0]["facet"], "test"
filter(
lambda f: f['id'] == new_filter.id,
res
)
)[0]['facet'],
'test'
) )