pyramid_cubicweb/rest_api.py
changeset 11599 f8ba6ea94af9
parent 11598 2dc0b0db2329
child 11600 473754eac7c1
equal deleted inserted replaced
11598:2dc0b0db2329 11599:f8ba6ea94af9
     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