|
1 """Contains resources classes. |
|
2 """ |
|
3 from six import text_type |
|
4 |
|
5 from rql import TypeResolverException |
|
6 |
|
7 from pyramid.decorator import reify |
|
8 from pyramid.httpexceptions import HTTPNotFound |
|
9 |
|
10 |
|
11 class EntityResource(object): |
|
12 |
|
13 """A resource class for an entity. It provide method to retrieve an entity |
|
14 by eid. |
|
15 """ |
|
16 |
|
17 @classmethod |
|
18 def from_eid(cls): |
|
19 def factory(request): |
|
20 return cls(request, None, None, request.matchdict['eid']) |
|
21 return factory |
|
22 |
|
23 def __init__(self, request, cls, attrname, value): |
|
24 self.request = request |
|
25 self.cls = cls |
|
26 self.attrname = attrname |
|
27 self.value = value |
|
28 |
|
29 @reify |
|
30 def rset(self): |
|
31 req = self.request.cw_request |
|
32 if self.cls is None: |
|
33 return req.execute('Any X WHERE X eid %(x)s', |
|
34 {'x': int(self.value)}) |
|
35 st = self.cls.fetch_rqlst(self.request.cw_cnx.user, ordermethod=None) |
|
36 st.add_constant_restriction(st.get_variable('X'), self.attrname, |
|
37 'x', 'Substitute') |
|
38 if self.attrname == 'eid': |
|
39 try: |
|
40 rset = req.execute(st.as_string(), {'x': int(self.value)}) |
|
41 except (ValueError, TypeResolverException): |
|
42 # conflicting eid/type |
|
43 raise HTTPNotFound() |
|
44 else: |
|
45 rset = req.execute(st.as_string(), {'x': text_type(self.value)}) |
|
46 return rset |
|
47 |
|
48 |
|
49 class ETypeResource(object): |
|
50 |
|
51 """A resource for etype. |
|
52 """ |
|
53 @classmethod |
|
54 def from_match(cls, matchname): |
|
55 def factory(request): |
|
56 return cls(request, request.matchdict[matchname]) |
|
57 return factory |
|
58 |
|
59 def __init__(self, request, etype): |
|
60 vreg = request.registry['cubicweb.registry'] |
|
61 |
|
62 self.request = request |
|
63 self.etype = vreg.case_insensitive_etypes[etype.lower()] |
|
64 self.cls = vreg['etypes'].etype_class(self.etype) |
|
65 |
|
66 def __getitem__(self, value): |
|
67 attrname = self.cls.cw_rest_attr_info()[0] |
|
68 return EntityResource(self.request, self.cls, attrname, value) |
|
69 |
|
70 @reify |
|
71 def rset(self): |
|
72 rql = self.cls.fetch_rql(self.request.cw_cnx.user) |
|
73 rset = self.request.cw_request.execute(rql) |
|
74 return rset |