# HG changeset patch # User Rabah Meradi # Date 1437738036 -7200 # Node ID f8ba6ea94af934d1af11155d70c44e0c3bd1fad2 # Parent 2dc0b0db23294358812b835553d161dfd23dea45 [refactoring] Move EntityResource and ETypeResource to a separate module diff -r 2dc0b0db2329 -r f8ba6ea94af9 pyramid_cubicweb/resources.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pyramid_cubicweb/resources.py Fri Jul 24 13:40:36 2015 +0200 @@ -0,0 +1,73 @@ +"""Contains resources classes. +""" + +from rql import TypeResolverException + +from pyramid.decorator import reify +from pyramid.httpexceptions import HTTPNotFound + + +class EntityResource(object): + + """A resource class for an entity. It provide method to retrieve an entity + by eid. + """ + + @classmethod + def from_eid(cls): + def factory(request): + return cls(request, None, None, request.matchdict['eid']) + return factory + + def __init__(self, request, cls, attrname, value): + self.request = request + self.cls = cls + self.attrname = attrname + self.value = value + + @reify + def rset(self): + req = self.request.cw_request + if self.cls is None: + return req.execute('Any X WHERE X eid %(x)s', + {'x': int(self.value)}) + st = self.cls.fetch_rqlst(self.request.cw_cnx.user, ordermethod=None) + st.add_constant_restriction(st.get_variable('X'), self.attrname, + 'x', 'Substitute') + if self.attrname == 'eid': + try: + rset = req.execute(st.as_string(), {'x': int(self.value)}) + except (ValueError, TypeResolverException): + # conflicting eid/type + raise HTTPNotFound() + else: + rset = req.execute(st.as_string(), {'x': unicode(self.value)}) + return rset + + +class ETypeResource(object): + + """A resource for etype. + """ + @classmethod + def from_match(cls, matchname): + def factory(request): + return cls(request, request.matchdict[matchname]) + return factory + + def __init__(self, request, etype): + vreg = request.registry['cubicweb.registry'] + + self.request = request + self.etype = vreg.case_insensitive_etypes[etype.lower()] + self.cls = vreg['etypes'].etype_class(self.etype) + + def __getitem__(self, value): + attrname = self.cls.cw_rest_attr_info()[0] + return EntityResource(self.request, self.cls, attrname, value) + + @reify + def rset(self): + rql = self.cls.fetch_rql(self.request.cw_cnx.user) + rset = self.request.cw_request.execute(rql) + return rset diff -r 2dc0b0db2329 -r f8ba6ea94af9 pyramid_cubicweb/rest_api.py --- a/pyramid_cubicweb/rest_api.py Mon Jun 15 09:31:37 2015 +0200 +++ b/pyramid_cubicweb/rest_api.py Fri Jul 24 13:40:36 2015 +0200 @@ -1,54 +1,9 @@ from __future__ import absolute_import -from rql import TypeResolverException - -from pyramid.decorator import reify -from pyramid.httpexceptions import HTTPNotFound -from pyramid.view import view_config - -class EntityResource(object): - def __init__(self, request, cls, attrname, value): - self.request = request - self.cls = cls - self.attrname = attrname - self.value = value - - @reify - def rset(self): - st = self.cls.fetch_rqlst(self.request.cw_cnx.user, ordermethod=None) - st.add_constant_restriction(st.get_variable('X'), self.attrname, - 'x', 'Substitute') - if self.attrname == 'eid': - try: - rset = self.request.cw_request.execute( - st.as_string(), {'x': int(self.value)}) - except (ValueError, TypeResolverException): - # conflicting eid/type - raise HTTPNotFound() - else: - rset = self.request.cw_request.execute( - st.as_string(), {'x': unicode(self.value)}) - return rset - - -class ETypeResource(object): - @classmethod - def from_match(cls, matchname): - def factory(request): - return cls(request, request.matchdict[matchname]) - return factory - - def __init__(self, request, etype): - vreg = request.registry['cubicweb.registry'] - - self.request = request - self.etype = vreg.case_insensitive_etypes[etype.lower()] - self.cls = vreg['etypes'].etype_class(self.etype) - - def __getitem__(self, value): - attrname = self.cls.cw_rest_attr_info()[0] - return EntityResource(self.request, self.cls, attrname, value) +from pyramid.httpexceptions import HTTPNotFound +from pyramid.view import view_config +from pyramid_cubicweb.resources import EntityResource, ETypeResource class MatchIsETypePredicate(object):