def patch(self): """ Handles a PATCH request. http://jsonapi.org/format/#crud-updating """ data = self.request.json.get("data", dict()) validators.assert_resource_object(data, source_pointer="/data/") # Get the unserializer unserializer = self.api.get_unserializer(self.real_typename) yield from unserializer.update_resource(self.db, self.resource, data) # Save the resource self.db.save([self.resource]) yield from self.db.commit() # Create the response serializer = self.api.get_serializer(self.real_typename) data = serializer.serialize_resource( self.resource, fields=self.request.japi_fields.get(self.typename)) included = list() meta = OrderedDict() links = OrderedDict() # Put all together. self.response.headers["content-type"] = "application/vnd.api+json" self.response.status_code = 200 self.response.body = self.api.dump_json( OrderedDict([("data", data), ("included", included), ("meta", meta), ("links", links), ("jsonapi", self.api.jsonapi_object)])) return None
def post(self): """ Handles a POST request. This means to create a new resource and to return it. http://jsonapi.org/format/#crud-creating """ # Make sure the request contains a valid JSON resource object. resource_object = self.request.json.get("data", dict()) validators.assert_resource_object( resource_object, source_pointer="/data/" ) # Check if the *type* is supported by this collection endpoint. if resource_object["type"] != self.typename: raise errors.Conflict() # Create the new resource. unserializer = self.api.get_unserializer(self.typename) resource = yield from unserializer.create_resource( self.db, resource_object ) # Save the resources. self.db.save([resource]) yield from self.db.commit() # Crate the response. serializer = self.api.get_serializer(self.typename) data = serializer.serialize_resource( resource, fields=self.request.japi_fields.get(self.typename) ) links = data.setdefault("links", dict()) links["self"] = self.api.reverse_url( typename=self.typename, endpoint="resource", id=data["id"] ) # Put everything together. self.response.headers["content-type"] = "application/vnd.api+json" self.response.headers["location"] = links["self"] self.response.status_code = 201 self.response.body = self.api.dump_json(OrderedDict([ ("data", data), ("links", links), ("jsonapi", self.api.jsonapi_object) ])) return None
def post(self): """ Handles a POST request. This means to create a new resource and to return it. http://jsonapi.org/format/#crud-creating .. todo:: Support the *include* parameter? """ # Make sure the request contains a valid JSON resource object. resource_object = self.request.json.get("data", dict()) validators.assert_resource_object(resource_object, source_pointer="/data/") # Check if the *type* is supported by this collection endpoint. if resource_object["type"] != self.typename: raise errors.Conflict() # Create the new resource. unserializer = self.api.get_unserializer(self.typename) resource = yield from unserializer.create_resource( self.db, resource_object) # Save the resources. self.db.save([resource]) yield from self.db.commit() # Crate the response. serializer = self.api.get_serializer(self.typename) data = serializer.serialize_resource( resource, fields=self.request.japi_fields.get(self.typename)) links = data.setdefault("links", dict()) links["self"] = self.api.reverse_url(typename=self.typename, endpoint="resource", id=data["id"]) # Put everything together. self.response.headers["content-type"] = "application/vnd.api+json" self.response.headers["location"] = links["self"] self.response.status_code = 201 self.response.body = self.api.dump_json( OrderedDict([("data", data), ("links", links), ("jsonapi", self.api.jsonapi_object)])) return None
def patch(self): """ Handles a PATCH request. http://jsonapi.org/format/#crud-updating """ data = self.request.json.get("data", dict()) validators.assert_resource_object(data, source_pointer="/data/") # Get the unserializer unserializer = self.api.get_unserializer(self.real_typename) yield from unserializer.update_resource(self.db, self.resource, data) # Save the resource self.db.save([self.resource]) yield from self.db.commit() # Create the response serializer = self.api.get_serializer(self.real_typename) data = serializer.serialize_resource( self.resource, fields=self.request.japi_fields.get(self.typename) ) included = list() meta = OrderedDict() links = OrderedDict() # Put all together. self.response.headers["content-type"] = "application/vnd.api+json" self.response.status_code = 200 self.response.body = self.api.dump_json(OrderedDict([ ("data", data), ("included", included), ("meta", meta), ("links", links), ("jsonapi", self.api.jsonapi_object) ])) return None