[IMP] qweb templates are stored in addon manifest and given by the server
authorChristophe Simonis <chs@openerp.com>
Wed, 2 Nov 2011 11:11:05 +0000 (12:11 +0100)
committerChristophe Simonis <chs@openerp.com>
Wed, 2 Nov 2011 11:11:05 +0000 (12:11 +0100)
bzr revid: chs@openerp.com-20111102111105-ibyupno1e47sv9ho

17 files changed:
addons/web/__openerp__.py
addons/web/controllers/main.py
addons/web/static/src/js/chrome.js
addons/web/static/src/js/core.js
addons/web/static/src/js/search.js
addons/web_calendar/__openerp__.py
addons/web_calendar/static/src/js/calendar.js
addons/web_dashboard/__openerp__.py
addons/web_dashboard/static/src/js/dashboard.js
addons/web_diagram/__openerp__.py
addons/web_diagram/static/src/js/diagram.js
addons/web_gantt/__openerp__.py
addons/web_gantt/static/src/js/gantt.js
addons/web_graph/__openerp__.py
addons/web_graph/static/src/js/graph.js
addons/web_kanban/__openerp__.py
addons/web_kanban/static/src/js/kanban.js

index 314d727..2695709 100644 (file)
@@ -52,4 +52,7 @@
         "static/src/css/data_export.css",
         "static/src/css/data_import.css",
     ],
+    'qweb' : [
+        "static/src/xml/*.xml",
+    ],
 }
index 6cc46b4..9f894dc 100644 (file)
@@ -24,6 +24,32 @@ openerpweb = web.common.http
 # OpenERP Web web Controllers
 #----------------------------------------------------------
 
+
+def concat_xml(file_list):
+    """Concatenate xml files
+    return (concat,timestamp)
+    concat: concatenation of file content
+    timestamp: max(os.path.getmtime of file_list)
+    """
+    root = None
+    files_timestamp = 0
+    for fname in file_list:
+        ftime = os.path.getmtime(fname)
+        if ftime > files_timestamp:
+            files_timestamp = ftime
+
+        xml = ElementTree.parse(fname).getroot()
+
+        if root is None:
+            root = ElementTree.Element(xml.tag)
+        #elif root.tag != xml.tag:
+        #    raise ValueError("Root tags missmatch: %r != %r" % (root.tag, xml.tag))
+
+        for child in xml.getchildren():
+            root.append(child)
+    return ElementTree.tostring(root, 'utf-8'), files_timestamp
+
+
 def concat_files(file_list):
     """ Concatenate file content
     return (concat,timestamp)
@@ -98,6 +124,10 @@ class WebClient(openerpweb.Controller):
     def jslist(self, req, mods=None):
         return self.manifest_list(req, mods, 'js')
 
+    @openerpweb.jsonrequest
+    def qweblist(self, req, mods=None):
+        return self.manifest_list(req, mods, 'qweb')
+
     @openerpweb.httprequest
     def css(self, req, mods=None):
         files = [f[0] for f in self.manifest_glob(req, mods, 'css')]
@@ -113,6 +143,14 @@ class WebClient(openerpweb.Controller):
         return req.make_response(content, [('Content-Type', 'application/javascript')])
 
     @openerpweb.httprequest
+    def qweb(self, req, mods=None):
+        files = [f[0] for f in self.manifest_glob(req, mods, 'qweb')]
+        content,timestamp = concat_xml(files)
+        # TODO use timestamp to set Last mofified date and E-tag
+        return req.make_response(content, [('Content-Type', 'text/xml')])
+
+
+    @openerpweb.httprequest
     def home(self, req, s_action=None, **kw):
         js = "\n        ".join('<script type="text/javascript" src="%s"></script>'%i for i in self.manifest_list(req, None, 'js'))
         css = "\n        ".join('<link rel="stylesheet" href="%s">'%i for i in self.manifest_list(req, None, 'css'))
index c8ebbb2..f2b90c5 100644 (file)
@@ -943,14 +943,13 @@ openerp.web.WebClient = openerp.web.Widget.extend(/** @lends openerp.web.WebClie
         this._super(null, element_id);
         openerp.webclient = this;
 
-        QWeb.add_template("/web/static/src/xml/base.xml");
         var params = {};
         if(jQuery.param != undefined && jQuery.deparam(jQuery.param.querystring()).kitten != undefined) {
             this.$element.addClass("kitten-mode-activated");
         }
         this.$element.html(QWeb.render("Interface", params));
 
-        this.notification = new openerp.web.Notification();
+        this.notification = new openerp.web.Notification(this);
         this.loading = new openerp.web.Loading(this,"oe_loading");
         this.crashmanager =  new openerp.web.CrashManager();
 
index 75f2bb8..837e9fa 100644 (file)
@@ -364,7 +364,9 @@ openerp.web.Connection = openerp.web.CallbackEnabled.extend( /** @lends openerp.
         // TODO: session should have an optional name indicating that they'll
         //       be saved to (and revived from) cookies
         this.name = 'session';
+        this.do_load_qweb(['/web/webclient/qweb']);
     },
+
     start: function() {
         this.session_restore();
     },
@@ -487,6 +489,7 @@ openerp.web.Connection = openerp.web.CallbackEnabled.extend( /** @lends openerp.
             self.user_context = result.context;
             self.db = result.db;
             self.session_save();
+            self.on_session_valid();
             return true;
         }).then(success_callback);
     },
@@ -578,6 +581,7 @@ openerp.web.Connection = openerp.web.CallbackEnabled.extend( /** @lends openerp.
                 self.rpc('/web/webclient/jslist', {"mods": modules}, function(files) {
                     self.do_load_js(file_list.concat(files));
                 });
+                self.rpc('/web/webclient/qweblist', {"mods": modules}, self.do_load_qweb);
                 openerp._modules_loaded = true;
             });
         });
@@ -611,6 +615,19 @@ openerp.web.Connection = openerp.web.CallbackEnabled.extend( /** @lends openerp.
             this.on_modules_loaded();
         }
     },
+    do_load_qweb: function(files) {
+        var self = this;
+        _.each(files, function(file) {
+            $.ajax({
+                url: file,
+                type: 'get',
+                async: false,
+                dataType: 'text',
+            }).then(function(xml) {
+                openerp.web.qweb.add_template(_(xml).trim());
+            });
+        });
+    },
     on_modules_loaded: function() {
         for(var j=0; j<this.module_list.length; j++) {
             var mod = this.module_list[j];
index b2402cf..18e035a 100644 (file)
@@ -433,6 +433,7 @@ openerp.web.search.Widget = openerp.web.Widget.extend( /** @lends openerp.web.se
      * @param view the ancestor view of this widget
      */
     init: function (view) {
+        this._super(view);
         this.view = view;
     },
     /**
@@ -473,10 +474,8 @@ openerp.web.search.Widget = openerp.web.Widget.extend( /** @lends openerp.web.se
         this._super();
     },
     render: function (defaults) {
-        return QWeb.render(
-            this.template, _.extend(this, {
-                defaults: defaults
-        }));
+        // FIXME
+        return this._super(_.extend(this, {defaults: defaults}));
     }
 });
 openerp.web.search.add_expand_listener = function($root) {
index 1eba260..5b09e70 100644 (file)
@@ -11,5 +11,8 @@
     "css": ['static/lib/dhtmlxScheduler/codebase/dhtmlxscheduler.css',
             'static/lib/dhtmlxScheduler/codebase/ext/dhtmlxscheduler_ext.css'
             ],
+    'qweb' : [
+        "static/src/xml/*.xml",
+    ],
     'active': True
 }
index a5fd8bc..982fc60 100644 (file)
@@ -5,7 +5,6 @@
 openerp.web_calendar = function(openerp) {
 var _t = openerp.web._t;
 var QWeb = openerp.web.qweb;
-QWeb.add_template('/web_calendar/static/src/xml/web_calendar.xml');
 openerp.web.views.add('calendar', 'openerp.web_calendar.CalendarView');
 openerp.web_calendar.CalendarView = openerp.web.View.extend({
 // Dhtmlx scheduler ?
index 7a52751..68c7373 100644 (file)
@@ -7,5 +7,8 @@
         'static/src/js/dashboard.js'
     ],
     "css": ['static/src/css/dashboard.css'],
+    'qweb' : [
+        "static/src/xml/*.xml",
+    ],
     'active': True
 }
index b5f3b60..e629a4a 100644 (file)
@@ -1,6 +1,5 @@
 openerp.web_dashboard = function(openerp) {
 var QWeb = openerp.web.qweb;
-QWeb.add_template('/web_dashboard/static/src/xml/web_dashboard.xml');
 
 if (!openerp.web_dashboard) {
     /** @namespace */
index 584c0a1..cd9eb71 100644 (file)
@@ -13,5 +13,8 @@
     'css' : [
         "static/src/css/base_diagram.css",
     ],
+    'qweb' : [
+        "static/src/xml/*.xml",
+    ],
     'active': True,
 }
index ffa2773..e4fb3ef 100644 (file)
@@ -4,7 +4,6 @@
 
 openerp.web_diagram = function (openerp) {
 var QWeb = openerp.web.qweb;
-QWeb.add_template('/web_diagram/static/src/xml/base_diagram.xml');
 openerp.web.views.add('diagram', 'openerp.web.DiagramView');
 openerp.web.DiagramView = openerp.web.View.extend({
     searchable: false,
index d2b24f9..cd24a8f 100644 (file)
@@ -9,5 +9,8 @@
         'static/src/js/gantt.js'
     ],
     "css": ['static/lib/dhtmlxGantt/codebase/dhtmlxgantt.css'],
+    'qweb' : [
+        "static/src/xml/*.xml",
+    ],
     'active': True
 }
index bdd57b7..d2eb3ae 100644 (file)
@@ -3,7 +3,6 @@
  *---------------------------------------------------------*/
 openerp.web_gantt = function (openerp) {
 var QWeb = openerp.web.qweb;
-QWeb.add_template('/web_gantt/static/src/xml/web_gantt.xml');
 openerp.web.views.add('gantt', 'openerp.web_gantt.GanttView');
 openerp.web_gantt.GanttView = openerp.web.View.extend({
 
index 68775b7..d7c37ac 100644 (file)
@@ -7,5 +7,8 @@
            "static/lib/dhtmlxGraph/codebase/dhtmlxchart_debug.js",
            "static/src/js/graph.js"],
     "css": ["static/lib/dhtmlxGraph/codebase/dhtmlxchart.css"],
+    'qweb' : [
+        "static/src/xml/*.xml",
+    ],
     "active": True
 }
index bac147b..91aaf8b 100644 (file)
@@ -13,7 +13,6 @@ var COLOR_PALETTE = [
     '#cc0000', '#d400a8'];
 
 var QWeb = openerp.web.qweb;
-QWeb.add_template('/web_graph/static/src/xml/web_graph.xml');
 openerp.web.views.add('graph', 'openerp.web_graph.GraphView');
 openerp.web_graph.GraphView = openerp.web.View.extend({
 
index f39cd64..92d60b0 100644 (file)
@@ -9,5 +9,8 @@
     "css": [
         "static/src/css/kanban.css"
     ],
+    'qweb' : [
+        "static/src/xml/*.xml",
+    ],
     'active': True
 }
index 8e222eb..a2a9c07 100644 (file)
@@ -16,7 +16,7 @@ openerp.web_kanban.KanbanView = openerp.web.View.extend({
         this.all_display_data = false;
         this.groups = [];
         this.qweb = new QWeb2.Engine();
-        this.qweb.debug = (window.location.search.indexOf('?debug') !== -1);
+        this.qweb.debug = openerp.connector.debug;
         this.aggregates = {};
         this.NO_OF_COLUMNS = 3;
         this.form_dialog = new openerp.web.FormDialog(this, {}, this.options.action_views_ids.form, dataset).start();