Source code for aiohttp_json_api.controller

import copy

from .abc.contoller import ControllerABC
from .common import logger
from .fields.decorators import Tag
from .helpers import first, get_processors


[docs]class DefaultController(ControllerABC):
[docs] @staticmethod async def default_include(field, resources, **kwargs): if field.mapped_key: ctx = kwargs['context'] compound_documents = [] for resource in resources: compound_document = getattr(resource, field.mapped_key) if compound_document: compound_documents.extend( (compound_document,) if type(compound_document) in ctx.registry else compound_document ) return compound_documents raise RuntimeError('No includer and mapped_key have been defined.')
[docs] @staticmethod async def default_query(field, resource, **kwargs): if field.mapped_key: return getattr(resource, field.mapped_key) raise RuntimeError('No query method and mapped_key have been defined.')
[docs] @staticmethod async def default_add(field, resource, data, sp, **kwargs): logger.warning('You should override the adder.') if not field.mapped_key: raise RuntimeError('No adder and mapped_key have been defined.') relatives = getattr(resource, field.mapped_key) relatives.extend(data)
[docs] @staticmethod async def default_remove(field, resource, data, sp, **kwargs): logger.warning('You should override the remover.') if not field.mapped_key: raise RuntimeError('No remover and mapped_key have been defined.') relatives = getattr(resource, field.mapped_key) for relative in data: try: relatives.remove(relative) except ValueError: pass
[docs] async def update_resource(self, resource, data, sp, **kwargs): updated_resource = copy.deepcopy(resource) for key, (field_data, sp) in data.items(): field = self.ctx.schema.get_field(key) await self.ctx.schema.set_value(field, updated_resource, field_data, sp, **kwargs) return resource, updated_resource
[docs] async def update_relationship(self, field, resource, data, sp, **kwargs): updated_resource = copy.deepcopy(resource) await self.ctx.schema.set_value(field, updated_resource, data, sp, **kwargs) return resource, updated_resource
[docs] async def add_relationship(self, field, resource, data, sp, **kwargs): updated_resource = copy.deepcopy(resource) adder, adder_kwargs = first( get_processors(self, Tag.ADD, field, self.default_add) ) await adder(field, updated_resource, data, sp, **adder_kwargs, **kwargs) return resource, updated_resource
[docs] async def remove_relationship(self, field, resource, data, sp, **kwargs): updated_resource = copy.deepcopy(resource) remover, remover_kwargs = first( get_processors(self, Tag.REMOVE, field, self.default_remove) ) await remover(field, updated_resource, data, sp, **remover_kwargs, **kwargs) return resource, updated_resource
[docs] async def query_relatives(self, field, resource, **kwargs): query, query_kwargs = first( get_processors(self, Tag.QUERY, field, self.default_query) ) return await query(field, resource, **query_kwargs, **kwargs)
[docs] async def fetch_compound_documents(self, field, resources, **kwargs): include, include_kwargs = first( get_processors(self, Tag.INCLUDE, field, self.default_include) ) return await include(field, resources, context=self.ctx, **include_kwargs, **kwargs)