diff --git a/sao/src/tab.js b/sao/src/tab.js index b652074bbd..b7a261c5bb 100644 --- a/sao/src/tab.js +++ b/sao/src/tab.js @@ -1506,9 +1506,7 @@ do_export: function(export_) { this.modified_save().then(() => { var ids, paths; - if (this.screen.current_view && - (this.screen.current_view.view_type == 'tree') && - this.screen.current_view.children_field) { + if (export_.records == 'listed') { ids = this.screen.listed_records.map(r => r.id); paths = this.screen.listed_paths; } else { diff --git a/sao/src/window.js b/sao/src/window.js index 3478bdcff5..98ff6a0e94 100644 --- a/sao/src/window.js +++ b/sao/src/window.js @@ -1939,11 +1939,14 @@ 'method': 'model.ir.export.search_read', 'params': [ [['resource', '=', this.screen.model_name]], 0, null, null, - ['name', 'export_fields.name'], {}], + ['name', 'header', 'records', 'export_fields.name'], {}], }, this.session).done(exports => { for (const export_ of exports) { - this.predef_exports[export_.id] = export_['export_fields.'] - .map(field => field.name); + this.predef_exports[export_.id] = { + 'fields': export_['export_fields.'].map( + field => field.name), + 'values': export_, + }; this.add_to_predef(export_.id, export_.name); this.predef_exports_list.children('li').first().focus(); } @@ -1981,38 +1984,37 @@ const save = name => { var prm; + var values = { + 'header': this.el_add_field_names.is(':checked'), + 'records': ( + JSON.parse(this.selected_records.val()) ? + 'selected' : 'listed'), + }; if (!pref_id) { + values.name = name; + values.resource = this.screen.model_name; + values.export_fields = [ + ['create', fields.map(f => ({'name': f}))]]; prm = Sao.rpc({ method: 'model.ir.export.create', - params: [[{ - name: name, - resource: this.screen.model_name, - header: this.el_add_field_names.is(':checked'), - export_fields: [['create', fields.map(function(f) { - return {name: f}; - })]], - }], this.context], - }, this.session).then(function(new_ids) { - return new_ids[0]; - }); + params: [[values], this.context], + }, this.session).then(([id]) => id); } else { prm = Sao.rpc({ method: 'model.ir.export.update', - params: [[pref_id], fields, this.context], - }, this.session).then(function() { - return pref_id; - }); + params: [[pref_id], values, fields, this.context], + }, this.session).then(() => pref_id); } return prm.then(pref_id => { this.session.cache.clear( 'model.' + this.screen.model_name + '.view_toolbar_get'); - this.predef_exports[pref_id] = fields; + this.predef_exports[pref_id] = { + 'fields': fields, + 'values': values, + }; if (selection.length === 0) { this.add_to_predef(pref_id, name); } - else { - selection.attr('export_id', pref_id); - } }); }; @@ -2050,7 +2052,8 @@ }, sel_predef: function(export_id) { this.fields_selected.empty(); - for (const name of this.predef_exports[export_id]) { + const export_ = this.predef_exports[export_id]; + for (const name of export_.fields) { if (!(name in this.fields)) { var fields = this.fields_model; var prefix = ''; @@ -2062,6 +2065,9 @@ } this.sel_field(name); } + this.el_add_field_names.prop('checked', export_.values.header); + this.selected_records.val( + JSON.stringify(export_.values.records == 'selected')); }, _traverse: function(fields, prefix, parents, i) { var field, item; diff --git a/tryton/tryton/gui/window/form.py b/tryton/tryton/gui/window/form.py index 9f53d613f5..05271e2503 100644 --- a/tryton/tryton/gui/window/form.py +++ b/tryton/tryton/gui/window/form.py @@ -408,9 +408,7 @@ class Form(TabContent): def do_export(self, widget, export): if not self.modified_save(): return - if (self.screen.current_view - and self.screen.current_view.view_type == 'tree' - and self.screen.current_view.children_field): + if export.get('records') == 'listed': ids = [r.id for r in self.screen.listed_records] paths = self.screen.listed_paths else: diff --git a/tryton/tryton/gui/window/win_export.py b/tryton/tryton/gui/window/win_export.py index a63a819d23..e4e3faaf5c 100644 --- a/tryton/tryton/gui/window/win_export.py +++ b/tryton/tryton/gui/window/win_export.py @@ -99,15 +99,16 @@ class WinExport(WinCSV): self.pref_export = Gtk.TreeView() self.pref_export.append_column( - Gtk.TreeViewColumn(_('Name'), Gtk.CellRendererText(), text=2)) + Gtk.TreeViewColumn(_('Name'), Gtk.CellRendererText(), text=1)) scrolledwindow_exports.add(self.pref_export) self.pref_export.connect("button-press-event", self.export_click) self.pref_export.connect("key-press-event", self.export_keypress) self.predef_model = Gtk.ListStore( - GObject.TYPE_INT, - GObject.TYPE_PYOBJECT, - GObject.TYPE_STRING) + GObject.TYPE_INT, + GObject.TYPE_STRING, + GObject.TYPE_PYOBJECT, + GObject.TYPE_PYOBJECT) self.fill_predefwin() def add_chooser(self, box): @@ -216,15 +217,16 @@ class WinExport(WinCSV): exports = RPCExecute( 'model', 'ir.export', 'search_read', [('resource', '=', self.model)], 0, None, None, - ['name', 'export_fields.name'], + ['name', 'header', 'records', 'export_fields.name'], context=self.context) except RPCException: return for export in exports: self.predef_model.append(( export['id'], + export['name'], [f['name'] for f in export['export_fields.']], - export['name'])) + export)) self.pref_export.set_model(self.predef_model) def addreplace_predef(self, widget): @@ -248,31 +250,39 @@ class WinExport(WinCSV): return else: pref_id = model.get_value(iter_, 0) - name = model.get_value(iter_, 2) + name = model.get_value(iter_, 1) override = common.sur(_("Override '%s' definition?") % name) if not override: return try: + values = { + 'header': self.add_field_names.get_active(), + 'records': ( + 'selected' if self.selected_records.get_active() + else 'listed'), + } if not pref_id: - pref_id, = RPCExecute('model', 'ir.export', 'create', [{ + values.update({ 'name': name, 'resource': self.model, - 'header': self.add_field_names.get_active(), - 'export_fields': [('create', [{ - 'name': x, - } for x in fields])], - }], context=self.context) + 'export_fields': [ + ('create', [{'name': x, } for x in fields])], + }) + pref_id, = RPCExecute( + 'model', 'ir.export', 'create', [values], + context=self.context) else: - RPCExecute('model', 'ir.export', 'update', [pref_id], fields, + RPCExecute( + 'model', 'ir.export', 'update', [pref_id], values, fields, context=self.context) except RPCException: return clear_cache('model.%s.view_toolbar_get' % self.model) if iter_ is None: - self.predef_model.append((pref_id, fields, name)) + self.predef_model.append((pref_id, name, fields, values)) else: - model.set_value(iter_, 0, pref_id) - model.set_value(iter_, 1, fields) + model.set_value(iter_, 2, fields) + model.set_value(iter_, 3, values) def remove_predef(self, widget): sel = self.pref_export.get_selection().get_selected() @@ -296,7 +306,8 @@ class WinExport(WinCSV): def sel_predef(self, path): self.model2.clear() - for name in self.predef_model[path[0]][1]: + _, _, fields, values = self.predef_model[path[0]] + for name in fields: if name not in self.fields: iter = self.model1.get_iter_first() prefix = '' @@ -316,6 +327,10 @@ class WinExport(WinCSV): continue self.sel_field(name) + self.add_field_names.set_active(values.get('header')) + self.selected_records.set_active( + int(values.get('records') == 'selected')) + def sel_field(self, name): string_, relation = self.fields[name] if relation: diff --git a/trytond/CHANGELOG b/trytond/CHANGELOG index f10c527ef6..a084c449bd 100644 --- a/trytond/CHANGELOG +++ b/trytond/CHANGELOG @@ -1,3 +1,4 @@ +* Store records selection on export Version 6.8.0 - 2023-05-01 -------------------------- diff --git a/trytond/trytond/ir/export.py b/trytond/trytond/ir/export.py index 17d4da6f76..357352c44e 100644 --- a/trytond/trytond/ir/export.py +++ b/trytond/trytond/ir/export.py @@ -31,6 +31,11 @@ class Export(_ClearCache, ModelSQL, ModelView): header = fields.Boolean( "Header", help="Check to include field names on the export.") + records = fields.Selection([ + ('selected', "Selected"), + ('listed', "Listed"), + ], "Records", + help="The records on which the export runs.") export_fields = fields.One2Many('ir.export.line', 'export', 'Fields') @@ -45,9 +50,14 @@ class Export(_ClearCache, ModelSQL, ModelView): return False @classmethod - def update(cls, exports, fields): + def default_records(cls): + return 'selected' + + @classmethod + def update(cls, exports, values, fields): pool = Pool() Line = pool.get('ir.export.line') + cls.write(exports, values) to_delete = [] to_save = [] for export in exports: diff --git a/trytond/trytond/ir/view/export_form.xml b/trytond/trytond/ir/view/export_form.xml index 484ee5e23c..22826aa4ac 100644 --- a/trytond/trytond/ir/view/export_form.xml +++ b/trytond/trytond/ir/view/export_form.xml @@ -3,10 +3,14 @@ this repository contains the full copyright notices and license terms. -->
diff --git a/trytond/trytond/model/modelview.py b/trytond/trytond/model/modelview.py index ea2bda82a8..35c0083cda 100644 --- a/trytond/trytond/model/modelview.py +++ b/trytond/trytond/model/modelview.py @@ -319,7 +319,7 @@ class ModelView(Model): relates = Action.get_keyword('form_relate', (cls.__name__, -1)) exports = Export.search_read( [('resource', '=', cls.__name__)], - fields_names=['name', 'header', 'export_fields.name']) + fields_names=['name', 'header', 'records', 'export_fields.name']) emails = Email.search_read( [('model.model', '=', cls.__name__)], fields_names=['name'])