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)