from main import db, app, ma from sqlalchemy import Sequence from sqlalchemy.exc import SQLAlchemyError from shared import PA # DEL ME SOON from flask_login import login_required from flask import render_template import json # pylint: disable=no-member ################################################################################ # Class describing Face in the database and DB via sqlalchemy # - face contains the binary version of numpy array so we dont need to recalc it # - locn is the pixel coords of the face (top, right, bottom, left) # - refimg_lnk and facefile_lnk are viewOnly / just for convenience in viewer # - refimg is a real link to the refimg used for this face (its is only used in # viewer, and is either set when there is a matched face, or None if no match ################################################################################ class Face(PA,db.Model): __tablename__ = "face" id = db.Column(db.Integer, db.Sequence('face_id_seq'), primary_key=True ) face = db.Column( db.LargeBinary ) locn = db.Column( db.String ) face_top = db.Column( db.Integer ) face_right = db.Column( db.Integer ) face_bottom = db.Column( db.Integer ) face_left = db.Column( db.Integer ) w = db.Column( db.Integer ) h = db.Column( db.Integer ) refimg_lnk = db.relationship("FaceRefimgLink", uselist=False, viewonly=True) facefile_lnk = db.relationship("FaceFileLink", uselist=False, viewonly=True) refimg =db.relationship("Refimg", secondary="face_refimg_link", uselist=False) ################################################################################ # Class describing FaceFileLink in the database and DB via sqlalchemy # each face comes from a file and used a model to find the face # this is not perfect, each face in the same file is always foudn with the same # model - so really should have ModelFileLink or something, in the long run # this might even be better as ScanDetailsFileLink and ScanDetails ################################################################################ class FaceFileLink(PA, db.Model): __tablename__ = "face_file_link" face_id = db.Column(db.Integer, db.ForeignKey("face.id"), primary_key=True ) file_eid = db.Column(db.Integer, db.ForeignKey("file.eid"), primary_key=True ) model_used = db.Column(db.Integer, db.ForeignKey("ai_model.id"), primary_key=True ) ################################################################################ # Class describing FaceRefimgLink in the database and DB via sqlalchemy # connects / implies a face has matched a refimg and we keep the distance too # distance is mainly for debugging for now and shown in viewer ################################################################################ class FaceRefimgLink(PA, db.Model): __tablename__ = "face_refimg_link" face_id = db.Column(db.Integer, db.ForeignKey("face.id"), primary_key=True ) refimg_id = db.Column(db.Integer, db.ForeignKey("refimg.id"), primary_key=True ) face_distance = db.Column(db.Integer) ################################################################################ # Class describing FaceOverrideType in the database and DB via sqlalchemy # when a face has an override, it will be a simple list of different types # eg (forced match, no match, not a face, etc) ################################################################################ class FaceOverrideType(PA, db.Model): __tablename__ = "face_override_type" id = db.Column(db.Integer, db.Sequence('face_override_type_id_seq'), primary_key=True ) name = db.Column( db.String ) ################################################################################ # Class describing FaceNoMatchOverride in the database and DB via sqlalchemy # used when a face does not match for some reason (type and face id connected) ################################################################################ class FaceNoMatchOverride(PA, db.Model): __tablename__ = "face_no_match_override" id = db.Column(db.Integer, db.Sequence('face_override_id_seq'), primary_key=True ) face_id = db.Column(db.Integer, db.ForeignKey("face.id"), primary_key=True ) type_id = db.Column(db.Integer, db.ForeignKey("face_override_type.id")) type = db.relationship("FaceOverrideType") ################################################################################ # Class describing FaceForceMatchOverride in the database and DB via sqlalchemy # used when a face is forced to match for some reason (who and face id connected) ################################################################################ class FaceForceMatchOverride(PA, db.Model): __tablename__ = "face_force_match_override" id = db.Column(db.Integer, db.Sequence('face_override_id_seq'), primary_key=True ) face_id = db.Column(db.Integer, db.ForeignKey("face.id"), primary_key=True ) person_id = db.Column(db.Integer, db.ForeignKey("person.id"), primary_key=True ) person = db.relationship("Person")