[refactoring] Move EntityResource and ETypeResource to a separate module
authorRabah Meradi <rabah.meradi@logilab.fr>
Fri, 24 Jul 2015 13:40:36 +0200
changeset 11599 f8ba6ea94af9
parent 11598 2dc0b0db2329
child 11600 473754eac7c1
[refactoring] Move EntityResource and ETypeResource to a separate module
pyramid_cubicweb/resources.py
pyramid_cubicweb/rest_api.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
--- 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):