7 """ |
7 """ |
8 __docformat__ = "restructuredtext en" |
8 __docformat__ = "restructuredtext en" |
9 _ = unicode |
9 _ = unicode |
10 |
10 |
11 from logilab.common.ureports import Section, Title, Table, Link, Span, Text |
11 from logilab.common.ureports import Section, Title, Table, Link, Span, Text |
|
12 |
12 from yams.schema2dot import CARD_MAP |
13 from yams.schema2dot import CARD_MAP |
|
14 from yams.schema import RelationDefinitionSchema |
13 |
15 |
14 I18NSTRINGS = [_('read'), _('add'), _('delete'), _('update'), _('order')] |
16 I18NSTRINGS = [_('read'), _('add'), _('delete'), _('update'), _('order')] |
|
17 |
15 |
18 |
16 class SchemaViewer(object): |
19 class SchemaViewer(object): |
17 """return an ureport layout for some part of a schema""" |
20 """return an ureport layout for some part of a schema""" |
18 def __init__(self, req=None, encoding=None): |
21 def __init__(self, req=None, encoding=None): |
19 self.req = req |
22 self.req = req |
66 |
69 |
67 def _entity_attributes_data(self, eschema): |
70 def _entity_attributes_data(self, eschema): |
68 _ = self.req._ |
71 _ = self.req._ |
69 data = [_('attribute'), _('type'), _('default'), _('constraints')] |
72 data = [_('attribute'), _('type'), _('default'), _('constraints')] |
70 for rschema, aschema in eschema.attribute_definitions(): |
73 for rschema, aschema in eschema.attribute_definitions(): |
71 if not (rschema.has_local_role('read') or rschema.has_perm(self.req, 'read')): |
74 rdef = eschema.rdef(rschema) |
|
75 if not rdef.may_have_permission('read', self.req): |
72 continue |
76 continue |
73 aname = rschema.type |
77 aname = rschema.type |
74 if aname == 'eid': |
78 if aname == 'eid': |
75 continue |
79 continue |
76 data.append('%s (%s)' % (aname, _(aname))) |
80 data.append('%s (%s)' % (aname, _(aname))) |
77 data.append(_(aschema.type)) |
81 data.append(_(aschema.type)) |
78 defaultval = eschema.default(aname) |
82 defaultval = eschema.default(aname) |
79 if defaultval is not None: |
83 if defaultval is not None: |
80 default = self.to_string(defaultval) |
84 default = self.to_string(defaultval) |
81 elif eschema.rproperty(rschema, 'cardinality')[0] == '1': |
85 elif rdef.cardinality[0] == '1': |
82 default = _('required field') |
86 default = _('required field') |
83 else: |
87 else: |
84 default = '' |
88 default = '' |
85 data.append(default) |
89 data.append(default) |
86 constraints = rschema.rproperty(eschema.type, aschema.type, |
90 constraints = rschema.rproperty(eschema.type, aschema.type, |
117 data.append(Section(children='', klass='vl')) |
121 data.append(Section(children='', klass='vl')) |
118 data.append(Section(children='', klass='hl')) |
122 data.append(Section(children='', klass='hl')) |
119 t_vars = [] |
123 t_vars = [] |
120 rels = [] |
124 rels = [] |
121 first = True |
125 first = True |
122 for rschema, targetschemas, x in eschema.relation_definitions(): |
126 for rschema, targetschemas, role in eschema.relation_definitions(): |
123 if rschema.type in skiptypes: |
127 if rschema.type in skiptypes: |
124 continue |
|
125 if not (rschema.has_local_role('read') or rschema.has_perm(self.req, 'read')): |
|
126 continue |
128 continue |
127 rschemaurl = self.rschema_link_url(rschema) |
129 rschemaurl = self.rschema_link_url(rschema) |
128 for oeschema in targetschemas: |
130 for oeschema in targetschemas: |
|
131 rdef = rschema.role_rdef(eschema, oeschema, role) |
|
132 if not rdef.may_have_permission('read', self.req): |
|
133 continue |
129 label = rschema.type |
134 label = rschema.type |
130 if x == 'subject': |
135 if role == 'subject': |
131 cards = rschema.rproperty(eschema, oeschema, 'cardinality') |
136 cards = rschema.rproperty(eschema, oeschema, 'cardinality') |
132 else: |
137 else: |
133 cards = rschema.rproperty(oeschema, eschema, 'cardinality') |
138 cards = rschema.rproperty(oeschema, eschema, 'cardinality') |
134 cards = cards[::-1] |
139 cards = cards[::-1] |
135 label = '%s %s (%s) %s' % (CARD_MAP[cards[1]], label, display_name(self.req, label, x), CARD_MAP[cards[0]]) |
140 label = '%s %s (%s) %s' % (CARD_MAP[cards[1]], label, |
|
141 display_name(self.req, label, role), |
|
142 CARD_MAP[cards[0]]) |
136 rlink = Link(rschemaurl, label) |
143 rlink = Link(rschemaurl, label) |
137 elink = Link(self.eschema_link_url(oeschema), oeschema.type) |
144 elink = Link(self.eschema_link_url(oeschema), oeschema.type) |
138 if first: |
145 if first: |
139 t_vars.append(Section(children=(elink,), klass='firstvar')) |
146 t_vars.append(Section(children=(elink,), klass='firstvar')) |
140 rels.append(Section(children=(rlink,), klass='firstrel')) |
147 rels.append(Section(children=(rlink,), klass='firstrel')) |
163 if title: |
170 if title: |
164 title = Link(self.rschema_link_url(rschema), rschema.type) |
171 title = Link(self.rschema_link_url(rschema), rschema.type) |
165 stereotypes = [] |
172 stereotypes = [] |
166 if rschema.meta: |
173 if rschema.meta: |
167 stereotypes.append('meta') |
174 stereotypes.append('meta') |
168 if rschema.symetric: |
175 if rschema.symmetric: |
169 stereotypes.append('symetric') |
176 stereotypes.append('symmetric') |
170 if rschema.inlined: |
177 if rschema.inlined: |
171 stereotypes.append('inlined') |
178 stereotypes.append('inlined') |
172 title = Section(children=(title, ' (%s)'%rschema.display_name(self.req)), klass='title') |
179 title = Section(children=(title, ' (%s)'%rschema.display_name(self.req)), klass='title') |
173 if stereotypes: |
180 if stereotypes: |
174 title.append(self.stereotype(','.join(stereotypes))) |
181 title.append(self.stereotype(','.join(stereotypes))) |
178 data = [_('from'), _('to')] |
185 data = [_('from'), _('to')] |
179 schema = rschema.schema |
186 schema = rschema.schema |
180 rschema_objects = rschema.objects() |
187 rschema_objects = rschema.objects() |
181 if rschema_objects: |
188 if rschema_objects: |
182 # might be empty |
189 # might be empty |
183 properties = [p for p in rschema.rproperty_defs(rschema_objects[0]) |
190 properties = [p for p in RelationDefinitionSchema.rproperty_defs(rschema_objects[0]) |
184 if not p in ('cardinality', 'composite', 'eid')] |
191 if not p in ('cardinality', 'composite', 'eid')] |
185 else: |
192 else: |
186 properties = [] |
193 properties = [] |
187 data += [_(prop) for prop in properties] |
194 data += [_(prop) for prop in properties] |
188 cols = len(data) |
195 cols = len(data) |
190 for subjtype, objtypes in rschema.associations(): |
197 for subjtype, objtypes in rschema.associations(): |
191 for objtype in objtypes: |
198 for objtype in objtypes: |
192 if (subjtype, objtype) in done: |
199 if (subjtype, objtype) in done: |
193 continue |
200 continue |
194 done.add((subjtype, objtype)) |
201 done.add((subjtype, objtype)) |
195 if rschema.symetric: |
202 if rschema.symmetric: |
196 done.add((objtype, subjtype)) |
203 done.add((objtype, subjtype)) |
197 data.append(Link(self.eschema_link_url(schema[subjtype]), subjtype)) |
204 data.append(Link(self.eschema_link_url(schema[subjtype]), subjtype)) |
198 data.append(Link(self.eschema_link_url(schema[objtype]), objtype)) |
205 data.append(Link(self.eschema_link_url(schema[objtype]), objtype)) |
|
206 rdef = rschema.rdef(subjtype, objtype) |
199 for prop in properties: |
207 for prop in properties: |
200 val = rschema.rproperty(subjtype, objtype, prop) |
208 val = getattr(rdef, prop) |
201 if val is None: |
209 if val is None: |
202 val = '' |
210 val = '' |
203 elif isinstance(val, (list, tuple)): |
211 elif isinstance(val, (list, tuple)): |
204 val = ', '.join(str(v) for v in val) |
212 val = ', '.join(str(v) for v in val) |
205 elif val and isinstance(val, basestring): |
213 elif val and isinstance(val, basestring): |
207 else: |
215 else: |
208 val = str(val) |
216 val = str(val) |
209 data.append(Text(val)) |
217 data.append(Text(val)) |
210 table = Table(cols=cols, rheaders=1, children=data, klass='listing') |
218 table = Table(cols=cols, rheaders=1, children=data, klass='listing') |
211 layout.append(Section(children=(table,), klass='relationDefinition')) |
219 layout.append(Section(children=(table,), klass='relationDefinition')) |
212 if not self.req.cnx.anonymous_connection: |
220 #if self.req.user.matching_groups('managers'): |
213 layout.append(self.format_acls(rschema, ('read', 'add', 'delete'))) |
221 # layout.append(self.format_acls(rschema, ('read', 'add', 'delete'))) |
214 layout.append(Section(children='', klass='clear')) |
222 layout.append(Section(children='', klass='clear')) |
215 return layout |
223 return layout |
216 |
224 |
217 def to_string(self, value): |
225 def to_string(self, value): |
218 """used to converte arbitrary values to encoded string""" |
226 """used to converte arbitrary values to encoded string""" |