cubicweb/pyramid/resources.py
changeset 12911 a17cbf539a69
parent 12567 26744ad37953
--- a/cubicweb/pyramid/resources.py	Tue Mar 10 23:44:45 2020 +0100
+++ b/cubicweb/pyramid/resources.py	Tue Mar 10 23:47:50 2020 +0100
@@ -18,84 +18,33 @@
 # You should have received a copy of the GNU Lesser General Public License along
 # with CubicWeb.  If not, see <http://www.gnu.org/licenses/>.
 
-"""Pyramid resource definitions for CubicWeb."""
+from pyramid.httpexceptions import HTTPNotFound
 
-from rql import TypeResolverException
-
-from pyramid.decorator import reify
-from pyramid.httpexceptions import HTTPNotFound
+from cubicweb import rdf
 
 
-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': self.value})
-        return rset
+def negociate_mime_type(request, possible_mimetypes):
+    accepted_headers_by_weight = sorted(
+        request.accept.parsed or [], key=lambda h: h[1], reverse=True
+    )
+    mime_type_negociated = None
+    for parsed_header in accepted_headers_by_weight:
+        accepted_mime_type = parsed_header[0]
+        if accepted_mime_type in possible_mimetypes:
+            mime_type_negociated = accepted_mime_type
+            break
+    return mime_type_negociated
 
 
-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 rdf_context_from_eid(request):
+    mime_type = negociate_mime_type(request, rdf.RDF_MIMETYPE_TO_FORMAT)
+    if mime_type is None:
+        raise HTTPNotFound()
+    entity = request.cw_request.entity_from_eid(request.matchdict['eid'])
+    return RDFResource(entity, mime_type)
 
-    def __getitem__(self, value):
-        # Try eid first, then rest attribute as for URL path evaluation
-        # mecanism in cubicweb.web.views.urlpublishing.
-        for attrname in ('eid', self.cls.cw_rest_attr_info()[0]):
-            resource = EntityResource(self.request, self.cls, attrname, value)
-            try:
-                rset = resource.rset
-            except HTTPNotFound:
-                continue
-            if rset.rowcount:
-                return resource
-        raise KeyError(value)
 
-    @reify
-    def rset(self):
-        rql = self.cls.fetch_rql(self.request.cw_cnx.user)
-        rset = self.request.cw_request.execute(rql)
-        return rset
+class RDFResource:
+    def __init__(self, entity, mime_type):
+        self.entity = entity
+        self.mime_type = mime_type