schemaviewer.py
branchtls-sprint
changeset 1731 13f948678a6a
parent 1522 47b2ffbee760
child 1802 d628defebc17
equal deleted inserted replaced
1730:cec526a96535 1731:13f948678a6a
     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,'&nbsp;' , id=etype)) # anchor
   113         layout.append(Link(etype,'&nbsp;' , 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 = []