94 lines
2.3 KiB
Python
94 lines
2.3 KiB
Python
import uuid
|
|
|
|
import numpy as np
|
|
from sqlalchemy import (
|
|
Column,
|
|
Unicode,
|
|
Text,
|
|
Table,
|
|
ForeignKey,
|
|
LargeBinary,
|
|
TypeDecorator
|
|
)
|
|
from sqlalchemy.ext.declarative import declarative_base
|
|
from sqlalchemy.orm import (
|
|
scoped_session,
|
|
sessionmaker,
|
|
relationship
|
|
)
|
|
from zope.sqlalchemy import register
|
|
|
|
|
|
DBSession = scoped_session(sessionmaker())
|
|
register(DBSession)
|
|
Base = declarative_base()
|
|
|
|
|
|
class User(Base):
|
|
__tablename__ = 'users'
|
|
uid = Column(Unicode(32), primary_key=True)
|
|
name = Column(Unicode(50), unique=True)
|
|
devices = relationship(
|
|
'Device',
|
|
secondary='users_devices_link',
|
|
back_populates='users'
|
|
)
|
|
faces = relationship('Face', back_populates='user')
|
|
|
|
def __init__(self, name):
|
|
self.uid = uuid.uuid4().hex
|
|
self.name = name
|
|
|
|
def __repr__(self):
|
|
return '<User uid=%s, name=%s>' % (self.uid, self.name)
|
|
|
|
|
|
class Device(Base):
|
|
__tablename__ = 'devices'
|
|
uid = Column(Unicode(32), primary_key=True)
|
|
callback = Column(Unicode(250))
|
|
users = relationship(
|
|
'User',
|
|
secondary='users_devices_link',
|
|
back_populates='devices'
|
|
)
|
|
|
|
def __init__(self, callback=None):
|
|
self.uid = uuid.uuid4().hex
|
|
self.callback = callback
|
|
|
|
def __repr__(self):
|
|
return '<Device uid=%s, callback=%s>' % (self.uid, self.callback)
|
|
|
|
|
|
class UserDeviceLink(Base):
|
|
__tablename__ = 'users_devices_link'
|
|
user_id = Column(Unicode(36), ForeignKey('users.uid'), primary_key=True)
|
|
device_id = Column(Unicode(36), ForeignKey('devices.uid'), primary_key=True)
|
|
|
|
|
|
class NDArray(TypeDecorator):
|
|
impl = LargeBinary
|
|
|
|
def process_bind_param(self, value, dialect):
|
|
if value is not None:
|
|
value = value.tobytes()
|
|
return value
|
|
|
|
def process_result_value(self, value, dialect):
|
|
if value is not None:
|
|
value = np.frombuffer(value, dtype='float32')
|
|
return value
|
|
|
|
|
|
class Face(Base):
|
|
__tablename__ = 'faces'
|
|
uid = Column(Unicode(32), primary_key=True)
|
|
face = Column(NDArray(512))
|
|
user_id = Column(Unicode(36), ForeignKey('users.uid'))
|
|
user = relationship('User', back_populates='faces')
|
|
|
|
def __repr__(self):
|
|
return '<Face uid=%s, user=%s, face=<array %d>>' % (
|
|
self.uid, self.user.name, len(self.face))
|