web/views/owl.py
changeset 502 7882941d3530
child 503 a2fca6cdc5ff
equal deleted inserted replaced
501:567e85e646d8 502:7882941d3530
       
     1 from logilab.mtconverter import html_escape
       
     2 
       
     3 from cubicweb.common.uilib import ureport_as_html, unormalize, ajax_replace_url
       
     4 from cubicweb.common.view import StartupView
       
     5 from cubicweb.common.view import EntityView
       
     6 from cubicweb.web.httpcache import EtagHTTPCacheManager
       
     7 
       
     8 _ = unicode
       
     9 
       
    10 OWL_CARD_MAP = {'1': '<rdf:type rdf:resource="&owl;FunctionalProperty"/>',                      
       
    11                 '?': '<owl:maxCardinality rdf:datatype="&xsd;int">1</owl:maxCardinality>',
       
    12                 '+': '<owl:minCardinality rdf:datatype="&xsd;int">1</owl:minCardinality>',
       
    13                 '*': ''
       
    14                 }
       
    15 
       
    16 OWL_CARD_MAP_DATA = {'String': 'xsd:string',
       
    17                      'Datetime': 'xsd:dateTime',
       
    18                      'Bytes': 'xsd:byte',
       
    19                      'Float': 'xsd:float',
       
    20                      'Boolean': 'xsd:boolean',
       
    21                      'Int': 'xsd:int',
       
    22                      'Date':'xsd:date',
       
    23                      'Time': 'xsd:time',
       
    24                      'Password': 'xsd:byte',
       
    25                      'Decimal' : 'xsd:decimal',
       
    26                      'Interval': 'xsd:duration'
       
    27                      }
       
    28 
       
    29 class OWLView(StartupView):
       
    30     id = 'owl'
       
    31     title = _('owl')
       
    32     templatable =False
       
    33 
       
    34     def call(self):
       
    35         skipmeta = int(self.req.form.get('skipmeta', True))
       
    36         self.visit_schemaOWL(display_relations=True,
       
    37                              skiprels=('is', 'is_instance_of', 'identity',
       
    38                                        'owned_by', 'created_by'),
       
    39                              skipmeta=skipmeta)
       
    40 
       
    41 
       
    42     def visit_schemaOWL(self, display_relations=0,
       
    43                      skiprels=(), skipmeta=True):
       
    44         """get a layout for a whole schema"""
       
    45         self.w(u'''<?xml version="1.0" encoding="UTF-8"?>
       
    46         <!DOCTYPE rdf:RDF [
       
    47         <!ENTITY owl "http://www.w3.org/2002/07/owl#" >
       
    48         <!ENTITY xsd "http://www.w3.org/2001/XMLSchema#" >
       
    49         <!ENTITY rdfs "http://www.w3.org/2000/01/rdf-schema#" >
       
    50         <!ENTITY rdf "http://www.w3.org/1999/02/22-rdf-syntax-ns#" >
       
    51         <!ENTITY %s "http://logilab.org/owl/ontologies/%s#" >
       
    52         
       
    53         ]>        
       
    54         <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
       
    55             xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#"
       
    56             xmlns:xsd="http://www.w3.org/2001/XMLSchema#"
       
    57             xmlns:owl="http://www.w3.org/2002/07/owl#"
       
    58             xmlns="http://logilab.org/owl/ontologies/%s#"
       
    59             xmlns:%s="http://logilab.org/owl/ontologies/%s#"
       
    60             xml:base="http://logilab.org/owl/ontologies/%s">
       
    61 
       
    62     <owl:Ontology rdf:about="">
       
    63         <rdfs:comment>
       
    64         %s Cubicweb OWL Ontology                           
       
    65                                         
       
    66         </rdfs:comment>
       
    67    </owl:Ontology>
       
    68         ''' % (self.schema.name, self.schema.name, self.schema.name, self.schema.name, self.schema.name, self.schema.name, self.schema.name))
       
    69         entities = [eschema for eschema in self.schema.entities()
       
    70                     if not eschema.is_final()]
       
    71         if skipmeta:
       
    72             entities = [eschema for eschema in entities
       
    73                         if not eschema.meta]
       
    74         keys = [(eschema.type, eschema) for eschema in entities]
       
    75         self.w(u'<!-- classes definition -->')
       
    76         for key, eschema in sorted(keys):
       
    77             self.visit_entityschemaOWL(eschema, skiprels)
       
    78         self.w(u'<!-- property definition -->')
       
    79         self.w(u'<!-- object property -->')
       
    80         for key, eschema in sorted(keys):
       
    81              self.visit_property_schemaOWL(eschema, skiprels)
       
    82         self.w(u'<!-- datatype property -->')
       
    83         for key, eschema in sorted(keys):
       
    84             self.visit_property_object_schemaOWL(eschema, skiprels)
       
    85         self.w(u'</rdf:RDF>')
       
    86            
       
    87     def eschema_link_url(self, eschema):
       
    88         return self.req.build_url('eetype/%s?vid=eschema' % eschema)
       
    89     
       
    90     def rschema_link_url(self, rschema):
       
    91         return self.req.build_url('ertype/%s?vid=eschema' % rschema)
       
    92 
       
    93     def possible_views(self, etype):
       
    94         rset = self.req.etype_rset(etype)
       
    95         return [v for v in self._possible_views(self.req, rset)
       
    96                 if v.category != 'startupview']
       
    97 
       
    98     def stereotype(self, name):
       
    99         return Span((' <<%s>>' % name,), klass='stereotype')
       
   100                        
       
   101     def visit_entityschemaOWL(self, eschema, skiprels=()):
       
   102         """get a layout for an entity OWL schema"""
       
   103         etype = eschema.type
       
   104         
       
   105         if eschema.meta:
       
   106             self.stereotype('meta')
       
   107             self.w(u'''<owl:Class rdf:ID="%s"><rdfs:subClassOf rdf:resource="http://www.w3.org/2002/07/owl#Thing"/>
       
   108                                 '''%eschema, stereotype)
       
   109         else:
       
   110              self.w(u'''<owl:Class rdf:ID="%s"><rdfs:subClassOf rdf:resource="http://www.w3.org/2002/07/owl#Thing"/>
       
   111                                 '''% eschema)         
       
   112        
       
   113         self.w(u'<!-- relations -->')    
       
   114         for rschema, targetschemas, role in eschema.relation_definitions():
       
   115             if rschema.type in skiprels:
       
   116                 continue
       
   117             if not (rschema.has_local_role('read') or rschema.has_perm(self.req, 'read')):
       
   118                 continue
       
   119             for oeschema in targetschemas:
       
   120                 label = rschema.type
       
   121                 if role == 'subject':
       
   122                     card = rschema.rproperty(eschema, oeschema, 'cardinality')[0]
       
   123                 else:
       
   124                     card = rschema.rproperty(oeschema, eschema, 'cardinality')[1]
       
   125                 self.w(u'''<rdfs:subClassOf>
       
   126                               <owl:Restriction>
       
   127                               <owl:onProperty rdf:resource="#%s"/>
       
   128                                 %s
       
   129                               </owl:Restriction>
       
   130                            </rdfs:subClassOf>
       
   131                                 ''' % (label, OWL_CARD_MAP[card]))
       
   132 
       
   133         self.w(u'<!-- attributes -->')
       
   134               
       
   135         for rschema, aschema in eschema.attribute_definitions():
       
   136             if not (rschema.has_local_role('read') or rschema.has_perm(self.req, 'read')):
       
   137                 continue
       
   138             aname = rschema.type
       
   139             if aname == 'eid':
       
   140                 continue
       
   141             card_data = aschema.type
       
   142             self.w(u'''<rdfs:subClassOf>
       
   143                               <owl:Restriction>
       
   144                                  <owl:onProperty rdf:resource="#%s"/>
       
   145                                  <rdf:type rdf:resource="&owl;FunctionalProperty"/>
       
   146                                  </owl:Restriction>
       
   147                         </rdfs:subClassOf>'''
       
   148                           
       
   149                    % aname)
       
   150         self.w(u'</owl:Class>')
       
   151     
       
   152     def visit_property_schemaOWL(self, eschema, skiprels=()):
       
   153         """get a layout for property entity OWL schema"""
       
   154         etype = eschema.type
       
   155 
       
   156         for rschema, targetschemas, role in eschema.relation_definitions():
       
   157             if rschema.type in skiprels:
       
   158                 continue
       
   159             if not (rschema.has_local_role('read') or rschema.has_perm(self.req, 'read')):
       
   160                 continue
       
   161             rschemaurl = self.rschema_link_url(rschema)
       
   162             for oeschema in targetschemas:
       
   163                 label = rschema.type
       
   164                 self.w(u'''<owl:ObjectProperty rdf:ID="%s">
       
   165                               <rdfs:domain rdf:resource="#%s"/>
       
   166                               <rdfs:range rdf:resource="#%s"/>
       
   167                            </owl:ObjectProperty>                   
       
   168                              
       
   169                                 ''' % (label, eschema, oeschema.type ))
       
   170 
       
   171     def visit_property_object_schemaOWL(self, eschema, skiprels=()):
       
   172                
       
   173         for rschema, aschema in eschema.attribute_definitions():
       
   174             if not (rschema.has_local_role('read') or rschema.has_perm(self.req, 'read')):
       
   175                 continue
       
   176             aname = rschema.type
       
   177             if aname == 'eid':
       
   178                 continue
       
   179             card_data = aschema.type
       
   180             self.w(u'''<owl:DatatypeProperty rdf:ID="%s">
       
   181                           <rdfs:domain rdf:resource="#%s"/>
       
   182                           <rdfs:range rdf:resource="%s"/>
       
   183                        </owl:DatatypeProperty>'''
       
   184                    % (aname, eschema, OWL_CARD_MAP_DATA[card_data]))
       
   185 class OWLABOXView(EntityView):
       
   186     id = 'owlabox'
       
   187     title = _('owlabox')
       
   188     templatable =False
       
   189     accepts = ('Any',)
       
   190     
       
   191     def call(self):
       
   192 
       
   193         rql = ('Any X')
       
   194         rset = self.req.execute(rql)
       
   195         skipmeta = int(self.req.form.get('skipmeta', True))
       
   196         self.w(u'''<?xml version="1.0" encoding="UTF-8"?>
       
   197         <!DOCTYPE rdf:RDF [
       
   198         <!ENTITY owl "http://www.w3.org/2002/07/owl#" >
       
   199         <!ENTITY xsd "http://www.w3.org/2001/XMLSchema#" >
       
   200         <!ENTITY rdfs "http://www.w3.org/2000/01/rdf-schema#" >
       
   201         <!ENTITY rdf "http://www.w3.org/1999/02/22-rdf-syntax-ns#" >
       
   202         <!ENTITY %s "http://logilab.org/owl/ontologies/%s#" >
       
   203         
       
   204         ]>        
       
   205         <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
       
   206             xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#"
       
   207             xmlns:xsd="http://www.w3.org/2001/XMLSchema#"
       
   208             xmlns:owl="http://www.w3.org/2002/07/owl#"
       
   209             xmlns="http://logilab.org/owl/ontologies/%s#"
       
   210             xmlns:%s="http://logilab.org/owl/ontologies/%s#"
       
   211             xmlns:base="http://logilab.org/owl/ontologies/%s">
       
   212 
       
   213     <owl:Ontology rdf:about="">
       
   214         <rdfs:comment>
       
   215         %s Cubicweb OWL Ontology                           
       
   216                                         
       
   217         </rdfs:comment>
       
   218    </owl:Ontology>''' % (self.schema.name, self.schema.name, self.schema.name, self.schema.name, self.schema.name, self.schema.name, self.schema.name))
       
   219         #self.view('owl', rset)
       
   220 
       
   221         for i in xrange(self.rset.rowcount):
       
   222             self.cell_call(i, 0, skiprels=('is', 'is_instance_of', 'identity',
       
   223                                        'owned_by', 'created_by'),
       
   224                              skipmeta=skipmeta)
       
   225         self.w(u'</rdf:RDF>')
       
   226 
       
   227     def cell_call(self, row, col, skiprels=(), skipmeta=True):
       
   228         entity = self.complete_entity(row, col)
       
   229         eschema = entity.e_schema
       
   230         self.w(u'''<%s rdf:ID="%s">''' % (eschema, entity.name))
       
   231         print 'i'*40
       
   232         self.w(u'<!--attributes-->')
       
   233         for rschema, aschema in eschema.attribute_definitions():
       
   234             if rschema.type in skiprels:
       
   235                 continue
       
   236             if not (rschema.has_local_role('read') or rschema.has_perm(self.req, 'read')):
       
   237                 continue
       
   238             aname = rschema.type
       
   239             if aname == 'eid':
       
   240                 continue
       
   241             attr = getattr(entity, aname)
       
   242             if attr is not None:
       
   243                 self.w(u'''<%s>%s</%s>'''% (aname, html_escape(unicode(attr)), aname))
       
   244             
       
   245         self.w(u'<!--relations -->')
       
   246         for rschema, targetschemas, role in eschema.relation_definitions():
       
   247             if rschema.type in skiprels:
       
   248                 continue
       
   249             if not (rschema.has_local_role('read') or rschema.has_perm(self.req, 'read')):
       
   250                 continue
       
   251             if role =='object':
       
   252                 reverse = 'reverse_%s' % rschema.type 
       
   253                 rel = getattr(entity, reverse)
       
   254             else:
       
   255                 rel = getattr(entity, rschema.type)
       
   256                 reverse = '%s' % rschema.type        
       
   257             if len(rel)!=0:
       
   258                 print rel
       
   259                 for x in rel:
       
   260                     if hasattr(x, 'name'):
       
   261                         self.w(u'''<%s>%s %s %s</%s> ''' % (reverse, targetschemas[0], html_escape(unicode(x.name)), html_escape(unicode(x.eid)), reverse))
       
   262                     else :
       
   263                         self.w(u'''<%s>%s %s</%s> ''' % (reverse, targetschemas[0], html_escape(unicode(x.eid)), reverse))
       
   264                        
       
   265         self.w(u'''</%s>'''% eschema)
       
   266