pyramid_cubicweb/entities.py
changeset 11596 1f2570f1d72a
equal deleted inserted replaced
11595:9ab8c7100fc0 11596:1f2570f1d72a
       
     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__)