예제 #1
0
    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
예제 #2
0
    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
예제 #3
0
    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
예제 #4
0
    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