Source code for luna_backport3.app.handlers.handler_identify
""" Handler for identify resource"""
from sanic.response import HTTPResponse
from app.handlers.handlers_mixin import HandlersMixin
from app.handlers.matcher_basic_handler import MatcherBasicHandler
from app.handlers.schemas import PATCH_HANDLER_IDENTIFY_SCHEMA
from app.mixins import CachedHandlerMixin
from classes.enums import HandlerType, ListType
from classes.handler_defaults import IdentifyHandlerPolicies
from crutches_on_wheels.web.query_getters import boolFrom01Getter, int01Getter
[docs]class HandlerIdentify(CachedHandlerMixin, HandlersMixin, MatcherBasicHandler):
    """
    Handler for identifying persons on provided image.
    Resource: "/{api_version}/identify"
    """
[docs]    async def post(self) -> HTTPResponse:
        """
        Identify person on provided image, see `spec_handlers_identify`_.
        .. _`spec_handlers_identify`:
            _static/api.html#operation/identifyFace
        """
        noCache = self.getQueryParam("no_cache", boolFrom01Getter, default=False)
        warpedImage = self.getQueryParam("warped_image", int01Getter, default=0)
        handler = await self.getHandler(HandlerType.identify, noCache)
        handlerId, policiesDict = handler["handler_id"], handler["policies"]
        handlerPolicies = IdentifyHandlerPolicies(**policiesDict)
        event = await self.emitHandlerEvent(
            handlerType=HandlerType.identify,
            handlerId=handlerId,
            handlerPolicies=handlerPolicies,
            warpedImage=warpedImage,
        )
        face = event.face
        exif = event.exif
        faceCandidates = event.event["matches"][0]["candidates"]
        faceCandidatesIds = [match["face"]["face_id"] for match in faceCandidates]
        descriptorToPersonMap = await self.dbContext.getPersonsByDescriptors(descriptorIds=faceCandidatesIds)
        listType = await self.getCachedListType(policiesDict["list_id"])
        if listType == ListType.persons:
            candidates = self.makeCandidatesList(descriptorToPersonMap, faceCandidates)
        else:
            candidates = [
                {"id": match["face"]["face_id"], "similarity": match["similarity"]} for match in faceCandidates
            ]
        result = {"candidates": candidates, "face": face}
        if exif is not None:
            result["exif"] = exif
        return self.success(201, outputJson=result, extraHeaders=self.getExtraHeaders()) 
[docs]    async def get(self) -> HTTPResponse:
        """
        Get handler info. See `spec_get_handler_identify`_.
        .. _spec_get_handler_identify:
            _static/api.html#operation/getHandlerIdentify
        """
        handler = await self.getHandler(handlerType=HandlerType.identify, noCache=True)
        return self.success(200, outputJson=handler) 
[docs]    async def patch(self) -> HTTPResponse:
        """
        Patch handler. See `spec_patch_handler_identify`_.
        .. _spec_patch_handler_identify:
            _static/api.html#operation/patchHandlerIdentify
        """
        reqJson = self.request.json
        self.validateJson(reqJson, PATCH_HANDLER_IDENTIFY_SCHEMA, useJsonSchema=False)
        if "limit" in reqJson:
            reqJson["limit"] = min(self.config.maxCandidateCount, reqJson["limit"])
        actualHandlerVersion = await self.patchHandler(handlerType=HandlerType.identify, policies=reqJson)
        return self.success(200, outputJson={"version": actualHandlerVersion})