5 :contact: http://www.logilab.fr/ -- mailto:contact@logilab.fr |
5 :contact: http://www.logilab.fr/ -- mailto:contact@logilab.fr |
6 """ |
6 """ |
7 __docformat__ = "restructuredtext en" |
7 __docformat__ = "restructuredtext en" |
8 |
8 |
9 from logilab.common.ureports import Section, Title, Table, Link, Span, Text |
9 from logilab.common.ureports import Section, Title, Table, Link, Span, Text |
10 from yams.schema2dot import CARD_MAP |
10 from yams.schema2dot import CARD_MAP |
11 |
11 |
12 _ = unicode |
12 _ = unicode |
13 I18NSTRINGS = [_('read'), _('add'), _('delete'), _('update'), _('order')] |
13 I18NSTRINGS = [_('read'), _('add'), _('delete'), _('update'), _('order')] |
14 |
14 |
15 class SchemaViewer(object): |
15 class SchemaViewer(object): |
22 if not encoding: |
22 if not encoding: |
23 encoding = req.encoding |
23 encoding = req.encoding |
24 else: |
24 else: |
25 self._possible_views = lambda x: () |
25 self._possible_views = lambda x: () |
26 self.encoding = encoding |
26 self.encoding = encoding |
27 |
27 |
28 def format_acls(self, schema, access_types): |
28 def format_acls(self, schema, access_types): |
29 """return a layout displaying access control lists""" |
29 """return a layout displaying access control lists""" |
30 data = [self.req._('access type'), self.req._('groups')] |
30 data = [self.req._('access type'), self.req._('groups')] |
31 for access_type in access_types: |
31 for access_type in access_types: |
32 data.append(self.req._(access_type)) |
32 data.append(self.req._(access_type)) |
34 acls += (rqlexp.expression for rqlexp in schema.get_rqlexprs(access_type)) |
34 acls += (rqlexp.expression for rqlexp in schema.get_rqlexprs(access_type)) |
35 data.append(', '.join(acls)) |
35 data.append(', '.join(acls)) |
36 return Section(children=(Table(cols=2, cheaders=1, rheaders=1, children=data),), |
36 return Section(children=(Table(cols=2, cheaders=1, rheaders=1, children=data),), |
37 klass='acl') |
37 klass='acl') |
38 |
38 |
39 |
39 |
40 def visit_schema(self, schema, display_relations=0, |
40 def visit_schema(self, schema, display_relations=0, |
41 skiprels=(), skipmeta=True): |
41 skiprels=(), skipmeta=True): |
42 """get a layout for a whole schema""" |
42 """get a layout for a whole schema""" |
43 title = Title(self.req._('Schema %s') % schema.name, |
43 title = Title(self.req._('Schema %s') % schema.name, |
44 klass='titleUnderline') |
44 klass='titleUnderline') |
49 eschemas = [eschema for eschema in schema.entities() |
49 eschemas = [eschema for eschema in schema.entities() |
50 if not eschema.is_final()] |
50 if not eschema.is_final()] |
51 if skipmeta: |
51 if skipmeta: |
52 eschemas = [eschema for eschema in eschemas |
52 eschemas = [eschema for eschema in eschemas |
53 if not eschema.meta] |
53 if not eschema.meta] |
54 for eschema in sorted(eschema): |
54 for eschema in sorted(eschemas): |
55 esection.append(self.visit_entityschema(eschema, skiprels)) |
55 esection.append(self.visit_entityschema(eschema, skiprels)) |
56 if display_relations: |
56 if display_relations: |
57 title = Title(self.req._('Relations'), klass='titleUnderline') |
57 title = Title(self.req._('Relations'), klass='titleUnderline') |
58 rsection = Section(children=(title,)) |
58 rsection = Section(children=(title,)) |
59 layout.append(rsection) |
59 layout.append(rsection) |
60 relations = [rschema for rschema in schema.relations() |
60 relations = [rschema for rschema in schema.relations() |
61 if not (rschema.is_final() or rschema.type in skiprels)] |
61 if not (rschema.is_final() or rschema.type in skiprels)] |
62 if skipmeta: |
62 if skipmeta: |
63 relations = [rschema for rschema in relations |
63 relations = [rschema for rschema in relations |
74 for rschema, aschema in eschema.attribute_definitions(): |
74 for rschema, aschema in eschema.attribute_definitions(): |
75 if not (rschema.has_local_role('read') or rschema.has_perm(self.req, 'read')): |
75 if not (rschema.has_local_role('read') or rschema.has_perm(self.req, 'read')): |
76 continue |
76 continue |
77 aname = rschema.type |
77 aname = rschema.type |
78 if aname == 'eid': |
78 if aname == 'eid': |
79 continue |
79 continue |
80 data.append('%s (%s)' % (aname, _(aname))) |
80 data.append('%s (%s)' % (aname, _(aname))) |
81 data.append(_(aschema.type)) |
81 data.append(_(aschema.type)) |
82 defaultval = eschema.default(aname) |
82 defaultval = eschema.default(aname) |
83 if defaultval is not None: |
83 if defaultval is not None: |
84 default = self.to_string(defaultval) |
84 default = self.to_string(defaultval) |
92 data.append(', '.join(str(constr) for constr in constraints)) |
92 data.append(', '.join(str(constr) for constr in constraints)) |
93 return data |
93 return data |
94 |
94 |
95 def eschema_link_url(self, eschema): |
95 def eschema_link_url(self, eschema): |
96 return self.req.build_url('eetype/%s?vid=eschema' % eschema) |
96 return self.req.build_url('eetype/%s?vid=eschema' % eschema) |
97 |
97 |
98 def rschema_link_url(self, rschema): |
98 def rschema_link_url(self, rschema): |
99 return self.req.build_url('ertype/%s?vid=eschema' % rschema) |
99 return self.req.build_url('ertype/%s?vid=eschema' % rschema) |
100 |
100 |
101 def possible_views(self, etype): |
101 def possible_views(self, etype): |
102 rset = self.req.etype_rset(etype) |
102 rset = self.req.etype_rset(etype) |
103 return [v for v in self._possible_views(self.req, rset) |
103 return [v for v in self._possible_views(self.req, rset) |
104 if v.category != 'startupview'] |
104 if v.category != 'startupview'] |
105 |
105 |
106 def stereotype(self, name): |
106 def stereotype(self, name): |
107 return Span((' <<%s>>' % name,), klass='stereotype') |
107 return Span((' <<%s>>' % name,), klass='stereotype') |
108 |
108 |
109 def visit_entityschema(self, eschema, skiprels=()): |
109 def visit_entityschema(self, eschema, skiprels=()): |
110 """get a layout for an entity schema""" |
110 """get a layout for an entity schema""" |
111 etype = eschema.type |
111 etype = eschema.type |
112 layout = Section(children=' ', klass='clear') |
112 layout = Section(children=' ', klass='clear') |
113 layout.append(Link(etype,' ' , id=etype)) # anchor |
113 layout.append(Link(etype,' ' , id=etype)) # anchor |
115 if eschema.meta: |
115 if eschema.meta: |
116 stereotype = self.stereotype('meta') |
116 stereotype = self.stereotype('meta') |
117 boxchild = [Section(children=(title, ' (%s)'%eschema.display_name(self.req), stereotype), klass='title')] |
117 boxchild = [Section(children=(title, ' (%s)'%eschema.display_name(self.req), stereotype), klass='title')] |
118 else: |
118 else: |
119 boxchild = [Section(children=(title, ' (%s)'%eschema.display_name(self.req)), klass='title')] |
119 boxchild = [Section(children=(title, ' (%s)'%eschema.display_name(self.req)), klass='title')] |
120 table = Table(cols=4, rheaders=1, |
120 table = Table(cols=4, rheaders=1, |
121 children=self._entity_attributes_data(eschema)) |
121 children=self._entity_attributes_data(eschema)) |
122 boxchild.append(Section(children=(table,), klass='body')) |
122 boxchild.append(Section(children=(table,), klass='body')) |
123 data = [] |
123 data = [] |
124 data.append(Section(children=boxchild, klass='box')) |
124 data.append(Section(children=boxchild, klass='box')) |
125 data.append(Section(children='', klass='vl')) |
125 data.append(Section(children='', klass='vl')) |
162 views = [_(view.title) for view in self.possible_views(etype)] |
162 views = [_(view.title) for view in self.possible_views(etype)] |
163 layout.append(Section(children=(Table(cols=1, rheaders=1, |
163 layout.append(Section(children=(Table(cols=1, rheaders=1, |
164 children=[_('views')]+views),), |
164 children=[_('views')]+views),), |
165 klass='views')) |
165 klass='views')) |
166 return layout |
166 return layout |
167 |
167 |
168 def visit_relationschema(self, rschema, title=True): |
168 def visit_relationschema(self, rschema, title=True): |
169 """get a layout for a relation schema""" |
169 """get a layout for a relation schema""" |
170 _ = self.req._ |
170 _ = self.req._ |
171 title = Link(self.rschema_link_url(rschema), rschema.type) |
171 title = Link(self.rschema_link_url(rschema), rschema.type) |
172 stereotypes = [] |
172 stereotypes = [] |