changeset 62400e239a21 in tryton:default
details: https://hg.tryton.org/tryton?cmd=changeset;node=62400e239a21
description:
Add CSV exports to print toolbar
issue8130
review54571002
diffstat:
CHANGELOG | 1 +
tryton/gui/window/form.py | 54 ++++++++++++++++++++++++++++++++++++----
tryton/gui/window/win_export.py | 9 +++---
tryton/rpc.py | 4 +++
4 files changed, 57 insertions(+), 11 deletions(-)
diffs (172 lines):
diff -r 65aff6f1a7e9 -r 62400e239a21 CHANGELOG
--- a/CHANGELOG Fri Mar 22 12:16:36 2019 +0100
+++ b/CHANGELOG Fri Mar 22 17:21:20 2019 +0100
@@ -1,3 +1,4 @@
+* Add CSV exports into print toolbar
* Display unread and total of notes
* Support badge on icon
* Use resources method
diff -r 65aff6f1a7e9 -r 62400e239a21 tryton/gui/window/form.py
--- a/tryton/gui/window/form.py Fri Mar 22 12:16:36 2019 +0100
+++ b/tryton/gui/window/form.py Fri Mar 22 17:21:20 2019 +0100
@@ -1,7 +1,11 @@
# This file is part of Tryton. The COPYRIGHT file at the top level of
# this repository contains the full copyright notices and license terms.
"Form"
+import csv
import gettext
+import locale
+import os
+import tempfile
from gi.repository import Gdk, GLib, Gtk
@@ -311,6 +315,8 @@
WinImport(self.title.get_text(), self.model, self.screen.context)
def sig_export(self, widget=None):
+ if not self.modified_save():
+ return
export = WinExport(
self.title.get_text(), self.model,
[r.id for r in self.screen.selected_records],
@@ -325,6 +331,26 @@
else:
export.sel_field(name)
+ def do_export(self, widget, export):
+ if not self.modified_save():
+ return
+ ids = [r.id for r in self.screen.selected_records]
+ fields = [f['name'] for f in export['export_fields.']]
+ data = RPCExecute(
+ 'model', self.model, 'export_data', ids, fields,
+ context=self.screen.context)
+ delimiter = ','
+ if os.name == 'nt' and ',' == locale.localeconv()['decimal_point']:
+ delimiter = ';'
+ fileno, fname = tempfile.mkstemp(
+ '.csv', common.slugify(export['name']) + '_')
+ with open(fname, 'w') as fp:
+ writer = csv.writer(fp, delimiter=delimiter)
+ writer.writerow(fields)
+ writer.writerows(data)
+ os.close(fileno)
+ common.file_open(fname, 'csv')
+
def sig_new(self, widget=None, autosave=True):
if not common.MODELACCESS[self.model]['create']:
return
@@ -507,9 +533,9 @@
return self.modified_save()
def _action(self, action, atype):
+ if not self.modified_save():
+ return
action = action.copy()
- if self.screen.modified() and not self.sig_save():
- return
record_id = (self.screen.current_record.id
if self.screen.current_record else None)
record_ids = [r.id for r in self.screen.selected_records]
@@ -573,6 +599,19 @@
tbutton = Gtk.SeparatorToolItem()
gtktoolbar.insert(tbutton, -1)
+ exports = toolbars['exports']
+ if exports:
+ tbutton = self.buttons['open']
+ tbutton._can_be_sensitive = True
+ menu = tbutton._menu
+ if menu.get_children():
+ menu.add(Gtk.SeparatorMenuItem())
+ for export in exports:
+ menuitem = Gtk.MenuItem(set_underline(export['name']))
+ menuitem.set_use_underline(True)
+ menuitem.connect('activate', self.do_export, export)
+ menu.add(menuitem)
+
gtktoolbar.insert(Gtk.SeparatorToolItem(), -1)
url_button = Gtk.ToggleToolButton()
@@ -628,14 +667,15 @@
def _update_popup_menu(self, tbutton, menu, keyword):
for item in menu.get_children():
- if (getattr(item, '_update_action', False)
- or isinstance(item, Gtk.SeparatorMenuItem)):
+ if getattr(item, '_update_action', False):
menu.remove(item)
buttons = [b for b in self.screen.get_buttons()
if keyword == b.attrs.get('keyword', 'action')]
if buttons and menu.get_children():
- menu.add(Gtk.SeparatorMenuItem())
+ separator = Gtk.SeparatorMenuItem()
+ separator._update_action = True
+ menu.add(separator)
for button in buttons:
menuitem = Gtk.MenuItem(
label=set_underline(button.attrs.get('string', _('Unknown'))),
@@ -658,7 +698,9 @@
kw_plugins.append((name, func))
if kw_plugins:
- menu.add(Gtk.SeparatorMenuItem())
+ separator = Gtk.SeparatorMenuItem()
+ separator._update_action = True
+ menu.add(separator)
for name, func in kw_plugins:
menuitem = Gtk.MenuItem(label=set_underline(name))
menuitem.set_use_underline(True)
diff -r 65aff6f1a7e9 -r 62400e239a21 tryton/gui/window/win_export.py
--- a/tryton/gui/window/win_export.py Fri Mar 22 12:16:36 2019 +0100
+++ b/tryton/gui/window/win_export.py Fri Mar 22 17:21:20 2019 +0100
@@ -10,6 +10,7 @@
import tryton.common as common
from tryton.common import RPCExecute, RPCException
from tryton.gui.window.win_csv import WinCSV
+from tryton.rpc import clear_toolbar_cache
_ = gettext.gettext
@@ -213,6 +214,7 @@
context=self.context)
except RPCException:
return
+ clear_toolbar_cache()
if iter_ is None:
self.predef_model.append((new_id, fields, name))
else:
@@ -232,6 +234,7 @@
context=self.context)
except RPCException:
return
+ clear_toolbar_cache()
for i in range(len(self.predef_model)):
if self.predef_model[i][0] == export_id:
del self.predef_model[i]
@@ -305,11 +308,7 @@
delimiter=self.get_delimiter())
if self.add_field_names.get_active():
writer.writerow(fields)
- for line in data:
- row = []
- for val in line:
- row.append(val)
- writer.writerow(row)
+ writer.writerows(data)
if popup:
if len(data) == 1:
common.message(_('%d record saved.') % len(data))
diff -r 65aff6f1a7e9 -r 62400e239a21 tryton/rpc.py
--- a/tryton/rpc.py Fri Mar 22 12:16:36 2019 +0100
+++ b/tryton/rpc.py Fri Mar 22 17:21:20 2019 +0100
@@ -162,3 +162,7 @@
def execute_nonblocking(*args):
return _execute(False, *args)
+
+
+def clear_toolbar_cache():
+ _TOOLBAR_CACHE.clear()