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] |