From 521e2891f5d536e52193e0b007b70fce0247b332 Mon Sep 17 00:00:00 2001 From: "Yogesh (OpenERP)" Date: Thu, 7 Jul 2011 15:31:04 +0530 Subject: [PATCH 01/47] [ADD] add base_export module. bzr revid: ysa@tinyerp.com-20110707100104-3trko5x1njl1huhp --- addons/base/static/src/img/collapse.gif | Bin 0 -> 80 bytes addons/base/static/src/img/expand.gif | Bin 0 -> 81 bytes addons/base/static/src/js/views.js | 14 ++- addons/base_export/__init__.py | 2 + addons/base_export/__openerp__.py | 10 ++ addons/base_export/controllers/__init__.py | 1 + addons/base_export/controllers/main.py | 59 ++++++++++ .../static/src/css/base_export.css | 65 +++++++++++ .../base_export/static/src/js/base_export.js | 32 +++++ .../static/src/xml/base_export.xml | 109 ++++++++++++++++++ 10 files changed, 290 insertions(+), 2 deletions(-) create mode 100755 addons/base/static/src/img/collapse.gif create mode 100755 addons/base/static/src/img/expand.gif create mode 100644 addons/base_export/__init__.py create mode 100644 addons/base_export/__openerp__.py create mode 100644 addons/base_export/controllers/__init__.py create mode 100644 addons/base_export/controllers/main.py create mode 100644 addons/base_export/static/src/css/base_export.css create mode 100644 addons/base_export/static/src/js/base_export.js create mode 100644 addons/base_export/static/src/xml/base_export.xml diff --git a/addons/base/static/src/img/collapse.gif b/addons/base/static/src/img/collapse.gif new file mode 100755 index 0000000000000000000000000000000000000000..759e72ebcfe18bc1bc714b6451c301b12a1f27d5 GIT binary patch literal 80 zcmZ?wbhEHb6krfwSjfZx1Zin$|G_}', {id: element_id}).dialog({ + title: "Export Data", + modal: true, + width: '50%', + height: 'auto' + }).html(QWeb.render('ExportTreeView', {'fields': result})) + + jQuery(_export).find('[id^=parentimg_]').click(function(){ + console.log('this>>>id', this.id); + }); + }, +}); + +}; diff --git a/addons/base_export/static/src/xml/base_export.xml b/addons/base_export/static/src/xml/base_export.xml new file mode 100644 index 00000000000..4fd9c7d872e --- /dev/null +++ b/addons/base_export/static/src/xml/base_export.xml @@ -0,0 +1,109 @@ + \ No newline at end of file From 2432079b1319190a636c0b1fdfc3cb3203f38832 Mon Sep 17 00:00:00 2001 From: "Yogesh (OpenERP)" Date: Mon, 11 Jul 2011 10:33:35 +0530 Subject: [PATCH 02/47] [IMP] improve export data. bzr revid: ysa@tinyerp.com-20110711050335-fauz9cddnwj8urnv --- addons/base_export/controllers/main.py | 11 ++--- .../base_export/static/src/js/base_export.js | 41 ++++++++++++++--- .../static/src/xml/base_export.xml | 45 ++++++++++++------- 3 files changed, 72 insertions(+), 25 deletions(-) diff --git a/addons/base_export/controllers/main.py b/addons/base_export/controllers/main.py index 6ce716fea6c..5e0d5155a1e 100644 --- a/addons/base_export/controllers/main.py +++ b/addons/base_export/controllers/main.py @@ -10,7 +10,7 @@ class Export(View): return fields @openerpweb.jsonrequest - def get_fields(self, req, model): + def get_fields(self, req, model, prefix='', field_parent=None, name= ''): fields = self.fields_get(req, model) fields.update({'id': {'string': 'ID'}, '.id': {'string': 'Database ID'}}) @@ -19,11 +19,12 @@ class Export(View): for key, value in fields.items(): record = {} - id = key - nm = value['string'] - + id = prefix + (prefix and '/' or '') + key + nm = name + (name and '/' or '') + value['string'] + levels = nm.split('/') + levels > 1 and levels.remove(levels[0]) or [] record.update(id=id, string= nm, action='javascript: void(0)', - target=None, icon=None, children=[]) + target=None, icon=None, children=[], level = levels) records.append(record) if value.get('relation', False): diff --git a/addons/base_export/static/src/js/base_export.js b/addons/base_export/static/src/js/base_export.js index d21dba51f0b..8b91529f85e 100644 --- a/addons/base_export/static/src/js/base_export.js +++ b/addons/base_export/static/src/js/base_export.js @@ -4,27 +4,58 @@ openerp.base.views.add('export', 'openerp.base_export.Export'); openerp.base_export.Export = openerp.base.Controller.extend({ init: function(session, dataset, views){ + this._super(session); this.dataset = dataset this.views = views - this.session = session - this._super(); }, start: function() { this.rpc("/base_export/export/get_fields", {"model": this.dataset.model}, this.on_loaded); }, on_loaded: function(result) { - var element_id = _.uniqueId("act_window_dialog"); var self = this; + var element_id = _.uniqueId("act_window_dialog"); var _export = $('
', {id: element_id}).dialog({ title: "Export Data", modal: true, width: '50%', height: 'auto' }).html(QWeb.render('ExportTreeView', {'fields': result})) + jQuery(_export).find('[id^=parentimg]').click(function(){ + self.on_click(this.id, result); + }); + }, + + on_click: function(id, result) { + var self = this + this.field_id = id.split("@"); + this.field_id = self.field_id[1]; + var model = '' + var prefix = '' + var name = '' + for (var record in result){ + if(result[record]['id'] == this.field_id){ + model = result[record]['params']['model'] + prefix = result[record]['params']['prefix'] + name = result[record]['params']['name'] + } + } + if (model){ + self.get_data(model, prefix, name) + } + }, + + get_data: function(model, prefix, name) { + this.rpc("/base_export/export/get_fields", {"model": model, "prefix": prefix, "field_parent" : this.field_id, "name": name}, this.on_show_data, {}); + }, + + on_show_data: function(result) { + var self = this; + $('tr #treerow_' + self.field_id).after(QWeb.render('ExportTreeView-Secondary', {'fields': result})); + jQuery($.find('img[id ^= parentimg]')).click(function(){ + self.field_id = this.id + self.on_click(this.id, result); - jQuery(_export).find('[id^=parentimg_]').click(function(){ - console.log('this>>>id', this.id); }); }, }); diff --git a/addons/base_export/static/src/xml/base_export.xml b/addons/base_export/static/src/xml/base_export.xml index 4fd9c7d872e..a104bc853a5 100644 --- a/addons/base_export/static/src/xml/base_export.xml +++ b/addons/base_export/static/src/xml/base_export.xml @@ -43,21 +43,8 @@ Name - - - - - - - +
- - - - - - - -
+
@@ -106,4 +93,32 @@ + + + + + + + + + + + + + + + +
  + + + + + + + +
+ + +
+
\ No newline at end of file From 9d4dcb1f77a397bfd970626425b86d63b3d2fb8a Mon Sep 17 00:00:00 2001 From: "Yogesh (OpenERP)" Date: Mon, 11 Jul 2011 12:40:16 +0530 Subject: [PATCH 03/47] [IMP] improve code. bzr revid: ysa@tinyerp.com-20110711071016-w743le30aujzc80g --- addons/base_export/controllers/main.py | 6 +-- .../base_export/static/src/js/base_export.js | 4 +- .../static/src/xml/base_export.xml | 41 +++++++++---------- 3 files changed, 23 insertions(+), 28 deletions(-) diff --git a/addons/base_export/controllers/main.py b/addons/base_export/controllers/main.py index 5e0d5155a1e..6a261c826bf 100644 --- a/addons/base_export/controllers/main.py +++ b/addons/base_export/controllers/main.py @@ -19,7 +19,7 @@ class Export(View): for key, value in fields.items(): record = {} - id = prefix + (prefix and '/' or '') + key + id = prefix + (prefix and '_'or '') + key nm = name + (name and '/' or '') + value['string'] levels = nm.split('/') levels > 1 and levels.remove(levels[0]) or [] @@ -39,7 +39,7 @@ class Export(View): cfields_order.sort(lambda x,y: -cmp(cfields[x].get('string', ''), cfields[y].get('string', ''))) children = [] for j, fld in enumerate(cfields_order): - cid = id + '/' + fld + cid = id + '_' + fld cid = cid.replace(' ', '_') children.append(cid) record['children'] = children or [] @@ -50,7 +50,7 @@ class Export(View): cfields_order.sort(lambda x,y: -cmp(cfields[x].get('string', ''), cfields[y].get('string', ''))) children = [] for j, fld in enumerate(cfields_order): - cid = id + '/' + fld + cid = id + '_' + fld cid = cid.replace(' ', '_') children.append(cid) record['children'] = children or [] diff --git a/addons/base_export/static/src/js/base_export.js b/addons/base_export/static/src/js/base_export.js index 8b91529f85e..b1dcd42d2d3 100644 --- a/addons/base_export/static/src/js/base_export.js +++ b/addons/base_export/static/src/js/base_export.js @@ -28,8 +28,7 @@ openerp.base_export.Export = openerp.base.Controller.extend({ on_click: function(id, result) { var self = this - this.field_id = id.split("@"); - this.field_id = self.field_id[1]; + this.field_id = id.split("@")[1]; var model = '' var prefix = '' var name = '' @@ -53,7 +52,6 @@ openerp.base_export.Export = openerp.base.Controller.extend({ var self = this; $('tr #treerow_' + self.field_id).after(QWeb.render('ExportTreeView-Secondary', {'fields': result})); jQuery($.find('img[id ^= parentimg]')).click(function(){ - self.field_id = this.id self.on_click(this.id, result); }); diff --git a/addons/base_export/static/src/xml/base_export.xml b/addons/base_export/static/src/xml/base_export.xml index a104bc853a5..d094eb1a3aa 100644 --- a/addons/base_export/static/src/xml/base_export.xml +++ b/addons/base_export/static/src/xml/base_export.xml @@ -94,31 +94,28 @@ - - - - - - - - - - - -
  - - - - - - - -
+ + + + + + + + +
  + + + + + + + +
- -
+ +
\ No newline at end of file From a692a00f097390f1977fdeb8d68bdc647abaf022 Mon Sep 17 00:00:00 2001 From: "Kunal Chavda (OpenERP)" Date: Mon, 11 Jul 2011 17:10:03 +0530 Subject: [PATCH 04/47] [FIX]jquery id selector problem when id has slash. bzr revid: kch@tinyerp.com-20110711114003-ava3hz0n2syvr3o8 --- addons/base_export/controllers/main.py | 6 +++--- addons/base_export/static/src/js/base_export.js | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/addons/base_export/controllers/main.py b/addons/base_export/controllers/main.py index 6a261c826bf..eb475e59a21 100644 --- a/addons/base_export/controllers/main.py +++ b/addons/base_export/controllers/main.py @@ -19,7 +19,7 @@ class Export(View): for key, value in fields.items(): record = {} - id = prefix + (prefix and '_'or '') + key + id = prefix + (prefix and '/'or '') + key nm = name + (name and '/' or '') + value['string'] levels = nm.split('/') levels > 1 and levels.remove(levels[0]) or [] @@ -39,7 +39,7 @@ class Export(View): cfields_order.sort(lambda x,y: -cmp(cfields[x].get('string', ''), cfields[y].get('string', ''))) children = [] for j, fld in enumerate(cfields_order): - cid = id + '_' + fld + cid = id + '/' + fld cid = cid.replace(' ', '_') children.append(cid) record['children'] = children or [] @@ -50,7 +50,7 @@ class Export(View): cfields_order.sort(lambda x,y: -cmp(cfields[x].get('string', ''), cfields[y].get('string', ''))) children = [] for j, fld in enumerate(cfields_order): - cid = id + '_' + fld + cid = id + '/' + fld cid = cid.replace(' ', '_') children.append(cid) record['children'] = children or [] diff --git a/addons/base_export/static/src/js/base_export.js b/addons/base_export/static/src/js/base_export.js index b1dcd42d2d3..9b240421bda 100644 --- a/addons/base_export/static/src/js/base_export.js +++ b/addons/base_export/static/src/js/base_export.js @@ -50,7 +50,7 @@ openerp.base_export.Export = openerp.base.Controller.extend({ on_show_data: function(result) { var self = this; - $('tr #treerow_' + self.field_id).after(QWeb.render('ExportTreeView-Secondary', {'fields': result})); + $("tr[id='treerow_" + self.field_id + "']").after(QWeb.render('ExportTreeView-Secondary', {'fields': result})); jQuery($.find('img[id ^= parentimg]')).click(function(){ self.on_click(this.id, result); From a5fb5a10c17ddc06fe889fe793ef0a195a51c921 Mon Sep 17 00:00:00 2001 From: "Yogesh (OpenERP)" Date: Mon, 11 Jul 2011 17:15:37 +0530 Subject: [PATCH 05/47] [IMP] add add_field method and bind double click method of field. bzr revid: ysa@tinyerp.com-20110711114537-843beu7m00s225m7 --- .../static/src/css/base_export.css | 2 +- .../base_export/static/src/js/base_export.js | 28 +++++++++++++++++-- .../static/src/xml/base_export.xml | 21 +++----------- 3 files changed, 30 insertions(+), 21 deletions(-) diff --git a/addons/base_export/static/src/css/base_export.css b/addons/base_export/static/src/css/base_export.css index 4421c0e4fa5..61ddb47451b 100644 --- a/addons/base_export/static/src/css/base_export.css +++ b/addons/base_export/static/src/css/base_export.css @@ -4,7 +4,7 @@ .row:hover { background-color: #F3F3F3; - color: #0000FF; + color : #4F4F4F; } .row.selected{ diff --git a/addons/base_export/static/src/js/base_export.js b/addons/base_export/static/src/js/base_export.js index 9b240421bda..0dd98efc952 100644 --- a/addons/base_export/static/src/js/base_export.js +++ b/addons/base_export/static/src/js/base_export.js @@ -19,8 +19,20 @@ openerp.base_export.Export = openerp.base.Controller.extend({ title: "Export Data", modal: true, width: '50%', - height: 'auto' + height: 'auto', + buttons : { + "Close" : function() { + _export.dialog('destroy'); + }, + "Export To File" : function() { + _export.dialog('destroy'); + } + } }).html(QWeb.render('ExportTreeView', {'fields': result})) + + jQuery(_export).find('[id^=export]').dblclick(function(){ + self.add_field(this.id, this.text) + }); jQuery(_export).find('[id^=parentimg]').click(function(){ self.on_click(this.id, result); }); @@ -28,7 +40,7 @@ openerp.base_export.Export = openerp.base.Controller.extend({ on_click: function(id, result) { var self = this - this.field_id = id.split("@")[1]; + this.field_id = id.split("-")[1]; var model = '' var prefix = '' var name = '' @@ -53,8 +65,18 @@ openerp.base_export.Export = openerp.base.Controller.extend({ $("tr[id='treerow_" + self.field_id + "']").after(QWeb.render('ExportTreeView-Secondary', {'fields': result})); jQuery($.find('img[id ^= parentimg]')).click(function(){ self.on_click(this.id, result); - }); + jQuery($.find('[id^=export]')).dblclick(function(){ + self.add_field(this.id, this.text) + }); + }, + + add_field: function(id, string) { + var field_list = $('#fields_list') + field_id = id.split("-")[1]; + if ( !$("#fields_list option[value='" + field_id + "']").length){ + field_list.append( new Option(string, field_id)); + } }, }); diff --git a/addons/base_export/static/src/xml/base_export.xml b/addons/base_export/static/src/xml/base_export.xml index d094eb1a3aa..c0bcd72508e 100644 --- a/addons/base_export/static/src/xml/base_export.xml +++ b/addons/base_export/static/src/xml/base_export.xml @@ -55,7 +55,7 @@ @@ -71,25 +71,12 @@
- +
- + - - - - - - - -
- - -
- - @@ -104,11 +91,11 @@ - + - + From 28a4cff1a1e41264bce79803c457add9962c3a61 Mon Sep 17 00:00:00 2001 From: "Yogesh (OpenERP)" Date: Tue, 12 Jul 2011 10:35:39 +0530 Subject: [PATCH 06/47] Improve code. bzr revid: ysa@tinyerp.com-20110712050539-17fsv9d6angr7f97 --- .../base_export/static/src/js/base_export.js | 30 ++++++++----------- .../static/src/xml/base_export.xml | 2 +- 2 files changed, 14 insertions(+), 18 deletions(-) diff --git a/addons/base_export/static/src/js/base_export.js b/addons/base_export/static/src/js/base_export.js index 0dd98efc952..944dbdb4fb9 100644 --- a/addons/base_export/static/src/js/base_export.js +++ b/addons/base_export/static/src/js/base_export.js @@ -15,27 +15,21 @@ openerp.base_export.Export = openerp.base.Controller.extend({ on_loaded: function(result) { var self = this; var element_id = _.uniqueId("act_window_dialog"); - var _export = $('
', {id: element_id}).dialog({ + this._export = $('
', {id: element_id}).dialog({ title: "Export Data", modal: true, width: '50%', height: 'auto', buttons : { "Close" : function() { - _export.dialog('destroy'); + this._export.dialog('destroy'); }, "Export To File" : function() { - _export.dialog('destroy'); + this._export.dialog('destroy'); } } - }).html(QWeb.render('ExportTreeView', {'fields': result})) - - jQuery(_export).find('[id^=export]').dblclick(function(){ - self.add_field(this.id, this.text) - }); - jQuery(_export).find('[id^=parentimg]').click(function(){ - self.on_click(this.id, result); - }); + }).html(QWeb.render('ExportTreeView')) + self.on_show_data(result) }, on_click: function(id, result) { @@ -52,17 +46,19 @@ openerp.base_export.Export = openerp.base.Controller.extend({ } } if (model){ - self.get_data(model, prefix, name) + this.rpc("/base_export/export/get_fields", {"model": model, "prefix": prefix, "field_parent" : this.field_id, "name": name}, this.on_show_data, {}); } }, - get_data: function(model, prefix, name) { - this.rpc("/base_export/export/get_fields", {"model": model, "prefix": prefix, "field_parent" : this.field_id, "name": name}, this.on_show_data, {}); - }, - on_show_data: function(result) { var self = this; - $("tr[id='treerow_" + self.field_id + "']").after(QWeb.render('ExportTreeView-Secondary', {'fields': result})); + var current_tr = $("tr[id='treerow_" + self.field_id + "']"); + if (current_tr.length >= 1){ + current_tr.after(QWeb.render('ExportTreeView-Secondary', {'fields': result})); + } + else{ + jQuery(self._export).find('#left_field_panel').append(QWeb.render('ExportTreeView-Secondary', {'fields': result})); + } jQuery($.find('img[id ^= parentimg]')).click(function(){ self.on_click(this.id, result); }); diff --git a/addons/base_export/static/src/xml/base_export.xml b/addons/base_export/static/src/xml/base_export.xml index c0bcd72508e..5f2ab00012d 100644 --- a/addons/base_export/static/src/xml/base_export.xml +++ b/addons/base_export/static/src/xml/base_export.xml @@ -44,7 +44,7 @@ - +
From d4575451a439f27a84cceeb3fe14035749d8c57c Mon Sep 17 00:00:00 2001 From: "Yogesh (OpenERP)" Date: Tue, 12 Jul 2011 12:44:22 +0530 Subject: [PATCH 07/47] [IMP] improve tree structure in export. bzr revid: ysa@tinyerp.com-20110712071422-wq5bal1pbepyrrdq --- .../base_export/static/src/js/base_export.js | 52 +++++++++++++++++-- 1 file changed, 48 insertions(+), 4 deletions(-) diff --git a/addons/base_export/static/src/js/base_export.js b/addons/base_export/static/src/js/base_export.js index 944dbdb4fb9..df5b3680f0d 100644 --- a/addons/base_export/static/src/js/base_export.js +++ b/addons/base_export/static/src/js/base_export.js @@ -38,22 +38,45 @@ openerp.base_export.Export = openerp.base.Controller.extend({ var model = '' var prefix = '' var name = '' + var is_loaded = 0; for (var record in result){ if(result[record]['id'] == this.field_id){ model = result[record]['params']['model'] prefix = result[record]['params']['prefix'] name = result[record]['params']['name'] + if ( (result[record]['children']).length >= 1){ + $(result[record]['children']).each (function(e, childid) { + if ($("tr[id='treerow_" + childid +"']").length > 0) { + if ($("tr[id='treerow_" + childid +"']").is(':hidden')) { + is_loaded = -1; + } else { + is_loaded++; + } + } + }); + if (is_loaded == 0) { + if ($("tr[id='treerow_" + this.field_id +"']").find('img').attr('src') == '/base/static/src/img/expand.gif') { + if (model){ + this.rpc("/base_export/export/get_fields", {"model": model, "prefix": prefix, "field_parent" : this.field_id, "name": name}, function (result) { + self.on_show_data(result, true); + }); + } + } + } else if (is_loaded > 0) { + self.showcontent(this.field_id, true); + } else { + self.showcontent(this.field_id, false); + } + } } } - if (model){ - this.rpc("/base_export/export/get_fields", {"model": model, "prefix": prefix, "field_parent" : this.field_id, "name": name}, this.on_show_data, {}); - } }, - on_show_data: function(result) { + on_show_data: function(result, flag) { var self = this; var current_tr = $("tr[id='treerow_" + self.field_id + "']"); if (current_tr.length >= 1){ + current_tr.find('img').attr('src','/base/static/src/img/collapse.gif'); current_tr.after(QWeb.render('ExportTreeView-Secondary', {'fields': result})); } else{ @@ -67,6 +90,27 @@ openerp.base_export.Export = openerp.base.Controller.extend({ }); }, + + // show & hide the contents + showcontent: function (id, flag) { + var first_child = $("tr[id='treerow_" + id + "']").find('img') + if (flag) { + first_child.attr('src', '/base/static/src/img/expand.gif'); + } + else { + first_child.attr('src', '/base/static/src/img/collapse.gif'); + } + var child_field = $("tr[id^='treerow_" + id +"/']") + for (var i = 0; i < child_field.length; i++) { + if (flag) { + $(child_field[i]).hide(); + } + else { + $(child_field[i]).show(); + } + } + }, + add_field: function(id, string) { var field_list = $('#fields_list') field_id = id.split("-")[1]; From 5ad4baccf6f78aea0eac29b9d85af3f869107397 Mon Sep 17 00:00:00 2001 From: "Yogesh (OpenERP)" Date: Tue, 12 Jul 2011 15:51:18 +0530 Subject: [PATCH 08/47] [IMP] bind click event of add button and define add_field method.. bzr revid: ysa@tinyerp.com-20110712102118-zj85dz9nved836iv --- .../base_export/static/src/js/base_export.js | 35 ++++++++++++++++--- 1 file changed, 30 insertions(+), 5 deletions(-) diff --git a/addons/base_export/static/src/js/base_export.js b/addons/base_export/static/src/js/base_export.js index df5b3680f0d..342fffa711a 100644 --- a/addons/base_export/static/src/js/base_export.js +++ b/addons/base_export/static/src/js/base_export.js @@ -7,11 +7,15 @@ openerp.base_export.Export = openerp.base.Controller.extend({ this._super(session); this.dataset = dataset this.views = views + this.selected_field_id = ''; + this.selected_field_str = ''; }, + start: function() { this.rpc("/base_export/export/get_fields", {"model": this.dataset.model}, this.on_loaded); }, + on_loaded: function(result) { var self = this; var element_id = _.uniqueId("act_window_dialog"); @@ -22,14 +26,19 @@ openerp.base_export.Export = openerp.base.Controller.extend({ height: 'auto', buttons : { "Close" : function() { - this._export.dialog('destroy'); + self._export.dialog('destroy'); }, "Export To File" : function() { - this._export.dialog('destroy'); + self.get_fields(); } } }).html(QWeb.render('ExportTreeView')) self.on_show_data(result) + jQuery(this._export).find('#add_field').click(function(){ + if (self.selected_field_id && self.selected_field_str){ + self.add_field(self.selected_field_id, self.selected_field_str); + } + }); }, on_click: function(id, result) { @@ -85,12 +94,15 @@ openerp.base_export.Export = openerp.base.Controller.extend({ jQuery($.find('img[id ^= parentimg]')).click(function(){ self.on_click(this.id, result); }); - jQuery($.find('[id^=export]')).dblclick(function(){ + jQuery($.find('[id^=export-]')).dblclick(function(){ self.add_field(this.id, this.text) }); + jQuery($.find('[id^=export-]')).click(function(){ + self.selected_field_id = this.id; + self.selected_field_str = this.text; + }); }, - // show & hide the contents showcontent: function (id, flag) { var first_child = $("tr[id='treerow_" + id + "']").find('img') @@ -114,10 +126,23 @@ openerp.base_export.Export = openerp.base.Controller.extend({ add_field: function(id, string) { var field_list = $('#fields_list') field_id = id.split("-")[1]; - if ( !$("#fields_list option[value='" + field_id + "']").length){ + if ( $("#fields_list option[value='" + field_id + "']") && !$("#fields_list option[value='" + field_id + "']").length){ field_list.append( new Option(string, field_id)); } }, + + get_fields: function (){ + var export_field = []; + jQuery("#fields_list option").each(function(){ + export_field.push(jQuery(this).val()); + }); + if (! export_field.length){ + alert('Please select fields to export...'); + } + else { + this._export.dialog('destroy'); + } + }, }); }; From 2c1473cdad3e21c2945da203127552d7b036be3b Mon Sep 17 00:00:00 2001 From: "Yogesh (OpenERP)" Date: Tue, 12 Jul 2011 18:42:21 +0530 Subject: [PATCH 09/47] [IMP] add mouseover event for be able to drag and drop field within a export list. bzr revid: ysa@tinyerp.com-20110712131221-wcxsfq0u5fovv088 --- addons/base_export/static/src/js/base_export.js | 10 ++++++++++ addons/base_export/static/src/xml/base_export.xml | 2 +- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/addons/base_export/static/src/js/base_export.js b/addons/base_export/static/src/js/base_export.js index 342fffa711a..158ecb03999 100644 --- a/addons/base_export/static/src/js/base_export.js +++ b/addons/base_export/static/src/js/base_export.js @@ -101,6 +101,16 @@ openerp.base_export.Export = openerp.base.Controller.extend({ self.selected_field_id = this.id; self.selected_field_str = this.text; }); + jQuery($.find('#fields_list')).mouseover(function(event){ + if(event.relatedTarget){ + if ('id' in event.relatedTarget.attributes && 'string' in event.relatedTarget.attributes){ + field_id = event.relatedTarget.attributes["id"]["value"] + if (field_id && field_id.split("-")[0] == 'export'){ + self.add_field(event.relatedTarget.attributes['id']["value"], event.relatedTarget.attributes["string"]["value"]); + } + } + } + }); }, // show & hide the contents diff --git a/addons/base_export/static/src/xml/base_export.xml b/addons/base_export/static/src/xml/base_export.xml index 5f2ab00012d..cebbb02d4d7 100644 --- a/addons/base_export/static/src/xml/base_export.xml +++ b/addons/base_export/static/src/xml/base_export.xml @@ -95,7 +95,7 @@ - + From b37a904b73c6b243f142d69c6c1b7ce50bac8bc9 Mon Sep 17 00:00:00 2001 From: "Yogesh (OpenERP)" Date: Wed, 13 Jul 2011 10:56:02 +0530 Subject: [PATCH 10/47] [IMP] implementation of dialogbox stop() method. bzr revid: ysa@tinyerp.com-20110713052602-qkuxt6sca9wktmtp --- addons/base_export/static/src/js/base_export.js | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/addons/base_export/static/src/js/base_export.js b/addons/base_export/static/src/js/base_export.js index 158ecb03999..8e5544c02dd 100644 --- a/addons/base_export/static/src/js/base_export.js +++ b/addons/base_export/static/src/js/base_export.js @@ -26,12 +26,14 @@ openerp.base_export.Export = openerp.base.Controller.extend({ height: 'auto', buttons : { "Close" : function() { + self.stop(); self._export.dialog('destroy'); }, "Export To File" : function() { self.get_fields(); } - } + }, + close: function(event, ui){ self.stop();}, }).html(QWeb.render('ExportTreeView')) self.on_show_data(result) jQuery(this._export).find('#add_field').click(function(){ @@ -153,6 +155,11 @@ openerp.base_export.Export = openerp.base.Controller.extend({ this._export.dialog('destroy'); } }, + + stop: function() { + jQuery(this._export).remove(); + }, + }); }; From 13e6ddd9849898f965493453bf9d2a2665a42310 Mon Sep 17 00:00:00 2001 From: "Yogesh (OpenERP)" Date: Wed, 13 Jul 2011 11:36:46 +0530 Subject: [PATCH 11/47] [IMP] bind click event of remove field and remove all field button, also remove field on selection box. bzr revid: ysa@tinyerp.com-20110713060646-d21a13gb90ii9ihl --- addons/base/static/src/js/chrome.js | 14 +++++++------- addons/base_export/static/src/js/base_export.js | 6 ++++++ addons/base_export/static/src/xml/base_export.xml | 4 ++-- 3 files changed, 15 insertions(+), 9 deletions(-) diff --git a/addons/base/static/src/js/chrome.js b/addons/base/static/src/js/chrome.js index ebaf457daa2..20f952798e4 100644 --- a/addons/base/static/src/js/chrome.js +++ b/addons/base/static/src/js/chrome.js @@ -269,7 +269,7 @@ openerp.base.BasicController = Class.extend( /** @lends openerp.base.BasicContro /** * Generates an inherited class that replaces all the methods by null methods (methods * that does nothing and always return undefined). - * + * * @param {Class} claz * @param {dict} add Additional functions to override. * @return {Class} @@ -579,7 +579,7 @@ openerp.base.Controller = openerp.base.BasicController.extend( /** @lends opener element_post_prefix: false }, /** - * Controller registry, + * Controller registry, */ controller_registry: { }, @@ -676,14 +676,14 @@ openerp.base.BaseWidget = openerp.base.Controller.extend({ /** * The name of the QWeb template that will be used for rendering. Must be * redefined in subclasses or the render() method can not be used. - * + * * @type string */ template: null, /** * The prefix used to generate an id automatically. Should be redefined in * subclasses. If it is not defined, a default identifier will be used. - * + * * @type string */ identifier_prefix: 'generic-identifier', @@ -741,7 +741,7 @@ openerp.base.BaseWidget = openerp.base.Controller.extend({ /** * Set the parent of this component, also un-register the previous parent * if there was one. - * + * * @param {openerp.base.BaseWidget} parent The new parent. */ set_parent: function(parent) { @@ -756,7 +756,7 @@ openerp.base.BaseWidget = openerp.base.Controller.extend({ /** * Render the widget. This.template must be defined. * The content of the current object is passed as context to the template. - * + * * @param {object} additional Additional context arguments to pass to the template. */ render: function (additional) { @@ -1135,7 +1135,7 @@ openerp.base.WebClient = openerp.base.Controller.extend({ on_logged: function() { this.action_manager = new openerp.base.ActionManager(this.session, "oe_app"); this.action_manager.start(); - + // if using saved actions, load the action and give it to action manager var parameters = jQuery.deparam(jQuery.param.querystring()); if(parameters["s_action"] != undefined) { diff --git a/addons/base_export/static/src/js/base_export.js b/addons/base_export/static/src/js/base_export.js index 8e5544c02dd..28ac988fbe7 100644 --- a/addons/base_export/static/src/js/base_export.js +++ b/addons/base_export/static/src/js/base_export.js @@ -41,6 +41,12 @@ openerp.base_export.Export = openerp.base.Controller.extend({ self.add_field(self.selected_field_id, self.selected_field_str); } }); + jQuery(this._export).find('#remove_field').click(function(){ + jQuery(self._export).find("#fields_list option:selected").remove(); + }); + jQuery(this._export).find('#remove_all_field').click(function(){ + jQuery(self._export).find("#fields_list option").remove(); + }); }, on_click: function(id, result) { diff --git a/addons/base_export/static/src/xml/base_export.xml b/addons/base_export/static/src/xml/base_export.xml index cebbb02d4d7..e2a653e4465 100644 --- a/addons/base_export/static/src/xml/base_export.xml +++ b/addons/base_export/static/src/xml/base_export.xml @@ -60,12 +60,12 @@ - + - + From 3634daba44ba904eb0c42abccaf410c70f0ac383 Mon Sep 17 00:00:00 2001 From: "Yogesh (OpenERP)" Date: Wed, 13 Jul 2011 12:46:41 +0530 Subject: [PATCH 12/47] Improve code. bzr revid: ysa@tinyerp.com-20110713071641-1uwyq5feycks76ka --- addons/base_export/static/src/js/base_export.js | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/addons/base_export/static/src/js/base_export.js b/addons/base_export/static/src/js/base_export.js index 28ac988fbe7..32f20a39aa9 100644 --- a/addons/base_export/static/src/js/base_export.js +++ b/addons/base_export/static/src/js/base_export.js @@ -1,7 +1,7 @@ openerp.base_export = function(openerp) { QWeb.add_template('/base_export/static/src/xml/base_export.xml'); openerp.base.views.add('export', 'openerp.base_export.Export'); -openerp.base_export.Export = openerp.base.Controller.extend({ +openerp.base_export.Export = openerp.base.Dialog.extend({ init: function(session, dataset, views){ this._super(session); @@ -9,7 +9,6 @@ openerp.base_export.Export = openerp.base.Controller.extend({ this.views = views this.selected_field_id = ''; this.selected_field_str = ''; - }, start: function() { @@ -24,16 +23,16 @@ openerp.base_export.Export = openerp.base.Controller.extend({ modal: true, width: '50%', height: 'auto', + position: 'top', buttons : { "Close" : function() { - self.stop(); - self._export.dialog('destroy'); + self.close(); }, "Export To File" : function() { self.get_fields(); } }, - close: function(event, ui){ self.stop();}, + close: function(event, ui){ self.close();}, }).html(QWeb.render('ExportTreeView')) self.on_show_data(result) jQuery(this._export).find('#add_field').click(function(){ @@ -158,12 +157,13 @@ openerp.base_export.Export = openerp.base.Controller.extend({ alert('Please select fields to export...'); } else { - this._export.dialog('destroy'); + this._export.dialog('close'); } }, - stop: function() { + close: function() { jQuery(this._export).remove(); + this._export.dialog('close'); }, }); From 8b5f33ad159e4652185a56b1aebfb5344985be3e Mon Sep 17 00:00:00 2001 From: "Yogesh (OpenERP)" Date: Wed, 13 Jul 2011 14:32:18 +0530 Subject: [PATCH 13/47] [IMP] improve code and extend openerp.base.Dialog class and used this class for export dialog. bzr revid: ysa@tinyerp.com-20110713090218-aw9akqd48aey4w2h --- addons/base/static/src/js/views.js | 2 +- .../base_export/static/src/js/base_export.js | 99 +++++++++---------- 2 files changed, 49 insertions(+), 52 deletions(-) diff --git a/addons/base/static/src/js/views.js b/addons/base/static/src/js/views.js index da50e62c713..7f80046e645 100644 --- a/addons/base/static/src/js/views.js +++ b/addons/base/static/src/js/views.js @@ -169,7 +169,7 @@ openerp.base.ViewManager = openerp.base.Controller.extend({ this.views[this.active_view].controller.$element.after(QWeb.render('ExportView')) this.$element.find('#exportview').click(function(ev) { var export_view = new openerp.base_export.Export(self.session, self.dataset, self.views); - export_view.start(); + export_view.start(false); ev.preventDefault(); }); } diff --git a/addons/base_export/static/src/js/base_export.js b/addons/base_export/static/src/js/base_export.js index 32f20a39aa9..bc2dd73d8b5 100644 --- a/addons/base_export/static/src/js/base_export.js +++ b/addons/base_export/static/src/js/base_export.js @@ -6,25 +6,21 @@ openerp.base_export.Export = openerp.base.Dialog.extend({ init: function(session, dataset, views){ this._super(session); this.dataset = dataset - this.views = views this.selected_field_id = ''; this.selected_field_str = ''; }, start: function() { - this.rpc("/base_export/export/get_fields", {"model": this.dataset.model}, this.on_loaded); - }, - - on_loaded: function(result) { - var self = this; - var element_id = _.uniqueId("act_window_dialog"); - this._export = $('
', {id: element_id}).dialog({ - title: "Export Data", - modal: true, - width: '50%', - height: 'auto', - position: 'top', - buttons : { + var self = this + self._super(false); + self.template = 'ExportTreeView'; + self.dialog_title = "Export Data " + self.open({ + modal: true, + width: '50%', + height: 'auto', + position: 'top', + buttons : { "Close" : function() { self.close(); }, @@ -32,63 +28,64 @@ openerp.base_export.Export = openerp.base.Dialog.extend({ self.get_fields(); } }, - close: function(event, ui){ self.close();}, - }).html(QWeb.render('ExportTreeView')) - self.on_show_data(result) - jQuery(this._export).find('#add_field').click(function(){ + close: function(event, ui){ self.close();} + }); + jQuery(self.$dialog).find('#add_field').click(function(){ if (self.selected_field_id && self.selected_field_str){ self.add_field(self.selected_field_id, self.selected_field_str); } }); - jQuery(this._export).find('#remove_field').click(function(){ - jQuery(self._export).find("#fields_list option:selected").remove(); + jQuery(self.$dialog).find('#remove_field').click(function(){ + jQuery(self.$dialog).find("#fields_list option:selected").remove(); }); - jQuery(this._export).find('#remove_all_field').click(function(){ - jQuery(self._export).find("#fields_list option").remove(); + jQuery(self.$dialog).find('#remove_all_field').click(function(){ + jQuery(self.$dialog).find("#fields_list option").remove(); }); + this.rpc("/base_export/export/get_fields", {"model": this.dataset.model}, this.on_show_data); }, on_click: function(id, result) { var self = this - this.field_id = id.split("-")[1]; + self.field_id = id.split("-")[1]; var model = '' var prefix = '' var name = '' var is_loaded = 0; - for (var record in result){ - if(result[record]['id'] == this.field_id){ - model = result[record]['params']['model'] - prefix = result[record]['params']['prefix'] - name = result[record]['params']['name'] - if ( (result[record]['children']).length >= 1){ - $(result[record]['children']).each (function(e, childid) { + _.each(result, function(record) { + if(record['id'] == self.field_id){ + model = record['params']['model'] + prefix = record['params']['prefix'] + name = record['params']['name'] + if ((record['children']).length >= 1){ + $(record['children']).each (function(e, childid) { if ($("tr[id='treerow_" + childid +"']").length > 0) { if ($("tr[id='treerow_" + childid +"']").is(':hidden')) { is_loaded = -1; } else { - is_loaded++; - } - } - }); - if (is_loaded == 0) { - if ($("tr[id='treerow_" + this.field_id +"']").find('img').attr('src') == '/base/static/src/img/expand.gif') { + is_loaded++; + } + } + }); + if (is_loaded == 0) { + if ($("tr[id='treerow_" + self.field_id +"']").find('img').attr('src') == '/base/static/src/img/expand.gif') { if (model){ - this.rpc("/base_export/export/get_fields", {"model": model, "prefix": prefix, "field_parent" : this.field_id, "name": name}, function (result) { - self.on_show_data(result, true); + self.rpc("/base_export/export/get_fields", {"model": model, "prefix": prefix, "field_parent" : self.field_id, "name": name}, function (results) { + self.on_show_data(results); }); } } - } else if (is_loaded > 0) { - self.showcontent(this.field_id, true); - } else { - self.showcontent(this.field_id, false); - } - } - } - } + } else if (is_loaded > 0) { + self.showcontent(self.field_id, true); + } else { + self.showcontent(self.field_id, false); + } + } + } + + }); }, - on_show_data: function(result, flag) { + on_show_data: function(result) { var self = this; var current_tr = $("tr[id='treerow_" + self.field_id + "']"); if (current_tr.length >= 1){ @@ -96,7 +93,7 @@ openerp.base_export.Export = openerp.base.Dialog.extend({ current_tr.after(QWeb.render('ExportTreeView-Secondary', {'fields': result})); } else{ - jQuery(self._export).find('#left_field_panel').append(QWeb.render('ExportTreeView-Secondary', {'fields': result})); + jQuery(this.$dialog).find('#left_field_panel').append(QWeb.render('ExportTreeView-Secondary', {'fields': result})); } jQuery($.find('img[id ^= parentimg]')).click(function(){ self.on_click(this.id, result); @@ -157,13 +154,13 @@ openerp.base_export.Export = openerp.base.Dialog.extend({ alert('Please select fields to export...'); } else { - this._export.dialog('close'); + this.close(); } }, close: function() { - jQuery(this._export).remove(); - this._export.dialog('close'); + jQuery(this.$dialog).remove(); + this._super(); }, }); From a4168644d5244417865bfc0ad29dfa8d1dddbaac Mon Sep 17 00:00:00 2001 From: "Yogesh (OpenERP)" Date: Wed, 13 Jul 2011 18:36:51 +0530 Subject: [PATCH 14/47] [IMP] left side multiple selected field move to right panel in export dialog box. bzr revid: ysa@tinyerp.com-20110713130651-imuct7olrl0e385e --- .../base_export/static/src/js/base_export.js | 28 +++++++++++-------- 1 file changed, 17 insertions(+), 11 deletions(-) diff --git a/addons/base_export/static/src/js/base_export.js b/addons/base_export/static/src/js/base_export.js index bc2dd73d8b5..eb0fbd244f2 100644 --- a/addons/base_export/static/src/js/base_export.js +++ b/addons/base_export/static/src/js/base_export.js @@ -6,8 +6,7 @@ openerp.base_export.Export = openerp.base.Dialog.extend({ init: function(session, dataset, views){ this._super(session); this.dataset = dataset - this.selected_field_id = ''; - this.selected_field_str = ''; + this.selected_fields = {}; }, start: function() { @@ -31,9 +30,9 @@ openerp.base_export.Export = openerp.base.Dialog.extend({ close: function(event, ui){ self.close();} }); jQuery(self.$dialog).find('#add_field').click(function(){ - if (self.selected_field_id && self.selected_field_str){ - self.add_field(self.selected_field_id, self.selected_field_str); - } + for (var key in self.selected_fields) { + self.add_field(key, self.selected_fields[key]) + } }); jQuery(self.$dialog).find('#remove_field').click(function(){ jQuery(self.$dialog).find("#fields_list option:selected").remove(); @@ -99,24 +98,32 @@ openerp.base_export.Export = openerp.base.Dialog.extend({ self.on_click(this.id, result); }); jQuery($.find('[id^=export-]')).dblclick(function(){ - self.add_field(this.id, this.text) + self.add_field(this.id.split('-')[1], this.text) }); jQuery($.find('[id^=export-]')).click(function(){ - self.selected_field_id = this.id; - self.selected_field_str = this.text; + self.on_field_click(this); }); jQuery($.find('#fields_list')).mouseover(function(event){ if(event.relatedTarget){ if ('id' in event.relatedTarget.attributes && 'string' in event.relatedTarget.attributes){ field_id = event.relatedTarget.attributes["id"]["value"] if (field_id && field_id.split("-")[0] == 'export'){ - self.add_field(event.relatedTarget.attributes['id']["value"], event.relatedTarget.attributes["string"]["value"]); + self.add_field(field_id.split("-")[1], event.relatedTarget.attributes["string"]["value"]); } } } }); }, + on_field_click: function(ids){ + var self = this; + field_id = ids.id.split("-")[1]; + self.selected_fields = {}; + if (!(field_id in self.selected_fields)){ + self.selected_fields[field_id] = ids.text; + } + }, + // show & hide the contents showcontent: function (id, flag) { var first_child = $("tr[id='treerow_" + id + "']").find('img') @@ -137,9 +144,8 @@ openerp.base_export.Export = openerp.base.Dialog.extend({ } }, - add_field: function(id, string) { + add_field: function(field_id, string) { var field_list = $('#fields_list') - field_id = id.split("-")[1]; if ( $("#fields_list option[value='" + field_id + "']") && !$("#fields_list option[value='" + field_id + "']").length){ field_list.append( new Option(string, field_id)); } From 191361eda0c1f85bebb86d06491ebbe930ed1e6e Mon Sep 17 00:00:00 2001 From: "Kunal Chavda (OpenERP)" Date: Thu, 14 Jul 2011 10:57:03 +0530 Subject: [PATCH 15/47] [IMP]Implement bind arrow key for open and close child node. bzr revid: kch@tinyerp.com-20110714052703-o4d5ef985zt612s6 --- .../base_export/static/src/js/base_export.js | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/addons/base_export/static/src/js/base_export.js b/addons/base_export/static/src/js/base_export.js index eb0fbd244f2..b0d63e3b538 100644 --- a/addons/base_export/static/src/js/base_export.js +++ b/addons/base_export/static/src/js/base_export.js @@ -103,6 +103,26 @@ openerp.base_export.Export = openerp.base.Dialog.extend({ jQuery($.find('[id^=export-]')).click(function(){ self.on_field_click(this); }); + + $('[id^=export-]').keydown(function (e) { + var keyCode = e.keyCode || e.which, + arrow = {left: 37, up: 38, right: 39, down: 40 }; + switch (keyCode) { + case arrow.left: + self.on_click(this.id, result); + break; + case arrow.up: + //.. + break; + case arrow.right: + self.on_click(this.id, result); + break; + case arrow.down: + //.. + break; + } + }); + jQuery($.find('#fields_list')).mouseover(function(event){ if(event.relatedTarget){ if ('id' in event.relatedTarget.attributes && 'string' in event.relatedTarget.attributes){ From e790623f9091a6ac582e91cc9244298cf296aa1e Mon Sep 17 00:00:00 2001 From: "Yogesh (OpenERP)" Date: Thu, 14 Jul 2011 11:43:52 +0530 Subject: [PATCH 16/47] [IMP] improve code and fix problem of show tree structure. bzr revid: ysa@tinyerp.com-20110714061352-6f47mbow332ats0m --- .../base_export/static/src/js/base_export.js | 90 ++++++++++--------- 1 file changed, 47 insertions(+), 43 deletions(-) diff --git a/addons/base_export/static/src/js/base_export.js b/addons/base_export/static/src/js/base_export.js index b0d63e3b538..abd0d1684b8 100644 --- a/addons/base_export/static/src/js/base_export.js +++ b/addons/base_export/static/src/js/base_export.js @@ -29,15 +29,15 @@ openerp.base_export.Export = openerp.base.Dialog.extend({ }, close: function(event, ui){ self.close();} }); - jQuery(self.$dialog).find('#add_field').click(function(){ - for (var key in self.selected_fields) { - self.add_field(key, self.selected_fields[key]) - } + $('#add_field').click(function(){ + for (var key in self.selected_fields) { + self.add_field(key, self.selected_fields[key]) + } }); - jQuery(self.$dialog).find('#remove_field').click(function(){ + $('#remove_field').click(function(){ jQuery(self.$dialog).find("#fields_list option:selected").remove(); }); - jQuery(self.$dialog).find('#remove_all_field').click(function(){ + $('#remove_all_field').click(function(){ jQuery(self.$dialog).find("#fields_list option").remove(); }); this.rpc("/base_export/export/get_fields", {"model": this.dataset.model}, this.on_show_data); @@ -45,39 +45,37 @@ openerp.base_export.Export = openerp.base.Dialog.extend({ on_click: function(id, result) { var self = this - self.field_id = id.split("-")[1]; - var model = '' - var prefix = '' - var name = '' - var is_loaded = 0; + self.field_id = id.split("-")[1]; + var model = '' + var prefix = '' + var name = '' + var is_loaded = 0; _.each(result, function(record) { - if(record['id'] == self.field_id){ + if(record['id'] == self.field_id && (record['children']).length >= 1){ model = record['params']['model'] prefix = record['params']['prefix'] name = record['params']['name'] - if ((record['children']).length >= 1){ - $(record['children']).each (function(e, childid) { - if ($("tr[id='treerow_" + childid +"']").length > 0) { - if ($("tr[id='treerow_" + childid +"']").is(':hidden')) { - is_loaded = -1; - } else { - is_loaded++; - } + $(record['children']).each (function(e, childid) { + if ($("tr[id='treerow_" + childid +"']").length > 0) { + if ($("tr[id='treerow_" + childid +"']").is(':hidden')) { + is_loaded = -1; + } else { + is_loaded++; } - }); - if (is_loaded == 0) { - if ($("tr[id='treerow_" + self.field_id +"']").find('img').attr('src') == '/base/static/src/img/expand.gif') { - if (model){ - self.rpc("/base_export/export/get_fields", {"model": model, "prefix": prefix, "field_parent" : self.field_id, "name": name}, function (results) { - self.on_show_data(results); - }); - } - } - } else if (is_loaded > 0) { - self.showcontent(self.field_id, true); - } else { - self.showcontent(self.field_id, false); } + }); + if (is_loaded == 0) { + if ($("tr[id='treerow_" + self.field_id +"']").find('img').attr('src') == '/base/static/src/img/expand.gif') { + if (model){ + self.rpc("/base_export/export/get_fields", {"model": model, "prefix": prefix, "field_parent" : self.field_id, "name": name}, function (results) { + self.on_show_data(results); + }); + } + } + } else if (is_loaded > 0) { + self.showcontent(self.field_id, true); + } else { + self.showcontent(self.field_id, false); } } @@ -92,15 +90,15 @@ openerp.base_export.Export = openerp.base.Dialog.extend({ current_tr.after(QWeb.render('ExportTreeView-Secondary', {'fields': result})); } else{ - jQuery(this.$dialog).find('#left_field_panel').append(QWeb.render('ExportTreeView-Secondary', {'fields': result})); + $('#left_field_panel').append(QWeb.render('ExportTreeView-Secondary', {'fields': result})); } - jQuery($.find('img[id ^= parentimg]')).click(function(){ + $('img[id ^= parentimg]').click(function(){ self.on_click(this.id, result); }); - jQuery($.find('[id^=export-]')).dblclick(function(){ + $('[id^=export-]').dblclick(function(){ self.add_field(this.id.split('-')[1], this.text) }); - jQuery($.find('[id^=export-]')).click(function(){ + $('[id^=export-]').click(function(){ self.on_field_click(this); }); @@ -123,7 +121,7 @@ openerp.base_export.Export = openerp.base.Dialog.extend({ } }); - jQuery($.find('#fields_list')).mouseover(function(event){ + $('#fields_list').mouseover(function(event){ if(event.relatedTarget){ if ('id' in event.relatedTarget.attributes && 'string' in event.relatedTarget.attributes){ field_id = event.relatedTarget.attributes["id"]["value"] @@ -154,21 +152,27 @@ openerp.base_export.Export = openerp.base.Dialog.extend({ first_child.attr('src', '/base/static/src/img/collapse.gif'); } var child_field = $("tr[id^='treerow_" + id +"/']") + var child_len = (id.split("/")).length + 1 for (var i = 0; i < child_field.length; i++) { if (flag) { $(child_field[i]).hide(); } else { - $(child_field[i]).show(); + if(child_len == (child_field[i].id.split("/")).length){ + if( jQuery(child_field[i]).find('img').attr('src') == '/base/static/src/img/collapse.gif'){ + jQuery(child_field[i]).find('img').attr('src', '/base/static/src/img/expand.gif') + } + $(child_field[i]).show(); + } } } }, add_field: function(field_id, string) { - var field_list = $('#fields_list') - if ( $("#fields_list option[value='" + field_id + "']") && !$("#fields_list option[value='" + field_id + "']").length){ - field_list.append( new Option(string, field_id)); - } + var field_list = $('#fields_list') + if ( $("#fields_list option[value='" + field_id + "']") && !$("#fields_list option[value='" + field_id + "']").length){ + field_list.append( new Option(string, field_id)); + } }, get_fields: function (){ From 2e2ff402fc0fafa85bfae2a5cda9bab9ea948b42 Mon Sep 17 00:00:00 2001 From: "Yogesh (OpenERP)" Date: Thu, 14 Jul 2011 12:39:45 +0530 Subject: [PATCH 17/47] [IMP] improve functionality of left and right arrow in export tree structure. bzr revid: ysa@tinyerp.com-20110714070945-448n11l9avevfng0 --- .../base_export/static/src/js/base_export.js | 51 ++++++++++--------- .../static/src/xml/base_export.xml | 2 +- 2 files changed, 28 insertions(+), 25 deletions(-) diff --git a/addons/base_export/static/src/js/base_export.js b/addons/base_export/static/src/js/base_export.js index abd0d1684b8..33380d8f613 100644 --- a/addons/base_export/static/src/js/base_export.js +++ b/addons/base_export/static/src/js/base_export.js @@ -56,8 +56,8 @@ openerp.base_export.Export = openerp.base.Dialog.extend({ prefix = record['params']['prefix'] name = record['params']['name'] $(record['children']).each (function(e, childid) { - if ($("tr[id='treerow_" + childid +"']").length > 0) { - if ($("tr[id='treerow_" + childid +"']").is(':hidden')) { + if ($("tr[id='treerow-" + childid +"']").length > 0) { + if ($("tr[id='treerow-" + childid +"']").is(':hidden')) { is_loaded = -1; } else { is_loaded++; @@ -65,7 +65,7 @@ openerp.base_export.Export = openerp.base.Dialog.extend({ } }); if (is_loaded == 0) { - if ($("tr[id='treerow_" + self.field_id +"']").find('img').attr('src') == '/base/static/src/img/expand.gif') { + if ($("tr[id='treerow-" + self.field_id +"']").find('img').attr('src') == '/base/static/src/img/expand.gif') { if (model){ self.rpc("/base_export/export/get_fields", {"model": model, "prefix": prefix, "field_parent" : self.field_id, "name": name}, function (results) { self.on_show_data(results); @@ -84,7 +84,7 @@ openerp.base_export.Export = openerp.base.Dialog.extend({ on_show_data: function(result) { var self = this; - var current_tr = $("tr[id='treerow_" + self.field_id + "']"); + var current_tr = $("tr[id='treerow-" + self.field_id + "']"); if (current_tr.length >= 1){ current_tr.find('img').attr('src','/base/static/src/img/collapse.gif'); current_tr.after(QWeb.render('ExportTreeView-Secondary', {'fields': result})); @@ -101,24 +101,27 @@ openerp.base_export.Export = openerp.base.Dialog.extend({ $('[id^=export-]').click(function(){ self.on_field_click(this); }); - - $('[id^=export-]').keydown(function (e) { - var keyCode = e.keyCode || e.which, - arrow = {left: 37, up: 38, right: 39, down: 40 }; - switch (keyCode) { - case arrow.left: - self.on_click(this.id, result); - break; - case arrow.up: - //.. - break; - case arrow.right: - self.on_click(this.id, result); - break; - case arrow.down: - //.. - break; - } + $("tr[id^='treerow-']").keydown(function (e) { + var keyCode = e.keyCode || e.which; + arrow = {left: 37, up: 38, right: 39, down: 40 }; + switch (keyCode) { + case arrow.left: + if( jQuery(this).find('img').attr('src') == '/base/static/src/img/collapse.gif'){ + self.on_click(this.id, result); + } + break; + case arrow.up: + //.. + break; + case arrow.right: + if( jQuery(this).find('img').attr('src') == '/base/static/src/img/expand.gif'){ + self.on_click(this.id, result); + } + break; + case arrow.down: + //.. + break; + } }); $('#fields_list').mouseover(function(event){ @@ -144,14 +147,14 @@ openerp.base_export.Export = openerp.base.Dialog.extend({ // show & hide the contents showcontent: function (id, flag) { - var first_child = $("tr[id='treerow_" + id + "']").find('img') + var first_child = $("tr[id='treerow-" + id + "']").find('img') if (flag) { first_child.attr('src', '/base/static/src/img/expand.gif'); } else { first_child.attr('src', '/base/static/src/img/collapse.gif'); } - var child_field = $("tr[id^='treerow_" + id +"/']") + var child_field = $("tr[id^='treerow-" + id +"/']") var child_len = (id.split("/")).length + 1 for (var i = 0; i < child_field.length; i++) { if (flag) { diff --git a/addons/base_export/static/src/xml/base_export.xml b/addons/base_export/static/src/xml/base_export.xml index e2a653e4465..ef3d3de4af4 100644 --- a/addons/base_export/static/src/xml/base_export.xml +++ b/addons/base_export/static/src/xml/base_export.xml @@ -82,7 +82,7 @@ - + From 78890bc3de6c381f4aa1c5082d5841bf4810e234 Mon Sep 17 00:00:00 2001 From: "Yogesh (OpenERP)" Date: Thu, 14 Jul 2011 17:11:43 +0530 Subject: [PATCH 18/47] [IMP] Implement save export list in db. bzr revid: ysa@tinyerp.com-20110714114143-rsrkae7ve1gpap00 --- addons/base_export/controllers/main.py | 9 +++++ .../base_export/static/src/js/base_export.js | 39 +++++++++++++++++-- .../static/src/xml/base_export.xml | 13 ++++++- 3 files changed, 57 insertions(+), 4 deletions(-) diff --git a/addons/base_export/controllers/main.py b/addons/base_export/controllers/main.py index eb475e59a21..e3b7de03413 100644 --- a/addons/base_export/controllers/main.py +++ b/addons/base_export/controllers/main.py @@ -58,3 +58,12 @@ class Export(View): records.reverse() return records + + @openerpweb.jsonrequest + def save_export_lists(self, req, name, model, field_list): + result = {'resource':model, 'name':name, 'export_fields': []} + for field in field_list: + result['export_fields'].append((0, 0, {'name': field})) + req.session.model("ir.exports").create(result, req.session.eval_context(req.context)) + return True + diff --git a/addons/base_export/static/src/js/base_export.js b/addons/base_export/static/src/js/base_export.js index 33380d8f613..0a3ea7cf53b 100644 --- a/addons/base_export/static/src/js/base_export.js +++ b/addons/base_export/static/src/js/base_export.js @@ -40,8 +40,43 @@ openerp.base_export.Export = openerp.base.Dialog.extend({ $('#remove_all_field').click(function(){ jQuery(self.$dialog).find("#fields_list option").remove(); }); + $('#export_new_list').click(function(){ + self.on_show_save_list(); + }); this.rpc("/base_export/export/get_fields", {"model": this.dataset.model}, this.on_show_data); }, + on_show_save_list: function(){ + var self = this; + var current_node = $("#savenewlist"); + if(!(current_node.find("label")).length){ + current_node.append(QWeb.render('ExportNewList')); + current_node.find("#add_export_list").click(function(){ + var value = current_node.find("#savelist_name").val(); + if (value){ + self.do_save_export_list(value); + } + else{ + alert("Pleae Enter Save Field List Name"); + } + + }); + } + else{ + if (current_node.is(':hidden')){ + current_node.show(); + } + else{ + current_node.hide(); + } + } + }, + + do_save_export_list: function(value){ + var export_field = this.get_fields() + if(export_field.length){ + this.rpc("/base_export/export/save_export_lists", {"model": this.dataset.model, "name":value, "field_list":export_field}, {}); + } + }, on_click: function(id, result) { var self = this @@ -186,9 +221,7 @@ openerp.base_export.Export = openerp.base.Dialog.extend({ if (! export_field.length){ alert('Please select fields to export...'); } - else { - this.close(); - } + return export_field; }, close: function() { diff --git a/addons/base_export/static/src/xml/base_export.xml b/addons/base_export/static/src/xml/base_export.xml index ef3d3de4af4..21eeccfe52c 100644 --- a/addons/base_export/static/src/xml/base_export.xml +++ b/addons/base_export/static/src/xml/base_export.xml @@ -34,7 +34,10 @@ - + + + + + + + + + \ No newline at end of file From 03451e85940eca8d284beb46cecda23ba87fdc45 Mon Sep 17 00:00:00 2001 From: "Kunal Chavda (OpenERP)" Date: Thu, 14 Jul 2011 17:58:25 +0530 Subject: [PATCH 19/47] [IMP]Implement up and down arrow key in export tree structure. bzr revid: kch@tinyerp.com-20110714122825-0omxwj3z039f82g2 --- .../base_export/static/src/js/base_export.js | 46 +++++++++++-------- 1 file changed, 26 insertions(+), 20 deletions(-) diff --git a/addons/base_export/static/src/js/base_export.js b/addons/base_export/static/src/js/base_export.js index 0a3ea7cf53b..38abbb219c0 100644 --- a/addons/base_export/static/src/js/base_export.js +++ b/addons/base_export/static/src/js/base_export.js @@ -128,6 +128,8 @@ openerp.base_export.Export = openerp.base.Dialog.extend({ $('#left_field_panel').append(QWeb.render('ExportTreeView-Secondary', {'fields': result})); } $('img[id ^= parentimg]').click(function(){ + var elem_id = this.id.split("-")[1]; + $($.find("tr[id='treerow-" + elem_id + "']")).find('a').focus(); self.on_click(this.id, result); }); $('[id^=export-]').dblclick(function(){ @@ -137,26 +139,30 @@ openerp.base_export.Export = openerp.base.Dialog.extend({ self.on_field_click(this); }); $("tr[id^='treerow-']").keydown(function (e) { - var keyCode = e.keyCode || e.which; - arrow = {left: 37, up: 38, right: 39, down: 40 }; - switch (keyCode) { - case arrow.left: - if( jQuery(this).find('img').attr('src') == '/base/static/src/img/collapse.gif'){ - self.on_click(this.id, result); - } - break; - case arrow.up: - //.. - break; - case arrow.right: - if( jQuery(this).find('img').attr('src') == '/base/static/src/img/expand.gif'){ - self.on_click(this.id, result); - } - break; - case arrow.down: - //.. - break; - } + var keyCode = e.keyCode || e.which; + arrow = {left: 37, up: 38, right: 39, down: 40 }; + switch (keyCode) { + case arrow.left: + if( jQuery(this).find('img').attr('src') == '/base/static/src/img/collapse.gif'){ + self.on_click(this.id, result); + } + break; + case arrow.up: + $(this).prev().find('a').focus(); + break; + case arrow.right: + if( jQuery(this).find('img').attr('src') == '/base/static/src/img/expand.gif'){ + self.on_click(this.id, result); + } + break; + case arrow.down: + var elem = this; + while($(elem).next().is(":visible") == false){ + elem = $(elem).next(); + } + $(elem).next().find('a').focus(); + break; + } }); $('#fields_list').mouseover(function(event){ From 3805f31e9d904fdb0781118739db069355299f56 Mon Sep 17 00:00:00 2001 From: "Yogesh (OpenERP)" Date: Thu, 14 Jul 2011 18:50:11 +0530 Subject: [PATCH 20/47] [IMP] after create list fields are hidden and remove all field in export list. bzr revid: ysa@tinyerp.com-20110714132011-9dunrdg9aswgd7g1 --- addons/base_export/static/src/js/base_export.js | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/addons/base_export/static/src/js/base_export.js b/addons/base_export/static/src/js/base_export.js index 38abbb219c0..a25012cea44 100644 --- a/addons/base_export/static/src/js/base_export.js +++ b/addons/base_export/static/src/js/base_export.js @@ -35,10 +35,10 @@ openerp.base_export.Export = openerp.base.Dialog.extend({ } }); $('#remove_field').click(function(){ - jQuery(self.$dialog).find("#fields_list option:selected").remove(); + $("#fields_list option:selected").remove(); }); $('#remove_all_field').click(function(){ - jQuery(self.$dialog).find("#fields_list option").remove(); + $("#fields_list option").remove(); }); $('#export_new_list').click(function(){ self.on_show_save_list(); @@ -75,6 +75,8 @@ openerp.base_export.Export = openerp.base.Dialog.extend({ var export_field = this.get_fields() if(export_field.length){ this.rpc("/base_export/export/save_export_lists", {"model": this.dataset.model, "name":value, "field_list":export_field}, {}); + this.on_show_save_list() + $("#fields_list option").remove(); } }, @@ -221,7 +223,7 @@ openerp.base_export.Export = openerp.base.Dialog.extend({ get_fields: function (){ var export_field = []; - jQuery("#fields_list option").each(function(){ + $("#fields_list option").each(function(){ export_field.push(jQuery(this).val()); }); if (! export_field.length){ From 8596daa98bba6fc8ad99f4300d0cbf5fd71f1fcc Mon Sep 17 00:00:00 2001 From: "Yogesh (OpenERP)" Date: Fri, 15 Jul 2011 11:27:46 +0530 Subject: [PATCH 21/47] [IMP] improve template of export tree structure and tree open on 2 level. bzr revid: ysa@tinyerp.com-20110715055746-m2ukkqyrxcnqmcy2 --- addons/base_export/controllers/main.py | 4 +--- addons/base_export/static/src/xml/base_export.xml | 10 +++++++--- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/addons/base_export/controllers/main.py b/addons/base_export/controllers/main.py index e3b7de03413..bb633852192 100644 --- a/addons/base_export/controllers/main.py +++ b/addons/base_export/controllers/main.py @@ -21,10 +21,8 @@ class Export(View): id = prefix + (prefix and '/'or '') + key nm = name + (name and '/' or '') + value['string'] - levels = nm.split('/') - levels > 1 and levels.remove(levels[0]) or [] record.update(id=id, string= nm, action='javascript: void(0)', - target=None, icon=None, children=[], level = levels) + target=None, icon=None, children=[]) records.append(record) if value.get('relation', False): diff --git a/addons/base_export/static/src/xml/base_export.xml b/addons/base_export/static/src/xml/base_export.xml index 21eeccfe52c..b8fff4e6064 100644 --- a/addons/base_export/static/src/xml/base_export.xml +++ b/addons/base_export/static/src/xml/base_export.xml @@ -89,12 +89,16 @@
Available fields Fields to exportFields to export + Save fields list +
+
@@ -105,4 +108,12 @@
- - + + + +
&nbsp;&nbsp; - + + + From e16e35e00fb01b230159ccab76ed37826178ef66 Mon Sep 17 00:00:00 2001 From: "Yogesh (OpenERP)" Date: Fri, 15 Jul 2011 15:53:14 +0530 Subject: [PATCH 22/47] [IMP] implement save export list functionality. bzr revid: ysa@tinyerp.com-20110715102314-pvz1uyke4wjhk8xl --- addons/base_export/controllers/main.py | 12 ++++- .../base_export/static/src/js/base_export.js | 53 +++++++++++++++++-- .../static/src/xml/base_export.xml | 30 ++++++++--- 3 files changed, 81 insertions(+), 14 deletions(-) diff --git a/addons/base_export/controllers/main.py b/addons/base_export/controllers/main.py index bb633852192..adb0b9e6e9f 100644 --- a/addons/base_export/controllers/main.py +++ b/addons/base_export/controllers/main.py @@ -62,6 +62,14 @@ class Export(View): result = {'resource':model, 'name':name, 'export_fields': []} for field in field_list: result['export_fields'].append((0, 0, {'name': field})) - req.session.model("ir.exports").create(result, req.session.eval_context(req.context)) - return True + return req.session.model("ir.exports").create(result, req.session.eval_context(req.context)) + @openerpweb.jsonrequest + def exist_export_lists(self, req, model): + export_model = req.session.model("ir.exports") + return export_model.read(export_model.search([('resource', '=', model)]), ['name']) + + @openerpweb.jsonrequest + def delete_export(self, req, export_id): + req.session.model("ir.exports").unlink(export_id, req.session.eval_context(req.context)) + return True diff --git a/addons/base_export/static/src/js/base_export.js b/addons/base_export/static/src/js/base_export.js index a25012cea44..7b1137ac6ae 100644 --- a/addons/base_export/static/src/js/base_export.js +++ b/addons/base_export/static/src/js/base_export.js @@ -29,6 +29,7 @@ openerp.base_export.Export = openerp.base.Dialog.extend({ }, close: function(event, ui){ self.close();} }); + this.on_show_exists_export_list(); $('#add_field').click(function(){ for (var key in self.selected_fields) { self.add_field(key, self.selected_fields[key]) @@ -44,7 +45,33 @@ openerp.base_export.Export = openerp.base.Dialog.extend({ self.on_show_save_list(); }); this.rpc("/base_export/export/get_fields", {"model": this.dataset.model}, this.on_show_data); + }, + + on_show_exists_export_list: function(){ + var self = this; + if($("#saved_export_list").is(":hidden")){ + $("#ExistsExportList").show(); + } + else{ + this.rpc("/base_export/export/exist_export_lists", {"model": this.dataset.model}, function(export_list){ + if(export_list.length){ + $("#ExistsExportList").append(QWeb.render('Exists.ExportList', {'existing_exports':export_list})); + $('#delete_export_list').click(function(){ + select_exp = $("#saved_export_list option:selected") + if (select_exp.val()){ + self.rpc("/base_export/export/delete_export", {"export_id": parseInt(select_exp.val())}, {}); + select_exp.remove(); + if($("#saved_export_list option").length <= 1){ + $("#ExistsExportList").hide(); + } + } + }); + } + }); + } + }, + on_show_save_list: function(){ var self = this; var current_node = $("#savenewlist"); @@ -58,7 +85,6 @@ openerp.base_export.Export = openerp.base.Dialog.extend({ else{ alert("Pleae Enter Save Field List Name"); } - }); } else{ @@ -72,10 +98,23 @@ openerp.base_export.Export = openerp.base.Dialog.extend({ }, do_save_export_list: function(value){ - var export_field = this.get_fields() + var self = this; + var export_field = self.get_fields() if(export_field.length){ - this.rpc("/base_export/export/save_export_lists", {"model": this.dataset.model, "name":value, "field_list":export_field}, {}); - this.on_show_save_list() + self.rpc("/base_export/export/save_export_lists", {"model": self.dataset.model, "name":value, "field_list":export_field}, function(exp_id){ + if(exp_id){ + if($("#saved_export_list").length > 0){ + $("#saved_export_list").append( new Option(value, exp_id)); + } + else{ + self.on_show_exists_export_list(); + } + if($("#saved_export_list").is(":hidden")){ + self.on_show_exists_export_list(); + } + } + }); + self.on_show_save_list() $("#fields_list option").remove(); } }, @@ -150,7 +189,11 @@ openerp.base_export.Export = openerp.base.Dialog.extend({ } break; case arrow.up: - $(this).prev().find('a').focus(); + var elem = this; + while($(elem).prev().is(":visible") == false){ + elem = $(elem).prev(); + } + $(elem).prev().find('a').focus(); break; case arrow.right: if( jQuery(this).find('img').attr('src') == '/base/static/src/img/expand.gif'){ diff --git a/addons/base_export/static/src/xml/base_export.xml b/addons/base_export/static/src/xml/base_export.xml index b8fff4e6064..c5459ad888b 100644 --- a/addons/base_export/static/src/xml/base_export.xml +++ b/addons/base_export/static/src/xml/base_export.xml @@ -5,7 +5,7 @@ - +
-
This wizard will export all data that matches the current search criteria to a CSV file. @@ -29,20 +29,21 @@
- +
+ - +
Available fieldsAvailable fields Fields to export Save fields list
+
- +
Name
@@ -55,7 +56,7 @@ - +
- + + + + + + + + + \ No newline at end of file From dc8889a339c4da1c2ce2f5f93b8aaaf63a556b0e Mon Sep 17 00:00:00 2001 From: "Yogesh (OpenERP)" Date: Fri, 15 Jul 2011 17:52:01 +0530 Subject: [PATCH 23/47] [IMP] add onchange event of selection box and base on load field name in export list. bzr revid: ysa@tinyerp.com-20110715122201-9x60axor2glholzb --- addons/base_export/controllers/main.py | 54 ++++++++++++++++++- .../base_export/static/src/js/base_export.js | 42 ++++++++++----- 2 files changed, 80 insertions(+), 16 deletions(-) diff --git a/addons/base_export/controllers/main.py b/addons/base_export/controllers/main.py index adb0b9e6e9f..89a1d8be6d8 100644 --- a/addons/base_export/controllers/main.py +++ b/addons/base_export/controllers/main.py @@ -7,14 +7,13 @@ class Export(View): def fields_get(self, req, model): Model = req.session.model(model) fields = Model.fields_get(False, req.session.eval_context(req.context)) + fields.update({'id': {'string': 'ID'}, '.id': {'string': 'Database ID'}}) return fields @openerpweb.jsonrequest def get_fields(self, req, model, prefix='', field_parent=None, name= ''): fields = self.fields_get(req, model) - fields.update({'id': {'string': 'ID'}, '.id': {'string': 'Database ID'}}) - records = [] for key, value in fields.items(): record = {} @@ -73,3 +72,54 @@ class Export(View): def delete_export(self, req, export_id): req.session.model("ir.exports").unlink(export_id, req.session.eval_context(req.context)) return True + + @openerpweb.jsonrequest + def namelist(self,req, model, export_id): + + result = self.get_data(req, model, req.session.eval_context(req.context)) + ir_export_obj = req.session.model("ir.exports") + ir_export_line_obj = req.session.model("ir.exports.line") + + field = ir_export_obj.read(export_id) + fields = ir_export_line_obj.read(field['export_fields']) + + name_list = {} + [name_list.update({field['name']: result.get(field['name'])}) for field in fields] + print ":name_list::\n\n\n\n\n:",name_list + return name_list + + def get_data(self, req, model, context=None): + + ids = [] + context = context or {} + fields_data = {} + proxy = req.session.model(model) + fields = self.fields_get(req, model) + if not ids: + f1 = proxy.fields_view_get(False, 'tree', context)['fields'] + f2 = proxy.fields_view_get(False, 'form', context)['fields'] + + fields = dict(f1) + fields.update(f2) + + def rec(fields): + _fields = {'id': 'ID' , '.id': 'Database ID' } + def model_populate(fields, prefix_node='', prefix=None, prefix_value='', level=2): + fields_order = fields.keys() + fields_order.sort(lambda x,y: -cmp(fields[x].get('string', ''), fields[y].get('string', ''))) + + for field in fields_order: + fields_data[prefix_node+field] = fields[field] + if prefix_node: + fields_data[prefix_node + field]['string'] = '%s%s' % (prefix_value, fields_data[prefix_node + field]['string']) + st_name = fields[field]['string'] or field + _fields[prefix_node+field] = st_name + if fields[field].get('relation', False) and level>0: + fields2 = self.fields_get(req, fields[field]['relation']) + model_populate(fields2, prefix_node+field+'/', None, st_name+'/', level-1) + model_populate(fields) + + return _fields + + return rec(fields) + diff --git a/addons/base_export/static/src/js/base_export.js b/addons/base_export/static/src/js/base_export.js index 7b1137ac6ae..06ed5eacaa6 100644 --- a/addons/base_export/static/src/js/base_export.js +++ b/addons/base_export/static/src/js/base_export.js @@ -54,21 +54,35 @@ openerp.base_export.Export = openerp.base.Dialog.extend({ $("#ExistsExportList").show(); } else{ - this.rpc("/base_export/export/exist_export_lists", {"model": this.dataset.model}, function(export_list){ - if(export_list.length){ - $("#ExistsExportList").append(QWeb.render('Exists.ExportList', {'existing_exports':export_list})); - $('#delete_export_list').click(function(){ - select_exp = $("#saved_export_list option:selected") - if (select_exp.val()){ - self.rpc("/base_export/export/delete_export", {"export_id": parseInt(select_exp.val())}, {}); - select_exp.remove(); - if($("#saved_export_list option").length <= 1){ + this.rpc("/base_export/export/exist_export_lists", {"model": this.dataset.model}, function(export_list){ + if(export_list.length){ + $("#ExistsExportList").append(QWeb.render('Exists.ExportList', {'existing_exports':export_list})); + $("#saved_export_list").change(function(){ + $("#fields_list option").remove(); + export_id = $("#saved_export_list option:selected").val(); + if (export_id){ + self.rpc("/base_export/export/namelist", {"model": self.dataset.model, export_id: parseInt(export_id)}, self.do_load_export_field); + } + }); + $('#delete_export_list').click(function(){ + select_exp = $("#saved_export_list option:selected") + if (select_exp.val()){ + self.rpc("/base_export/export/delete_export", {"export_id": parseInt(select_exp.val())}, {}); + select_exp.remove(); + if($("#saved_export_list option").length <= 1){ $("#ExistsExportList").hide(); - } - } - }); - } - }); + } + } + }); + } + }); + } + }, + + do_load_export_field: function(field_list){ + var export_node = $("#fields_list"); + for (var key in field_list) { + export_node.append(new Option(field_list[key], key)); } }, From 5a09e97754228fa8c2f9ed337c6f7951a962d7d5 Mon Sep 17 00:00:00 2001 From: "Yogesh (OpenERP)" Date: Mon, 18 Jul 2011 11:54:59 +0530 Subject: [PATCH 24/47] [IMP] imporve display export button in list and form view. bzr revid: ysa@tinyerp.com-20110718062459-2kf2z0zmgoes4ied --- addons/base/static/src/js/views.js | 24 ++++++++++++++---------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/addons/base/static/src/js/views.js b/addons/base/static/src/js/views.js index 5efe27c7e21..07f1ce406f1 100644 --- a/addons/base/static/src/js/views.js +++ b/addons/base/static/src/js/views.js @@ -157,16 +157,6 @@ openerp.base.ViewManager = openerp.base.Controller.extend({ self.on_controller_inited(view_type, controller); }); this.views[view_type].controller = controller; - if(this.flags && this.flags.sidebar) { - if(this.active_view == 'list' || this.active_view == 'form') { - this.views[this.active_view].controller.$element.after(QWeb.render('ExportView')) - this.$element.find('#exportview').click(function(ev) { - var export_view = new openerp.base_export.Export(self.session, self.dataset, self.views); - export_view.start(false); - ev.preventDefault(); - }); - } - } } @@ -193,6 +183,20 @@ openerp.base.ViewManager = openerp.base.Controller.extend({ } } } + if(this.flags && this.flags.sidebar) { + if(this.$element.find('#exportview')){ + this.$element.find('#exportview').remove() + } + if(this.active_view == 'list' || this.active_view == 'form') { + console.log("this.views[this.active_view].controller.$element::",this.views[this.active_view].controller.$element) + this.views[this.active_view].controller.$element.after(QWeb.render('ExportView')) + this.$element.find('#exportview').click(function(ev) { + var export_view = new openerp.base_export.Export(self.session, self.dataset, self.views); + export_view.start(false); + ev.preventDefault(); + }); + } + } return view_promise; }, /** From 530f4361863e01162f60a0549cbcf5cc568d694d Mon Sep 17 00:00:00 2001 From: "Yogesh (OpenERP)" Date: Mon, 18 Jul 2011 12:05:25 +0530 Subject: [PATCH 25/47] Remove console log. bzr revid: ysa@tinyerp.com-20110718063525-0gsycc588oqmefzi --- addons/base/static/src/js/views.js | 1 - 1 file changed, 1 deletion(-) diff --git a/addons/base/static/src/js/views.js b/addons/base/static/src/js/views.js index 07f1ce406f1..3c566d64145 100644 --- a/addons/base/static/src/js/views.js +++ b/addons/base/static/src/js/views.js @@ -188,7 +188,6 @@ openerp.base.ViewManager = openerp.base.Controller.extend({ this.$element.find('#exportview').remove() } if(this.active_view == 'list' || this.active_view == 'form') { - console.log("this.views[this.active_view].controller.$element::",this.views[this.active_view].controller.$element) this.views[this.active_view].controller.$element.after(QWeb.render('ExportView')) this.$element.find('#exportview').click(function(ev) { var export_view = new openerp.base_export.Export(self.session, self.dataset, self.views); From f146e2a85e9a41c95684522a19da9028d33efa06 Mon Sep 17 00:00:00 2001 From: "Yogesh (OpenERP)" Date: Mon, 18 Jul 2011 18:19:40 +0530 Subject: [PATCH 26/47] [IMP] add on_click_export_data method for export data in csv file. bzr revid: ysa@tinyerp.com-20110718124940-kbxbqz90buuef93d --- addons/base_export/controllers/main.py | 41 +++++++++++++++++-- .../base_export/static/src/js/base_export.js | 23 ++++++++++- 2 files changed, 59 insertions(+), 5 deletions(-) diff --git a/addons/base_export/controllers/main.py b/addons/base_export/controllers/main.py index 89a1d8be6d8..38964111e2a 100644 --- a/addons/base_export/controllers/main.py +++ b/addons/base_export/controllers/main.py @@ -1,5 +1,7 @@ from base.controllers.main import View import openerpweb +import StringIO +import csv class Export(View): _cp_path = "/base_export/export" @@ -89,7 +91,6 @@ class Export(View): return name_list def get_data(self, req, model, context=None): - ids = [] context = context or {} fields_data = {} @@ -118,8 +119,42 @@ class Export(View): fields2 = self.fields_get(req, fields[field]['relation']) model_populate(fields2, prefix_node+field+'/', None, st_name+'/', level-1) model_populate(fields) - return _fields - return rec(fields) + def export_csv(self, req, fields, result): + fp = StringIO.StringIO() + writer = csv.writer(fp, quoting=csv.QUOTE_ALL) + + writer.writerow(fields) + + for data in result: + row = [] + for d in data: + if isinstance(d, basestring): + d = d.replace('\n',' ').replace('\t',' ') + try: + d = d.encode('utf-8') + except: + pass + if d is False: d = None + row.append(d) + writer.writerow(row) + + fp.seek(0) + data = fp.read() + fp.close() + return data + + @openerpweb.jsonrequest + def export_data(self, req, model, fields, ids, domain, import_compat=False, context=None): + context = req.session.eval_context(req.context) + modle_obj = req.session.model(model) + ids = ids or modle_obj.search(domain, context=context) + + field = fields.keys() + result = modle_obj.export_data(ids, field , context).get('datas',[]) + + if not import_compat: + field = fields.values() + return self.export_csv(req, field, result) diff --git a/addons/base_export/static/src/js/base_export.js b/addons/base_export/static/src/js/base_export.js index 06ed5eacaa6..07ca3ef8b1f 100644 --- a/addons/base_export/static/src/js/base_export.js +++ b/addons/base_export/static/src/js/base_export.js @@ -24,7 +24,7 @@ openerp.base_export.Export = openerp.base.Dialog.extend({ self.close(); }, "Export To File" : function() { - self.get_fields(); + self.on_click_export_data(); } }, close: function(event, ui){ self.close();} @@ -284,10 +284,29 @@ openerp.base_export.Export = openerp.base.Dialog.extend({ export_field.push(jQuery(this).val()); }); if (! export_field.length){ - alert('Please select fields to export...'); + alert('Please select fields to save export list...'); } return export_field; }, + on_click_export_data: function(){ + var self = this; + var export_field = {}; + var flag = true; + $("#fields_list option").each(function(){ + export_field[jQuery(this).val()] = jQuery(this).text(); + flag = false; + }); + if (flag){ + alert('Please select fields to export...'); + return; + } + + import_comp = $("#import_compat option:selected").val() + self.rpc("/base_export/export/export_data", {"model": self.dataset.model, "fields":export_field, 'ids': self.dataset.ids, 'domain': self.dataset.domain, "import_compat":parseInt(import_comp)}, function(data){ + window.location="data:text/csv;charset=utf8," + encodeURIComponent(data) + self.close(); + }); + }, close: function() { jQuery(this.$dialog).remove(); From 001b539ee8c856b1052a23f73c3ba76c9b0bd7cb Mon Sep 17 00:00:00 2001 From: "Yogesh (OpenERP)" Date: Tue, 19 Jul 2011 12:00:41 +0530 Subject: [PATCH 27/47] [FIX] fix problem. bzr revid: ysa@tinyerp.com-20110719063041-rwfcflad0vb91s12 --- addons/base/static/src/js/views.js | 2 +- addons/base_export/static/src/js/base_export.js | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/addons/base/static/src/js/views.js b/addons/base/static/src/js/views.js index fa00607a68a..ce53db4c7b3 100644 --- a/addons/base/static/src/js/views.js +++ b/addons/base/static/src/js/views.js @@ -187,7 +187,7 @@ openerp.base.ViewManager = openerp.base.Controller.extend({ if(this.active_view == 'list' || this.active_view == 'form') { this.views[this.active_view].controller.$element.after(QWeb.render('ExportView')) this.$element.find('#exportview').click(function(ev) { - var export_view = new openerp.base_export.Export(self.session, self.dataset, self.views); + var export_view = new openerp.base_export.Export(self, self.dataset); export_view.start(false); ev.preventDefault(); }); diff --git a/addons/base_export/static/src/js/base_export.js b/addons/base_export/static/src/js/base_export.js index 07ca3ef8b1f..baf1b8d2dac 100644 --- a/addons/base_export/static/src/js/base_export.js +++ b/addons/base_export/static/src/js/base_export.js @@ -3,8 +3,8 @@ QWeb.add_template('/base_export/static/src/xml/base_export.xml'); openerp.base.views.add('export', 'openerp.base_export.Export'); openerp.base_export.Export = openerp.base.Dialog.extend({ - init: function(session, dataset, views){ - this._super(session); + init: function(parent, dataset){ + this._super(parent); this.dataset = dataset this.selected_fields = {}; }, From dd8e7dd165f82798cbfe7ef4fe7878694829db05 Mon Sep 17 00:00:00 2001 From: "Yogesh (OpenERP)" Date: Tue, 19 Jul 2011 18:02:09 +0530 Subject: [PATCH 28/47] [IMP] implement onchange method of exoprt type field and change the tree structure of export fields. bzr revid: ysa@tinyerp.com-20110719123209-kvuqo2s4y57zx3br --- addons/base/static/src/js/views.js | 2 +- addons/base_export/controllers/main.py | 103 ++++++++++++++---- .../base_export/static/src/js/base_export.js | 22 +++- 3 files changed, 101 insertions(+), 26 deletions(-) diff --git a/addons/base/static/src/js/views.js b/addons/base/static/src/js/views.js index ce53db4c7b3..03056709043 100644 --- a/addons/base/static/src/js/views.js +++ b/addons/base/static/src/js/views.js @@ -187,7 +187,7 @@ openerp.base.ViewManager = openerp.base.Controller.extend({ if(this.active_view == 'list' || this.active_view == 'form') { this.views[this.active_view].controller.$element.after(QWeb.render('ExportView')) this.$element.find('#exportview').click(function(ev) { - var export_view = new openerp.base_export.Export(self, self.dataset); + var export_view = new openerp.base_export.Export(self, self.dataset, self.views); export_view.start(false); ev.preventDefault(); }); diff --git a/addons/base_export/controllers/main.py b/addons/base_export/controllers/main.py index 38964111e2a..ef87e51f59a 100644 --- a/addons/base_export/controllers/main.py +++ b/addons/base_export/controllers/main.py @@ -2,6 +2,47 @@ from base.controllers.main import View import openerpweb import StringIO import csv +import xml.dom.minidom + +def node_attributes(node): + attrs = node.attributes + + if not attrs: + return {} + # localName can be a unicode string, we're using attribute names as + # **kwargs keys and python-level kwargs don't take unicode keys kindly + # (they blow up) so we need to ensure all keys are ``str`` + return dict([(str(attrs.item(i).localName), attrs.item(i).nodeValue) + for i in range(attrs.length)]) + +def _fields_get_all(req, model, views, context=None): + + if context is None: + context = {} + + def parse(root, fields): + for node in root.childNodes: + if node.nodeName in ('form', 'notebook', 'page', 'group', 'tree', 'hpaned', 'vpaned'): + parse(node, fields) + elif node.nodeName=='field': + attrs = node_attributes(node) + name = attrs['name'] + fields[name].update(attrs) + return fields + + def get_view_fields(view): + return parse( + xml.dom.minidom.parseString(view['arch'].encode('utf-8')).documentElement, + view['fields']) + + model_obj = req.session.model(model) + tree_view = model_obj.fields_view_get(views.get('tree', False), 'tree', context) + form_view = model_obj.fields_view_get(views.get('form', False), 'form', context) + fields = {} + fields.update(get_view_fields(tree_view)) + fields.update(get_view_fields(form_view)) + return fields + class Export(View): _cp_path = "/base_export/export" @@ -9,42 +50,60 @@ class Export(View): def fields_get(self, req, model): Model = req.session.model(model) fields = Model.fields_get(False, req.session.eval_context(req.context)) - fields.update({'id': {'string': 'ID'}, '.id': {'string': 'Database ID'}}) return fields @openerpweb.jsonrequest - def get_fields(self, req, model, prefix='', field_parent=None, name= ''): - fields = self.fields_get(req, model) + def get_fields(self, req, model, prefix='', name= '', field_parent=None, import_compat=False, views_id={}): + fields = _fields_get_all(req, model, views=views_id, context=req.session.eval_context(req.context)) + if field_parent and import_compat: + fields = {} + fields.update({'id': {'string': 'ID'}, '.id': {'string': 'Database ID'}}) records = [] - for key, value in fields.items(): + fields_order = fields.keys() + fields_order.sort(lambda x,y: -cmp(fields[x].get('string', ''), fields[y].get('string', ''))) + for index, field in enumerate(fields_order): + value = fields[field] record = {} + if import_compat and value.get('readonly', False): + ok = False + for sl in value.get('states', {}).values(): + for s in sl: + ok = ok or (s==['readonly',False]) + if not ok: continue - id = prefix + (prefix and '/'or '') + key + id = prefix + (prefix and '/'or '') + field nm = name + (name and '/' or '') + value['string'] + record.update(id=id, string= nm, action='javascript: void(0)', target=None, icon=None, children=[]) records.append(record) - if value.get('relation', False): - ref = value.pop('relation') - cfields = self.fields_get(req, ref) - if (value['type'] == 'many2many'): - record['children'] = [] - record['params'] = {'model': ref, 'prefix': id, 'name': nm} + if len(nm.split('/')) < 3 and value.get('relation', False): + if import_compat: + ref = value.pop('relation') + cfields = self.fields_get(req, ref) + if (value['type'] == 'many2many'): + record['children'] = [] + record['params'] = {'model': ref, 'prefix': id, 'name': nm} - elif (value['type'] == 'many2one') or (value['type'] == 'many2many'): - cfields_order = cfields.keys() - cfields_order.sort(lambda x,y: -cmp(cfields[x].get('string', ''), cfields[y].get('string', ''))) - children = [] - for j, fld in enumerate(cfields_order): - cid = id + '/' + fld - cid = cid.replace(' ', '_') - children.append(cid) - record['children'] = children or [] - record['params'] = {'model': ref, 'prefix': id, 'name': nm} + elif value['type'] == 'many2one': + record['children'] = [id + '/id', id + '/.id'] + record['params'] = {'model': ref, 'prefix': id, 'name': nm} + else: + cfields_order = cfields.keys() + cfields_order.sort(lambda x,y: -cmp(cfields[x].get('string', ''), cfields[y].get('string', ''))) + children = [] + for j, fld in enumerate(cfields_order): + cid = id + '/' + fld + cid = cid.replace(' ', '_') + children.append(cid) + record['children'] = children or [] + record['params'] = {'model': ref, 'prefix': id, 'name': nm} else: + ref = value.pop('relation') + cfields = self.fields_get(req, ref) cfields_order = cfields.keys() cfields_order.sort(lambda x,y: -cmp(cfields[x].get('string', ''), cfields[y].get('string', ''))) children = [] @@ -102,6 +161,7 @@ class Export(View): fields = dict(f1) fields.update(f2) + fields.update({'id': {'string': 'ID'}, '.id': {'string': 'Database ID'}}) def rec(fields): _fields = {'id': 'ID' , '.id': 'Database ID' } @@ -117,6 +177,7 @@ class Export(View): _fields[prefix_node+field] = st_name if fields[field].get('relation', False) and level>0: fields2 = self.fields_get(req, fields[field]['relation']) + fields2.update({'id': {'string': 'ID'}, '.id': {'string': 'Database ID'}}) model_populate(fields2, prefix_node+field+'/', None, st_name+'/', level-1) model_populate(fields) return _fields diff --git a/addons/base_export/static/src/js/base_export.js b/addons/base_export/static/src/js/base_export.js index baf1b8d2dac..11a9510ae1b 100644 --- a/addons/base_export/static/src/js/base_export.js +++ b/addons/base_export/static/src/js/base_export.js @@ -3,10 +3,15 @@ QWeb.add_template('/base_export/static/src/xml/base_export.xml'); openerp.base.views.add('export', 'openerp.base_export.Export'); openerp.base_export.Export = openerp.base.Dialog.extend({ - init: function(parent, dataset){ + init: function(parent, dataset, views){ this._super(parent); this.dataset = dataset + this.views = views this.selected_fields = {}; + this.views_id = {}; + for (var key in this.views) { + this.views_id[key] = this.views[key].view_id + } }, start: function() { @@ -44,8 +49,16 @@ openerp.base_export.Export = openerp.base.Dialog.extend({ $('#export_new_list').click(function(){ self.on_show_save_list(); }); - this.rpc("/base_export/export/get_fields", {"model": this.dataset.model}, this.on_show_data); - + import_comp = $("#import_compat option:selected").val() + this.rpc("/base_export/export/get_fields", {"model": this.dataset.model,"import_compat":parseInt(import_comp), "views_id": this.views_id}, this.on_show_data); + $("#import_compat").change(function(){ + $("#fields_list option").remove(); + $("tr[id^='treerow-']").remove(); + import_comp = $("#import_compat option:selected").val(); + if(import_comp){ + self.rpc("/base_export/export/get_fields", {"model": self.dataset.model,"import_compat":parseInt(import_comp), "views_id": this.views_id}, self.on_show_data); + } + }); }, on_show_exists_export_list: function(){ @@ -157,7 +170,8 @@ openerp.base_export.Export = openerp.base.Dialog.extend({ if (is_loaded == 0) { if ($("tr[id='treerow-" + self.field_id +"']").find('img').attr('src') == '/base/static/src/img/expand.gif') { if (model){ - self.rpc("/base_export/export/get_fields", {"model": model, "prefix": prefix, "field_parent" : self.field_id, "name": name}, function (results) { + import_comp = $("#import_compat option:selected").val() + self.rpc("/base_export/export/get_fields", {"model": model, "prefix": prefix, "name": name, "field_parent" : self.field_id, "import_compat":parseInt(import_comp), "views_id": this.views_id}, function (results) { self.on_show_data(results); }); } From c1546ac368be928f990f261263eb163cae1fe72e Mon Sep 17 00:00:00 2001 From: "Yogesh (OpenERP)" Date: Tue, 19 Jul 2011 18:34:23 +0530 Subject: [PATCH 29/47] [IMP] if export type import compatible then all childs not display in m2o and o2m display all childs. bzr revid: ysa@tinyerp.com-20110719130423-cs8nexdnyqa42ili --- addons/base_export/controllers/main.py | 16 ++++++++++------ addons/base_export/static/src/js/base_export.js | 9 ++++++--- 2 files changed, 16 insertions(+), 9 deletions(-) diff --git a/addons/base_export/controllers/main.py b/addons/base_export/controllers/main.py index ef87e51f59a..dec0829b83b 100644 --- a/addons/base_export/controllers/main.py +++ b/addons/base_export/controllers/main.py @@ -53,15 +53,21 @@ class Export(View): return fields @openerpweb.jsonrequest - def get_fields(self, req, model, prefix='', name= '', field_parent=None, import_compat=False, views_id={}): - fields = _fields_get_all(req, model, views=views_id, context=req.session.eval_context(req.context)) + def get_fields(self, req, model, prefix='', name= '', field_parent=None, params={}): + import_compat = params.get("import_compat", False) + views_id = params.get("views_id", {}) - if field_parent and import_compat: + fields = _fields_get_all(req, model, views=views_id, context=req.session.eval_context(req.context)) + field_parent_type = params.get("parent_field_type",False) + + if import_compat and field_parent_type and field_parent_type == "many2one": fields = {} + fields.update({'id': {'string': 'ID'}, '.id': {'string': 'Database ID'}}) records = [] fields_order = fields.keys() fields_order.sort(lambda x,y: -cmp(fields[x].get('string', ''), fields[y].get('string', ''))) + for index, field in enumerate(fields_order): value = fields[field] record = {} @@ -74,9 +80,8 @@ class Export(View): id = prefix + (prefix and '/'or '') + field nm = name + (name and '/' or '') + value['string'] - record.update(id=id, string= nm, action='javascript: void(0)', - target=None, icon=None, children=[]) + target=None, icon=None, children=[], field_type=value.get('type',False)) records.append(record) if len(nm.split('/')) < 3 and value.get('relation', False): @@ -146,7 +151,6 @@ class Export(View): name_list = {} [name_list.update({field['name']: result.get(field['name'])}) for field in fields] - print ":name_list::\n\n\n\n\n:",name_list return name_list def get_data(self, req, model, context=None): diff --git a/addons/base_export/static/src/js/base_export.js b/addons/base_export/static/src/js/base_export.js index 11a9510ae1b..c4f80994c8f 100644 --- a/addons/base_export/static/src/js/base_export.js +++ b/addons/base_export/static/src/js/base_export.js @@ -50,13 +50,15 @@ openerp.base_export.Export = openerp.base.Dialog.extend({ self.on_show_save_list(); }); import_comp = $("#import_compat option:selected").val() - this.rpc("/base_export/export/get_fields", {"model": this.dataset.model,"import_compat":parseInt(import_comp), "views_id": this.views_id}, this.on_show_data); + var params = {"import_compat":parseInt(import_comp), "views_id": this.views_id} + this.rpc("/base_export/export/get_fields", {"model": this.dataset.model, "params": params}, this.on_show_data); $("#import_compat").change(function(){ $("#fields_list option").remove(); $("tr[id^='treerow-']").remove(); import_comp = $("#import_compat option:selected").val(); if(import_comp){ - self.rpc("/base_export/export/get_fields", {"model": self.dataset.model,"import_compat":parseInt(import_comp), "views_id": this.views_id}, self.on_show_data); + var params = {"import_compat":parseInt(import_comp), "views_id": this.views_id} + self.rpc("/base_export/export/get_fields", {"model": self.dataset.model, "params": params}, self.on_show_data); } }); }, @@ -171,7 +173,8 @@ openerp.base_export.Export = openerp.base.Dialog.extend({ if ($("tr[id='treerow-" + self.field_id +"']").find('img').attr('src') == '/base/static/src/img/expand.gif') { if (model){ import_comp = $("#import_compat option:selected").val() - self.rpc("/base_export/export/get_fields", {"model": model, "prefix": prefix, "name": name, "field_parent" : self.field_id, "import_compat":parseInt(import_comp), "views_id": this.views_id}, function (results) { + var params = {"import_compat":parseInt(import_comp), "views_id": this.views_id, "parent_field_type" : record['field_type']} + self.rpc("/base_export/export/get_fields", {"model": model, "prefix": prefix, "name": name, "field_parent" : self.field_id, "params":params}, function (results) { self.on_show_data(results); }); } From 0bf100cb537f5eee493379b92968a40a7206d784 Mon Sep 17 00:00:00 2001 From: "Yogesh (OpenERP)" Date: Thu, 21 Jul 2011 10:42:32 +0530 Subject: [PATCH 30/47] [IMP] Improve code, css and template. add image file. bzr revid: ysa@tinyerp.com-20110721051232-welyq15eoo9rhmb4 --- addons/base_export/controllers/main.py | 2 +- .../static/src/css/base_export.css | 69 ++++++++++-------- .../base_export/static/src/img/collapse.gif | Bin 0 -> 80 bytes addons/base_export/static/src/img/expand.gif | Bin 0 -> 81 bytes addons/base_export/static/src/img/header.gif | Bin 0 -> 182 bytes .../base_export/static/src/js/base_export.js | 22 +++--- .../static/src/xml/base_export.xml | 46 ++++++------ 7 files changed, 72 insertions(+), 67 deletions(-) create mode 100644 addons/base_export/static/src/img/collapse.gif create mode 100644 addons/base_export/static/src/img/expand.gif create mode 100644 addons/base_export/static/src/img/header.gif diff --git a/addons/base_export/controllers/main.py b/addons/base_export/controllers/main.py index dec0829b83b..9c09d8f3749 100644 --- a/addons/base_export/controllers/main.py +++ b/addons/base_export/controllers/main.py @@ -221,5 +221,5 @@ class Export(View): result = modle_obj.export_data(ids, field , context).get('datas',[]) if not import_compat: - field = fields.values() + field = [val.strip() for val in fields.values()] return self.export_csv(req, field, result) diff --git a/addons/base_export/static/src/css/base_export.css b/addons/base_export/static/src/css/base_export.css index 61ddb47451b..65dbbdbf7c1 100644 --- a/addons/base_export/static/src/css/base_export.css +++ b/addons/base_export/static/src/css/base_export.css @@ -1,34 +1,27 @@ -.row { +.row tr{ background-color: #FFFFFF; + font-size: 0.9em; + height: 22px; } -.row:hover { +.row:hover{ background-color: #F3F3F3; - color : #4F4F4F; + color : blue; } -.row.selected{ - background-color: #E0E0E0; - -} .fields-selector-export { width: 100%; height: 400px; } -.fields-selector-import { - width: 100%; - height: 300px; -} - .fields-selector-left { width: 45%; } -td.fields-selector-left div#fields_left { +div#left_field_panel { overflow: scroll; width: 100%; - height: 100%; + height: 400px; border: solid #999999 1px; } @@ -36,30 +29,44 @@ td.fields-selector-left div#fields_left { width: 15%; } -.fields-selector-center td { - padding: 2px 3px; -} - -.fields-selector-center a.button-a { - float: none; -} - .fields-selector-right { width: 45%; + height: 400px; } -.fields-selector-export select, -.fields-selector-import select { +.fields-selector-export select{ width: 100%; height: 100%; } -.fields-selector-export button, -.fields-selector-import button { - width: 100%; - margin: 5px 0; +.tree_header{ + border: 0.5px solid #E3E3E3; + text-align: left; + white-space: nowrap; + padding: 4px 5px; + background: url(/base_export/static/src/img/header.gif); } -td.side_spacing { - padding: 5px 5px 0px; -} \ No newline at end of file + +table.tree-grid{ + border: 1px solid #E3E3E3; + text-align: left; + white-space: nowrap; + background-color:#E3E3E3; + border-collapse: collapse; + width: 100%; +} + +table.tree-grid a:hover { + color: blue; + border: none; +} + +table.tree-grid a { + color: #5F5C5C; + border: none; +} + +.button { + border: 1px solid #006; +} diff --git a/addons/base_export/static/src/img/collapse.gif b/addons/base_export/static/src/img/collapse.gif new file mode 100644 index 0000000000000000000000000000000000000000..759e72ebcfe18bc1bc714b6451c301b12a1f27d5 GIT binary patch literal 80 zcmZ?wbhEHb6krfwSjfZx1Zin$|G_}ER?(XjE>+9+1>F4L?<>lq$z>(a_M) z&d$!w&CSfr%>V!YEC2ui00IC!000F$U=RqxFc3sh7{+lRNRlYZvM@~3IL`AxkVr%# knM^2@O2uNiTrikSMx)tmIGj$$!|i&%;IMd14u=2$JFIAN1ONa4 literal 0 HcmV?d00001 diff --git a/addons/base_export/static/src/js/base_export.js b/addons/base_export/static/src/js/base_export.js index c4f80994c8f..4ef196c2d65 100644 --- a/addons/base_export/static/src/js/base_export.js +++ b/addons/base_export/static/src/js/base_export.js @@ -35,6 +35,7 @@ openerp.base_export.Export = openerp.base.Dialog.extend({ close: function(event, ui){ self.close();} }); this.on_show_exists_export_list(); + jQuery(this.$dialog).removeClass('ui-dialog-content ui-widget-content'); $('#add_field').click(function(){ for (var key in self.selected_fields) { self.add_field(key, self.selected_fields[key]) @@ -52,9 +53,10 @@ openerp.base_export.Export = openerp.base.Dialog.extend({ import_comp = $("#import_compat option:selected").val() var params = {"import_compat":parseInt(import_comp), "views_id": this.views_id} this.rpc("/base_export/export/get_fields", {"model": this.dataset.model, "params": params}, this.on_show_data); + $("#import_compat").change(function(){ $("#fields_list option").remove(); - $("tr[id^='treerow-']").remove(); + $("#field-tree-structure").remove(); import_comp = $("#import_compat option:selected").val(); if(import_comp){ var params = {"import_compat":parseInt(import_comp), "views_id": this.views_id} @@ -170,7 +172,7 @@ openerp.base_export.Export = openerp.base.Dialog.extend({ } }); if (is_loaded == 0) { - if ($("tr[id='treerow-" + self.field_id +"']").find('img').attr('src') == '/base/static/src/img/expand.gif') { + if ($("tr[id='treerow-" + self.field_id +"']").find('img').attr('src') == '/base_export/static/src/img/expand.gif') { if (model){ import_comp = $("#import_compat option:selected").val() var params = {"import_compat":parseInt(import_comp), "views_id": this.views_id, "parent_field_type" : record['field_type']} @@ -193,8 +195,8 @@ openerp.base_export.Export = openerp.base.Dialog.extend({ var self = this; var current_tr = $("tr[id='treerow-" + self.field_id + "']"); if (current_tr.length >= 1){ - current_tr.find('img').attr('src','/base/static/src/img/collapse.gif'); - current_tr.after(QWeb.render('ExportTreeView-Secondary', {'fields': result})); + current_tr.find('img').attr('src','/base_export/static/src/img/collapse.gif'); + current_tr.after(QWeb.render('ExportTreeView-Secondary.children', {'fields': result})); } else{ $('#left_field_panel').append(QWeb.render('ExportTreeView-Secondary', {'fields': result})); @@ -215,7 +217,7 @@ openerp.base_export.Export = openerp.base.Dialog.extend({ arrow = {left: 37, up: 38, right: 39, down: 40 }; switch (keyCode) { case arrow.left: - if( jQuery(this).find('img').attr('src') == '/base/static/src/img/collapse.gif'){ + if( jQuery(this).find('img').attr('src') == '/base_export/static/src/img/collapse.gif'){ self.on_click(this.id, result); } break; @@ -227,7 +229,7 @@ openerp.base_export.Export = openerp.base.Dialog.extend({ $(elem).prev().find('a').focus(); break; case arrow.right: - if( jQuery(this).find('img').attr('src') == '/base/static/src/img/expand.gif'){ + if( jQuery(this).find('img').attr('src') == '/base_export/static/src/img/expand.gif'){ self.on_click(this.id, result); } break; @@ -266,10 +268,10 @@ openerp.base_export.Export = openerp.base.Dialog.extend({ showcontent: function (id, flag) { var first_child = $("tr[id='treerow-" + id + "']").find('img') if (flag) { - first_child.attr('src', '/base/static/src/img/expand.gif'); + first_child.attr('src', '/base_export/static/src/img/expand.gif'); } else { - first_child.attr('src', '/base/static/src/img/collapse.gif'); + first_child.attr('src', '/base_export/static/src/img/collapse.gif'); } var child_field = $("tr[id^='treerow-" + id +"/']") var child_len = (id.split("/")).length + 1 @@ -279,8 +281,8 @@ openerp.base_export.Export = openerp.base.Dialog.extend({ } else { if(child_len == (child_field[i].id.split("/")).length){ - if( jQuery(child_field[i]).find('img').attr('src') == '/base/static/src/img/collapse.gif'){ - jQuery(child_field[i]).find('img').attr('src', '/base/static/src/img/expand.gif') + if( jQuery(child_field[i]).find('img').attr('src') == '/base_export/static/src/img/collapse.gif'){ + jQuery(child_field[i]).find('img').attr('src', '/base_export/static/src/img/expand.gif') } $(child_field[i]).show(); } diff --git a/addons/base_export/static/src/xml/base_export.xml b/addons/base_export/static/src/xml/base_export.xml index c5459ad888b..f8b41c06d77 100644 --- a/addons/base_export/static/src/xml/base_export.xml +++ b/addons/base_export/static/src/xml/base_export.xml @@ -5,20 +5,20 @@ -
@@ -115,9 +116,24 @@
+ +
+
- - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file From a0a95f2a6ea94f56e678602ae09eebbc8bd04cba Mon Sep 17 00:00:00 2001 From: "Kunal Chavda (OpenERP)" Date: Fri, 22 Jul 2011 18:31:57 +0530 Subject: [PATCH 39/47] [IMP]Remove style from selection box. bzr revid: kch@tinyerp.com-20110722130157-ijq40kghbk16io4m --- addons/base/static/src/xml/base.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/base/static/src/xml/base.xml b/addons/base/static/src/xml/base.xml index fee6a07281b..ad55f2f90a5 100644 --- a/addons/base/static/src/xml/base.xml +++ b/addons/base/static/src/xml/base.xml @@ -951,7 +951,7 @@ +
+ This wizard will export all data that matches the current search criteria to a CSV file. You can export all data or only the fields that can be reimported after modification.
+ + + + + + + + + + + + + + + + + + + + + diff --git a/addons/base_export/__init__.py b/addons/base_export/__init__.py deleted file mode 100644 index 4a64491e6bb..00000000000 --- a/addons/base_export/__init__.py +++ /dev/null @@ -1,2 +0,0 @@ -#!/usr/bin/python -import controllers diff --git a/addons/base_export/__openerp__.py b/addons/base_export/__openerp__.py deleted file mode 100644 index 53347c57d04..00000000000 --- a/addons/base_export/__openerp__.py +++ /dev/null @@ -1,10 +0,0 @@ -{ - "name": "Base Export", - "version": "2.0", - "depends": ['base'], - "js": [ - 'static/src/js/base_export.js' - ], - "css": ["static/src/css/base_export.css"], - 'active': True -} diff --git a/addons/base_export/controllers/__init__.py b/addons/base_export/controllers/__init__.py deleted file mode 100644 index 039d9715fab..00000000000 --- a/addons/base_export/controllers/__init__.py +++ /dev/null @@ -1 +0,0 @@ -import main \ No newline at end of file diff --git a/addons/base_export/controllers/main.py b/addons/base_export/controllers/main.py deleted file mode 100644 index 3aa73147ebb..00000000000 --- a/addons/base_export/controllers/main.py +++ /dev/null @@ -1,260 +0,0 @@ -from base.controllers.main import View -import openerpweb -import StringIO -import csv -import xml.dom.minidom -import re - -def export_csv(fields, result): - fp = StringIO.StringIO() - writer = csv.writer(fp, quoting=csv.QUOTE_ALL) - - writer.writerow(fields) - - for data in result: - row = [] - for d in data: - if isinstance(d, basestring): - d = d.replace('\n',' ').replace('\t',' ') - try: - d = d.encode('utf-8') - except: - pass - if d is False: d = None - row.append(d) - writer.writerow(row) - - fp.seek(0) - data = fp.read() - fp.close() - return data - -def export_xls(fieldnames, table): - try: - import xlwt - except ImportError: - common.error(_('Import Error.'), _('Please install xlwt library to export to MS Excel.')) - - workbook = xlwt.Workbook() - worksheet = workbook.add_sheet('Sheet 1') - - for i, fieldname in enumerate(fieldnames): - worksheet.write(0, i, str(fieldname)) - worksheet.col(i).width = 8000 # around 220 pixels - - style = xlwt.easyxf('align: wrap yes') - - for row_index, row in enumerate(table): - for cell_index, cell_value in enumerate(row): - cell_value = str(cell_value) - cell_value = re.sub("\r", " ", cell_value) - worksheet.write(row_index + 1, cell_index, cell_value, style) - - - fp = StringIO.StringIO() - workbook.save(fp) - fp.seek(0) - data = fp.read() - fp.close() - #return data.decode('ISO-8859-1') - return unicode(data, 'utf-8', 'replace') - -def node_attributes(node): - attrs = node.attributes - - if not attrs: - return {} - # localName can be a unicode string, we're using attribute names as - # **kwargs keys and python-level kwargs don't take unicode keys kindly - # (they blow up) so we need to ensure all keys are ``str`` - return dict([(str(attrs.item(i).localName), attrs.item(i).nodeValue) - for i in range(attrs.length)]) - -def _fields_get_all(req, model, views, context=None): - - if context is None: - context = {} - - def parse(root, fields): - for node in root.childNodes: - if node.nodeName in ('form', 'notebook', 'page', 'group', 'tree', 'hpaned', 'vpaned'): - parse(node, fields) - elif node.nodeName=='field': - attrs = node_attributes(node) - name = attrs['name'] - fields[name].update(attrs) - return fields - - def get_view_fields(view): - return parse( - xml.dom.minidom.parseString(view['arch'].encode('utf-8')).documentElement, - view['fields']) - - model_obj = req.session.model(model) - tree_view = model_obj.fields_view_get(views.get('tree', False), 'tree', context) - form_view = model_obj.fields_view_get(views.get('form', False), 'form', context) - fields = {} - fields.update(get_view_fields(tree_view)) - fields.update(get_view_fields(form_view)) - return fields - - -class Export(View): - _cp_path = "/base_export/export" - - def fields_get(self, req, model): - Model = req.session.model(model) - fields = Model.fields_get(False, req.session.eval_context(req.context)) - return fields - - @openerpweb.jsonrequest - def get_fields(self, req, model, prefix='', name= '', field_parent=None, params={}): - import_compat = params.get("import_compat", False) - views_id = params.get("views_id", {}) - - fields = _fields_get_all(req, model, views=views_id, context=req.session.eval_context(req.context)) - field_parent_type = params.get("parent_field_type",False) - - if import_compat and field_parent_type and field_parent_type == "many2one": - fields = {} - - fields.update({'id': {'string': 'ID'}, '.id': {'string': 'Database ID'}}) - records = [] - fields_order = fields.keys() - fields_order.sort(lambda x,y: -cmp(fields[x].get('string', ''), fields[y].get('string', ''))) - - for index, field in enumerate(fields_order): - value = fields[field] - record = {} - if import_compat and value.get('readonly', False): - ok = False - for sl in value.get('states', {}).values(): - for s in sl: - ok = ok or (s==['readonly',False]) - if not ok: continue - - id = prefix + (prefix and '/'or '') + field - nm = name + (name and '/' or '') + value['string'] - record.update(id=id, string= nm, action='javascript: void(0)', - target=None, icon=None, children=[], field_type=value.get('type',False), required=value.get('required', False)) - records.append(record) - - if len(nm.split('/')) < 3 and value.get('relation', False): - if import_compat: - ref = value.pop('relation') - cfields = self.fields_get(req, ref) - if (value['type'] == 'many2many'): - record['children'] = [] - record['params'] = {'model': ref, 'prefix': id, 'name': nm} - - elif value['type'] == 'many2one': - record['children'] = [id + '/id', id + '/.id'] - record['params'] = {'model': ref, 'prefix': id, 'name': nm} - - else: - cfields_order = cfields.keys() - cfields_order.sort(lambda x,y: -cmp(cfields[x].get('string', ''), cfields[y].get('string', ''))) - children = [] - for j, fld in enumerate(cfields_order): - cid = id + '/' + fld - cid = cid.replace(' ', '_') - children.append(cid) - record['children'] = children or [] - record['params'] = {'model': ref, 'prefix': id, 'name': nm} - else: - ref = value.pop('relation') - cfields = self.fields_get(req, ref) - cfields_order = cfields.keys() - cfields_order.sort(lambda x,y: -cmp(cfields[x].get('string', ''), cfields[y].get('string', ''))) - children = [] - for j, fld in enumerate(cfields_order): - cid = id + '/' + fld - cid = cid.replace(' ', '_') - children.append(cid) - record['children'] = children or [] - record['params'] = {'model': ref, 'prefix': id, 'name': nm} - - records.reverse() - return records - - @openerpweb.jsonrequest - def save_export_lists(self, req, name, model, field_list): - result = {'resource':model, 'name':name, 'export_fields': []} - for field in field_list: - result['export_fields'].append((0, 0, {'name': field})) - return req.session.model("ir.exports").create(result, req.session.eval_context(req.context)) - - @openerpweb.jsonrequest - def exist_export_lists(self, req, model): - export_model = req.session.model("ir.exports") - return export_model.read(export_model.search([('resource', '=', model)]), ['name']) - - @openerpweb.jsonrequest - def delete_export(self, req, export_id): - req.session.model("ir.exports").unlink(export_id, req.session.eval_context(req.context)) - return True - - @openerpweb.jsonrequest - def namelist(self,req, model, export_id): - - result = self.get_data(req, model, req.session.eval_context(req.context)) - ir_export_obj = req.session.model("ir.exports") - ir_export_line_obj = req.session.model("ir.exports.line") - - field = ir_export_obj.read(export_id) - fields = ir_export_line_obj.read(field['export_fields']) - - name_list = {} - [name_list.update({field['name']: result.get(field['name'])}) for field in fields] - return name_list - - def get_data(self, req, model, context=None): - ids = [] - context = context or {} - fields_data = {} - proxy = req.session.model(model) - fields = self.fields_get(req, model) - if not ids: - f1 = proxy.fields_view_get(False, 'tree', context)['fields'] - f2 = proxy.fields_view_get(False, 'form', context)['fields'] - - fields = dict(f1) - fields.update(f2) - fields.update({'id': {'string': 'ID'}, '.id': {'string': 'Database ID'}}) - - def rec(fields): - _fields = {'id': 'ID' , '.id': 'Database ID' } - def model_populate(fields, prefix_node='', prefix=None, prefix_value='', level=2): - fields_order = fields.keys() - fields_order.sort(lambda x,y: -cmp(fields[x].get('string', ''), fields[y].get('string', ''))) - - for field in fields_order: - fields_data[prefix_node+field] = fields[field] - if prefix_node: - fields_data[prefix_node + field]['string'] = '%s%s' % (prefix_value, fields_data[prefix_node + field]['string']) - st_name = fields[field]['string'] or field - _fields[prefix_node+field] = st_name - if fields[field].get('relation', False) and level>0: - fields2 = self.fields_get(req, fields[field]['relation']) - fields2.update({'id': {'string': 'ID'}, '.id': {'string': 'Database ID'}}) - model_populate(fields2, prefix_node+field+'/', None, st_name+'/', level-1) - model_populate(fields) - return _fields - return rec(fields) - - @openerpweb.jsonrequest - def export_data(self, req, model, fields, ids, domain, import_compat=False, export_format="csv", context=None): - context = req.session.eval_context(req.context) - modle_obj = req.session.model(model) - ids = ids or modle_obj.search(domain, context=context) - - field = fields.keys() - result = modle_obj.export_data(ids, field , context).get('datas',[]) - - if not import_compat: - field = [val.strip() for val in fields.values()] - - if export_format == 'xls': - return export_xls(field, result) - else: - return export_csv(field, result) diff --git a/addons/base_export/static/src/img/collapse.gif b/addons/base_export/static/src/img/collapse.gif deleted file mode 100644 index 759e72ebcfe18bc1bc714b6451c301b12a1f27d5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 80 zcmZ?wbhEHb6krfwSjfZx1Zin$|G_} - - - Export - - - -
- @@ -30,7 +30,7 @@
- +
@@ -41,40 +41,30 @@ - - @@ -85,10 +75,16 @@ +
Available fields
-
- - - - - -
Name
- -
-
-
+
+
- +
- +
- +
- +
+
+ + +
Name
+ +
- +
@@ -98,12 +94,12 @@ From 58c601ab11adf7d7fd4d6617168844fce924ee86 Mon Sep 17 00:00:00 2001 From: "Kunal Chavda (OpenERP)" Date: Thu, 21 Jul 2011 14:14:20 +0530 Subject: [PATCH 31/47] [IMP]Improve code for bind ctrl key for multiple selection. bzr revid: kch@tinyerp.com-20110721084420-d30pnissxcxude0a --- .../static/src/css/base_export.css | 4 + .../base_export/static/src/js/base_export.js | 135 ++++++++++-------- 2 files changed, 81 insertions(+), 58 deletions(-) diff --git a/addons/base_export/static/src/css/base_export.css b/addons/base_export/static/src/css/base_export.css index 65dbbdbf7c1..68a2ec202af 100644 --- a/addons/base_export/static/src/css/base_export.css +++ b/addons/base_export/static/src/css/base_export.css @@ -4,6 +4,10 @@ height: 22px; } +tr.ui-selected td { + background-color: #CCCCCC; +} + .row:hover{ background-color: #F3F3F3; color : blue; diff --git a/addons/base_export/static/src/js/base_export.js b/addons/base_export/static/src/js/base_export.js index 4ef196c2d65..2fd236cd73d 100644 --- a/addons/base_export/static/src/js/base_export.js +++ b/addons/base_export/static/src/js/base_export.js @@ -7,7 +7,6 @@ openerp.base_export.Export = openerp.base.Dialog.extend({ this._super(parent); this.dataset = dataset this.views = views - this.selected_fields = {}; this.views_id = {}; for (var key in this.views) { this.views_id[key] = this.views[key].view_id @@ -37,8 +36,14 @@ openerp.base_export.Export = openerp.base.Dialog.extend({ this.on_show_exists_export_list(); jQuery(this.$dialog).removeClass('ui-dialog-content ui-widget-content'); $('#add_field').click(function(){ - for (var key in self.selected_fields) { - self.add_field(key, self.selected_fields[key]) + if($("#field-tree-structure tr.ui-selected")){ + var fld = $("#field-tree-structure tr.ui-selected").find('a'); + for (var i=0;i Date: Thu, 21 Jul 2011 14:41:02 +0530 Subject: [PATCH 32/47] [IMP] improve css and template. bzr revid: ysa@tinyerp.com-20110721091102-2bf321qehu233jid --- addons/base_export/static/src/css/base_export.css | 9 +++++---- addons/base_export/static/src/js/base_export.js | 2 +- addons/base_export/static/src/xml/base_export.xml | 12 ++++++------ 3 files changed, 12 insertions(+), 11 deletions(-) diff --git a/addons/base_export/static/src/css/base_export.css b/addons/base_export/static/src/css/base_export.css index 68a2ec202af..198db30b5d0 100644 --- a/addons/base_export/static/src/css/base_export.css +++ b/addons/base_export/static/src/css/base_export.css @@ -1,6 +1,6 @@ .row tr{ background-color: #FFFFFF; - font-size: 0.9em; + font-size: 0.8em; height: 22px; } @@ -19,7 +19,7 @@ tr.ui-selected td { } .fields-selector-left { - width: 45%; + width: 50%; } div#left_field_panel { @@ -30,7 +30,7 @@ div#left_field_panel { } .fields-selector-center { - width: 15%; + width: 102px; } .fields-selector-right { @@ -71,6 +71,7 @@ table.tree-grid a { border: none; } -.button { +.button-export { border: 1px solid #006; + background-color: #F3F3F3; } diff --git a/addons/base_export/static/src/js/base_export.js b/addons/base_export/static/src/js/base_export.js index 2fd236cd73d..b00da47e924 100644 --- a/addons/base_export/static/src/js/base_export.js +++ b/addons/base_export/static/src/js/base_export.js @@ -20,7 +20,7 @@ openerp.base_export.Export = openerp.base.Dialog.extend({ self.dialog_title = "Export Data " self.open({ modal: true, - width: '50%', + width: '55%', height: 'auto', position: 'top', buttons : { diff --git a/addons/base_export/static/src/xml/base_export.xml b/addons/base_export/static/src/xml/base_export.xml index f8b41c06d77..84bdf683529 100644 --- a/addons/base_export/static/src/xml/base_export.xml +++ b/addons/base_export/static/src/xml/base_export.xml @@ -1,7 +1,7 @@ \ No newline at end of file From 7b11b0d076667a41a326b6d58dbe25b913995484 Mon Sep 17 00:00:00 2001 From: "Kunal Chavda (OpenERP)" Date: Fri, 22 Jul 2011 17:38:26 +0530 Subject: [PATCH 37/47] [IMP]Implement code for o2m field should not select. bzr revid: kch@tinyerp.com-20110722120826-uattcrxljouh9rx2 --- .../static/src/css/base_export.css | 4 ++ .../base_export/static/src/js/base_export.js | 44 ++++++++++++++----- 2 files changed, 36 insertions(+), 12 deletions(-) diff --git a/addons/base_export/static/src/css/base_export.css b/addons/base_export/static/src/css/base_export.css index 431287ca471..485338b63e3 100644 --- a/addons/base_export/static/src/css/base_export.css +++ b/addons/base_export/static/src/css/base_export.css @@ -12,6 +12,10 @@ tr.ui-selected td { background-color: #D2D2FF; } +.readonlyfield{ + background-color: DarkGray; +} + .row:hover{ background-color: #F3F3F3; } diff --git a/addons/base_export/static/src/js/base_export.js b/addons/base_export/static/src/js/base_export.js index 8814edc946b..566a6cf167c 100644 --- a/addons/base_export/static/src/js/base_export.js +++ b/addons/base_export/static/src/js/base_export.js @@ -207,6 +207,10 @@ openerp.base_export.Export = openerp.base.Dialog.extend({ $('#left_field_panel').append(QWeb.render('ExportTreeView-Secondary', {'fields': result})); } _.each(result, function(record) { + if(record.field_type == "one2many"){ + var o2m_fld = $("tr[id^='treerow-" + record.id + "']").find('#tree-column'); + o2m_fld.addClass("readonlyfield"); + } if ((record.required == true) || record.required == "True"){ var required_fld = $("tr[id^='treerow-" + record.id + "']").find('#tree-column'); required_fld.addClass("requiredfield"); @@ -226,12 +230,16 @@ openerp.base_export.Export = openerp.base.Dialog.extend({ if (this.rowIndex >=self.row_index){ for (i = (self.row_index-1); i < this.rowIndex; i++) { scnd_click = $("tr[id^='treerow-']")[i]; - $(scnd_click).addClass("ui-selected"); + if(!$(scnd_click).find('#tree-column').hasClass("readonlyfield")){ + $(scnd_click).addClass("ui-selected"); + } } }else{ for (i = (self.row_index-1); i >= (this.rowIndex-1); i--) { scnd_click = $("tr[id^='treerow-']")[i]; - $(scnd_click).addClass("ui-selected"); + if(!$(scnd_click).find('#tree-column').hasClass("readonlyfield")){ + $(scnd_click).addClass("ui-selected"); + } } } } @@ -241,7 +249,10 @@ openerp.base_export.Export = openerp.base.Dialog.extend({ $("tr[id^='treerow-" + record.id + "']").keyup(function (e) { self.row_index = 0; }); - + var o2m_selection = $("tr[id^='treerow-" + record.id + "']").find('#tree-column'); + if ($(o2m_selection).hasClass("readonlyfield")){ + return false; + } var selected = $("tr.ui-selected"); if ($(this).hasClass("ui-selected") && (e.ctrlKey == true)){ $(this).find('a').blur(); @@ -278,7 +289,9 @@ openerp.base_export.Export = openerp.base.Dialog.extend({ while($(elem).prev().is(":visible") == false){ elem = $(elem).prev(); } - $(elem).prev().addClass("ui-selected"); + if(!$(elem).prev().find('#tree-column').hasClass("readonlyfield")){ + $(elem).prev().addClass("ui-selected"); + } $(elem).prev().find('a').focus(); break; case arrow.right: @@ -292,24 +305,31 @@ openerp.base_export.Export = openerp.base.Dialog.extend({ while($(elem).next().is(":visible") == false){ elem = $(elem).next(); } - $(elem).next().addClass("ui-selected"); + if(!$(elem).next().find('#tree-column').hasClass("readonlyfield")){ + $(elem).next().addClass("ui-selected"); + } $(elem).next().find('a').focus(); break; } }); - $("tr[id^='treerow-" + record.id + "']").dblclick(function (e) { - var field_id = $(this).find("a").attr("id"); - if(field_id){ - self.add_field(field_id.split('-')[1], $(this).find("a").attr("string")) - } - }); + $("tr[id^='treerow-" + record.id + "']").dblclick(function (e) { + var o2m_selection = $("tr[id^='treerow-" + record.id + "']").find('#tree-column'); + if (! $(o2m_selection).hasClass("readonlyfield")){ + var field_id = $(this).find("a").attr("id"); + if(field_id){ + self.add_field(field_id.split('-')[1], $(this).find("a").attr("string")) + } + } + }); }); $('#fields_list').mouseover(function(event){ if(event.relatedTarget){ if (event.relatedTarget.attributes['id'] && event.relatedTarget.attributes['string']){ field_id = event.relatedTarget.attributes["id"]["value"] if (field_id && field_id.split("-")[0] == 'export'){ - self.add_field(field_id.split("-")[1], event.relatedTarget.attributes["string"]["value"]); + if(!$("tr[id^='treerow-" + field_id.split("-")[1] + "']").find('#tree-column').hasClass("readonlyfield")){ + self.add_field(field_id.split("-")[1], event.relatedTarget.attributes["string"]["value"]); + } } } } From 7ff6fafdaf7e665fd29ba6ba55bb76c3088e45ea Mon Sep 17 00:00:00 2001 From: "Yogesh (OpenERP)" Date: Fri, 22 Jul 2011 18:22:14 +0530 Subject: [PATCH 38/47] [MOVE] move export related functionality base_export to base module. bzr revid: ysa@tinyerp.com-20110722125214-3lrqho65skbzokcy --- addons/base/controllers/main.py | 273 +++++++++++++++++- addons/base/static/src/base.html | 2 + .../static/src/css/export.css} | 2 +- addons/base/static/src/img/collapse.gif | Bin addons/base/static/src/img/expand.gif | Bin .../static/src/img/header.gif | Bin addons/base/static/src/js/base.js | 3 + .../static/src/js/export.js} | 38 ++- addons/base/static/src/js/views.js | 5 +- addons/base/static/src/xml/base.xml | 149 +++++++++- addons/base_export/__init__.py | 2 - addons/base_export/__openerp__.py | 10 - addons/base_export/controllers/__init__.py | 1 - addons/base_export/controllers/main.py | 260 ----------------- .../base_export/static/src/img/collapse.gif | Bin 80 -> 0 bytes addons/base_export/static/src/img/expand.gif | Bin 81 -> 0 bytes .../static/src/xml/base_export.xml | 143 --------- 17 files changed, 437 insertions(+), 451 deletions(-) rename addons/{base_export/static/src/css/base_export.css => base/static/src/css/export.css} (95%) mode change 100755 => 100644 addons/base/static/src/img/collapse.gif mode change 100755 => 100644 addons/base/static/src/img/expand.gif rename addons/{base_export => base}/static/src/img/header.gif (100%) rename addons/{base_export/static/src/js/base_export.js => base/static/src/js/export.js} (88%) delete mode 100644 addons/base_export/__init__.py delete mode 100644 addons/base_export/__openerp__.py delete mode 100644 addons/base_export/controllers/__init__.py delete mode 100644 addons/base_export/controllers/main.py delete mode 100644 addons/base_export/static/src/img/collapse.gif delete mode 100644 addons/base_export/static/src/img/expand.gif delete mode 100644 addons/base_export/static/src/xml/base_export.xml diff --git a/addons/base/controllers/main.py b/addons/base/controllers/main.py index da471499087..be1f103d6f9 100644 --- a/addons/base/controllers/main.py +++ b/addons/base/controllers/main.py @@ -10,6 +10,8 @@ import openerpweb.ast import openerpweb.nonliterals import cherrypy +import csv +import xml.dom.minidom # Should move to openerpweb.Xml2Json class Xml2Json: @@ -179,7 +181,7 @@ class Session(openerpweb.Controller): context, domain = eval_context_and_domain(req.session, openerpweb.nonliterals.CompoundContext(*(contexts or [])), openerpweb.nonliterals.CompoundDomain(*(domains or []))) - + group_by_sequence = [] for candidate in (group_by_seq or []): ctx = req.session.eval_context(candidate, context) @@ -190,7 +192,7 @@ class Session(openerpweb.Controller): group_by_sequence.append(group_by) else: group_by_sequence.extend(group_by) - + return { 'context': context, 'domain': domain, @@ -203,7 +205,7 @@ class Session(openerpweb.Controller): This method store an action object in the session object and returns an integer identifying that action. The method get_session_action() can be used to get back the action. - + :param the_action: The action to save in the session. :type the_action: anything :return: A key identifying the saved action. @@ -226,7 +228,7 @@ class Session(openerpweb.Controller): """ Gets back a previously saved action. This method can return None if the action was saved since too much time (this case should be handled in a smart way). - + :param key: The key given by save_session_action() :type key: integer :return: The saved action or None. @@ -361,7 +363,7 @@ class Menu(openerpweb.Controller): menu_items = Menus.read(menu_ids, ['name', 'sequence', 'parent_id'], context) menu_root = {'id': False, 'name': 'root', 'parent_id': [-1, '']} menu_items.append(menu_root) - + # make a tree using parent_id menu_items_map = dict((menu_item["id"], menu_item) for menu_item in menu_items) for menu_item in menu_items: @@ -468,7 +470,7 @@ class DataSet(openerpweb.Controller): record_map = dict((record['id'], record) for record in records) return [record_map[id] for id in ids if record_map.get(id)] - + @openerpweb.jsonrequest def load(self, req, model, id, fields): m = req.session.model(model) @@ -631,7 +633,7 @@ class View(openerpweb.Controller): except ValueError: # not a literal return openerpweb.nonliterals.Domain(session, domain) - + def parse_context(self, context, session): """ Parses an arbitrary string containing a context, transforms it to either a literal context or a :class:`openerpweb.nonliterals.Context` @@ -832,4 +834,259 @@ class Action(openerpweb.Controller): return clean_action(req.session.model('ir.actions.server').run( [action_id], req.session.eval_context(req.context)), req.session) -# +def export_csv(fields, result): + import StringIO + fp = StringIO.StringIO() + writer = csv.writer(fp, quoting=csv.QUOTE_ALL) + + writer.writerow(fields) + + for data in result: + row = [] + for d in data: + if isinstance(d, basestring): + d = d.replace('\n',' ').replace('\t',' ') + try: + d = d.encode('utf-8') + except: + pass + if d is False: d = None + row.append(d) + writer.writerow(row) + + fp.seek(0) + data = fp.read() + fp.close() + return data + +def export_xls(fieldnames, table): + import StringIO + try: + import xlwt + except ImportError: + common.error(_('Import Error.'), _('Please install xlwt library to export to MS Excel.')) + + workbook = xlwt.Workbook() + worksheet = workbook.add_sheet('Sheet 1') + + for i, fieldname in enumerate(fieldnames): + worksheet.write(0, i, str(fieldname)) + worksheet.col(i).width = 8000 # around 220 pixels + + style = xlwt.easyxf('align: wrap yes') + + for row_index, row in enumerate(table): + for cell_index, cell_value in enumerate(row): + cell_value = str(cell_value) + cell_value = re.sub("\r", " ", cell_value) + worksheet.write(row_index + 1, cell_index, cell_value, style) + + + fp = StringIO.StringIO() + workbook.save(fp) + fp.seek(0) + data = fp.read() + fp.close() + #return data.decode('ISO-8859-1') + return unicode(data, 'utf-8', 'replace') + +def node_attributes(node): + attrs = node.attributes + + if not attrs: + return {} + # localName can be a unicode string, we're using attribute names as + # **kwargs keys and python-level kwargs don't take unicode keys kindly + # (they blow up) so we need to ensure all keys are ``str`` + return dict([(str(attrs.item(i).localName), attrs.item(i).nodeValue) + for i in range(attrs.length)]) + +def _fields_get_all(req, model, views, context=None): + + if context is None: + context = {} + + def parse(root, fields): + for node in root.childNodes: + if node.nodeName in ('form', 'notebook', 'page', 'group', 'tree', 'hpaned', 'vpaned'): + parse(node, fields) + elif node.nodeName=='field': + attrs = node_attributes(node) + name = attrs['name'] + fields[name].update(attrs) + return fields + + def get_view_fields(view): + return parse( + xml.dom.minidom.parseString(view['arch'].encode('utf-8')).documentElement, + view['fields']) + + model_obj = req.session.model(model) + tree_view = model_obj.fields_view_get(views.get('tree', False), 'tree', context) + form_view = model_obj.fields_view_get(views.get('form', False), 'form', context) + fields = {} + fields.update(get_view_fields(tree_view)) + fields.update(get_view_fields(form_view)) + return fields + + +class Export(View): + _cp_path = "/base/export" + + def fields_get(self, req, model): + Model = req.session.model(model) + fields = Model.fields_get(False, req.session.eval_context(req.context)) + return fields + + @openerpweb.jsonrequest + def get_fields(self, req, model, prefix='', name= '', field_parent=None, params={}): + import_compat = params.get("import_compat", False) + views_id = params.get("views_id", {}) + + fields = _fields_get_all(req, model, views=views_id, context=req.session.eval_context(req.context)) + field_parent_type = params.get("parent_field_type",False) + + if import_compat and field_parent_type and field_parent_type == "many2one": + fields = {} + + fields.update({'id': {'string': 'ID'}, '.id': {'string': 'Database ID'}}) + records = [] + fields_order = fields.keys() + fields_order.sort(lambda x,y: -cmp(fields[x].get('string', ''), fields[y].get('string', ''))) + + for index, field in enumerate(fields_order): + value = fields[field] + record = {} + if import_compat and value.get('readonly', False): + ok = False + for sl in value.get('states', {}).values(): + for s in sl: + ok = ok or (s==['readonly',False]) + if not ok: continue + + id = prefix + (prefix and '/'or '') + field + nm = name + (name and '/' or '') + value['string'] + record.update(id=id, string= nm, action='javascript: void(0)', + target=None, icon=None, children=[], field_type=value.get('type',False), required=value.get('required', False)) + records.append(record) + + if len(nm.split('/')) < 3 and value.get('relation', False): + if import_compat: + ref = value.pop('relation') + cfields = self.fields_get(req, ref) + if (value['type'] == 'many2many'): + record['children'] = [] + record['params'] = {'model': ref, 'prefix': id, 'name': nm} + + elif value['type'] == 'many2one': + record['children'] = [id + '/id', id + '/.id'] + record['params'] = {'model': ref, 'prefix': id, 'name': nm} + + else: + cfields_order = cfields.keys() + cfields_order.sort(lambda x,y: -cmp(cfields[x].get('string', ''), cfields[y].get('string', ''))) + children = [] + for j, fld in enumerate(cfields_order): + cid = id + '/' + fld + cid = cid.replace(' ', '_') + children.append(cid) + record['children'] = children or [] + record['params'] = {'model': ref, 'prefix': id, 'name': nm} + else: + ref = value.pop('relation') + cfields = self.fields_get(req, ref) + cfields_order = cfields.keys() + cfields_order.sort(lambda x,y: -cmp(cfields[x].get('string', ''), cfields[y].get('string', ''))) + children = [] + for j, fld in enumerate(cfields_order): + cid = id + '/' + fld + cid = cid.replace(' ', '_') + children.append(cid) + record['children'] = children or [] + record['params'] = {'model': ref, 'prefix': id, 'name': nm} + + records.reverse() + return records + + @openerpweb.jsonrequest + def save_export_lists(self, req, name, model, field_list): + result = {'resource':model, 'name':name, 'export_fields': []} + for field in field_list: + result['export_fields'].append((0, 0, {'name': field})) + return req.session.model("ir.exports").create(result, req.session.eval_context(req.context)) + + @openerpweb.jsonrequest + def exist_export_lists(self, req, model): + export_model = req.session.model("ir.exports") + return export_model.read(export_model.search([('resource', '=', model)]), ['name']) + + @openerpweb.jsonrequest + def delete_export(self, req, export_id): + req.session.model("ir.exports").unlink(export_id, req.session.eval_context(req.context)) + return True + + @openerpweb.jsonrequest + def namelist(self,req, model, export_id): + + result = self.get_data(req, model, req.session.eval_context(req.context)) + ir_export_obj = req.session.model("ir.exports") + ir_export_line_obj = req.session.model("ir.exports.line") + + field = ir_export_obj.read(export_id) + fields = ir_export_line_obj.read(field['export_fields']) + + name_list = {} + [name_list.update({field['name']: result.get(field['name'])}) for field in fields] + return name_list + + def get_data(self, req, model, context=None): + ids = [] + context = context or {} + fields_data = {} + proxy = req.session.model(model) + fields = self.fields_get(req, model) + if not ids: + f1 = proxy.fields_view_get(False, 'tree', context)['fields'] + f2 = proxy.fields_view_get(False, 'form', context)['fields'] + + fields = dict(f1) + fields.update(f2) + fields.update({'id': {'string': 'ID'}, '.id': {'string': 'Database ID'}}) + + def rec(fields): + _fields = {'id': 'ID' , '.id': 'Database ID' } + def model_populate(fields, prefix_node='', prefix=None, prefix_value='', level=2): + fields_order = fields.keys() + fields_order.sort(lambda x,y: -cmp(fields[x].get('string', ''), fields[y].get('string', ''))) + + for field in fields_order: + fields_data[prefix_node+field] = fields[field] + if prefix_node: + fields_data[prefix_node + field]['string'] = '%s%s' % (prefix_value, fields_data[prefix_node + field]['string']) + st_name = fields[field]['string'] or field + _fields[prefix_node+field] = st_name + if fields[field].get('relation', False) and level>0: + fields2 = self.fields_get(req, fields[field]['relation']) + fields2.update({'id': {'string': 'ID'}, '.id': {'string': 'Database ID'}}) + model_populate(fields2, prefix_node+field+'/', None, st_name+'/', level-1) + model_populate(fields) + return _fields + return rec(fields) + + @openerpweb.jsonrequest + def export_data(self, req, model, fields, ids, domain, import_compat=False, export_format="csv", context=None): + context = req.session.eval_context(req.context) + modle_obj = req.session.model(model) + ids = ids or modle_obj.search(domain, context=context) + + field = fields.keys() + result = modle_obj.export_data(ids, field , context).get('datas',[]) + + if not import_compat: + field = [val.strip() for val in fields.values()] + + if export_format == 'xls': + return export_xls(field, result) + else: + return export_csv(field, result) + diff --git a/addons/base/static/src/base.html b/addons/base/static/src/base.html index 0c615ed8903..679ac454ca7 100644 --- a/addons/base/static/src/base.html +++ b/addons/base/static/src/base.html @@ -27,6 +27,7 @@ + @@ -39,6 +40,7 @@ + diff --git a/addons/base_export/static/src/css/base_export.css b/addons/base/static/src/css/export.css similarity index 95% rename from addons/base_export/static/src/css/base_export.css rename to addons/base/static/src/css/export.css index 485338b63e3..051b5cb076c 100644 --- a/addons/base_export/static/src/css/base_export.css +++ b/addons/base/static/src/css/export.css @@ -55,7 +55,7 @@ div#left_field_panel { text-align: left; white-space: nowrap; padding: 4px 5px; - background: url(/base_export/static/src/img/header.gif); + background: url(/base/static/src/img/header.gif); } diff --git a/addons/base/static/src/img/collapse.gif b/addons/base/static/src/img/collapse.gif old mode 100755 new mode 100644 diff --git a/addons/base/static/src/img/expand.gif b/addons/base/static/src/img/expand.gif old mode 100755 new mode 100644 diff --git a/addons/base_export/static/src/img/header.gif b/addons/base/static/src/img/header.gif similarity index 100% rename from addons/base_export/static/src/img/header.gif rename to addons/base/static/src/img/header.gif diff --git a/addons/base/static/src/js/base.js b/addons/base/static/src/js/base.js index 28022f8b764..8e593de5949 100644 --- a/addons/base/static/src/js/base.js +++ b/addons/base/static/src/js/base.js @@ -87,6 +87,9 @@ openerp.base = function(instance) { if (openerp.base.view_tree) { openerp.base.view_tree(instance); } + if (openerp.base.export) { + openerp.base.export(instance); + } }; // vim:et fdc=0 fdl=0 foldnestmax=3 fdm=syntax: diff --git a/addons/base_export/static/src/js/base_export.js b/addons/base/static/src/js/export.js similarity index 88% rename from addons/base_export/static/src/js/base_export.js rename to addons/base/static/src/js/export.js index 566a6cf167c..e12ba0e613c 100644 --- a/addons/base_export/static/src/js/base_export.js +++ b/addons/base/static/src/js/export.js @@ -1,7 +1,5 @@ -openerp.base_export = function(openerp) { -QWeb.add_template('/base_export/static/src/xml/base_export.xml'); -openerp.base.views.add('export', 'openerp.base_export.Export'); -openerp.base_export.Export = openerp.base.Dialog.extend({ +openerp.base.export = function(openerp) { +openerp.base.Export = openerp.base.Dialog.extend({ init: function(parent, dataset, views){ this._super(parent); @@ -57,7 +55,7 @@ openerp.base_export.Export = openerp.base.Dialog.extend({ }); import_comp = $("#import_compat option:selected").val() var params = {"import_compat":parseInt(import_comp), "views_id": this.views_id} - this.rpc("/base_export/export/get_fields", {"model": this.dataset.model, "params": params}, this.on_show_data); + this.rpc("/base/export/get_fields", {"model": this.dataset.model, "params": params}, this.on_show_data); $("#import_compat").change(function(){ $("#fields_list option").remove(); @@ -65,7 +63,7 @@ openerp.base_export.Export = openerp.base.Dialog.extend({ import_comp = $("#import_compat option:selected").val(); if(import_comp){ var params = {"import_compat":parseInt(import_comp), "views_id": this.views_id} - self.rpc("/base_export/export/get_fields", {"model": self.dataset.model, "params": params}, self.on_show_data); + self.rpc("/base/export/get_fields", {"model": self.dataset.model, "params": params}, self.on_show_data); } }); }, @@ -76,20 +74,20 @@ openerp.base_export.Export = openerp.base.Dialog.extend({ $("#ExistsExportList").show(); } else{ - this.rpc("/base_export/export/exist_export_lists", {"model": this.dataset.model}, function(export_list){ + this.rpc("/base/export/exist_export_lists", {"model": this.dataset.model}, function(export_list){ if(export_list.length){ $("#ExistsExportList").append(QWeb.render('Exists.ExportList', {'existing_exports':export_list})); $("#saved_export_list").change(function(){ $("#fields_list option").remove(); export_id = $("#saved_export_list option:selected").val(); if (export_id){ - self.rpc("/base_export/export/namelist", {"model": self.dataset.model, export_id: parseInt(export_id)}, self.do_load_export_field); + self.rpc("/base/export/namelist", {"model": self.dataset.model, export_id: parseInt(export_id)}, self.do_load_export_field); } }); $('#delete_export_list').click(function(){ select_exp = $("#saved_export_list option:selected") if (select_exp.val()){ - self.rpc("/base_export/export/delete_export", {"export_id": parseInt(select_exp.val())}, {}); + self.rpc("/base/export/delete_export", {"export_id": parseInt(select_exp.val())}, {}); select_exp.remove(); if($("#saved_export_list option").length <= 1){ $("#ExistsExportList").hide(); @@ -137,7 +135,7 @@ openerp.base_export.Export = openerp.base.Dialog.extend({ var self = this; var export_field = self.get_fields() if(export_field.length){ - self.rpc("/base_export/export/save_export_lists", {"model": self.dataset.model, "name":value, "field_list":export_field}, function(exp_id){ + self.rpc("/base/export/save_export_lists", {"model": self.dataset.model, "name":value, "field_list":export_field}, function(exp_id){ if(exp_id){ if($("#saved_export_list").length > 0){ $("#saved_export_list").append( new Option(value, exp_id)); @@ -177,11 +175,11 @@ openerp.base_export.Export = openerp.base.Dialog.extend({ } }); if (is_loaded == 0) { - if ($("tr[id='treerow-" + self.field_id +"']").find('img').attr('src') == '/base_export/static/src/img/expand.gif') { + if ($("tr[id='treerow-" + self.field_id +"']").find('img').attr('src') == '/base/static/src/img/expand.gif') { if (model){ import_comp = $("#import_compat option:selected").val() var params = {"import_compat":parseInt(import_comp), "views_id": this.views_id, "parent_field_type" : record['field_type']} - self.rpc("/base_export/export/get_fields", {"model": model, "prefix": prefix, "name": name, "field_parent" : self.field_id, "params":params}, function (results) { + self.rpc("/base/export/get_fields", {"model": model, "prefix": prefix, "name": name, "field_parent" : self.field_id, "params":params}, function (results) { self.on_show_data(results); }); } @@ -200,7 +198,7 @@ openerp.base_export.Export = openerp.base.Dialog.extend({ var self = this; var current_tr = $("tr[id='treerow-" + self.field_id + "']"); if (current_tr.length >= 1){ - current_tr.find('img').attr('src','/base_export/static/src/img/collapse.gif'); + current_tr.find('img').attr('src','/base/static/src/img/collapse.gif'); current_tr.after(QWeb.render('ExportTreeView-Secondary.children', {'fields': result})); } else{ @@ -279,7 +277,7 @@ openerp.base_export.Export = openerp.base.Dialog.extend({ arrow = {left: 37, up: 38, right: 39, down: 40 }; switch (keyCode) { case arrow.left: - if( jQuery(this).find('img').attr('src') == '/base_export/static/src/img/collapse.gif'){ + if( jQuery(this).find('img').attr('src') == '/base/static/src/img/collapse.gif'){ self.on_click(this.id, result); } break; @@ -295,7 +293,7 @@ openerp.base_export.Export = openerp.base.Dialog.extend({ $(elem).prev().find('a').focus(); break; case arrow.right: - if( jQuery(this).find('img').attr('src') == '/base_export/static/src/img/expand.gif'){ + if( jQuery(this).find('img').attr('src') == '/base/static/src/img/expand.gif'){ self.on_click(this.id, result); } break; @@ -340,10 +338,10 @@ openerp.base_export.Export = openerp.base.Dialog.extend({ showcontent: function (id, flag) { var first_child = $("tr[id='treerow-" + id + "']").find('img') if (flag) { - first_child.attr('src', '/base_export/static/src/img/expand.gif'); + first_child.attr('src', '/base/static/src/img/expand.gif'); } else { - first_child.attr('src', '/base_export/static/src/img/collapse.gif'); + first_child.attr('src', '/base/static/src/img/collapse.gif'); } var child_field = $("tr[id^='treerow-" + id +"/']") var child_len = (id.split("/")).length + 1 @@ -353,8 +351,8 @@ openerp.base_export.Export = openerp.base.Dialog.extend({ } else { if(child_len == (child_field[i].id.split("/")).length){ - if( jQuery(child_field[i]).find('img').attr('src') == '/base_export/static/src/img/collapse.gif'){ - jQuery(child_field[i]).find('img').attr('src', '/base_export/static/src/img/expand.gif') + if( jQuery(child_field[i]).find('img').attr('src') == '/base/static/src/img/collapse.gif'){ + jQuery(child_field[i]).find('img').attr('src', '/base/static/src/img/expand.gif') } $(child_field[i]).show(); } @@ -395,7 +393,7 @@ openerp.base_export.Export = openerp.base.Dialog.extend({ import_comp = $("#import_compat option:selected").val() export_format = $("#export_format").val() - self.rpc("/base_export/export/export_data", {"model": self.dataset.model, "fields":export_field, 'ids': self.dataset.ids, 'domain': self.dataset.domain, "import_compat":parseInt(import_comp), "export_format" :export_format}, function(data){ + self.rpc("/base/export/export_data", {"model": self.dataset.model, "fields":export_field, 'ids': self.dataset.ids, 'domain': self.dataset.domain, "import_compat":parseInt(import_comp), "export_format" :export_format}, function(data){ window.location="data:text/csv/excel;charset=utf8," + data self.close(); }); diff --git a/addons/base/static/src/js/views.js b/addons/base/static/src/js/views.js index 0f520cab13d..0d8539d6292 100644 --- a/addons/base/static/src/js/views.js +++ b/addons/base/static/src/js/views.js @@ -200,7 +200,7 @@ openerp.base.ViewManager = openerp.base.Controller.extend({ if(this.active_view == 'list' || this.active_view == 'form') { this.views[this.active_view].controller.$element.after(QWeb.render('ExportView')) this.$element.find('#exportview').click(function(ev) { - var export_view = new openerp.base_export.Export(self, self.dataset, self.views); + var export_view = new openerp.base.Export(self, self.dataset, self.views); export_view.start(false); ev.preventDefault(); }); @@ -417,6 +417,7 @@ openerp.base.Sidebar = openerp.base.BaseWidget.extend({ openerp.base.NullSidebar = openerp.base.generate_null_object_class(openerp.base.Sidebar); +/* openerp.base.Export = openerp.base.Dialog.extend({ dialog_title: "Export", template: 'ExportDialog', @@ -435,7 +436,7 @@ openerp.base.Export = openerp.base.Dialog.extend({ this.$element.dialog("close"); } }); - +*/ openerp.base.View = openerp.base.Controller.extend({ /** * Fetches and executes the action identified by ``action_data``. diff --git a/addons/base/static/src/xml/base.xml b/addons/base/static/src/xml/base.xml index 04841a2e297..fee6a07281b 100644 --- a/addons/base/static/src/xml/base.xml +++ b/addons/base/static/src/xml/base.xml @@ -103,7 +103,7 @@
- + - +
@@ -135,7 +135,7 @@
- + @@ -311,7 +311,7 @@ t-att-data-index="row_index">
- + @@ -786,7 +786,7 @@ -
@@ -932,4 +932,145 @@ .unwrap(); + + + Export + + + + + + + + + + + + + + +
+ This wizard will export all data that matches the current search criteria to a CSV file. + You can export all data or only the fields that can be reimported after modification. +
+ + + + + + + + +
+ + + +
+
+ + + + + + + + + + + +
Available fieldsFields to export + Save fields list +
+
+
+
+
+
+ + + + + + + + + + +
+ +
+ +
+ +
+
+ +
+
+
+ + + + + +
Name
+
+ + +
+ + + + + + + + + + +
&nbsp; + + + + + + + + + +
+
+ +
- - - - - - - - - - -
- This wizard will export all data that matches the current search criteria to a CSV file. - You can export all data or only the fields that can be reimported after modification. -
- - - - - - - - -
- - - -
-
- - - - - - - - - - - -
Available fieldsFields to export - Save fields list -
-
-
-
-
-
- - - - - - - - - - -
- -
- -
- -
-
- -
-
- - - - - - -
Name
-
- - -
- - - - - - - - - - -
&nbsp; - - - - - - - - - -
-
- -
- From 509aaab131b6f0485bac50aaf18dbf8eb8bdcd7e Mon Sep 17 00:00:00 2001 From: "Yogesh (OpenERP)" Date: Mon, 25 Jul 2011 11:08:04 +0530 Subject: [PATCH 40/47] [FIX] fix some selector problem. bzr revid: ysa@tinyerp.com-20110725053804-naq7vcrzg8kjrzl3 --- addons/base/static/src/js/export.js | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/addons/base/static/src/js/export.js b/addons/base/static/src/js/export.js index e12ba0e613c..0f7db81f6d4 100644 --- a/addons/base/static/src/js/export.js +++ b/addons/base/static/src/js/export.js @@ -1,6 +1,5 @@ openerp.base.export = function(openerp) { openerp.base.Export = openerp.base.Dialog.extend({ - init: function(parent, dataset, views){ this._super(parent); this.dataset = dataset @@ -206,18 +205,18 @@ openerp.base.Export = openerp.base.Dialog.extend({ } _.each(result, function(record) { if(record.field_type == "one2many"){ - var o2m_fld = $("tr[id^='treerow-" + record.id + "']").find('#tree-column'); + var o2m_fld = $("tr[id='treerow-" + record.id + "']").find('#tree-column'); o2m_fld.addClass("readonlyfield"); } if ((record.required == true) || record.required == "True"){ - var required_fld = $("tr[id^='treerow-" + record.id + "']").find('#tree-column'); + var required_fld = $("tr[id='treerow-" + record.id + "']").find('#tree-column'); required_fld.addClass("requiredfield"); } - $("img[id ^='parentimg-" + record.id +"']").click(function(){ + $("img[id='parentimg-" + record.id +"']").click(function(){ self.on_click(this.id, result); }); - $("tr[id^='treerow-" + record.id + "']").click(function(e){ + $("tr[id='treerow-" + record.id + "']").click(function(e){ if (e.shiftKey == true){ var frst_click,scnd_click = ''; if (self.row_index == 0){ @@ -244,10 +243,10 @@ openerp.base.Export = openerp.base.Dialog.extend({ } self.row_index = this.rowIndex; - $("tr[id^='treerow-" + record.id + "']").keyup(function (e) { + $("tr[id='treerow-" + record.id + "']").keyup(function (e) { self.row_index = 0; }); - var o2m_selection = $("tr[id^='treerow-" + record.id + "']").find('#tree-column'); + var o2m_selection = $("tr[id='treerow-" + record.id + "']").find('#tree-column'); if ($(o2m_selection).hasClass("readonlyfield")){ return false; } @@ -272,7 +271,7 @@ openerp.base.Export = openerp.base.Dialog.extend({ return false; }); - $("tr[id^='treerow-" + record.id + "']").keydown(function (e) { + $("tr[id='treerow-" + record.id + "']").keydown(function (e) { var keyCode = e.keyCode || e.which; arrow = {left: 37, up: 38, right: 39, down: 40 }; switch (keyCode) { @@ -310,7 +309,7 @@ openerp.base.Export = openerp.base.Dialog.extend({ break; } }); - $("tr[id^='treerow-" + record.id + "']").dblclick(function (e) { + $("tr[id='treerow-" + record.id + "']").dblclick(function (e) { var o2m_selection = $("tr[id^='treerow-" + record.id + "']").find('#tree-column'); if (! $(o2m_selection).hasClass("readonlyfield")){ var field_id = $(this).find("a").attr("id"); @@ -325,7 +324,7 @@ openerp.base.Export = openerp.base.Dialog.extend({ if (event.relatedTarget.attributes['id'] && event.relatedTarget.attributes['string']){ field_id = event.relatedTarget.attributes["id"]["value"] if (field_id && field_id.split("-")[0] == 'export'){ - if(!$("tr[id^='treerow-" + field_id.split("-")[1] + "']").find('#tree-column').hasClass("readonlyfield")){ + if(!$("tr[id='treerow-" + field_id.split("-")[1] + "']").find('#tree-column').hasClass("readonlyfield")){ self.add_field(field_id.split("-")[1], event.relatedTarget.attributes["string"]["value"]); } } From 883380866e8917594525a7a0877f56729df8f238 Mon Sep 17 00:00:00 2001 From: "Kunal Chavda (OpenERP)" Date: Mon, 25 Jul 2011 11:36:32 +0530 Subject: [PATCH 41/47] [FIX]Fix code for o2m field should readonly if import compatible option select. bzr revid: kch@tinyerp.com-20110725060632-uj2bkmg31k3gby70 --- addons/base/static/src/js/export.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/addons/base/static/src/js/export.js b/addons/base/static/src/js/export.js index 0f7db81f6d4..ff8e8604348 100644 --- a/addons/base/static/src/js/export.js +++ b/addons/base/static/src/js/export.js @@ -195,6 +195,7 @@ openerp.base.Export = openerp.base.Dialog.extend({ on_show_data: function(result) { var self = this; + var imp_cmpt = parseInt($("#import_compat option:selected").val()); var current_tr = $("tr[id='treerow-" + self.field_id + "']"); if (current_tr.length >= 1){ current_tr.find('img').attr('src','/base/static/src/img/collapse.gif'); @@ -204,7 +205,7 @@ openerp.base.Export = openerp.base.Dialog.extend({ $('#left_field_panel').append(QWeb.render('ExportTreeView-Secondary', {'fields': result})); } _.each(result, function(record) { - if(record.field_type == "one2many"){ + if((record.field_type == "one2many") && imp_cmpt){ var o2m_fld = $("tr[id='treerow-" + record.id + "']").find('#tree-column'); o2m_fld.addClass("readonlyfield"); } From e766d1892f3c3aaacebef4c180794c2757bffffc Mon Sep 17 00:00:00 2001 From: "Yogesh (OpenERP)" Date: Thu, 28 Jul 2011 10:49:53 +0530 Subject: [PATCH 42/47] In css the convention is to prepend all css declarations with .openerp. bzr revid: ysa@tinyerp.com-20110728051953-cpjaae65bgrfr8cf --- addons/base/static/src/css/export.css | 34 +++++++++++++-------------- addons/base/static/src/js/export.js | 18 +++++++------- addons/base/static/src/xml/base.xml | 28 +++++++++++----------- 3 files changed, 40 insertions(+), 40 deletions(-) diff --git a/addons/base/static/src/css/export.css b/addons/base/static/src/css/export.css index 051b5cb076c..13dfc3d5a3f 100644 --- a/addons/base/static/src/css/export.css +++ b/addons/base/static/src/css/export.css @@ -1,56 +1,56 @@ -.row tr{ +.openerp .oe_export_row tr{ background-color: #FFFFFF; font-size: 0.8em; height: 22px; } -tr.ui-selected td { +.openerp tr.ui-selected td { background-color: #CCCCCC; } -.requiredfield { +.openerp .oe_export_requiredfield { background-color: #D2D2FF; } -.readonlyfield{ - background-color: DarkGray; +.openerp .oe_export_readonlyfield{ + background-color: #999999; } -.row:hover{ +.openerp .oe_export_row:hover{ background-color: #F3F3F3; } -.fields-selector-export { +.openerp .oe_export_fields_selector_export { width: 100%; height: 400px; } -.fields-selector-left { +.openerp .oe_export_fields_selector_left { width: 50%; } -div#left_field_panel { +.openerp div#left_field_panel { overflow: scroll; width: 100%; height: 400px; border: solid #999999 1px; } -.fields-selector-center { +.openerp .oe_export_fields_selector_center { width: 102px; } -.fields-selector-right { +.openerp .oe_export_fields_selector_right { width: 45%; height: 400px; } -.fields-selector-export select{ +.openerp .oe_export_fields_selector_export select{ width: 100%; height: 100%; } -.tree_header{ +.openerp .oe_export_tree_header{ border: 0.5px solid #E3E3E3; text-align: left; white-space: nowrap; @@ -59,7 +59,7 @@ div#left_field_panel { } -table.tree-grid{ +.openerp table.tree_grid{ border: 1px solid #E3E3E3; text-align: left; white-space: nowrap; @@ -68,17 +68,17 @@ table.tree-grid{ width: 100%; } -table.tree-grid a:hover { +.openerp table.tree_grid a:hover { color: blue; border: none; } -table.tree-grid a { +.openerp table.tree_grid a { color: #5F5C5C; border: none; } -.button-export { +.openerp .oe_export_button_export { border: 1px solid #006; background-color: #F3F3F3; } diff --git a/addons/base/static/src/js/export.js b/addons/base/static/src/js/export.js index ff8e8604348..8fe42f900d1 100644 --- a/addons/base/static/src/js/export.js +++ b/addons/base/static/src/js/export.js @@ -207,11 +207,11 @@ openerp.base.Export = openerp.base.Dialog.extend({ _.each(result, function(record) { if((record.field_type == "one2many") && imp_cmpt){ var o2m_fld = $("tr[id='treerow-" + record.id + "']").find('#tree-column'); - o2m_fld.addClass("readonlyfield"); + o2m_fld.addClass("oe_export_readonlyfield"); } if ((record.required == true) || record.required == "True"){ var required_fld = $("tr[id='treerow-" + record.id + "']").find('#tree-column'); - required_fld.addClass("requiredfield"); + required_fld.addClass("oe_export_requiredfield"); } $("img[id='parentimg-" + record.id +"']").click(function(){ self.on_click(this.id, result); @@ -228,14 +228,14 @@ openerp.base.Export = openerp.base.Dialog.extend({ if (this.rowIndex >=self.row_index){ for (i = (self.row_index-1); i < this.rowIndex; i++) { scnd_click = $("tr[id^='treerow-']")[i]; - if(!$(scnd_click).find('#tree-column').hasClass("readonlyfield")){ + if(!$(scnd_click).find('#tree-column').hasClass("oe_export_readonlyfield")){ $(scnd_click).addClass("ui-selected"); } } }else{ for (i = (self.row_index-1); i >= (this.rowIndex-1); i--) { scnd_click = $("tr[id^='treerow-']")[i]; - if(!$(scnd_click).find('#tree-column').hasClass("readonlyfield")){ + if(!$(scnd_click).find('#tree-column').hasClass("oe_export_readonlyfield")){ $(scnd_click).addClass("ui-selected"); } } @@ -248,7 +248,7 @@ openerp.base.Export = openerp.base.Dialog.extend({ self.row_index = 0; }); var o2m_selection = $("tr[id='treerow-" + record.id + "']").find('#tree-column'); - if ($(o2m_selection).hasClass("readonlyfield")){ + if ($(o2m_selection).hasClass("oe_export_readonlyfield")){ return false; } var selected = $("tr.ui-selected"); @@ -287,7 +287,7 @@ openerp.base.Export = openerp.base.Dialog.extend({ while($(elem).prev().is(":visible") == false){ elem = $(elem).prev(); } - if(!$(elem).prev().find('#tree-column').hasClass("readonlyfield")){ + if(!$(elem).prev().find('#tree-column').hasClass("oe_export_readonlyfield")){ $(elem).prev().addClass("ui-selected"); } $(elem).prev().find('a').focus(); @@ -303,7 +303,7 @@ openerp.base.Export = openerp.base.Dialog.extend({ while($(elem).next().is(":visible") == false){ elem = $(elem).next(); } - if(!$(elem).next().find('#tree-column').hasClass("readonlyfield")){ + if(!$(elem).next().find('#tree-column').hasClass("oe_export_readonlyfield")){ $(elem).next().addClass("ui-selected"); } $(elem).next().find('a').focus(); @@ -312,7 +312,7 @@ openerp.base.Export = openerp.base.Dialog.extend({ }); $("tr[id='treerow-" + record.id + "']").dblclick(function (e) { var o2m_selection = $("tr[id^='treerow-" + record.id + "']").find('#tree-column'); - if (! $(o2m_selection).hasClass("readonlyfield")){ + if (! $(o2m_selection).hasClass("oe_export_readonlyfield")){ var field_id = $(this).find("a").attr("id"); if(field_id){ self.add_field(field_id.split('-')[1], $(this).find("a").attr("string")) @@ -325,7 +325,7 @@ openerp.base.Export = openerp.base.Dialog.extend({ if (event.relatedTarget.attributes['id'] && event.relatedTarget.attributes['string']){ field_id = event.relatedTarget.attributes["id"]["value"] if (field_id && field_id.split("-")[0] == 'export'){ - if(!$("tr[id='treerow-" + field_id.split("-")[1] + "']").find('#tree-column').hasClass("readonlyfield")){ + if(!$("tr[id='treerow-" + field_id.split("-")[1] + "']").find('#tree-column').hasClass("oe_export_readonlyfield")){ self.add_field(field_id.split("-")[1], event.relatedTarget.attributes["string"]["value"]); } } diff --git a/addons/base/static/src/xml/base.xml b/addons/base/static/src/xml/base.xml index 89e23fece6d..1c35ce9a06d 100644 --- a/addons/base/static/src/xml/base.xml +++ b/addons/base/static/src/xml/base.xml @@ -983,7 +983,7 @@
- +
@@ -994,30 +994,30 @@ - - @@ -1028,17 +1028,17 @@ -
Available fields
+
- +
- +
- +
- +
+
- +
Name
+
Name
-
- - +
+ @@ -1067,7 +1067,7 @@ - + @@ -1082,7 +1082,7 @@ - + From 4a321d51d83ff85d81c987eca16e0c01da7bbbea Mon Sep 17 00:00:00 2001 From: "Yogesh (OpenERP)" Date: Thu, 28 Jul 2011 12:11:54 +0530 Subject: [PATCH 43/47] [IMP] Improve jquery selector use this. instead of directly $. bzr revid: ysa@tinyerp.com-20110728064154-t3k2fcfss4e1g6kk --- addons/base/static/src/js/export.js | 130 ++++++++++++++-------------- 1 file changed, 65 insertions(+), 65 deletions(-) diff --git a/addons/base/static/src/js/export.js b/addons/base/static/src/js/export.js index 8fe42f900d1..cec141aefcd 100644 --- a/addons/base/static/src/js/export.js +++ b/addons/base/static/src/js/export.js @@ -30,38 +30,38 @@ openerp.base.Export = openerp.base.Dialog.extend({ }, close: function(event, ui){ self.close();} }); - this.on_show_exists_export_list(); - jQuery(this.$dialog).removeClass('ui-dialog-content ui-widget-content'); - $('#add_field').click(function(){ + self.on_show_exists_export_list(); + jQuery(self.$dialog).removeClass('ui-dialog-content ui-widget-content'); + self.$element.find('#add_field').click(function(){ if($("#field-tree-structure tr.ui-selected")){ - var fld = $("#field-tree-structure tr.ui-selected").find('a'); + var fld = self.$element.find("#field-tree-structure tr.ui-selected").find('a'); for (var i=0;i 0){ - $("#saved_export_list").append( new Option(value, exp_id)); + if(self.$element.find("#saved_export_list").length > 0){ + self.$element.find("#saved_export_list").append( new Option(value, exp_id)); } else{ self.on_show_exists_export_list(); } - if($("#saved_export_list").is(":hidden")){ + if(self.$element.find("#saved_export_list").is(":hidden")){ self.on_show_exists_export_list(); } } }); self.on_show_save_list() - $("#fields_list option").remove(); + self.$element.find("#fields_list option").remove(); } }, @@ -165,8 +166,8 @@ openerp.base.Export = openerp.base.Dialog.extend({ prefix = record['params']['prefix'] name = record['params']['name'] $(record['children']).each (function(e, childid) { - if ($("tr[id='treerow-" + childid +"']").length > 0) { - if ($("tr[id='treerow-" + childid +"']").is(':hidden')) { + if (self.$element.find("tr[id='treerow-" + childid +"']").length > 0) { + if (self.$element.find("tr[id='treerow-" + childid +"']").is(':hidden')) { is_loaded = -1; } else { is_loaded++; @@ -174,9 +175,9 @@ openerp.base.Export = openerp.base.Dialog.extend({ } }); if (is_loaded == 0) { - if ($("tr[id='treerow-" + self.field_id +"']").find('img').attr('src') == '/base/static/src/img/expand.gif') { + if (self.$element.find("tr[id='treerow-" + self.field_id +"']").find('img').attr('src') == '/base/static/src/img/expand.gif') { if (model){ - import_comp = $("#import_compat option:selected").val() + import_comp = self.$element.find("#import_compat option:selected").val() var params = {"import_compat":parseInt(import_comp), "views_id": this.views_id, "parent_field_type" : record['field_type']} self.rpc("/base/export/get_fields", {"model": model, "prefix": prefix, "name": name, "field_parent" : self.field_id, "params":params}, function (results) { self.on_show_data(results); @@ -189,52 +190,51 @@ openerp.base.Export = openerp.base.Dialog.extend({ self.showcontent(self.field_id, false); } } - }); }, on_show_data: function(result) { var self = this; - var imp_cmpt = parseInt($("#import_compat option:selected").val()); - var current_tr = $("tr[id='treerow-" + self.field_id + "']"); + var imp_cmpt = parseInt(self.$element.find("#import_compat option:selected").val()); + var current_tr = self.$element.find("tr[id='treerow-" + self.field_id + "']"); if (current_tr.length >= 1){ current_tr.find('img').attr('src','/base/static/src/img/collapse.gif'); current_tr.after(QWeb.render('ExportTreeView-Secondary.children', {'fields': result})); } else{ - $('#left_field_panel').append(QWeb.render('ExportTreeView-Secondary', {'fields': result})); + self.$element.find('#left_field_panel').append(QWeb.render('ExportTreeView-Secondary', {'fields': result})); } _.each(result, function(record) { if((record.field_type == "one2many") && imp_cmpt){ - var o2m_fld = $("tr[id='treerow-" + record.id + "']").find('#tree-column'); + var o2m_fld = self.$element.find("tr[id='treerow-" + record.id + "']").find('#tree-column'); o2m_fld.addClass("oe_export_readonlyfield"); } if ((record.required == true) || record.required == "True"){ - var required_fld = $("tr[id='treerow-" + record.id + "']").find('#tree-column'); + var required_fld = self.$element.find("tr[id='treerow-" + record.id + "']").find('#tree-column'); required_fld.addClass("oe_export_requiredfield"); } - $("img[id='parentimg-" + record.id +"']").click(function(){ + self.$element.find("img[id='parentimg-" + record.id +"']").click(function(){ self.on_click(this.id, result); }); - $("tr[id='treerow-" + record.id + "']").click(function(e){ + self.$element.find("tr[id='treerow-" + record.id + "']").click(function(e){ if (e.shiftKey == true){ var frst_click,scnd_click = ''; if (self.row_index == 0){ self.row_index = this.rowIndex; - frst_click = $("tr[id^='treerow-']")[self.row_index-1]; + frst_click = self.$element.find("tr[id^='treerow-']")[self.row_index-1]; $(frst_click).addClass("ui-selected"); }else{ if (this.rowIndex >=self.row_index){ for (i = (self.row_index-1); i < this.rowIndex; i++) { - scnd_click = $("tr[id^='treerow-']")[i]; + scnd_click = self.$element.find("tr[id^='treerow-']")[i]; if(!$(scnd_click).find('#tree-column').hasClass("oe_export_readonlyfield")){ $(scnd_click).addClass("ui-selected"); } } }else{ for (i = (self.row_index-1); i >= (this.rowIndex-1); i--) { - scnd_click = $("tr[id^='treerow-']")[i]; + scnd_click = self.$element.find("tr[id^='treerow-']")[i]; if(!$(scnd_click).find('#tree-column').hasClass("oe_export_readonlyfield")){ $(scnd_click).addClass("ui-selected"); } @@ -244,14 +244,14 @@ openerp.base.Export = openerp.base.Dialog.extend({ } self.row_index = this.rowIndex; - $("tr[id='treerow-" + record.id + "']").keyup(function (e) { + self.$element.find("tr[id='treerow-" + record.id + "']").keyup(function (e) { self.row_index = 0; }); - var o2m_selection = $("tr[id='treerow-" + record.id + "']").find('#tree-column'); + var o2m_selection = self.$element.find("tr[id='treerow-" + record.id + "']").find('#tree-column'); if ($(o2m_selection).hasClass("oe_export_readonlyfield")){ return false; } - var selected = $("tr.ui-selected"); + var selected = self.$element.find("tr.ui-selected"); if ($(this).hasClass("ui-selected") && (e.ctrlKey == true)){ $(this).find('a').blur(); $(this).removeClass("ui-selected"); @@ -272,7 +272,7 @@ openerp.base.Export = openerp.base.Dialog.extend({ return false; }); - $("tr[id='treerow-" + record.id + "']").keydown(function (e) { + self.$element.find("tr[id='treerow-" + record.id + "']").keydown(function (e) { var keyCode = e.keyCode || e.which; arrow = {left: 37, up: 38, right: 39, down: 40 }; switch (keyCode) { @@ -310,8 +310,8 @@ openerp.base.Export = openerp.base.Dialog.extend({ break; } }); - $("tr[id='treerow-" + record.id + "']").dblclick(function (e) { - var o2m_selection = $("tr[id^='treerow-" + record.id + "']").find('#tree-column'); + self.$element.find("tr[id='treerow-" + record.id + "']").dblclick(function (e) { + var o2m_selection = self.$element.find("tr[id^='treerow-" + record.id + "']").find('#tree-column'); if (! $(o2m_selection).hasClass("oe_export_readonlyfield")){ var field_id = $(this).find("a").attr("id"); if(field_id){ @@ -320,12 +320,12 @@ openerp.base.Export = openerp.base.Dialog.extend({ } }); }); - $('#fields_list').mouseover(function(event){ + self.$element.find('#fields_list').mouseover(function(event){ if(event.relatedTarget){ if (event.relatedTarget.attributes['id'] && event.relatedTarget.attributes['string']){ field_id = event.relatedTarget.attributes["id"]["value"] if (field_id && field_id.split("-")[0] == 'export'){ - if(!$("tr[id='treerow-" + field_id.split("-")[1] + "']").find('#tree-column').hasClass("oe_export_readonlyfield")){ + if(!self.$element.find("tr[id='treerow-" + field_id.split("-")[1] + "']").find('#tree-column').hasClass("oe_export_readonlyfield")){ self.add_field(field_id.split("-")[1], event.relatedTarget.attributes["string"]["value"]); } } @@ -336,14 +336,14 @@ openerp.base.Export = openerp.base.Dialog.extend({ // show & hide the contents showcontent: function (id, flag) { - var first_child = $("tr[id='treerow-" + id + "']").find('img') + var first_child = this.$element.find("tr[id='treerow-" + id + "']").find('img') if (flag) { first_child.attr('src', '/base/static/src/img/expand.gif'); } else { first_child.attr('src', '/base/static/src/img/collapse.gif'); } - var child_field = $("tr[id^='treerow-" + id +"/']") + var child_field = this.$element.find("tr[id^='treerow-" + id +"/']") var child_len = (id.split("/")).length + 1 for (var i = 0; i < child_field.length; i++) { if (flag) { @@ -361,15 +361,15 @@ openerp.base.Export = openerp.base.Dialog.extend({ }, add_field: function(field_id, string) { - var field_list = $('#fields_list') - if ( $("#fields_list option[value='" + field_id + "']") && !$("#fields_list option[value='" + field_id + "']").length){ + var field_list = this.$element.find('#fields_list') + if ( this.$element.find("#fields_list option[value='" + field_id + "']") && !this.$element.find("#fields_list option[value='" + field_id + "']").length){ field_list.append( new Option(string, field_id)); } }, get_fields: function (){ var export_field = []; - $("#fields_list option").each(function(){ + this.$element.find("#fields_list option").each(function(){ export_field.push(jQuery(this).val()); }); if (! export_field.length){ @@ -381,7 +381,7 @@ openerp.base.Export = openerp.base.Dialog.extend({ var self = this; var export_field = {}; var flag = true; - $("#fields_list option").each(function(){ + self.$element.find("#fields_list option").each(function(){ export_field[jQuery(this).val()] = jQuery(this).text(); flag = false; }); @@ -390,8 +390,8 @@ openerp.base.Export = openerp.base.Dialog.extend({ return; } - import_comp = $("#import_compat option:selected").val() - export_format = $("#export_format").val() + import_comp = self.$element.find("#import_compat option:selected").val() + export_format = self.$element.find("#export_format").val() self.rpc("/base/export/export_data", {"model": self.dataset.model, "fields":export_field, 'ids': self.dataset.ids, 'domain': self.dataset.domain, "import_compat":parseInt(import_comp), "export_format" :export_format}, function(data){ window.location="data:text/csv/excel;charset=utf8," + data From cf877c60ee43456828c46f8a49572e2583e96fdf Mon Sep 17 00:00:00 2001 From: "Yogesh (OpenERP)" Date: Thu, 28 Jul 2011 12:49:54 +0530 Subject: [PATCH 44/47] [IMP] improve css of tree_grid a tag. bzr revid: ysa@tinyerp.com-20110728071954-gpan09gff3xhy4e8 --- addons/base/static/src/css/export.css | 1 + 1 file changed, 1 insertion(+) diff --git a/addons/base/static/src/css/export.css b/addons/base/static/src/css/export.css index 13dfc3d5a3f..7b4b9707b39 100644 --- a/addons/base/static/src/css/export.css +++ b/addons/base/static/src/css/export.css @@ -76,6 +76,7 @@ .openerp table.tree_grid a { color: #5F5C5C; border: none; + display: block; } .openerp .oe_export_button_export { From 0b04e6fa34b278689e9f22a4446a12161ea05a06 Mon Sep 17 00:00:00 2001 From: Fabien Meghazi Date: Thu, 28 Jul 2011 13:20:13 +0200 Subject: [PATCH 45/47] [FIX] Renamed export module to data_export. export is a javascript reserved word thus causing problems with safari bzr revid: fme@openerp.com-20110728112013-lmo06h75r0xqipbo --- addons/base/__openerp__.py | 4 ++-- addons/base/static/src/css/{export.css => data_export.css} | 0 addons/base/static/src/js/boot.js | 4 ++-- addons/base/static/src/js/{export.js => data_export.js} | 4 ++-- addons/base/static/src/js/views.js | 2 +- 5 files changed, 7 insertions(+), 7 deletions(-) rename addons/base/static/src/css/{export.css => data_export.css} (100%) rename addons/base/static/src/js/{export.js => data_export.js} (99%) diff --git a/addons/base/__openerp__.py b/addons/base/__openerp__.py index 01d712ef41e..c8c80cd2e3a 100644 --- a/addons/base/__openerp__.py +++ b/addons/base/__openerp__.py @@ -28,13 +28,13 @@ "static/src/js/list-editable.js", "static/src/js/search.js", "static/src/js/view_tree.js", - "static/src/js/export.js", + "static/src/js/data_export.js", ], 'css' : [ "static/lib/jquery.superfish/css/superfish.css", "static/lib/jquery.ui/css/smoothness/jquery-ui-1.8.9.custom.css", "static/lib/jquery.ui.notify/css/ui.notify.css", "static/src/css/base.css", - "static/src/css/export.css", + "static/src/css/data_export.css", ], } diff --git a/addons/base/static/src/css/export.css b/addons/base/static/src/css/data_export.css similarity index 100% rename from addons/base/static/src/css/export.css rename to addons/base/static/src/css/data_export.css diff --git a/addons/base/static/src/js/boot.js b/addons/base/static/src/js/boot.js index 25ab0bda632..5f86a73ed5e 100644 --- a/addons/base/static/src/js/boot.js +++ b/addons/base/static/src/js/boot.js @@ -86,8 +86,8 @@ openerp.base = function(instance) { if (openerp.base.view_tree) { openerp.base.view_tree(instance); } - if (openerp.base.export) { - openerp.base.export(instance); + if (openerp.base.data_export) { + openerp.base.data_export(instance); } }; diff --git a/addons/base/static/src/js/export.js b/addons/base/static/src/js/data_export.js similarity index 99% rename from addons/base/static/src/js/export.js rename to addons/base/static/src/js/data_export.js index cec141aefcd..9a04dbf4c4e 100644 --- a/addons/base/static/src/js/export.js +++ b/addons/base/static/src/js/data_export.js @@ -1,5 +1,5 @@ -openerp.base.export = function(openerp) { -openerp.base.Export = openerp.base.Dialog.extend({ +openerp.base.data_export = function(openerp) { +openerp.base.DataExport = openerp.base.Dialog.extend({ init: function(parent, dataset, views){ this._super(parent); this.dataset = dataset diff --git a/addons/base/static/src/js/views.js b/addons/base/static/src/js/views.js index d25e34a26f4..36fce76d40c 100644 --- a/addons/base/static/src/js/views.js +++ b/addons/base/static/src/js/views.js @@ -222,7 +222,7 @@ openerp.base.ViewManager = openerp.base.Controller.extend({ if(this.active_view == 'list' || this.active_view == 'form') { this.views[this.active_view].controller.$element.after(QWeb.render('ExportView')) this.$element.find('#exportview').click(function(ev) { - var export_view = new openerp.base.Export(self, self.dataset, self.views); + var export_view = new openerp.base.DataExport(self, self.dataset, self.views); export_view.start(false); ev.preventDefault(); }); From 8b095a3b1ea0a740388a31d5f3f89701ff7130d3 Mon Sep 17 00:00:00 2001 From: Fabien Meghazi Date: Thu, 28 Jul 2011 14:26:50 +0200 Subject: [PATCH 46/47] [IMP] Cleaned a bit, fixed some global variables bzr revid: fme@openerp.com-20110728122650-8305oh329y5y8a66 --- addons/base/static/src/js/data_export.js | 375 ++++++++++++----------- 1 file changed, 188 insertions(+), 187 deletions(-) diff --git a/addons/base/static/src/js/data_export.js b/addons/base/static/src/js/data_export.js index 9a04dbf4c4e..50a08bc4f12 100644 --- a/addons/base/static/src/js/data_export.js +++ b/addons/base/static/src/js/data_export.js @@ -1,95 +1,98 @@ openerp.base.data_export = function(openerp) { openerp.base.DataExport = openerp.base.Dialog.extend({ - init: function(parent, dataset, views){ + init: function(parent, dataset, views) { this._super(parent); - this.dataset = dataset - this.views = views + this.dataset = dataset; + this.views = views; this.views_id = {}; for (var key in this.views) { - this.views_id[key] = this.views[key].view_id + this.views_id[key] = this.views[key].view_id; } }, - start: function() { - var self = this + var self = this; self._super(false); self.template = 'ExportTreeView'; - self.dialog_title = "Export Data " + self.dialog_title = "Export Data"; self.open({ - modal: true, - width: '55%', - height: 'auto', - position: 'top', - buttons : { - "Close" : function() { - self.close(); - }, - "Export To File" : function() { - self.on_click_export_data(); - } - }, - close: function(event, ui){ self.close();} - }); + modal: true, + width: '55%', + height: 'auto', + position: 'top', + buttons : { + "Close" : function() { + self.close(); + }, + "Export To File" : function() { + self.on_click_export_data(); + } + }, + close: function(event, ui){ self.close();} + }); self.on_show_exists_export_list(); - jQuery(self.$dialog).removeClass('ui-dialog-content ui-widget-content'); - self.$element.find('#add_field').click(function(){ - if($("#field-tree-structure tr.ui-selected")){ - var fld = self.$element.find("#field-tree-structure tr.ui-selected").find('a'); - for (var i=0;i 0){ - self.$element.find("#saved_export_list").append( new Option(value, exp_id)); - } - else{ + var export_field = self.get_fields(); + if (export_field.length) { + self.rpc("/base/export/save_export_lists", {"model": self.dataset.model, "name":value, "field_list":export_field}, function(exp_id) { + if (exp_id) { + if (self.$element.find("#saved_export_list").length > 0) { + self.$element.find("#saved_export_list").append(new Option(value, exp_id)); + } else { self.on_show_exists_export_list(); } - if(self.$element.find("#saved_export_list").is(":hidden")){ + if (self.$element.find("#saved_export_list").is(":hidden")) { self.on_show_exists_export_list(); } } }); - self.on_show_save_list() + self.on_show_save_list(); self.$element.find("#fields_list option").remove(); } }, - on_click: function(id, result) { - var self = this + var self = this; self.field_id = id.split("-")[1]; - var model = '' - var prefix = '' - var name = '' var is_loaded = 0; _.each(result, function(record) { - if(record['id'] == self.field_id && (record['children']).length >= 1){ - model = record['params']['model'] - prefix = record['params']['prefix'] - name = record['params']['name'] - $(record['children']).each (function(e, childid) { - if (self.$element.find("tr[id='treerow-" + childid +"']").length > 0) { - if (self.$element.find("tr[id='treerow-" + childid +"']").is(':hidden')) { + if (record['id'] == self.field_id && (record['children']).length >= 1) { + var model = record['params']['model'], + prefix = record['params']['prefix'], + name = record['params']['name']; + $(record['children']).each(function(e, childid) { + if (self.$element.find("tr[id='treerow-" + childid + "']").length > 0) { + if (self.$element.find("tr[id='treerow-" + childid + "']").is(':hidden')) { is_loaded = -1; } else { is_loaded++; @@ -175,11 +167,21 @@ openerp.base.DataExport = openerp.base.Dialog.extend({ } }); if (is_loaded == 0) { - if (self.$element.find("tr[id='treerow-" + self.field_id +"']").find('img').attr('src') == '/base/static/src/img/expand.gif') { - if (model){ - import_comp = self.$element.find("#import_compat option:selected").val() - var params = {"import_compat":parseInt(import_comp), "views_id": this.views_id, "parent_field_type" : record['field_type']} - self.rpc("/base/export/get_fields", {"model": model, "prefix": prefix, "name": name, "field_parent" : self.field_id, "params":params}, function (results) { + if (self.$element.find("tr[id='treerow-" + self.field_id +"']").find('img').attr('src') === '/base/static/src/img/expand.gif') { + if (model) { + var import_comp = self.$element.find("#import_compat option:selected").val(); + var params = { + import_compat: parseInt(import_comp), + views_id: self.views_id, + parent_field_type : record['field_type'] + } + self.rpc("/base/export/get_fields", { + model: model, + prefix: prefix, + name: name, + field_parent : self.field_id, + params: params + }, function(results) { self.on_show_data(results); }); } @@ -192,50 +194,48 @@ openerp.base.DataExport = openerp.base.Dialog.extend({ } }); }, - on_show_data: function(result) { var self = this; var imp_cmpt = parseInt(self.$element.find("#import_compat option:selected").val()); var current_tr = self.$element.find("tr[id='treerow-" + self.field_id + "']"); - if (current_tr.length >= 1){ + if (current_tr.length >= 1) { current_tr.find('img').attr('src','/base/static/src/img/collapse.gif'); current_tr.after(QWeb.render('ExportTreeView-Secondary.children', {'fields': result})); - } - else{ - self.$element.find('#left_field_panel').append(QWeb.render('ExportTreeView-Secondary', {'fields': result})); + } else { + self.$element.find('#left_field_panel').append(QWeb.render('ExportTreeView-Secondary', {'fields': result})); } _.each(result, function(record) { - if((record.field_type == "one2many") && imp_cmpt){ + if ((record.field_type == "one2many") && imp_cmpt) { var o2m_fld = self.$element.find("tr[id='treerow-" + record.id + "']").find('#tree-column'); o2m_fld.addClass("oe_export_readonlyfield"); } - if ((record.required == true) || record.required == "True"){ + if ((record.required == true) || record.required == "True") { var required_fld = self.$element.find("tr[id='treerow-" + record.id + "']").find('#tree-column'); required_fld.addClass("oe_export_requiredfield"); } - self.$element.find("img[id='parentimg-" + record.id +"']").click(function(){ + self.$element.find("img[id='parentimg-" + record.id +"']").click(function() { self.on_click(this.id, result); }); - self.$element.find("tr[id='treerow-" + record.id + "']").click(function(e){ - if (e.shiftKey == true){ - var frst_click,scnd_click = ''; - if (self.row_index == 0){ + self.$element.find("tr[id='treerow-" + record.id + "']").click(function(e) { + if (e.shiftKey == true) { + var frst_click, scnd_click = ''; + if (self.row_index == 0) { self.row_index = this.rowIndex; frst_click = self.$element.find("tr[id^='treerow-']")[self.row_index-1]; $(frst_click).addClass("ui-selected"); - }else{ - if (this.rowIndex >=self.row_index){ + } else { + if (this.rowIndex >=self.row_index) { for (i = (self.row_index-1); i < this.rowIndex; i++) { scnd_click = self.$element.find("tr[id^='treerow-']")[i]; - if(!$(scnd_click).find('#tree-column').hasClass("oe_export_readonlyfield")){ + if (!$(scnd_click).find('#tree-column').hasClass("oe_export_readonlyfield")) { $(scnd_click).addClass("ui-selected"); } } - }else{ + } else { for (i = (self.row_index-1); i >= (this.rowIndex-1); i--) { scnd_click = self.$element.find("tr[id^='treerow-']")[i]; - if(!$(scnd_click).find('#tree-column').hasClass("oe_export_readonlyfield")){ + if (!$(scnd_click).find('#tree-column').hasClass("oe_export_readonlyfield")) { $(scnd_click).addClass("ui-selected"); } } @@ -244,88 +244,88 @@ openerp.base.DataExport = openerp.base.Dialog.extend({ } self.row_index = this.rowIndex; - self.$element.find("tr[id='treerow-" + record.id + "']").keyup(function (e) { - self.row_index = 0; + self.$element.find("tr[id='treerow-" + record.id + "']").keyup(function(e) { + self.row_index = 0; }); var o2m_selection = self.$element.find("tr[id='treerow-" + record.id + "']").find('#tree-column'); - if ($(o2m_selection).hasClass("oe_export_readonlyfield")){ + if ($(o2m_selection).hasClass("oe_export_readonlyfield")) { return false; } var selected = self.$element.find("tr.ui-selected"); - if ($(this).hasClass("ui-selected") && (e.ctrlKey == true)){ + if ($(this).hasClass("ui-selected") && (e.ctrlKey == true)) { $(this).find('a').blur(); $(this).removeClass("ui-selected"); - }else if($(this).hasClass("ui-selected") && (e.ctrlKey == false) && (e.shiftKey == false)){ + } else if ($(this).hasClass("ui-selected") && (e.ctrlKey == false) && (e.shiftKey == false)) { selected.find('a').blur(); selected.removeClass("ui-selected"); $(this).find('a').focus(); $(this).addClass("ui-selected"); - }else if(!$(this).hasClass("ui-selected") && (e.ctrlKey == false) && (e.shiftKey == false)){ + } else if (!$(this).hasClass("ui-selected") && (e.ctrlKey == false) && (e.shiftKey == false)) { selected.find('a').blur(); selected.removeClass("ui-selected"); $(this).find('a').focus(); $(this).addClass("ui-selected"); - }else if(!$(this).hasClass("ui-selected") && (e.ctrlKey == true)){ + } else if (!$(this).hasClass("ui-selected") && (e.ctrlKey == true)) { $(this).find('a').focus(); $(this).addClass("ui-selected"); } return false; }); - self.$element.find("tr[id='treerow-" + record.id + "']").keydown(function (e) { + self.$element.find("tr[id='treerow-" + record.id + "']").keydown(function(e) { var keyCode = e.keyCode || e.which; arrow = {left: 37, up: 38, right: 39, down: 40 }; switch (keyCode) { case arrow.left: - if( jQuery(this).find('img').attr('src') == '/base/static/src/img/collapse.gif'){ + if ($(this).find('img').attr('src') === '/base/static/src/img/collapse.gif') { self.on_click(this.id, result); } - break; + break; case arrow.up: var elem = this; $(elem).removeClass("ui-selected"); - while($(elem).prev().is(":visible") == false){ + while ($(elem).prev().is(":visible") == false) { elem = $(elem).prev(); } - if(!$(elem).prev().find('#tree-column').hasClass("oe_export_readonlyfield")){ + if (!$(elem).prev().find('#tree-column').hasClass("oe_export_readonlyfield")) { $(elem).prev().addClass("ui-selected"); } $(elem).prev().find('a').focus(); - break; + break; case arrow.right: - if( jQuery(this).find('img').attr('src') == '/base/static/src/img/expand.gif'){ + if ($(this).find('img').attr('src') == '/base/static/src/img/expand.gif') { self.on_click(this.id, result); } - break; + break; case arrow.down: var elem = this; $(elem).removeClass("ui-selected"); - while($(elem).next().is(":visible") == false){ + while($(elem).next().is(":visible") == false) { elem = $(elem).next(); } - if(!$(elem).next().find('#tree-column').hasClass("oe_export_readonlyfield")){ + if (!$(elem).next().find('#tree-column').hasClass("oe_export_readonlyfield")) { $(elem).next().addClass("ui-selected"); } $(elem).next().find('a').focus(); - break; + break; } }); - self.$element.find("tr[id='treerow-" + record.id + "']").dblclick(function (e) { - var o2m_selection = self.$element.find("tr[id^='treerow-" + record.id + "']").find('#tree-column'); - if (! $(o2m_selection).hasClass("oe_export_readonlyfield")){ - var field_id = $(this).find("a").attr("id"); - if(field_id){ - self.add_field(field_id.split('-')[1], $(this).find("a").attr("string")) + self.$element.find("tr[id='treerow-" + record.id + "']").dblclick(function(e) { + var $o2m_selection = self.$element.find("tr[id^='treerow-" + record.id + "']").find('#tree-column'); + if (!$o2m_selection.hasClass("oe_export_readonlyfield")) { + var field_id = $(this).find("a").attr("id"); + if (field_id) { + self.add_field(field_id.split('-')[1], $(this).find("a").attr("string")); } } }); }); - self.$element.find('#fields_list').mouseover(function(event){ - if(event.relatedTarget){ - if (event.relatedTarget.attributes['id'] && event.relatedTarget.attributes['string']){ - field_id = event.relatedTarget.attributes["id"]["value"] - if (field_id && field_id.split("-")[0] == 'export'){ - if(!self.$element.find("tr[id='treerow-" + field_id.split("-")[1] + "']").find('#tree-column').hasClass("oe_export_readonlyfield")){ + self.$element.find('#fields_list').mouseover(function(event) { + if (event.relatedTarget) { + if (event.relatedTarget.attributes['id'] && event.relatedTarget.attributes['string']) { + var field_id = event.relatedTarget.attributes["id"]["value"]; + if (field_id && field_id.split("-")[0] === 'export') { + if (!self.$element.find("tr[id='treerow-" + field_id.split("-")[1] + "']").find('#tree-column').hasClass("oe_export_readonlyfield")) { self.add_field(field_id.split("-")[1], event.relatedTarget.attributes["string"]["value"]); } } @@ -333,77 +333,78 @@ openerp.base.DataExport = openerp.base.Dialog.extend({ } }); }, - - // show & hide the contents - showcontent: function (id, flag) { - var first_child = this.$element.find("tr[id='treerow-" + id + "']").find('img') + showcontent: function(id, flag) { + // show & hide the contents + var first_child = this.$element.find("tr[id='treerow-" + id + "']").find('img'); if (flag) { first_child.attr('src', '/base/static/src/img/expand.gif'); } else { first_child.attr('src', '/base/static/src/img/collapse.gif'); } - var child_field = this.$element.find("tr[id^='treerow-" + id +"/']") - var child_len = (id.split("/")).length + 1 + var child_field = this.$element.find("tr[id^='treerow-" + id +"/']"); + var child_len = (id.split("/")).length + 1; for (var i = 0; i < child_field.length; i++) { if (flag) { $(child_field[i]).hide(); - } - else { - if(child_len == (child_field[i].id.split("/")).length){ - if( jQuery(child_field[i]).find('img').attr('src') == '/base/static/src/img/collapse.gif'){ - jQuery(child_field[i]).find('img').attr('src', '/base/static/src/img/expand.gif') + } else { + if (child_len == (child_field[i].id.split("/")).length) { + if ($(child_field[i]).find('img').attr('src') == '/base/static/src/img/collapse.gif') { + $(child_field[i]).find('img').attr('src', '/base/static/src/img/expand.gif'); } $(child_field[i]).show(); } } } }, - add_field: function(field_id, string) { - var field_list = this.$element.find('#fields_list') - if ( this.$element.find("#fields_list option[value='" + field_id + "']") && !this.$element.find("#fields_list option[value='" + field_id + "']").length){ - field_list.append( new Option(string, field_id)); + var field_list = this.$element.find('#fields_list'); + if (this.$element.find("#fields_list option[value='" + field_id + "']") && !this.$element.find("#fields_list option[value='" + field_id + "']").length) { + field_list.append(new Option(string, field_id)); } }, - - get_fields: function (){ + get_fields: function() { var export_field = []; - this.$element.find("#fields_list option").each(function(){ - export_field.push(jQuery(this).val()); + this.$element.find("#fields_list option").each(function() { + export_field.push($(this).val()); }); - if (! export_field.length){ + if (!export_field.length) { alert('Please select fields to save export list...'); } return export_field; }, - on_click_export_data: function(){ + on_click_export_data: function() { var self = this; var export_field = {}; var flag = true; - self.$element.find("#fields_list option").each(function(){ - export_field[jQuery(this).val()] = jQuery(this).text(); + self.$element.find("#fields_list option").each(function() { + export_field[$(this).val()] = $(this).text(); flag = false; }); - if (flag){ + if (flag) { alert('Please select fields to export...'); return; } - import_comp = self.$element.find("#import_compat option:selected").val() - export_format = self.$element.find("#export_format").val() + var import_comp = self.$element.find("#import_compat option:selected").val(), + export_format = self.$element.find("#export_format").val(); - self.rpc("/base/export/export_data", {"model": self.dataset.model, "fields":export_field, 'ids': self.dataset.ids, 'domain': self.dataset.domain, "import_compat":parseInt(import_comp), "export_format" :export_format}, function(data){ - window.location="data:text/csv/excel;charset=utf8," + data + self.rpc("/base/export/export_data", { + model: self.dataset.model, + fields: export_field, + ids: self.dataset.ids, + domain: self.dataset.domain, + import_compat: parseInt(import_comp), + export_format: export_format + }, function(data) { + window.location = "data:text/csv/excel;charset=utf8," + data; self.close(); }); }, - close: function() { - jQuery(this.$dialog).remove(); + $(this.$dialog).remove(); this._super(); - }, - + } }); }; From 506e483974c164e5e682a572f8c69afa734e800c Mon Sep 17 00:00:00 2001 From: Fabien Meghazi Date: Thu, 28 Jul 2011 18:18:53 +0200 Subject: [PATCH 47/47] [IMP] Integrate import into sidebar. Use fields_get instead of parsing views. bzr revid: fme@openerp.com-20110728161853-21ml7wc7kgtfha45 --- addons/base/controllers/main.py | 32 +----------------- addons/base/static/src/js/data_export.js | 14 ++------ addons/base/static/src/js/views.js | 41 ++++++++++++++++-------- 3 files changed, 31 insertions(+), 56 deletions(-) diff --git a/addons/base/controllers/main.py b/addons/base/controllers/main.py index d1917aa764b..fcf673b50d7 100644 --- a/addons/base/controllers/main.py +++ b/addons/base/controllers/main.py @@ -972,35 +972,6 @@ def node_attributes(node): return dict([(str(attrs.item(i).localName), attrs.item(i).nodeValue) for i in range(attrs.length)]) -def _fields_get_all(req, model, views, context=None): - - if context is None: - context = {} - - def parse(root, fields): - for node in root.childNodes: - if node.nodeName in ('form', 'notebook', 'page', 'group', 'tree', 'hpaned', 'vpaned'): - parse(node, fields) - elif node.nodeName=='field': - attrs = node_attributes(node) - name = attrs['name'] - fields[name].update(attrs) - return fields - - def get_view_fields(view): - return parse( - xml.dom.minidom.parseString(view['arch'].encode('utf-8')).documentElement, - view['fields']) - - model_obj = req.session.model(model) - tree_view = model_obj.fields_view_get(views.get('tree', False), 'tree', context) - form_view = model_obj.fields_view_get(views.get('form', False), 'form', context) - fields = {} - fields.update(get_view_fields(tree_view)) - fields.update(get_view_fields(form_view)) - return fields - - class Export(View): _cp_path = "/base/export" @@ -1012,9 +983,8 @@ class Export(View): @openerpweb.jsonrequest def get_fields(self, req, model, prefix='', name= '', field_parent=None, params={}): import_compat = params.get("import_compat", False) - views_id = params.get("views_id", {}) - fields = _fields_get_all(req, model, views=views_id, context=req.session.eval_context(req.context)) + fields = self.fields_get(req, model) field_parent_type = params.get("parent_field_type",False) if import_compat and field_parent_type and field_parent_type == "many2one": diff --git a/addons/base/static/src/js/data_export.js b/addons/base/static/src/js/data_export.js index 50a08bc4f12..ad440302c69 100644 --- a/addons/base/static/src/js/data_export.js +++ b/addons/base/static/src/js/data_export.js @@ -1,13 +1,8 @@ openerp.base.data_export = function(openerp) { openerp.base.DataExport = openerp.base.Dialog.extend({ - init: function(parent, dataset, views) { + init: function(parent, dataset) { this._super(parent); this.dataset = dataset; - this.views = views; - this.views_id = {}; - for (var key in this.views) { - this.views_id[key] = this.views[key].view_id; - } }, start: function() { var self = this; @@ -53,8 +48,7 @@ openerp.base.DataExport = openerp.base.Dialog.extend({ }); var import_comp = self.$element.find('#import_compat option:selected').val(), params = { - import_compat: parseInt(import_comp), - views_id: self.views_id + import_compat: parseInt(import_comp) }; self.rpc('/base/export/get_fields', { model: self.dataset.model, params: params }, self.on_show_data); @@ -64,8 +58,7 @@ openerp.base.DataExport = openerp.base.Dialog.extend({ var import_comp = self.$element.find("#import_compat option:selected").val(); if (import_comp) { var params = { - import_compat: parseInt(import_comp), - views_id: self.views_id + import_compat: parseInt(import_comp) } self.rpc("/base/export/get_fields", { model: self.dataset.model, params: params}, self.on_show_data); } @@ -172,7 +165,6 @@ openerp.base.DataExport = openerp.base.Dialog.extend({ var import_comp = self.$element.find("#import_compat option:selected").val(); var params = { import_compat: parseInt(import_comp), - views_id: self.views_id, parent_field_type : record['field_type'] } self.rpc("/base/export/get_fields", { diff --git a/addons/base/static/src/js/views.js b/addons/base/static/src/js/views.js index 00182874c8c..687a9b25b18 100644 --- a/addons/base/static/src/js/views.js +++ b/addons/base/static/src/js/views.js @@ -215,19 +215,6 @@ openerp.base.ViewManager = openerp.base.Widget.extend({ } } } - if(this.flags && this.flags.sidebar) { - if(this.$element.find('#exportview')){ - this.$element.find('#exportview').remove() - } - if(this.active_view == 'list' || this.active_view == 'form') { - this.views[this.active_view].controller.$element.after(QWeb.render('ExportView')) - this.$element.find('#exportview').click(function(ev) { - var export_view = new openerp.base.DataExport(self, self.dataset, self.views); - export_view.start(false); - ev.preventDefault(); - }); - } - } return view_promise; }, /** @@ -530,7 +517,6 @@ openerp.base.View = openerp.base.Widget.extend({ this.embedded_view = embedded_view; }, set_common_sidebar_sections: function(sidebar) { - var items = []; sidebar.add_section('customize', "Customize", [ { label: "Manage Views", @@ -547,6 +533,23 @@ openerp.base.View = openerp.base.Widget.extend({ title: "Manage views of the current object" } ]); + sidebar.add_section('other', "Other Options", [ + { + label: "Import", + callback: this.on_sidebar_import + }, { + label: "Export", + callback: this.on_sidebar_export + }, { + label: "Translate", + callback: this.on_sidebar_translate, + classname: 'oe_hide oe_sidebar_translate' + }, { + label: "View Log", + callback: this.on_sidebar_view_log, + classname: 'oe_hide oe_sidebar_view_log' + } + ]); }, on_sidebar_manage_view: function() { console.log('Todo'); @@ -556,6 +559,16 @@ openerp.base.View = openerp.base.Widget.extend({ }, on_sidebar_customize_object: function() { console.log('Todo'); + }, + on_sidebar_import: function() { + }, + on_sidebar_export: function() { + var export_view = new openerp.base.DataExport(this, this.dataset); + export_view.start(false); + }, + on_sidebar_translate: function() { + }, + on_sidebar_view_log: function() { } });
&nbsp;