web/views/owl.py
changeset 2126 a25859917ccc
parent 1977 606923dff11b
child 2186 dba8eed12a16
--- a/web/views/owl.py	Thu Jun 18 21:01:55 2009 +0200
+++ b/web/views/owl.py	Fri Jun 19 14:42:04 2009 +0200
@@ -6,14 +6,14 @@
 :license: GNU Lesser General Public License, v2.1 - http://www.gnu.org/licenses
 """
 __docformat__ = "restructuredtext en"
+_ = unicode
 
 from logilab.mtconverter import TransformError, xml_escape
 
 from cubicweb.view import StartupView, EntityView
+from cubicweb.selectors import none_rset, match_view
 from cubicweb.web.action import Action
-from cubicweb.selectors import none_rset, match_view
-
-_ = unicode
+from cubicweb.web.views import schema
 
 OWL_CARD_MAP = {'1': '<rdf:type rdf:resource="&owl;FunctionalProperty"/>',
                 '?': '<owl:maxCardinality rdf:datatype="&xsd;int">1</owl:maxCardinality>',
@@ -55,8 +55,6 @@
 
 OWL_CLOSING_ROOT = u'</rdf:RDF>'
 
-DEFAULT_SKIP_RELS = frozenset(('is', 'is_instance_of', 'identity',
-                               'owned_by', 'created_by'))
 
 class OWLView(StartupView):
     """This view export in owl format schema database. It is the TBOX"""
@@ -69,36 +67,36 @@
         skipmeta = int(self.req.form.get('skipmeta', True))
         if writeprefix:
             self.w(OWL_OPENING_ROOT % {'appid': self.schema.name})
-        self.visit_schema(skipmeta=skipmeta)
+        self.visit_schema(skiptypes=skipmeta and schema.SKIP_TYPES or ())
         if writeprefix:
             self.w(OWL_CLOSING_ROOT)
 
-    def visit_schema(self, skiprels=DEFAULT_SKIP_RELS, skipmeta=True):
+    def should_display_rschema(self, rschema):
+        return not rschema in self.skiptypes and (
+            rschema.has_local_role('read') or
+            rschema.has_perm(self.req, 'read')):
+
+    def visit_schema(self, skiptypes):
         """get a layout for a whole schema"""
-        entities = sorted([eschema for eschema in self.schema.entities()
-                           if not eschema.is_final()])
-        if skipmeta:
-            entities = [eschema for eschema in entities
-                        if not eschema.meta]
+        self.skiptypes = skiptypes
+        entities = sorted(eschema for eschema in self.schema.entities()
+                          if not eschema.is_final() or eschema in skiptypes)
         self.w(u'<!-- classes definition -->')
         for eschema in entities:
-            self.visit_entityschema(eschema, skiprels)
+            self.visit_entityschema(eschema)
             self.w(u'<!-- property definition -->')
-            self.visit_property_schema(eschema, skiprels)
+            self.visit_property_schema(eschema)
             self.w(u'<!-- datatype property -->')
             self.visit_property_object_schema(eschema)
 
-    def visit_entityschema(self, eschema, skiprels=()):
+    def visit_entityschema(self, eschema):
         """get a layout for an entity OWL schema"""
         self.w(u'<owl:Class rdf:ID="%s">'% eschema)
         self.w(u'<!-- relations -->')
         for rschema, targetschemas, role in eschema.relation_definitions():
-            if rschema.type in skiprels:
-                continue
-            if not (rschema.has_local_role('read') or rschema.has_perm(self.req, 'read')):
+            if not self.should_display_rschema(rschema):
                 continue
             for oeschema in targetschemas:
-                label = rschema.type
                 if role == 'subject':
                     card = rschema.rproperty(eschema, oeschema, 'cardinality')[0]
                 else:
@@ -110,58 +108,44 @@
   <owl:onProperty rdf:resource="#%s"/>
   %s
  </owl:Restriction>
-</rdfs:subClassOf>
-''' % (label, cardtag))
+</rdfs:subClassOf>''' % (rschema, cardtag))
 
         self.w(u'<!-- attributes -->')
-
         for rschema, aschema in eschema.attribute_definitions():
-            if not (rschema.has_local_role('read') or rschema.has_perm(self.req, 'read')):
-                continue
-            aname = rschema.type
-            if aname == 'eid':
+            if not self.should_display_rschema(rschema):
                 continue
             self.w(u'''<rdfs:subClassOf>
   <owl:Restriction>
    <owl:onProperty rdf:resource="#%s"/>
    <rdf:type rdf:resource="&owl;FunctionalProperty"/>
   </owl:Restriction>
-</rdfs:subClassOf>'''
-                   % aname)
+</rdfs:subClassOf>''' % rschema)
         self.w(u'</owl:Class>')
 
-    def visit_property_schema(self, eschema, skiprels=()):
+    def visit_property_schema(self, eschema):
         """get a layout for property entity OWL schema"""
         for rschema, targetschemas, role in eschema.relation_definitions():
-            if rschema.type in skiprels:
-                continue
-            if not (rschema.has_local_role('read') or rschema.has_perm(self.req, 'read')):
+            if not self.should_display_rschema(rschema):
                 continue
             for oeschema in targetschemas:
                 label = rschema.type
                 self.w(u'''<owl:ObjectProperty rdf:ID="%s">
  <rdfs:domain rdf:resource="#%s"/>
  <rdfs:range rdf:resource="#%s"/>
-</owl:ObjectProperty>
-''' % (label, eschema, oeschema.type))
+</owl:ObjectProperty>''' % (label, eschema, oeschema.type))
 
     def visit_property_object_schema(self, eschema):
         for rschema, aschema in eschema.attribute_definitions():
-            if not (rschema.has_local_role('read') or rschema.has_perm(self.req, 'read')):
-                continue
-            aname = rschema.type
-            if aname == 'eid':
+            if not self.should_display_rschema(rschema):
                 continue
             self.w(u'''<owl:DatatypeProperty rdf:ID="%s">
   <rdfs:domain rdf:resource="#%s"/>
   <rdfs:range rdf:resource="%s"/>
-</owl:DatatypeProperty>'''
-                   % (aname, eschema, OWL_TYPE_MAP[aschema.type]))
+</owl:DatatypeProperty>''' % (aname, eschema, OWL_TYPE_MAP[aschema.type]))
 
 
 class OWLABOXView(EntityView):
     '''This view represents a part of the ABOX for a given entity.'''
-
     id = 'owlabox'
     title = _('owlabox')
     templatable = False
@@ -173,8 +157,8 @@
             self.cell_call(i, 0)
         self.w(OWL_CLOSING_ROOT)
 
-    def cell_call(self, row, col, skiprels=DEFAULT_SKIP_RELS):
-        self.wview('owlaboxitem', self.rset, row=row, col=col, skiprels=skiprels)
+    def cell_call(self, row, col):
+        self.wview('owlaboxitem', self.rset, row=row, col=col)
 
 
 class OWLABOXItemView(EntityView):
@@ -183,13 +167,13 @@
     templatable = False
     content_type = 'application/xml' # 'text/xml'
 
-    def cell_call(self, row, col, skiprels=DEFAULT_SKIP_RELS):
+    def cell_call(self, row, col):
         entity = self.complete_entity(row, col)
         eschema = entity.e_schema
         self.w(u'<%s rdf:ID="%s">' % (eschema, entity.eid))
         self.w(u'<!--attributes-->')
         for rschema, aschema in eschema.attribute_definitions():
-            if rschema.type in skiprels:
+            if rschema.meta:
                 continue
             if not (rschema.has_local_role('read') or rschema.has_perm(self.req, 'read')):
                 continue
@@ -204,7 +188,7 @@
                 pass
         self.w(u'<!--relations -->')
         for rschema, targetschemas, role in eschema.relation_definitions():
-            if rschema.type in skiprels:
+            if rschema.meta:
                 continue
             if not (rschema.has_local_role('read') or rschema.has_perm(self.req, 'read')):
                 continue