From fb0c16e24e502e168ea7ee9373fc0f1933ac4bc9 Mon Sep 17 00:00:00 2001 From: niv-openerp Date: Mon, 25 Jul 2011 13:37:40 +0200 Subject: [PATCH] [imp] added possibility to save filters bzr revid: nicolas.vanhoren@openerp.com-20110725113740-8q9vo1rlvexertc1 --- addons/base/controllers/main.py | 19 ++++++++++ addons/base/static/src/js/search.js | 57 ++++++++++++++++++++++++----- addons/base/static/src/xml/base.xml | 7 ++++ 3 files changed, 74 insertions(+), 9 deletions(-) diff --git a/addons/base/controllers/main.py b/addons/base/controllers/main.py index 79de302f069..628a086e3d6 100644 --- a/addons/base/controllers/main.py +++ b/addons/base/controllers/main.py @@ -773,6 +773,25 @@ class SearchView(View): filter["context"] = req.session.eval_context(self.parse_context(filter["context"], req.session)) filter["domain"] = req.session.eval_domain(self.parse_domain(filter["domain"], req.session)) return filters + + @openerpweb.jsonrequest + def save_filter(self, req, model, name, context_to_save, domain): + Model = req.session.model("ir.filters") + ctx = openerpweb.nonliterals.CompoundContext(context_to_save) + ctx.session = req.session + ctx = ctx.evaluate() + domain = openerpweb.nonliterals.CompoundDomain(domain) + domain.session = req.session + domain = domain.evaluate() + uid = req.session._uid + context = req.session.eval_context(req.context) + to_return = Model.create_or_replace({"context": ctx, + "domain": domain, + "model_id": model, + "name": name, + "user_id": uid + }, context) + return to_return class Binary(openerpweb.Controller): _cp_path = "/base/binary" diff --git a/addons/base/static/src/js/search.js b/addons/base/static/src/js/search.js index 779cd74c999..36f0aef1b90 100644 --- a/addons/base/static/src/js/search.js +++ b/addons/base/static/src/js/search.js @@ -145,7 +145,10 @@ openerp.base.SearchView = openerp.base.Controller.extend({ self.ready.resolve(); }); - // filters management + this.reload_managed_filters(); + }, + reload_managed_filters: function() { + var self = this; return this.rpc('/base/searchview/get_filters', { model: this.dataset.model }).then(function(result) { @@ -159,6 +162,7 @@ openerp.base.SearchView = openerp.base.Controller.extend({ * Handle event when the user make a selection in the filters management select box. */ on_filters_management: function(e) { + var self = this; var select = this.$element.find(".oe_search-view-filters-management"); var val = select.val(); @@ -173,7 +177,38 @@ openerp.base.SearchView = openerp.base.Controller.extend({ this.on_search([filter.domain], [filter.context], []); } else if (val == "save_filter") { select.val("_filters"); - //TODO niv + var data = this.build_search_data(); + var context = new openerp.base.CompoundContext(); + _.each(data.contexts, function(x) { + context.add(x); + }); + var domain = new openerp.base.CompoundDomain(); + _.each(data.domains, function(x) { + domain.add(x); + }); + var dial_html = QWeb.render("SearchView.managed-filters.add"); + var $dial = $(dial_html); + $dial.dialog({ + modal: true, + title: "Filter Entry", + buttons: { + Cancel: function() { + $(this).dialog("close"); + }, + OK: function() { + $(this).dialog("close"); + var name = $(this).find("input").val(); + self.rpc('/base/searchview/save_filter', { + model: self.dataset.model, + context_to_save: context, + domain: domain, + name: name + }).then(function(result) { + self.reload_managed_filters(); + }); + }, + } + }); } else { // manage_filters select.val("_filters"); //TODO niv @@ -197,6 +232,16 @@ openerp.base.SearchView = openerp.base.Controller.extend({ if (e && e.preventDefault) { e.preventDefault(); } + var data = this.build_search_data(); + + if (data.errors.length) { + this.on_invalid(data.errors); + return; + } + + this.on_search(data.domains, data.contexts, data.groupbys); + }, + build_search_data: function() { var domains = [], contexts = [], errors = []; @@ -221,19 +266,13 @@ openerp.base.SearchView = openerp.base.Controller.extend({ } }); - if (errors.length) { - this.on_invalid(errors); - return; - } - // TODO: do we need to handle *fields* with group_by in their context? var groupbys = _(this.enabled_filters) .chain() .map(function (filter) { return filter.get_context();}) .compact() .value(); - - this.on_search(domains, contexts, groupbys); + return {domains: domains, contexts: contexts, errors: errors, groupbys: groupbys}; }, /** * Triggered after the SearchView has collected all relevant domains and diff --git a/addons/base/static/src/xml/base.xml b/addons/base/static/src/xml/base.xml index faab1eb3d6d..5570415fdde 100644 --- a/addons/base/static/src/xml/base.xml +++ b/addons/base/static/src/xml/base.xml @@ -679,6 +679,13 @@ + +
+

Filter Name:

+ +

(Any existing filter with the same name will be replaced)

+
+