コード例 #1
0
    def get(self, *args, **kwargs):
        """Get a relationship details"""
        self.before_get(args, kwargs)

        relationship_field, model_relationship_field, related_type_, related_id_field = self._get_relationship_data()

        obj, data = self._data_layer.get_relationship(model_relationship_field, related_type_, related_id_field, kwargs)

        result = {
            "links": {
                "self": request.path,
                "related": self.schema._declared_fields[relationship_field].get_related_url(obj),
            },
            "data": data,
        }

        qs = QSManager(request.args, self.schema)
        if qs.include:
            schema = compute_schema(self.schema, dict(), qs, qs.include)

            serialized_obj = schema.dump(obj)
            result["included"] = serialized_obj.get("included", dict())

        final_result = self.after_get(result)

        return final_result
コード例 #2
0
    def get(self, *args, **kwargs):
        """Get object details"""
        self.before_get(args, kwargs)

        qs = QSManager(request.args, self.schema)

        obj = self.get_object(kwargs, qs)

        self.before_marshmallow(args, kwargs)

        schema = compute_schema(self.schema, getattr(self, "get_schema_kwargs", dict()), qs, qs.include)

        for i_plugins in self.plugins:
            try:
                i_plugins.after_init_schema_in_resource_detail_get(
                    *args, schema=schema, model=self.data_layer["model"], **kwargs
                )
            except PluginMethodNotImplementedError:
                pass

        result = schema.dump(obj)

        final_result = self.after_get(result)

        return final_result
コード例 #3
0
    def get(self, *args, **kwargs):
        """Retrieve a collection of objects"""
        self.before_get(args, kwargs)

        qs = QSManager(request.args, self.schema)

        objects_count, objects = self.get_collection(qs, kwargs)

        schema_kwargs = getattr(self, "get_schema_kwargs", dict())
        schema_kwargs.update({"many": True})

        self.before_marshmallow(args, kwargs)

        schema = compute_schema(self.schema, schema_kwargs, qs, qs.include)

        for i_plugins in self.plugins:
            try:
                i_plugins.after_init_schema_in_resource_list_get(
                    *args, schema=schema, model=self.data_layer["model"], **kwargs
                )
            except PluginMethodNotImplementedError:
                pass

        result = schema.dump(objects)

        view_kwargs = request.view_args if getattr(self, "view_kwargs", None) is True else dict()
        add_pagination_links(result, objects_count, qs, url_for(self.view, _external=True, **view_kwargs))

        result.update({"meta": {"count": objects_count}})

        final_result = self.after_get(result)

        return final_result
コード例 #4
0
    def patch(self, *args, **kwargs):
        """Update an object"""
        json_data = request.json or {}

        qs = self.qs_manager_class(request.args, self.schema)
        schema_kwargs = getattr(self, "patch_schema_kwargs", dict())
        schema_kwargs.update({"partial": True})

        self.before_marshmallow(args, kwargs)

        schema = compute_schema(self.schema, schema_kwargs, qs, qs.include)

        for i_plugins in self.plugins:
            try:
                i_plugins.after_init_schema_in_resource_detail_patch(
                    *args,
                    schema=schema,
                    model=self.data_layer["model"],
                    **kwargs)
            except PluginMethodNotImplementedError:
                pass

        if "data" not in json_data:
            raise BadRequest('Missing "data" node',
                             source={"pointer": "/data"})
        if "id" not in json_data["data"]:
            raise BadRequest('Missing id in "data" node',
                             source={"pointer": "/data/id"})
        if str(json_data["data"]["id"]) != str(kwargs[getattr(
                self._data_layer, "url_field", "id")]):
            raise BadRequest(
                "Value of id does not match the resource identifier in url",
                source={"pointer": "/data/id"})

        try:
            data = schema.load(json_data)
        except IncorrectTypeError as e:
            errors = e.messages
            for error in errors["errors"]:
                error["status"] = "409"
                error["title"] = "Incorrect type"
            return errors, 409
        except ValidationError as e:
            errors = e.messages
            for message in errors["errors"]:
                message["status"] = "422"
                message["title"] = "Validation error"
            return errors, 422

        self.before_patch(args, kwargs, data=data)

        obj = self.update_object(data, qs, kwargs)

        result = schema.dump(obj)

        final_result = self.after_patch(result)

        return final_result
コード例 #5
0
    def post(self, *args, **kwargs):
        """Create an object"""
        json_data = request.json or {}

        qs = QSManager(request.args, self.schema)

        schema = compute_schema(self.schema,
                                getattr(self, "post_schema_kwargs", dict()),
                                qs, qs.include)

        for i_plugins in self.plugins:
            try:
                i_plugins.after_init_schema_in_resource_list_post(
                    *args,
                    schema=schema,
                    model=self.data_layer["model"],
                    **kwargs)
            except PluginMethodNotImplementedError:
                pass

        try:
            data = schema.load(json_data)
        except IncorrectTypeError as e:
            errors = e.messages
            for error in errors["errors"]:
                error["status"] = "409"
                error["title"] = "Incorrect type"
            return errors, 409
        except ValidationError as e:
            errors = e.messages
            for message in errors["errors"]:
                message["status"] = "422"
                message["title"] = "Validation error"
            return errors, 422

        self.before_post(args, kwargs, data=data)

        obj = self.create_object(data, kwargs)

        if obj is None:
            result = {"data": None}
        else:
            result = schema.dump(obj)

        if result["data"].get("links", {}).get("self"):
            final_result = (result, 201, {
                "Location": result["data"]["links"]["self"]
            })
        else:
            final_result = (result, 201)

        result = self.after_post(final_result)

        return result
コード例 #6
0
    def get(self, *args, **kwargs):
        """Get object details"""
        self.before_get(args, kwargs)

        qs = self.qs_manager_class(request.args, self.schema)

        obj = self.get_object(kwargs, qs)

        if obj is None:
            url_field = getattr(self._data_layer, "url_field", "id")
            value = f" '{kwargs.get(url_field)}'" if kwargs.get(
                url_field) else ""
            raise ObjectNotFound(
                f"{self.data_layer['model'].__name__}{value} not found.")

        self.before_marshmallow(args, kwargs)

        schema = compute_schema(self.schema,
                                getattr(self, "get_schema_kwargs", dict()), qs,
                                qs.include)

        for i_plugins in self.plugins:
            try:
                i_plugins.after_init_schema_in_resource_detail_get(
                    *args,
                    schema=schema,
                    model=self.data_layer["model"],
                    **kwargs)
            except PluginMethodNotImplementedError:
                pass

        result = schema.dump(obj)

        final_result = self.after_get(result)

        return final_result