web/views/startup.py
changeset 452 8dd71540902f
parent 329 903eb8c4ebd6
child 453 d1b72b31e315
equal deleted inserted replaced
451:1261226552ec 452:8dd71540902f
    13 from cubicweb.common.view import StartupView
    13 from cubicweb.common.view import StartupView
    14 from cubicweb.web.httpcache import EtagHTTPCacheManager
    14 from cubicweb.web.httpcache import EtagHTTPCacheManager
    15 
    15 
    16 _ = unicode
    16 _ = unicode
    17 
    17 
       
    18 OWL_CARD_MAP = {'1': '''<owl:minCardinality rdf:datatype="&xsd;nonNegativeInteger">1</owl:minCardinality>
       
    19                         <owl:maxCardinality rdf:datatype="&xsd;nonNegativeInteger">1</owl:maxCardinality>''',
       
    20                 '?': '<owl:maxCardinality rdf:datatype="&xsd;nonNegativeInteger">1</owl:maxCardinality>',
       
    21                 '+': '<owl:minCardinality rdf:datatype="&xsd;nonNegativeInteger">1</owl:minCardinality>',
       
    22                 '*': '<owl:cardinality rdf:datatype="&xsd;nonNegativeInteger">n</owl:cardinality>'
       
    23                 }
       
    24 
       
    25 OWL_CARD_MAP_DATA = {'String': 'xsd:string',
       
    26                      'Datetime': 'xsd:dateTime',
       
    27                      'Bytes': 'xsd:byte',
       
    28                      'Float': 'xsd:float',
       
    29                      'Boolean': 'xsd:boolean',
       
    30                      'Int': 'xsd:int',
       
    31                      'Date':'xsd:date',
       
    32                      'Time': 'xsd:time',
       
    33                      'Password': 'xsd:byte',
       
    34                      'Decimal' : 'xsd:decimal',
       
    35                      'Interval': 'xsd:duration'
       
    36                      }
    18 
    37 
    19 class ManageView(StartupView):
    38 class ManageView(StartupView):
    20     id = 'manage'
    39     id = 'manage'
    21     title = _('manage')    
    40     title = _('manage')    
    22     http_cache_manager = EtagHTTPCacheManager
    41     http_cache_manager = EtagHTTPCacheManager
   188                                      skiprels=('is', 'is_instance_of', 'identity',
   207                                      skiprels=('is', 'is_instance_of', 'identity',
   189                                                'owned_by', 'created_by'),
   208                                                'owned_by', 'created_by'),
   190                                      skipmeta=skipmeta)
   209                                      skipmeta=skipmeta)
   191         self.w(ureport_as_html(layout))
   210         self.w(ureport_as_html(layout))
   192 
   211 
       
   212 
       
   213 class OWLView(StartupView):
       
   214     id = 'owl'
       
   215     title = _('owl')
       
   216     templatable =False
       
   217 
       
   218     def call(self):
       
   219         skipmeta = int(self.req.form.get('skipmeta', True))
       
   220         self.visit_schemaOWL(display_relations=True,
       
   221                              skiprels=('is', 'is_instance_of', 'identity',
       
   222                                        'owned_by', 'created_by'),
       
   223                              skipmeta=skipmeta)
       
   224 
       
   225 
       
   226     def visit_schemaOWL(self, display_relations=0,
       
   227                      skiprels=(), skipmeta=True):
       
   228         """get a layout for a whole schema"""
       
   229         self.w(u'''<?xml version="1.0" encoding="UTF-8"?>
       
   230         <!DOCTYPE rdf:RDF [
       
   231         <!ENTITY owl "http://www.w3.org/2002/07/owl#" >
       
   232         <!ENTITY xsd "http://www.w3.org/2001/XMLSchema#" >
       
   233         <!ENTITY rdfs "http://www.w3.org/2000/01/rdf-schema#" >
       
   234         <!ENTITY rdf "http://www.w3.org/1999/02/22-rdf-syntax-ns#" >
       
   235         <!ENTITY %s "http://logilab.org/owl/ontologies/%s#" >
       
   236         
       
   237         ]>        
       
   238         <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
       
   239             xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#"
       
   240             xmlns:xsd="http://www.w3.org/2001/XMLSchema#"
       
   241             xmlns:owl="http://www.w3.org/2002/07/owl#"
       
   242             xmlns="http://logilab.org/owl/ontologies/%s#"
       
   243             xmlns:%s="http://logilab.org/owl/ontologies/%s#"
       
   244             xml:base="http://logilab.org/owl/ontologies/%s#">
       
   245 
       
   246     <owl:Ontology rdf:about="">
       
   247         <rdfs:comment>
       
   248         Cubicweb OWL Ontology                           
       
   249       Author: Laure Bourgois                                   
       
   250         </rdfs:comment>
       
   251         ''' % (self.schema.name, self.schema.name, self.schema.name, self.schema.name, self.schema.name, self.schema.name))
       
   252         entities = [eschema for eschema in self.schema.entities()
       
   253                     if not eschema.is_final()]
       
   254         if skipmeta:
       
   255             entities = [eschema for eschema in entities
       
   256                         if not eschema.meta]
       
   257         keys = [(eschema.type, eschema) for eschema in entities]
       
   258         self.w(u'<!-- classes definition -->')
       
   259         for key, eschema in sorted(keys):
       
   260             self.visit_entityschemaOWL(eschema, skiprels)
       
   261         self.w(u'<!-- property definition -->')
       
   262         self.w(u'<!-- object property -->')
       
   263         for key, eschema in sorted(keys):
       
   264              self.visit_property_schemaOWL(eschema, skiprels)
       
   265         self.w(u'<!-- datatype property -->')
       
   266         for key, eschema in sorted(keys):
       
   267             self.visit_property_object_schemaOWL(eschema, skiprels)
       
   268         self.w(u' </owl:Ontology></rdf:RDF>')
       
   269            
       
   270     def eschema_link_url(self, eschema):
       
   271         return self.req.build_url('eetype/%s?vid=eschema' % eschema)
       
   272     
       
   273     def rschema_link_url(self, rschema):
       
   274         return self.req.build_url('ertype/%s?vid=eschema' % rschema)
       
   275 
       
   276     def possible_views(self, etype):
       
   277         rset = self.req.etype_rset(etype)
       
   278         return [v for v in self._possible_views(self.req, rset)
       
   279                 if v.category != 'startupview']
       
   280 
       
   281     def stereotype(self, name):
       
   282         return Span((' <<%s>>' % name,), klass='stereotype')
       
   283                        
       
   284     def visit_entityschemaOWL(self, eschema, skiprels=()):
       
   285         """get a layout for an entity OWL schema"""
       
   286         etype = eschema.type
       
   287         
       
   288         if eschema.meta:
       
   289             self.stereotype('meta')
       
   290             self.w(u'''<owl:Class rdf:ID="%s"><rdfs:subClassOf rdf:resource="http://www.w3.org/2002/07/owl#Thing"/>
       
   291                                 '''%eschema, stereotype)
       
   292         else:
       
   293              self.w(u'''<owl:Class rdf:ID="%s"><rdfs:subClassOf rdf:resource="http://www.w3.org/2002/07/owl#Thing"/>
       
   294                                 '''% eschema)         
       
   295        
       
   296         self.w(u'<!-- relations -->')    
       
   297         for rschema, targetschemas, role in eschema.relation_definitions():
       
   298             if rschema.type in skiprels:
       
   299                 continue
       
   300             if not (rschema.has_local_role('read') or rschema.has_perm(self.req, 'read')):
       
   301                 continue
       
   302             for oeschema in targetschemas:
       
   303                 label = rschema.type
       
   304                 if role == 'subject':
       
   305                     card = rschema.rproperty(eschema, oeschema, 'cardinality')[0]
       
   306                 else:
       
   307                     card = rschema.rproperty(oeschema, eschema, 'cardinality')[1]
       
   308                 self.w(u'''<rdfs:subClassOf>
       
   309                               <owl:Restriction>
       
   310                               <owl:onProperty rdf:resource="#%s"/>
       
   311                                 %s
       
   312                               </owl:Restriction>
       
   313                            </rdfs:subClassOf>
       
   314                                 ''' % (label, OWL_CARD_MAP[card]))
       
   315 
       
   316         self.w(u'<!-- attributes -->')
       
   317               
       
   318         for rschema, aschema in eschema.attribute_definitions():
       
   319             if not (rschema.has_local_role('read') or rschema.has_perm(self.req, 'read')):
       
   320                 continue
       
   321             aname = rschema.type
       
   322             if aname == 'eid':
       
   323                 continue
       
   324             card_data = aschema.type
       
   325             self.w(u'''<rdfs:subClassOf>
       
   326                               <owl:Restriction>
       
   327                                   <owl:onProperty rdf:resource="#%s"/>
       
   328                                   <owl:cardinality rdf:datatype="&xsd;nonNegativeInteger">1</owl:cardinality>
       
   329                               </owl:Restriction>
       
   330                         </rdfs:subClassOf>'''
       
   331                           
       
   332                    % aname)
       
   333         self.w(u'</owl:Class>')
       
   334       
       
   335     def visit_property_schemaOWL(self, eschema, skiprels=()):
       
   336         """get a layout for property entity OWL schema"""
       
   337         etype = eschema.type
       
   338 
       
   339         for rschema, targetschemas, role in eschema.relation_definitions():
       
   340             if rschema.type in skiprels:
       
   341                 continue
       
   342             if not (rschema.has_local_role('read') or rschema.has_perm(self.req, 'read')):
       
   343                 continue
       
   344             rschemaurl = self.rschema_link_url(rschema)
       
   345             for oeschema in targetschemas:
       
   346                 label = rschema.type
       
   347                 self.w(u'''<owl:ObjectProperty rdf:ID="%s">
       
   348                               <rdfs:domain rdf:resource="#%s"/>
       
   349                               <rdfs:range rdf:resource="#%s"/>
       
   350                            </owl:ObjectProperty>                   
       
   351                              
       
   352                                 ''' % (label, eschema, oeschema.type ))
       
   353 
       
   354     def visit_property_object_schemaOWL(self, eschema, skiprels=()):
       
   355                
       
   356         for rschema, aschema in eschema.attribute_definitions():
       
   357             if not (rschema.has_local_role('read') or rschema.has_perm(self.req, 'read')):
       
   358                 continue
       
   359             aname = rschema.type
       
   360             if aname == 'eid':
       
   361                 continue
       
   362             card_data = aschema.type
       
   363             self.w(u'''<owl:DatatypeProperty rdf:ID="%s">
       
   364                           <rdfs:domain rdf:resource="#%s"/>
       
   365                           <rdfs:range rdf:resource="%s"/>
       
   366                        </owl:DatatypeProperty>'''
       
   367                    % (aname, eschema, OWL_CARD_MAP_DATA[card_data]))
       
   368 # <owl:DatatypeProperty rdf:ID="%s"/>
       
   369 # </owl:DatatypeProperty>
       
   370 
       
   371         
       
   372