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 |