[WIP] AssetsBundle
authorFabien Meghazi <fme@openerp.com>
Wed, 9 Apr 2014 16:16:48 +0000 (18:16 +0200)
committerFabien Meghazi <fme@openerp.com>
Wed, 9 Apr 2014 16:16:48 +0000 (18:16 +0200)
bzr revid: fme@openerp.com-20140409161648-sx87vc0saj30f68x

addons/web/controllers/main.py
addons/web/static/src/js/chrome.js
addons/web/views/webclient_templates.xml

index 2771c65..4517c91 100644 (file)
@@ -31,6 +31,7 @@ except ImportError:
 
 import openerp
 import openerp.modules.registry
+from openerp.addons.base.ir.ir_qweb import AssetsBundle
 from openerp.tools.translate import _
 from openerp import http
 
@@ -364,30 +365,17 @@ def manifest_glob(extension, addons=None, db=None, include_remotes=False):
                     r.append((None, pattern))
             else:
                 for path in glob.glob(os.path.normpath(os.path.join(addons_path, addon, pattern))):
-                    # Hack for IE, who limit 288Ko, 4095 rules, 31 sheets
-                    # http://support.microsoft.com/kb/262161/en
-                    if pattern == "static/lib/bootstrap/css/bootstrap.css":
-                        if include_remotes:
-                            r.insert(0, (None, fs2web(path[len(addons_path):])))
-                    else:
-                        r.append((path, fs2web(path[len(addons_path):])))
+                    r.append((path, fs2web(path[len(addons_path):])))
     return r
 
-def manifest_list(extension, mods=None, db=None, debug=False):
+def manifest_list(extension, mods=None, db=None, debug=None):
     """ list ressources to load specifying either:
     mods: a comma separated string listing modules
     db: a database name (return all installed modules in that database)
     """
+    if debug is not None:
+        _logger.warning("openerp.addons.web.main.manifest_list(): debug parameter is deprecated")
     files = manifest_glob(extension, addons=mods, db=db, include_remotes=True)
-    if not debug:
-        path = '/web/webclient/' + extension
-        if mods is not None:
-            path += '?' + werkzeug.url_encode({'mods': mods})
-        elif db:
-            path += '?' + werkzeug.url_encode({'db': db})
-
-        remotes = [wp for fp, wp in files if fp is None]
-        return [path] + remotes
     return [wp for _fp, wp in files]
 
 def get_last_modified(files):
@@ -614,26 +602,16 @@ html_template = """<!DOCTYPE html>
 </html>
 """
 
-def render_bootstrap_template(template, values=None, debug=False, db=None, **kw):
-    if not db:
-        db = request.db
-    if request.debug:
-        debug = True
+def render_bootstrap_template(template, values=None, **kw):
     if values is None:
-        values = {}
-    values['debug'] = debug
-    values['current_db'] = db
+        values = dict()
     try:
         values['databases'] = http.db_list()
     except openerp.exceptions.AccessDenied:
         values['databases'] = None
 
-    for res in ['js', 'css']:
-        if res not in values:
-            values[res] = manifest_list(res, db=db, debug=debug)
-
     if 'modules' not in values:
-        values['modules'] = module_boot(db=db)
+        values['modules'] = module_boot()
     values['modules'] = simplejson.dumps(values['modules'])
 
     return request.render(template, values, **kw)
@@ -679,6 +657,20 @@ class Home(http.Controller):
     def login(self, db, login, key, redirect="/web", **kw):
         return login_and_redirect(db, login, key, redirect_url=redirect)
 
+    @http.route('/web/js/<xmlid>', type='http', auth="none")
+    def js_bundle(self, xmlid, **kw):
+        values = dict(manifest_list=manifest_list)
+        html = request.render(xmlid, lazy=False, qcontext=values)
+        bundle = AssetsBundle(xmlid, html)
+        return bundle.js()
+
+    @http.route('/web/css/<xmlid>', type='http', auth='none')
+    def css_bundle(self, xmlid, **kw):
+        values = dict(manifest_list=manifest_list)
+        html = request.render(xmlid, lazy=False, qcontext=values)
+        bundle = AssetsBundle(xmlid, html)
+        return bundle.css()
+
 class WebClient(http.Controller):
 
     @http.route('/web/webclient/csslist', type='json', auth="none")
index 8e5df84..ae14995 100644 (file)
@@ -1478,7 +1478,7 @@ instance.web.embed = function (origin, dbname, login, key, action, options) {
     $('head').append($('<link>', {
         'rel': 'stylesheet',
         'type': 'text/css',
-        'href': origin +'/web/webclient/css'
+        'href': origin +'/web/css/web.assets_webclient'
     }));
     var currentScript = document.currentScript;
     if (!currentScript) {
index 46bae5f..a0c6cc8 100644 (file)
@@ -3,6 +3,19 @@
 -->
 <openerp>
     <data>
+        <template id="web.assets_common">
+            <script type="text/javascript" src="/web/static/lib/es5-shim/es5-shim.min.js"></script>
+            <script type="text/javascript" src="/web/static/src/js/openerpframework.js"></script>
+        </template>
+
+        <template id="web.assets_webclient_manifest">
+            <t t-foreach="manifest_list('css')" t-as="css_file">
+                <link rel="stylesheet" t-att-href="css_file"/>
+            </t>
+            <t t-foreach="manifest_list('js')" t-as="js_file">
+                <script type="text/javascript" t-att-src="js_file"></script>
+            </t>
+        </template>
 
         <template id="web.layout" name="Web layout">&lt;!DOCTYPE html&gt;
             <html style="height: 100%">
         <template id="web.webclient_bootstrap" name="Webclient Bootstrap">
             <t t-call="web.layout">
                 <t t-set="head">
-                    <t t-foreach="css" t-as="css_file">
-                        <link rel="stylesheet" t-att-href="css_file"/>
-                    </t>
-                    <t t-foreach="js" t-as="js_file">
-                        <script type="text/javascript" t-att-src="js_file"></script>
-                    </t>
+                    <t t-call-assets="web.assets_webclient_manifest"/>
                     <script type="text/javascript">
                         $(function() {
                             var s = new openerp.init(<t t-raw="modules"/>);
             </script>
             <div class="form-group field-db" t-if="databases and len(databases) &gt; 1">
                 <label for="db" class="control-label">Database</label>
-                <select name="db" id="db" class="form-control" required="required" t-att-autofocus="'autofocus' if current_db not in databases else None" onchange="dbchanged(this.value)">
+                <select name="db" id="db" class="form-control" required="required" t-att-autofocus="'autofocus' if request.db not in databases else None" onchange="dbchanged(this.value)">
                     <option></option>
                     <t t-foreach="databases" t-as="db">
-                        <option t-att-selected="'selected' if db == current_db else None">
+                        <option t-att-selected="'selected' if db == request.db else None">
                             <t t-esc="db"/>
                         </option>
                     </t>