web/views/basetemplates.py
branch3.5
changeset 2935 e06b3eadef31
parent 2657 de974465d381
child 2936 f35b64718d02
equal deleted inserted replaced
2934:cf4d39416fca 2935:e06b3eadef31
    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('&nbsp;', '&#160;').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)