schemaviewer.py
brancholdstable
changeset 4985 02b52bf9f5f8
parent 4467 0e73d299730a
child 5233 673b63953e7a
child 5421 8167de96c523
equal deleted inserted replaced
4563:c25da7573ebd 4985:02b52bf9f5f8
     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"""