|
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 |