web/views/urlpublishing.py
changeset 10582 bc2f6f0d7433
parent 10222 75d6096216d7
equal deleted inserted replaced
10581:7846d26ff91d 10582:bc2f6f0d7433
    58 __docformat__ = "restructuredtext en"
    58 __docformat__ = "restructuredtext en"
    59 
    59 
    60 from rql import TypeResolverException
    60 from rql import TypeResolverException
    61 
    61 
    62 from cubicweb import RegistryException
    62 from cubicweb import RegistryException
    63 from cubicweb.web import NotFound, Redirect, component
    63 from cubicweb.web import NotFound, Redirect, component, views
    64 
    64 
    65 
    65 
    66 class PathDontMatch(Exception):
    66 class PathDontMatch(Exception):
    67     """exception used by url evaluators to notify they can't evaluate
    67     """exception used by url evaluators to notify they can't evaluate
    68     a path
    68     a path
   199                 attrname = cls.cw_rest_attr_info()[0]
   199                 attrname = cls.cw_rest_attr_info()[0]
   200             value = req.url_unquote(parts.pop(0))
   200             value = req.url_unquote(parts.pop(0))
   201             return self.handle_etype_attr(req, cls, attrname, value)
   201             return self.handle_etype_attr(req, cls, attrname, value)
   202         return self.handle_etype(req, cls)
   202         return self.handle_etype(req, cls)
   203 
   203 
   204     def set_vid_for_rset(self, req, cls, rset):# cls is there to ease overriding
   204     def set_vid_for_rset(self, req, cls, rset):  # cls is there to ease overriding
   205         if rset.rowcount == 0:
   205         if rset.rowcount == 0:
   206             raise NotFound()
   206             raise NotFound()
   207         # we've to set a default vid here, since vid_from_rset may try to use a
   207         if 'vid' not in req.form:
   208         # table view if fetch_rql include some non final relation
   208             # check_table=False tells vid_from_rset not to try to use a table view if fetch_rql
   209         if rset.rowcount == 1:
   209             # include some non final relation
   210             req.form.setdefault('vid', 'primary')
   210             req.form['vid'] = views.vid_from_rset(req, rset, req.vreg.schema,
   211         else: # rset.rowcount >= 1
   211                                                   check_table=False)
   212             if len(rset.column_types(0)) > 1:
       
   213                 req.form.setdefault('vid', 'list')
       
   214             else:
       
   215                 req.form.setdefault('vid', 'sameetypelist')
       
   216 
   212 
   217     def handle_etype(self, req, cls):
   213     def handle_etype(self, req, cls):
   218         rset = req.execute(cls.fetch_rql(req.user))
   214         rset = req.execute(cls.fetch_rql(req.user))
   219         self.set_vid_for_rset(req, cls, rset)
   215         self.set_vid_for_rset(req, cls, rset)
   220         return None, rset
   216         return None, rset