[IMP] add basic pivot support
authorGéry Debongnie <ged@odoo.com>
Tue, 7 Oct 2014 14:36:35 +0000 (16:36 +0200)
committerGéry Debongnie <ged@odoo.com>
Tue, 21 Oct 2014 07:33:50 +0000 (09:33 +0200)
The goal is to split the graph view into two views: pivot table view (short: 'pivot') and graph view (with charts).  This patch lays the foundation for that work.

addons/web/static/src/js/view_pivot.js [new file with mode: 0644]
addons/web/views/webclient_templates.xml
openerp/addons/base/ir/ir_ui_view.py
openerp/addons/base/rng/view.rng

diff --git a/addons/web/static/src/js/view_pivot.js b/addons/web/static/src/js/view_pivot.js
new file mode 100644 (file)
index 0000000..4823739
--- /dev/null
@@ -0,0 +1,92 @@
+/*---------------------------------------------------------
+ * Odoo Pivot Table view
+ *---------------------------------------------------------*/
+
+(function () {
+'use strict';
+
+var instance = openerp,
+       _lt = instance.web._lt,
+       _t = instance.web._t,
+       QWeb = instance.web.qweb;
+
+instance.web.views.add('pivot', 'instance.web.PivotView');
+
+instance.web.PivotView = instance.web.View.extend({
+       template: 'PivotView',
+    display_name: _lt('Pivot'),
+    view_type: 'pivot',
+
+    init: function(parent, dataset, view_id, options) {
+       this._super(parent, dataset, view_id, options);
+        this.model = new instance.web.Model(dataset.model, {group_by_no_leaf: true});
+       this.action_manager = parent.action_manager;
+
+       this.$buttons = options.$buttons;
+       this.fields = {};
+       this.measures = {};
+       this.groupable_fields = {};
+
+       this.row_groupbys = [];
+       this.col_groupbys = [];
+       this.active_measures = [];
+       },
+       start: function () {
+               var self = this,
+               load_fields = this.model.call('fields_get', [])
+                       .then(this.prepare_fields.bind(this));
+
+               return $.when(this._super(), load_fields).then(function () {
+                       var context = {measures: _.pairs(self.measures)};
+                       self.$buttons.html(QWeb.render('PivotView.buttons', self), context);
+               });
+       },
+       view_loading: function (fvg) {
+               var self = this;
+               this.do_push_state({});
+               fvg.arch.children.forEach(function (field) {
+                       var name = field.attrs.name + (field.attrs.interval || '');
+            //noinspection FallThroughInSwitchStatementJS
+            switch (field.attrs.type) {
+            case 'measure':
+                self.active_measures.push(name);
+                break;
+            case 'col':
+                self.col_groupbys.push(name);
+                break;
+            default:
+                if ('operator' in field.attrs) {
+                    self.active_measures.push(name);
+                    break;
+                }
+            case 'row':
+                self.row_groupbys.push(name);
+            }
+               });
+       },
+    prepare_fields: function (fields) {
+       var self = this,
+            groupable_types = ['many2one', 'char', 'boolean', 
+                                          'selection', 'date', 'datetime'];
+       this.fields = fields;
+       _.each(fields, function (field, name) {
+               if ((name !== 'id') && (field.store === true)) {
+                       if (field.type === 'integer' || field.type === 'float') {
+                               self.measures[name] = field;
+                       }
+                       if (_.contains(groupable_types, field.type)) {
+                               self.groupable_fields[name] = field;
+                       }
+               }
+       });
+    },
+    do_search: function (domain, context, group_by) {
+       console.log('do_search', domain, context, group_by);
+       debugger;
+       context.measure = "lol";
+    },
+});
+
+
+})();
+
index c63ff0b..d2772d2 100644 (file)
             <script type="text/javascript" src="/web/static/src/js/view_list.js"></script>
             <script type="text/javascript" src="/web/static/src/js/view_form.js"></script>
             <script type="text/javascript" src="/web/static/src/js/view_list_editable.js"></script>
+            <script type="text/javascript" src="/web/static/src/js/view_pivot.js"></script>
             <script type="text/javascript" src="/web/static/src/js/view_tree.js"></script>
             <script type="text/javascript" src="/base/static/src/js/apps.js"></script>
 
index e0a18af..a29fdfb 100644 (file)
@@ -186,6 +186,7 @@ class view(osv.osv):
             ('tree','Tree'),
             ('form','Form'),
             ('graph', 'Graph'),
+            ('pivot', 'Pivot'),
             ('calendar', 'Calendar'),
             ('diagram','Diagram'),
             ('gantt', 'Gantt'),
index d274292..61f13d4 100644 (file)
         </rng:element>
     </rng:define>
 
+    <rng:define name="pivot">
+        <rng:element name="pivot">
+            <rng:optional><rng:attribute name="string" /></rng:optional>
+            <rng:zeroOrMore>
+                <rng:ref name="field"/>
+            </rng:zeroOrMore>
+        </rng:element>
+    </rng:define>
+
     <rng:define name="button">
         <rng:element name="button">
             <rng:ref name="overload"/>
                     <rng:ref name="tree" />
                     <rng:ref name="notebook" />
                     <rng:ref name="graph" />
+                    <rng:ref name="pivot" />
                     <rng:ref name="calendar" />
                     <rng:ref name="gantt" />
                     <rng:ref name="xpath" />
             <rng:ref name="tree" />
             <rng:ref name="notebook" />
             <rng:ref name="graph" />
+            <rng:ref name="pivot" />
             <rng:ref name="calendar" />
             <rng:ref name="data" />
             <rng:ref name="gantt" />