Source code for luna_backport3.app.handlers.linker_handler

# -*- coding: utf-8 -*-
"""
Linker Handler

Module realize list linker handler.
"""

from sanic.response import HTTPResponse

from app.handlers.base_handler import BaseHandler
from app.handlers.schemas import LINKER_SCHEMA
from app.mixins import LinkerMixin, ListMixin
from classes.enums import ListType
from crutches_on_wheels.errors.errors import Error
from crutches_on_wheels.errors.exception import VLException


[docs]class LinkerHandler(ListMixin, LinkerMixin, BaseHandler): """ Handler for resource `/storage/linker`. """
[docs] async def patch(self) -> HTTPResponse: """ Attach or detach persons or descriptors from a list, see `spec patch linker`_. .. _`spec patch linker`: _static/api.html#operation/patchLinker Raises: VLException(Error.ListNotFound, 400, isCriticalError=False) if list not found VLException(Error.WrongListType, 400, isCriticalError=False) if wrong list type VLException(Error.PersonNotFound, 400, isCriticalError=False) if person not found VLException(Error.Backport3DescriptorNotFound, 400, isCriticalError=False) if descriptor not found """ inputJson = self.request.json self.validateJson(inputJson, LINKER_SCHEMA, useJsonSchema=False) listId = inputJson["list_id"] action = inputJson["action"] personIds = inputJson.get("person_ids", []) faceIds = inputJson.get("descriptor_ids", []) try: listType = await self.getListType(listId=listId) except VLException as e: if e.error == Error.ListNotFound: e.statusCode = 400 raise try: if listType == ListType.persons: if faceIds: # PLATFORM 3 bug raise VLException( Error.WrongListType.format("descriptors", "persons", listId), 400, isCriticalError=False ) if personIds: await self.linkPersons(listId=listId, personIds=personIds, action=action) else: faceIdsToAttach = faceIds[:] if personIds: # PLATFORM 3 feature personDescrs = await self.getPersonsDescriptors(personIds=personIds) faceIdsToAttach.extend(personDescrs) if faceIdsToAttach: await self.linkDescriptors(listId=listId, descriptorIds=faceIdsToAttach, action=action) except VLException as e: if e.error in (Error.PersonNotFound, Error.Backport3DescriptorNotFound): e.statusCode = 400 raise return self.success(204)