if db and db not in http.db_filter([db]):
db = None
+ if db and not request.session.db:
+ # User asked a specific database on a new session.
+ # That mean the nodb router has been used to find the route
+ # Depending on installed module in the database, the rendering of the page
+ # may depend on data injected by the database route dispatcher.
+ # Thus, we redirect the user to the same page but with the session cookie set.
+ # This will force using the database route dispatcher...
+ r = request.httprequest
+ response = werkzeug.utils.redirect(r.url, 302)
+ request.session.db = db
+ response = r.app.get_response(r, response, explicit_session=False)
+ werkzeug.exceptions.abort(response)
+ return
+
# if db not provided, use the session one
if not db:
db = request.session.db
* Sets up search view's view-wide auto-completion widget
*/
setup_global_completion: function () {
- var self = this;
-
var autocomplete = this.$el.autocomplete({
source: this.proxy('complete_global_search'),
select: this.proxy('select_completion'),
- search: function () { self.$el.autocomplete('close'); },
focus: function (e) { e.preventDefault(); },
html: true,
autoFocus: true,
delay: 250,
}).data('autocomplete');
+ this.$el.on('input', function () {
+ this.$el.autocomplete('close');
+ }.bind(this));
+
// MonkeyPatch autocomplete instance
_.extend(autocomplete, {
_renderItem: function (ul, item) {
##############################################################################
import collections
import copy
+import fnmatch
import logging
from lxml import etree
from operator import itemgetter
import os
+import simplejson
+import werkzeug
import HTMLParser
import openerp
from openerp import tools
+from openerp.http import request
from openerp.osv import fields, osv, orm
from openerp.tools import graph, SKIPPED_ELEMENT_TYPES
from openerp.tools.safe_eval import safe_eval as eval
MOVABLE_BRANDING = ['data-oe-model', 'data-oe-id', 'data-oe-field', 'data-oe-xpath']
+def keep_query(*args, **kw):
+ if not args and not kw:
+ args = ('*',)
+ params = kw.copy()
+ query_params = frozenset(werkzeug.url_decode(request.httprequest.query_string).keys())
+ for keep_param in args:
+ for param in fnmatch.filter(query_params, keep_param):
+ if param not in params and param in request.params:
+ params[param] = request.params[param]
+ return werkzeug.urls.url_encode(params)
+
class view_custom(osv.osv):
_name = 'ir.ui.view.custom'
_order = 'create_date desc' # search(limit=1) should return the last customization
if not context:
context = {}
+ if values is None:
+ values = dict()
+ qcontext = dict(
+ keep_query=keep_query,
+ request=request,
+ json=simplejson,
+ quote_plus=werkzeug.url_quote_plus,
+ )
+ qcontext.update(values)
+
def loader(name):
return self.read_template(cr, uid, name, context=context)
- return self.pool[engine].render(cr, uid, tname, values, loader=loader, context=context)
+ return self.pool[engine].render(cr, uid, tname, qcontext, loader=loader, context=context)
#------------------------------------------------------
# Misc