web/views/startup.py
changeset 501 567e85e646d8
parent 460 5cd2b27d5435
child 505 04f40057fc4d
equal deleted inserted replaced
500:14befdd50126 501:567e85e646d8
    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': '<rdf:type rdf:resource="&owl;FunctionalProperty"/>',                      
       
    19                 '?': '<owl:maxCardinality rdf:datatype="&xsd;int">1</owl:maxCardinality>',
       
    20                 '+': '<owl:minCardinality rdf:datatype="&xsd;int">1</owl:minCardinality>',
       
    21                 '*': ''
       
    22                 }
       
    23 
       
    24 OWL_CARD_MAP_DATA = {'String': 'xsd:string',
       
    25                      'Datetime': 'xsd:dateTime',
       
    26                      'Bytes': 'xsd:byte',
       
    27                      'Float': 'xsd:float',
       
    28                      'Boolean': 'xsd:boolean',
       
    29                      'Int': 'xsd:int',
       
    30                      'Date':'xsd:date',
       
    31                      'Time': 'xsd:time',
       
    32                      'Password': 'xsd:byte',
       
    33                      'Decimal' : 'xsd:decimal',
       
    34                      'Interval': 'xsd:duration'
       
    35                      }
       
    36 
    18 
    37 class ManageView(StartupView):
    19 class ManageView(StartupView):
    38     id = 'manage'
    20     id = 'manage'
    39     title = _('manage')    
    21     title = _('manage')    
    40     http_cache_manager = EtagHTTPCacheManager
    22     http_cache_manager = EtagHTTPCacheManager
   192                (html_escape(ajax_replace_url('detailed_schema', '', 'schematext',
   174                (html_escape(ajax_replace_url('detailed_schema', '', 'schematext',
   193                                              skipmeta=int(not withmeta))),
   175                                              skipmeta=int(not withmeta))),
   194                 self.req._('detailed schema view')))
   176                 self.req._('detailed schema view')))
   195 
   177 
   196 
   178 
   197 class SchemaUreportsView(StartupView):
   179 class SchemaUreportsView(EntityView):
   198     id = 'schematext'
   180     id = 'schematext'
   199 
   181 
   200     def call(self):
   182     def call(self):
   201         from cubicweb.schemaviewer import SchemaViewer
   183         from cubicweb.schemaviewer import SchemaViewer
   202         skipmeta = int(self.req.form.get('skipmeta', True))
   184         skipmeta = int(self.req.form.get('skipmeta', True))
   206                                      skiprels=('is', 'is_instance_of', 'identity',
   188                                      skiprels=('is', 'is_instance_of', 'identity',
   207                                                'owned_by', 'created_by'),
   189                                                'owned_by', 'created_by'),
   208                                      skipmeta=skipmeta)
   190                                      skipmeta=skipmeta)
   209         self.w(ureport_as_html(layout))
   191         self.w(ureport_as_html(layout))
   210 
   192 
   211 
       
   212 class OWLView(StartupView):
       
   213     id = 'owl'
       
   214     title = _('owl')
       
   215     templatable =False
       
   216 
       
   217     def call(self):
       
   218         skipmeta = int(self.req.form.get('skipmeta', True))
       
   219         self.visit_schemaOWL(display_relations=True,
       
   220                              skiprels=('is', 'is_instance_of', 'identity',
       
   221                                        'owned_by', 'created_by'),
       
   222                              skipmeta=skipmeta)
       
   223 
       
   224 
       
   225     def visit_schemaOWL(self, display_relations=0,
       
   226                      skiprels=(), skipmeta=True):
       
   227         """get a layout for a whole schema"""
       
   228         self.w(u'''<?xml version="1.0" encoding="UTF-8"?>
       
   229         <!DOCTYPE rdf:RDF [
       
   230         <!ENTITY owl "http://www.w3.org/2002/07/owl#" >
       
   231         <!ENTITY xsd "http://www.w3.org/2001/XMLSchema#" >
       
   232         <!ENTITY rdfs "http://www.w3.org/2000/01/rdf-schema#" >
       
   233         <!ENTITY rdf "http://www.w3.org/1999/02/22-rdf-syntax-ns#" >
       
   234         <!ENTITY %s "http://logilab.org/owl/ontologies/%s#" >
       
   235         
       
   236         ]>        
       
   237         <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
       
   238             xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#"
       
   239             xmlns:xsd="http://www.w3.org/2001/XMLSchema#"
       
   240             xmlns:owl="http://www.w3.org/2002/07/owl#"
       
   241             xmlns="http://logilab.org/owl/ontologies/%s#"
       
   242             xmlns:%s="http://logilab.org/owl/ontologies/%s#"
       
   243             xml:base="http://logilab.org/owl/ontologies/%s">
       
   244 
       
   245     <owl:Ontology rdf:about="">
       
   246         <rdfs:comment>
       
   247         %s Cubicweb OWL Ontology                           
       
   248                                         
       
   249         </rdfs:comment>
       
   250    </owl:Ontology>
       
   251         ''' % (self.schema.name, 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'</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                                  <rdf:type rdf:resource="&owl;FunctionalProperty"/>
       
   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 
       
   369