[imp] added possibility to save filters

bzr revid: nicolas.vanhoren@openerp.com-20110725113740-8q9vo1rlvexertc1
This commit is contained in:
niv-openerp 2011-07-25 13:37:40 +02:00
parent 5bc4c09c3a
commit fb0c16e24e
3 changed files with 74 additions and 9 deletions

View File

@ -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"

View File

@ -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

View File

@ -679,6 +679,13 @@
<option value="save_filter">Save Filter</option>
<option value="manage_filters">Manage Filters</option>
</t>
<t t-name="SearchView.managed-filters.add">
<div>
<p>Filter Name:</p>
<input type="text"/>
<p>(Any existing filter with the same name will be replaced)</p>
</div>
</t>
<t t-name="SearchView.render_lines">
<table class="oe-searchview-render-line" border="0" cellspacing="0" cellpadding="0"
t-foreach="lines" t-as="line">