bump project

This commit is contained in:
2026-05-01 21:24:21 +03:30
parent dc4b1a1400
commit 139b3e26da
83 changed files with 2455 additions and 18349 deletions

View File

@@ -0,0 +1 @@

44
app/recognition/routes.py Normal file
View File

@@ -0,0 +1,44 @@
from __future__ import annotations
from flask import Blueprint, current_app, jsonify, request
from app.models import Person, Role
from app.services.attendance import last_presence_summary
from app.services.recognition import RecognitionUnavailable, recognize_faces
from app.services.security import roles_required
bp = Blueprint("recognition", __name__, url_prefix="/recognition")
@bp.post("/identify")
@roles_required(Role.ADMIN, Role.OPERATOR)
def identify():
image = request.form.get("image", "")
if not image:
return jsonify({"error": "No image was provided."}), 400
people = Person.query.filter_by(active=True).all()
try:
result = recognize_faces(image, people, tolerance=current_app.config["FACE_MATCH_TOLERANCE"])
except RecognitionUnavailable as exc:
return jsonify({"error": str(exc)}), 503
except ValueError as exc:
return jsonify({"error": str(exc)}), 400
faces = []
for face in result.faces:
if not face.person:
faces.append({"matched": False, "confidence": None})
continue
faces.append(
{
"matched": True,
"person_id": face.person.id,
"full_name": face.person.full_name,
"employee_id": face.person.employee_id,
"confidence": round(face.confidence, 3) if face.confidence is not None else None,
"last_presence": last_presence_summary(face.person),
}
)
return jsonify({"faces": faces, "annotated_image": result.annotated_image})