mti840-projet/cloud/cloud/models.py

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))