web/views/dynimages.py
changeset 55 5ff3ca010290
parent 0 b97547f5f1fa
child 688 cddfbdee0eb3
equal deleted inserted replaced
54:e5cd878dc796 55:5ff3ca010290
     6 """
     6 """
     7 __docformat__ = "restructuredtext en"
     7 __docformat__ = "restructuredtext en"
     8 
     8 
     9 import os
     9 import os
    10 from tempfile import mktemp
    10 from tempfile import mktemp
       
    11 from itertools import cycle
    11 
    12 
    12 from logilab.common.graph import escape, GraphGenerator, DotBackend
    13 from logilab.common.graph import escape, GraphGenerator, DotBackend
    13 from yams import schema2dot as s2d
    14 from yams import schema2dot as s2d
    14 
    15 
    15 from cubicweb.common.view import EntityView, StartupView
    16 from cubicweb.common.view import EntityView, StartupView
    16 
    17 
    17 
    18 
    18 class RestrictedSchemaDotPropsHandler(s2d.SchemaDotPropsHandler):
    19 class RestrictedSchemaDotPropsHandler(s2d.SchemaDotPropsHandler):
    19     def __init__(self, req):
    20     def __init__(self, req):
       
    21         # FIXME: colors are arbitrary
       
    22         self.nextcolor = cycle( ('#aa0000', '#00aa00', '#0000aa',
       
    23                                  '#000000', '#888888') ).next
    20         self.req = req
    24         self.req = req
    21         
    25         
    22     def display_attr(self, rschema):
    26     def display_attr(self, rschema):
    23         return not rschema.meta and (rschema.has_local_role('read')
    27         return not rschema.meta and (rschema.has_local_role('read')
    24                                      or rschema.has_perm(self.req, 'read'))
    28                                      or rschema.has_perm(self.req, 'read'))
    30         label.append(r'\l'.join(rel.type for rel in eschema.subject_relations()
    34         label.append(r'\l'.join(rel.type for rel in eschema.subject_relations()
    31                                 if rel.final and self.display_attr(rel)))
    35                                 if rel.final and self.display_attr(rel)))
    32         label.append(r'\l}') # trailing \l ensure alignement of the last one
    36         label.append(r'\l}') # trailing \l ensure alignement of the last one
    33         return {'label' : ''.join(label), 'shape' : "record",
    37         return {'label' : ''.join(label), 'shape' : "record",
    34                 'fontname' : "Courier", 'style' : "filled"}
    38                 'fontname' : "Courier", 'style' : "filled"}
       
    39 
       
    40     def edge_properties(self, rschema, subjnode, objnode):
       
    41         kwargs = super(RestrictedSchemaDotPropsHandler, self).edge_properties(rschema, subjnode, objnode)
       
    42         # symetric rels are handled differently, let yams decide what's best
       
    43         if not rschema.symetric:
       
    44             kwargs['color'] = self.nextcolor()
       
    45         kwargs['fontcolor'] = kwargs['color']
       
    46         # dot label decoration is just awful (1 line underlining the label
       
    47         # + 1 line going to the closest edge spline point)
       
    48         kwargs['decorate'] = 'false'
       
    49         return kwargs
    35     
    50     
       
    51 
    36 class RestrictedSchemaVisitorMiIn:
    52 class RestrictedSchemaVisitorMiIn:
    37     def __init__(self, req, *args, **kwargs):
    53     def __init__(self, req, *args, **kwargs):
    38         # hack hack hack
    54         # hack hack hack
    39         assert len(self.__class__.__bases__) == 2
    55         assert len(self.__class__.__bases__) == 2
    40         self.__parent = self.__class__.__bases__[1]
    56         self.__parent = self.__class__.__bases__[1]