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()

Reply via email to