view.py
changeset 2468 93853b6f3bad
parent 2418 8f06e4f02733
child 2555 ca7b122f34fa
equal deleted inserted replaced
2467:6983631f5d0d 2468:93853b6f3bad
   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()