[MERGE] point_of_sale: posbox related usability & reliability improvements + firefox...
authorFrédéric van der Essen <fva@openerp.com>
Mon, 10 Feb 2014 15:53:18 +0000 (16:53 +0100)
committerFrédéric van der Essen <fva@openerp.com>
Mon, 10 Feb 2014 15:53:18 +0000 (16:53 +0100)
bzr revid: fva@openerp.com-20140210155318-1exkkl4ij93jtbq2

addons/web/controllers/main.py
addons/web/static/src/js/search.js
addons/web_calendar/static/src/js/web_calendar.js
openerp/addons/base/ir/ir_ui_view.py

index 3f3a246..94357c0 100644 (file)
@@ -133,6 +133,20 @@ def ensure_db(redirect='/web/database/selector'):
     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
index fa9bae9..903a9f4 100644 (file)
@@ -473,12 +473,9 @@ instance.web.SearchView = instance.web.Widget.extend(/** @lends instance.web.Sea
      * 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,
@@ -486,6 +483,10 @@ instance.web.SearchView = instance.web.Widget.extend(/** @lends instance.web.Sea
             delay: 250,
         }).data('autocomplete');
 
+        this.$el.on('input', function () {
+            this.$el.autocomplete('close');
+        }.bind(this));
+
         // MonkeyPatch autocomplete instance
         _.extend(autocomplete, {
             _renderItem: function (ul, item) {
index b283f8b..ef84f8a 100644 (file)
@@ -492,11 +492,7 @@ openerp.web_calendar = function(instance) {
                 all_day = this.all_day ? evt[this.all_day] : false,
                 res_computed_text = '',
                 the_title = '',
-                attendees = [];                
-
-            if (this.date_stop && this.fields[this.date_stop].type == 'date') {
-                date_stop.addDay(1);
-            }
+                attendees = [];          
 
             if (this.info_fields) {
                 var temp_ret = {};
index 011ba2d..ccbd563 100644 (file)
 ##############################################################################
 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
@@ -40,6 +44,17 @@ _logger = logging.getLogger(__name__)
 
 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
@@ -805,10 +820,20 @@ class view(osv.osv):
         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