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