sip_huellas/api/app/models/biometria.py

92 lines
4.5 KiB
Python

from app.database import db
class Persona(db.Model):
__tablename__ = 'personas'
cod_id = db.Column(db.Integer, primary_key=True)
cod_nombre = db.Column(db.String(255), nullable=False)
fecha_nacimiento = db.Column(db.Date, nullable=True)
sexo = db.Column(db.String(1), nullable=True) # 'M', 'F' u otros
# Relación inversa: Una persona puede tener varias huellas registradas
huellas = db.relationship('Huella', backref='persona', cascade='all, delete-orphan', lazy=True)
class OrigenHuella(db.Model):
__tablename__ = 'origen_huellas'
id = db.Column(db.Integer, primary_key=True)
descripcion = db.Column(db.String(255), nullable=False) # Ej: Índice, pulgar
lado = db.Column(db.String(50), nullable=True) # Ej: Derecho, izquierdo
huellas = db.relationship('Huella', backref='origen', lazy=True)
#Tipo fundamental para la clasificación dactilar, con relaciones a subclasificaciones y fichas de clasificación
class TiposF(db.Model):
__tablename__ = 'tipos_f'
id = db.Column(db.Integer, primary_key=True, autoincrement=True)
nombre = db.Column(db.String(255), nullable=False) # Ej: Arco, Presilla, Verticilo
foto = db.Column(db.LargeBinary, nullable=True) # Almacenamiento binario eficiente en Postgres
descripcion = db.Column(db.Text, nullable=True)
subclasificaciones = db.relationship('Subclasificacion', backref='tipo_f', lazy=True)
fichas = db.relationship('FichaClasificacion', backref='tipo_f', lazy=True)
class Subclasificacion(db.Model):
__tablename__ = 'subclasificaciones'
id = db.Column(db.Integer, primary_key=True, autoincrement=True)
nombre = db.Column(db.String(255), nullable=False) # Ej: Arco simple, Presilla derecha
tipo_f_id = db.Column(db.Integer, db.ForeignKey('tipos_f.id', ondelete='RESTRICT'), nullable=False)
fichas = db.relationship('FichaClasificacion', backref='subclasificacion', lazy=True)
class Huella(db.Model):
__tablename__ = 'huellas'
id = db.Column(db.Integer, primary_key=True, autoincrement=True)
descripcion = db.Column(db.String(255), nullable=True)
origen_hd = db.Column(db.String(255), nullable=True) # Ej: Escáner, Tinta
foto = db.Column(db.LargeBinary, nullable=True) # Imagen de la huella dactilar (Fichero RAW/WSQ)
persona_cod_id = db.Column(db.Integer, db.ForeignKey('personas.cod_id', ondelete='CASCADE'), nullable=False)
origen_huella_id = db.Column(db.Integer, db.ForeignKey('origen_huellas.id', ondelete='RESTRICT'), nullable=False)
# Relaciones Muchos a Muchos mediante tabla intermedia con atributos compuestos
puntos_caracteristicos = db.relationship('HuellaPuntoCaracteristico', backref='huella', cascade='all, delete-orphan', lazy=True)
fichas = db.relationship('FichaClasificacion', backref='huella', cascade='all, delete-orphan', lazy=True)
class PuntoCaracteristico(db.Model):
__tablename__ = 'puntos_caracteristicos'
id = db.Column(db.Integer, primary_key=True, autoincrement=True)
nombre = db.Column(db.String(255), nullable=False) # Ej: Bifurcación, Final de cresta
foto = db.Column(db.LargeBinary, nullable=True) # Gráfico patrón del punto
huellas_asociadas = db.relationship('HuellaPuntoCaracteristico', backref='punto', cascade='all, delete-orphan', lazy=True)
class HuellaPuntoCaracteristico(db.Model):
""" Tabla pivote relacional con atributos de coordenadas geo-espaciales (X, Y) y ángulo de la minucia """
__tablename__ = 'huella_punto_caracteristico'
huella_id = db.Column(db.Integer, db.ForeignKey('huellas.id', ondelete='CASCADE'), primary_key=True)
punto_id = db.Column(db.Integer, db.ForeignKey('puntos_caracteristicos.id', ondelete='CASCADE'), primary_key=True)
# Coordenadas numéricas precisas para algoritmos de correspondencia (Matching)
x = db.Column(db.Numeric(10, 6), nullable=False)
y = db.Column(db.Numeric(10, 6), nullable=False)
angulo = db.Column(db.Numeric(5, 2), nullable=False)
class FichaClasificacion(db.Model):
__tablename__ = 'fichas_clasificacion'
id = db.Column(db.Integer, primary_key=True, autoincrement=True)
huella_id = db.Column(db.Integer, db.ForeignKey('huellas.id', ondelete='CASCADE'), nullable=False)
subclasificacion_id = db.Column(db.Integer, db.ForeignKey('subclasificaciones.id', ondelete='RESTRICT'), nullable=False)
tipos_f_id = db.Column(db.Integer, db.ForeignKey('tipos_f.id', ondelete='RESTRICT'), nullable=False)
fecha = db.Column(db.Date, nullable=False, default=db.func.current_date())