1 from __future__ import absolute_import |
1 from __future__ import absolute_import |
2 |
2 |
3 from rql import TypeResolverException |
|
4 |
3 |
5 from pyramid.decorator import reify |
|
6 from pyramid.httpexceptions import HTTPNotFound |
4 from pyramid.httpexceptions import HTTPNotFound |
7 from pyramid.view import view_config |
5 from pyramid.view import view_config |
8 |
6 from pyramid_cubicweb.resources import EntityResource, ETypeResource |
9 |
|
10 class EntityResource(object): |
|
11 def __init__(self, request, cls, attrname, value): |
|
12 self.request = request |
|
13 self.cls = cls |
|
14 self.attrname = attrname |
|
15 self.value = value |
|
16 |
|
17 @reify |
|
18 def rset(self): |
|
19 st = self.cls.fetch_rqlst(self.request.cw_cnx.user, ordermethod=None) |
|
20 st.add_constant_restriction(st.get_variable('X'), self.attrname, |
|
21 'x', 'Substitute') |
|
22 if self.attrname == 'eid': |
|
23 try: |
|
24 rset = self.request.cw_request.execute( |
|
25 st.as_string(), {'x': int(self.value)}) |
|
26 except (ValueError, TypeResolverException): |
|
27 # conflicting eid/type |
|
28 raise HTTPNotFound() |
|
29 else: |
|
30 rset = self.request.cw_request.execute( |
|
31 st.as_string(), {'x': unicode(self.value)}) |
|
32 return rset |
|
33 |
|
34 |
|
35 class ETypeResource(object): |
|
36 @classmethod |
|
37 def from_match(cls, matchname): |
|
38 def factory(request): |
|
39 return cls(request, request.matchdict[matchname]) |
|
40 return factory |
|
41 |
|
42 def __init__(self, request, etype): |
|
43 vreg = request.registry['cubicweb.registry'] |
|
44 |
|
45 self.request = request |
|
46 self.etype = vreg.case_insensitive_etypes[etype.lower()] |
|
47 self.cls = vreg['etypes'].etype_class(self.etype) |
|
48 |
|
49 def __getitem__(self, value): |
|
50 attrname = self.cls.cw_rest_attr_info()[0] |
|
51 return EntityResource(self.request, self.cls, attrname, value) |
|
52 |
7 |
53 |
8 |
54 class MatchIsETypePredicate(object): |
9 class MatchIsETypePredicate(object): |
55 def __init__(self, matchname, config): |
10 def __init__(self, matchname, config): |
56 self.matchname = matchname |
11 self.matchname = matchname |