1 from __future__ import absolute_import |
|
2 |
|
3 from rql import TypeResolverException |
|
4 |
|
5 from pyramid.decorator import reify |
|
6 from pyramid.httpexceptions import HTTPNotFound |
|
7 from pyramid.view import view_config |
|
8 |
|
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_cnx.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_cnx.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 |
|
53 |
|
54 class MatchIsETypePredicate(object): |
|
55 def __init__(self, matchname, config): |
|
56 self.matchname = matchname |
|
57 self.etypes = frozenset( |
|
58 k.lower() for k in config.registry['cubicweb.registry']['etypes']) |
|
59 |
|
60 def text(self): |
|
61 return 'match_is_etype = %s' % self.matchname |
|
62 |
|
63 phash = text |
|
64 |
|
65 def __call__(self, info, request): |
|
66 return info['match'][self.matchname].lower() in \ |
|
67 request.registry['cubicweb.registry'].case_insensitive_etypes |
|
68 |
|
69 |
|
70 @view_config( |
|
71 route_name='cwentities', |
|
72 context=EntityResource, |
|
73 request_method='DELETE') |
|
74 def delete_entity(context, request): |
|
75 context.rset.one().cw_delete() |
|
76 request.response.status_int = 204 |
|
77 return request.response |
|
78 |
|
79 |
|
80 def includeme(config): |
|
81 config.add_route_predicate('match_is_etype', MatchIsETypePredicate) |
|
82 config.add_route( |
|
83 'cwentities', '/{etype}/*traverse', |
|
84 factory=ETypeResource.from_match('etype'), match_is_etype='etype') |
|
85 config.scan(__name__) |
|