web/views/dotgraphview.py
changeset 9383 7b3fa5a7a5a3
parent 8212 a045d3821990
child 10666 7f6b5f023884
equal deleted inserted replaced
9382:ac0661486568 9383:7b3fa5a7a5a3
    20 __docformat__ = "restructuredtext en"
    20 __docformat__ = "restructuredtext en"
    21 _ = unicode
    21 _ = unicode
    22 
    22 
    23 import tempfile
    23 import tempfile
    24 import os
    24 import os
       
    25 import codecs
    25 
    26 
    26 from logilab.mtconverter import xml_escape
    27 from logilab.mtconverter import xml_escape
    27 from logilab.common.graph import GraphGenerator, DotBackend
    28 from logilab.common.graph import GraphGenerator, DotBackend
    28 
    29 
    29 from cubicweb.view import EntityView
    30 from cubicweb.view import EntityView
    31 
    32 
    32 class DotGraphView(EntityView):
    33 class DotGraphView(EntityView):
    33     __abstract__ = True
    34     __abstract__ = True
    34     backend_class = DotBackend
    35     backend_class = DotBackend
    35     backend_kwargs = {'ratio': 'compress', 'size': '30,10'}
    36     backend_kwargs = {'ratio': 'compress', 'size': '30,10'}
       
    37 
    36     def cell_call(self, row, col):
    38     def cell_call(self, row, col):
       
    39         if 'MSIE 8' in self._cw.useragent():
       
    40             return
    37         entity = self.cw_rset.get_entity(row, col)
    41         entity = self.cw_rset.get_entity(row, col)
    38         visitor = self.build_visitor(entity)
    42         visitor = self.build_visitor(entity)
    39         prophdlr = self.build_dotpropshandler()
    43         prophdlr = self.build_dotpropshandler()
    40         graphname = 'dotgraph%s' % str(entity.eid)
    44         graphname = 'dotgraph%s' % str(entity.eid)
    41         generator = GraphGenerator(self.backend_class(graphname, None,
    45         generator = GraphGenerator(self.backend_class(graphname, None,
    42                                                       **self.backend_kwargs))
    46                                                       **self.backend_kwargs))
    43         # map file
       
    44         pmap, mapfile = tempfile.mkstemp(".map", graphname)
       
    45         os.close(pmap)
       
    46         # image file
    47         # image file
    47         fd, tmpfile = tempfile.mkstemp('.png')
    48         fd, tmpfile = tempfile.mkstemp('.svg')
    48         os.close(fd)
    49         os.close(fd)
    49         generator.generate(visitor, prophdlr, tmpfile, mapfile)
    50         generator.generate(visitor, prophdlr, tmpfile)
    50         filekeyid = make_uid()
    51         with codecs.open(tmpfile, 'rb', encoding='utf-8') as svgfile:
    51         self._cw.session.data[filekeyid] = tmpfile
    52             self.w(svgfile.read())
    52         self.w(u'<img src="%s" alt="%s" usemap="#%s" />' % (
       
    53             xml_escape(entity.absolute_url(vid='tmppng', tmpfile=filekeyid)),
       
    54             xml_escape(self._cw._('Data connection graph for %s') % entity.dc_title()),
       
    55             graphname))
       
    56         stream = open(mapfile, 'r').read()
       
    57         stream = stream.decode(self._cw.encoding)
       
    58         self.w(stream)
       
    59         os.unlink(mapfile)
       
    60 
    53 
    61     def build_visitor(self, entity):
    54     def build_visitor(self, entity):
    62         raise NotImplementedError
    55         raise NotImplementedError
    63 
    56 
    64     def build_dotpropshandler(self):
    57     def build_dotpropshandler(self):