manual merge of the 'fixprinter' branch from c2c ('bzr merge' failed :( )
[openerp-client.git] / bin / printer / printer.py
blob8ce068133fdf904fc9bdb53296ba42d57f15eb55
1 # -*- encoding: utf-8 -*-
2 ##############################################################################
4 # Copyright (c) 2004-2008 TINY SPRL. (http://tiny.be) All Rights Reserved.
6 # $Id$
8 # WARNING: This program as such is intended to be used by professional
9 # programmers who take the whole responsability of assessing all potential
10 # consequences resulting from its eventual inadequacies and bugs
11 # End users who are looking for a ready-to-use solution with commercial
12 # garantees and support are strongly adviced to contract a Free Software
13 # Service Company
15 # This program is Free Software; you can redistribute it and/or
16 # modify it under the terms of the GNU General Public License
17 # as published by the Free Software Foundation; either version 2
18 # of the License, or (at your option) any later version.
20 # This program is distributed in the hope that it will be useful,
21 # but WITHOUT ANY WARRANTY; without even the implied warranty of
22 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
23 # GNU General Public License for more details.
25 # You should have received a copy of the GNU General Public License
26 # along with this program; if not, write to the Free Software
27 # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
29 ##############################################################################
31 # ------------------------------------------------------------------- #
32 # Module printer
33 # ------------------------------------------------------------------- #
35 # Supported formats: pdf
37 # Print or open a previewer
40 import os, base64, options, sys
41 import gc
42 import common
43 import time
44 import gtk
46 class Printer(object):
48 def __init__(self):
49 self.openers = {
50 'pdf': self._findPDFOpener,
51 'html': self._findHTMLOpener,
52 'doc': self._findHTMLOpener,
53 'xls': self._findHTMLOpener,
54 'sxw': self._findSXWOpener,
57 def _findInPath(self, progs):
58 lstprogs = progs[:]
59 found = {}
60 path = [dir for dir in os.environ['PATH'].split(':')
61 if os.path.isdir(dir)]
62 for dir in path:
63 content = os.listdir(dir)
64 for prog in progs[:]:
65 if prog in content:
66 return os.path.join(dir, prog)#prog
68 progs.remove(prog)
69 found[prog] = os.path.join(dir, prog)
70 for prog in lstprogs:
71 if prog in found:
72 return found[prog]
73 return ''
75 def _findHTMLOpener(self):
76 import webbrowser
77 def opener(fn):
78 webbrowser.open('file://'+fn)
79 return opener
81 def _findPDFOpener(self):
82 if os.uname()[0] == 'Darwin' :
83 def opener(fn):
84 pid = os.fork()
85 if not pid:
86 pid = os.fork()
87 if not pid:
88 os.system('/usr/bin/open -a Preview ' + fn)
89 time.sleep(0.1)
90 sys.exit(0)
91 os.waitpid(pid, 0)
92 return opener
93 if os.name == 'nt':
94 if options.options['printer.preview']:
95 if options.options['printer.softpath'] == 'none':
96 return lambda fn: os.startfile(fn)
97 else:
98 return lambda fn: os.system(options.options['printer.softpath'] + ' ' + fn)
99 else:
100 return lambda fn: print_w32_filename(fn)
101 else:
102 if options.options['printer.preview']:
103 if options.options['printer.softpath'] == 'none':
104 prog = self._findInPath(['evince', 'xpdf', 'gpdf', 'kpdf', 'epdfview', 'acroread', 'open'])
105 def opener(fn):
106 pid = os.fork()
107 if not pid:
108 pid = os.fork()
109 if not pid:
110 os.execv(prog, (os.path.basename(prog), fn))
111 time.sleep(0.1)
112 sys.exit(0)
113 os.waitpid(pid, 0)
114 return opener
115 else:
116 def opener(fn):
117 pid = os.fork()
118 if not pid:
119 pid = os.fork()
120 if not pid:
121 os.execv(options.options['printer.softpath'], (os.path.basename(options.options['printer.softpath']),fn))
122 time.sleep(0.1)
123 sys.exit(0)
124 os.waitpid(pid, 0)
125 return opener
126 else:
127 return lambda fn: print_linux_filename(fn)
129 def _findSXWOpener(self):
130 if os.name == 'nt':
131 return lambda fn: os.startfile(fn)
132 else:
133 if options.options['printer.softpath_html'] == 'none':
134 prog = self._findInPath(['ooffice', 'ooffice2', 'openoffice', 'soffice'])
135 def opener(fn):
136 pid = os.fork()
137 if not pid:
138 pid = os.fork()
139 if not pid:
140 os.execv(prog, (os.path.basename(prog),fn))
141 time.sleep(0.1)
142 sys.exit(0)
143 os.waitpid(pid, 0)
144 return opener
145 else:
146 def opener(fn):
147 pid = os.fork()
148 if not pid:
149 pid = os.fork()
150 if not pid:
151 os.execv(options.options['printer.softpath_html'], (os.path.basename(options.options['printer.softpath_html']),fn))
152 time.sleep(0.1)
153 sys.exit(0)
154 os.waitpid(pid, 0)
155 return opener
157 def print_file(self, fname, ftype):
158 finderfunc = self.openers[ftype]
159 opener = finderfunc()
160 opener(fname)
161 gc.collect()
163 printer = Printer()
165 def print_linux_filename(filename):
166 common.message(_('Linux Automatic Printing not implemented.\nUse preview option !'))
168 def print_w32_filename(filename):
169 import win32api
170 win32api.ShellExecute (0, "print", filename, None, ".", 0)
172 def print_data(data):
173 if 'result' not in data:
174 common.message(_('Error no report'))
175 if data.get('code','normal')=='zlib':
176 import zlib
177 content = zlib.decompress(base64.decodestring(data['result']))
178 else:
179 content = base64.decodestring(data['result'])
181 if data['format'] in printer.openers.keys():
182 import tempfile
183 if data['format']=='html' and os.name=='nt':
184 data['format']='doc'
185 (fileno, fp_name) = tempfile.mkstemp('.'+data['format'], 'tinyerp_')
186 fp = file(fp_name, 'wb+')
187 fp.write(content)
188 fp.close()
189 os.close(fileno)
190 printer.print_file(fp_name, data['format'])
191 else:
192 fname = common.file_selection(_('Save As...'), filename='report.' + data['format'],
193 action=gtk.FILE_CHOOSER_ACTION_SAVE)
194 if fname:
195 try:
196 fp = file(fname,'wb+')
197 fp.write(content)
198 fp.close()
199 except:
200 common.message(_('Error writing the file!'))
203 # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: