11 from logilab.mtconverter import xml_escape |
11 from logilab.mtconverter import xml_escape |
12 |
12 |
13 from cubicweb.appobject import objectify_selector |
13 from cubicweb.appobject import objectify_selector |
14 from cubicweb.selectors import match_kwargs |
14 from cubicweb.selectors import match_kwargs |
15 from cubicweb.view import View, MainTemplate, NOINDEX, NOFOLLOW |
15 from cubicweb.view import View, MainTemplate, NOINDEX, NOFOLLOW |
16 from cubicweb.utils import make_uid, UStringIO |
16 from cubicweb.utils import make_uid, UStringIO, can_do_pdf_conversion |
17 |
17 |
18 |
18 |
19 # main templates ############################################################## |
19 # main templates ############################################################## |
20 |
20 |
21 class LogInOutTemplate(MainTemplate): |
21 class LogInOutTemplate(MainTemplate): |
263 self.w(u'<table id="header"><tr>\n') |
263 self.w(u'<table id="header"><tr>\n') |
264 self.w(u'<td>') |
264 self.w(u'<td>') |
265 logo.render(w=self.w) |
265 logo.render(w=self.w) |
266 self.w(u'</td>\n') |
266 self.w(u'</td>\n') |
267 self.w(u'</tr></table>\n') |
267 self.w(u'</tr></table>\n') |
|
268 |
|
269 if can_do_pdf_conversion(): |
|
270 from xml.etree.cElementTree import ElementTree |
|
271 from subprocess import Popen as sub |
|
272 from StringIO import StringIO |
|
273 from tempfile import NamedTemporaryFile |
|
274 from cubicweb.web.xhtml2fo import ReportTransformer |
|
275 |
|
276 class PdfMainTemplate(TheMainTemplate): |
|
277 id = 'pdf-main-template' |
|
278 |
|
279 def call(self, view): |
|
280 """build the standard view, then when it's all done, convert xhtml to pdf |
|
281 """ |
|
282 super(PdfMainTemplate, self).call(view) |
|
283 pdf = self.to_pdf(self._stream) |
|
284 self.req.set_content_type('application/pdf', filename='report.pdf') |
|
285 self.binary = True |
|
286 self.w = None |
|
287 self.set_stream() |
|
288 # pylint needs help |
|
289 self.w(pdf) |
|
290 |
|
291 def to_pdf(self, stream, section='contentmain'): |
|
292 # XXX see ticket/345282 |
|
293 stream = stream.getvalue().replace(' ', ' ').encode('utf-8') |
|
294 xmltree = ElementTree() |
|
295 xmltree.parse(StringIO(stream)) |
|
296 foptree = ReportTransformer(section).transform(xmltree) |
|
297 foptmp = NamedTemporaryFile() |
|
298 pdftmp = NamedTemporaryFile() |
|
299 foptree.write(foptmp) |
|
300 foptmp.flush() |
|
301 fopproc = sub(['/usr/bin/fop', foptmp.name, pdftmp.name]) |
|
302 fopproc.wait() |
|
303 pdftmp.seek(0) |
|
304 pdf = pdftmp.read() |
|
305 return pdf |
268 |
306 |
269 # page parts templates ######################################################## |
307 # page parts templates ######################################################## |
270 |
308 |
271 class HTMLHeader(View): |
309 class HTMLHeader(View): |
272 """default html headers""" |
310 """default html headers""" |
487 return req.url() |
525 return req.url() |
488 |
526 |
489 |
527 |
490 ## vregistry registration callback ############################################ |
528 ## vregistry registration callback ############################################ |
491 def registration_callback(vreg): |
529 def registration_callback(vreg): |
492 vreg.register_all(globals().values(), modname=__name__) |
530 vreg.register_all(globals().values(), __name__, (PdfMainTemplate,) ) |
|
531 if can_do_pdf_conversion(): |
|
532 vreg.register(PdfMainTemplate) |