Source code for stoqlib.gui.dialogs.spreadsheetexporterdialog
# -*- coding: utf-8 -*-
# vi:si:et:sw=4:sts=4:ts=4
##
## Copyright (C) 2008-2012 Async Open Source <http://www.async.com.br>
## All rights reserved
##
## This program is free software; you can redistribute it and/or modify
## it under the terms of the GNU Lesser General Public License as published by
## the Free Software Foundation; either version 2 of the License, or
## (at your option) any later version.
##
## This program is distributed in the hope that it will be useful,
## but WITHOUT ANY WARRANTY; without even the implied warranty of
## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
## GNU Lesser General Public License for more details.
##
## You should have received a copy of the GNU Lesser General Public License
## along with this program; if not, write to the Free Software
## Foundation, Inc., or visit: http://www.gnu.org/.
##
## Author(s): Stoq Team <stoq-devel@async.com.br>
##
"""Spreedsheet Exporter Dialog"""
import gio
import gtk
from stoqlib.api import api
from stoqlib.exporters.xlsexporter import XLSExporter
from stoqlib.lib.message import yesno
from stoqlib.lib.translation import stoqlib_gettext
_ = stoqlib_gettext
[docs]class SpreadSheetExporter:
"""A dialog to export data to a spreadsheet
"""
title = _('Exporter to Spreadseet')
[docs] def export(self, object_list, name, filename_prefix, data=None):
xls = XLSExporter(name)
xls.add_from_object_list(object_list, data)
temporary = xls.save(filename_prefix)
self.export_temporary(temporary)
[docs] def export_temporary(self, temporary):
mime_type = 'application/vnd.ms-excel'
app_info = gio.app_info_get_default_for_type(mime_type, False)
if app_info:
action = api.user_settings.get('spreadsheet-action')
if action is None:
action = 'open'
else:
action = 'save'
if action == 'ask':
action = self._ask(app_info)
if action == 'open':
temporary.close()
self._open_application(mime_type, temporary.name)
elif action == 'save':
self._save(temporary)
def _ask(self, app_info):
# FIXME: What if the user presses esc? Esc will return False
# and open action will be executed. Esc should cancel the action
if yesno(_("A spreadsheet has been created, "
"what do you want to do with it?"),
gtk.RESPONSE_NO,
_('Save it to disk'),
_("Open with %s") % (app_info.get_name())):
return 'save'
else:
return 'open'
def _open_application(self, mime_type, filename):
app_info = gio.app_info_get_default_for_type(mime_type, False)
gfile = gio.File(path=filename)
app_info.launch([gfile])
def _save(self, temp):
chooser = gtk.FileChooserDialog(
_("Export Spreadsheet..."), None,
gtk.FILE_CHOOSER_ACTION_SAVE,
(gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL,
gtk.STOCK_SAVE, gtk.RESPONSE_OK))
chooser.set_do_overwrite_confirmation(True)
xls_filter = gtk.FileFilter()
xls_filter.set_name(_('Excel Files'))
xls_filter.add_pattern('*.xls')
chooser.add_filter(xls_filter)
response = chooser.run()
filename = None
if response != gtk.RESPONSE_OK:
chooser.destroy()
return
filename = chooser.get_filename()
ext = '.xls'
chooser.destroy()
if not filename.endswith(ext):
filename += ext
# Open in binary format so windows dont replace '\n' with '\r\n'
open(filename, 'wb').write(temp.read())
temp.close()