193 def url(self): |
193 def url(self): |
194 """return the url associated with this view. Should not be |
194 """return the url associated with this view. Should not be |
195 necessary for non linkable views, but a default implementation |
195 necessary for non linkable views, but a default implementation |
196 is provided anyway. |
196 is provided anyway. |
197 """ |
197 """ |
198 try: |
198 rset = self.rset |
199 return self.build_url(vid=self.id, rql=self.req.form['rql']) |
199 if rset is None: |
200 except KeyError: |
200 return self.build_url('view', vid=self.id) |
201 return self.build_url(vid=self.id) |
201 coltypes = rset.column_types(0) |
|
202 if len(coltypes) == 1: |
|
203 etype = iter(coltypes).next() |
|
204 if not self.schema.eschema(etype).is_final(): |
|
205 if len(rset) == 1: |
|
206 entity = rset.get_entity(0, 0) |
|
207 return entity.absolute_url(vid=self.id) |
|
208 # don't want to generate /<etype> url if there is some restriction |
|
209 # on something else than the entity type |
|
210 restr = rset.syntax_tree().children[0].where |
|
211 # XXX norestriction is not correct here. For instance, in cases like |
|
212 # "Any P,N WHERE P is Project, P name N" norestriction should equal |
|
213 # True |
|
214 norestriction = (isinstance(restr, nodes.Relation) and |
|
215 restr.is_types_restriction()) |
|
216 if norestriction: |
|
217 return self.build_url(etype.lower(), vid=self.id) |
|
218 return self.build_url('view', rql=rset.printable_rql(), vid=self.id) |
202 |
219 |
203 def set_request_content_type(self): |
220 def set_request_content_type(self): |
204 """set the content type returned by this view""" |
221 """set the content type returned by this view""" |
205 self.req.set_content_type(self.content_type) |
222 self.req.set_content_type(self.content_type) |
206 |
223 |
311 __select__ = none_rset() |
328 __select__ = none_rset() |
312 registered = require_group_compat(View.registered) |
329 registered = require_group_compat(View.registered) |
313 |
330 |
314 category = 'startupview' |
331 category = 'startupview' |
315 |
332 |
316 def url(self): |
|
317 """return the url associated with this view. We can omit rql here""" |
|
318 return self.build_url('view', vid=self.id) |
|
319 |
|
320 def html_headers(self): |
333 def html_headers(self): |
321 """return a list of html headers (eg something to be inserted between |
334 """return a list of html headers (eg something to be inserted between |
322 <head> and </head> of the returned page |
335 <head> and </head> of the returned page |
323 |
336 |
324 by default startup views are indexed |
337 by default startup views are indexed |
351 if self.rset is None: |
364 if self.rset is None: |
352 self.rset = self.req.execute(self.startup_rql()) |
365 self.rset = self.req.execute(self.startup_rql()) |
353 rset = self.rset |
366 rset = self.rset |
354 for i in xrange(len(rset)): |
367 for i in xrange(len(rset)): |
355 self.wview(self.id, rset, row=i, **kwargs) |
368 self.wview(self.id, rset, row=i, **kwargs) |
356 |
|
357 def url(self): |
|
358 """return the url associated with this view. We can omit rql if we are |
|
359 on a result set on which we do not apply. |
|
360 """ |
|
361 if self.rset is None: |
|
362 return self.build_url(vid=self.id) |
|
363 return super(EntityStartupView, self).url() |
|
364 |
369 |
365 |
370 |
366 class AnyRsetView(View): |
371 class AnyRsetView(View): |
367 """base class for views applying on any non empty result sets""" |
372 """base class for views applying on any non empty result sets""" |
368 __select__ = nonempty_rset() |
373 __select__ = nonempty_rset() |