[IMP] change placeholder inclusion logic
[odoo/odoo.git] / addons / web / controllers / main.py
index abdbb1a..cfe25bb 100644 (file)
@@ -34,7 +34,6 @@ from openerp.tools.translate import _
 from .. import http
 openerpweb = http
 
-_logger = logging.getLogger(__name__)
 #----------------------------------------------------------
 # OpenERP Web helpers
 #----------------------------------------------------------
@@ -523,8 +522,19 @@ html_template = """<!DOCTYPE html>
     </head>
     <body>
         <!--[if lte IE 8]>
-        <script src="http://ajax.googleapis.com/ajax/libs/chrome-frame/1/CFInstall.min.js"></script>
-        <script>CFInstall.check({mode: "overlay"});</script>
+            <script src="http://ajax.googleapis.com/ajax/libs/chrome-frame/1/CFInstall.min.js"></script>
+            <script>CFInstall.check({mode: "overlay"});</script>
+        <![endif]-->
+        
+         <!--[if lte IE 9]>
+            <script src="/web/static/lib/jquery.placeholder/jquery.placeholder.min.js"></script>
+            <script>
+                document.addEventListener("DOMNodeInserted",function(event){
+                    if ( $(event.target).is("input") || $(event.target).is("textarea") ) {
+                    $(event.target).placeholder();
+                    }
+                });    
+            </script>
         <![endif]-->
     </body>
 </html>
@@ -669,7 +679,7 @@ class WebClient(openerpweb.Controller):
         messages = ir_translation.search_read([('module','in',mods),('lang','=',lang),
                                                ('comments','like','openerp-web'),('value','!=',False),
                                                ('value','!=','')],
-                                              ['module','src','value','lang'], order='module') 
+                                              ['module','src','value','lang'], order='module')
         for mod, msg_group in itertools.groupby(messages, key=operator.itemgetter('module')):
             translations_per_module.setdefault(mod,{'messages':[]})
             translations_per_module[mod]['messages'].extend({'id': m['src'],
@@ -680,9 +690,7 @@ class WebClient(openerpweb.Controller):
 
     @openerpweb.jsonrequest
     def version_info(self, req):
-        return {
-            "version": openerp.release.version
-        }
+        return openerp.service.web_services.RPC_VERSION_1
 
 class Proxy(openerpweb.Controller):
     _cp_path = '/web/proxy'
@@ -800,9 +808,9 @@ class Session(openerpweb.Controller):
         return {
             "session_id": req.session_id,
             "uid": req.session._uid,
-            "context": req.session.get_context() if req.session._uid else {},
+            "user_context": req.session.get_context() if req.session._uid else {},
             "db": req.session._db,
-            "login": req.session._login,
+            "username": req.session._login,
         }
 
     @openerpweb.jsonrequest
@@ -941,24 +949,28 @@ class Menu(openerpweb.Controller):
         """
         Menus = req.session.model('ir.ui.menu')
 
-        fields = ['name', 'sequence', 'parent_id', 'action',
-                  'needaction_enabled']
-        menu_roots = Menus.read(self.get_user_roots(req), fields, req.context)
+        fields = ['name', 'sequence', 'parent_id', 'action']
+        menu_root_ids = self.get_user_roots(req)
+        menu_roots = Menus.read(menu_root_ids, fields, req.context) if menu_root_ids else []
         menu_root = {
             'id': False,
             'name': 'root',
             'parent_id': [-1, ''],
-            'children': menu_roots
+            'children': menu_roots,
+            'all_menu_ids': menu_root_ids,
         }
+        if not menu_roots:
+            return menu_root
 
         # menus are loaded fully unlike a regular tree view, cause there are a
         # limited number of items (752 when all 6.1 addons are installed)
-        menu_ids = Menus.search([], 0, False, False, req.context)
+        menu_ids = Menus.search([('id', 'child_of', menu_root_ids)], 0, False, False, req.context)
         menu_items = Menus.read(menu_ids, fields, req.context)
         # adds roots at the end of the sequence, so that they will overwrite
         # equivalent menu items from full menu read when put into id:item
         # mapping, resulting in children being correctly set on the roots.
         menu_items.extend(menu_roots)
+        menu_root['all_menu_ids'] = menu_ids # includes menu_root_ids!
 
         # make a tree using parent_id
         menu_items_map = dict(
@@ -980,19 +992,13 @@ class Menu(openerpweb.Controller):
         return menu_root
 
     @openerpweb.jsonrequest
-    def load_needaction(self, req, menu_ids=False):
-        """ Loads needaction counters for all or some specific menu ids.
+    def load_needaction(self, req, menu_ids):
+        """ Loads needaction counters for specific menu ids.
 
             :return: needaction data
             :rtype: dict(menu_id: {'needaction_enabled': boolean, 'needaction_counter': int})
         """
-        Menus = req.session.model('ir.ui.menu')
-
-        if menu_ids == False:
-            menu_ids = Menus.search([('needaction_enabled', '=', True)], context=req.context)
-
-        menu_needaction_data = Menus.get_needaction_data(menu_ids, req.context)
-        return menu_needaction_data
+        return req.session.model('ir.ui.menu').get_needaction_data(menu_ids, req.context)
 
     @openerpweb.jsonrequest
     def action(self, req, menu_id):
@@ -1062,21 +1068,22 @@ class DataSet(openerpweb.Controller):
 
     def _call_kw(self, req, model, method, args, kwargs):
         # Temporary implements future display_name special field for model#read()
-        if method == 'read' and kwargs.get('context') and kwargs['context'].get('future_display_name'):
+        if method == 'read' and kwargs.get('context', {}).get('future_display_name'):
             if 'display_name' in args[1]:
-                names = req.session.model(model).name_get(args[0], **kwargs)
+                names = dict(req.session.model(model).name_get(args[0], **kwargs))
                 args[1].remove('display_name')
-                r = getattr(req.session.model(model), method)(*args, **kwargs)
-                for i in range(len(r)):
-                    r[i]['display_name'] = names[i][1] or "%s#%d" % (model, names[i][0])
-                return r
+                records = req.session.model(model).read(*args, **kwargs)
+                for record in records:
+                    record['display_name'] = \
+                        names.get(record['id']) or "%s#%d" % (model, (record['id']))
+                return records
 
         return getattr(req.session.model(model), method)(*args, **kwargs)
 
     @openerpweb.jsonrequest
     def call(self, req, model, method, args, domain_id=None, context_id=None):
         return self._call_kw(req, model, method, args, {})
-    
+
     @openerpweb.jsonrequest
     def call_kw(self, req, model, method, args, kwargs):
         return self._call_kw(req, model, method, args, kwargs)
@@ -1190,7 +1197,7 @@ class Binary(openerpweb.Controller):
                     if width > 500: width = 500
                     if height > 500: height = 500
                     image_base64 = openerp.tools.image_resize_image(base64_source=image_base64, size=(width, height), encoding='base64', filetype='PNG')
-            
+
             image_data = base64.b64decode(image_base64)
 
         except (TypeError, xmlrpclib.Fault):
@@ -1279,11 +1286,11 @@ class Binary(openerpweb.Controller):
     @openerpweb.httprequest
     def upload(self, req, callback, ufile):
         # TODO: might be useful to have a configuration flag for max-length file uploads
+        out = """<script language="javascript" type="text/javascript">
+                    var win = window.top.window;
+                    win.jQuery(win).trigger(%s, %s);
+                </script>"""
         try:
-            out = """<script language="javascript" type="text/javascript">
-                        var win = window.top.window;
-                        win.jQuery(win).trigger(%s, %s);
-                    </script>"""
             data = ufile.read()
             args = [len(data), ufile.filename,
                     ufile.content_type, base64.b64encode(data)]
@@ -1294,11 +1301,11 @@ class Binary(openerpweb.Controller):
     @openerpweb.httprequest
     def upload_attachment(self, req, callback, model, id, ufile):
         Model = req.session.model('ir.attachment')
+        out = """<script language="javascript" type="text/javascript">
+                    var win = window.top.window;
+                    win.jQuery(win).trigger(%s, %s);
+                </script>"""
         try:
-            out = """<script language="javascript" type="text/javascript">
-                        var win = window.top.window;
-                        win.jQuery(win).trigger(%s, %s);
-                    </script>"""
             attachment_id = Model.create({
                 'name': ufile.filename,
                 'datas': base64.encodestring(ufile.read()),
@@ -1310,17 +1317,14 @@ class Binary(openerpweb.Controller):
                 'filename': ufile.filename,
                 'id':  attachment_id
             }
-        except Exception,e:
-            args = {'erorr':e.faultCode.split('--')[1],'title':e.faultCode.split('--')[0]}
+        except xmlrpclib.Fault, e:
+            args = {'error':e.faultCode }
         return out % (simplejson.dumps(callback), simplejson.dumps(args))
 
     @openerpweb.httprequest
     def company_logo(self, req, dbname=None):
-        # TODO add etag
+        # TODO add etag, refactor to use /image code for etag
         uid = None
-        _logger.debug('session db = %r', req.session._db)
-        _logger.debug('session uid = %r', req.session._uid)
-        _logger.debug('param dbname = %r', dbname)
         if req.session._db:
             dbname = req.session._db
             uid = req.session._uid
@@ -1330,15 +1334,16 @@ class Binary(openerpweb.Controller):
         if uid is None:
             uid = openerp.SUPERUSER_ID
 
-        _logger.debug('dbname = %r', dbname)
         if not dbname:
             image_data = self.placeholder(req, 'logo.png')
         else:
             registry = openerp.modules.registry.RegistryManager.get(dbname)
             with registry.cursor() as cr:
                 user = registry.get('res.users').browse(cr, uid, uid)
-                image_data = user.company_id.logo_web.decode('base64')
-
+                if user.company_id.logo_web:
+                    image_data = user.company_id.logo_web.decode('base64')
+                else:
+                    image_data = self.placeholder(req, 'nologo.png')
         headers = [
             ('Content-Type', 'image/png'),
             ('Content-Length', len(image_data)),
@@ -1474,7 +1479,7 @@ class Export(View):
         fields = self.fields_get(req, model)
         if ".id" in export_fields:
             fields['.id'] = fields.pop('id', {'string': 'ID'})
-            
+
         # To make fields retrieval more efficient, fetch all sub-fields of a
         # given field at the same time. Because the order in the export list is
         # arbitrary, this requires ordering all sub-fields of a given field