--- 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