89 lines
2.5 KiB
Python
89 lines
2.5 KiB
Python
from sqlalchemy import BigInteger, Column, Float, ForeignKey, Integer, Sequence, SmallInteger, \
|
|
Unicode
|
|
from sqlalchemy.ext.declarative import declared_attr
|
|
from sqlalchemy.orm import backref, relationship
|
|
|
|
from ereuse_devicehub.resources.model import STR_BIG_SIZE, STR_SIZE, Thing, check_range
|
|
from teal.db import POLYMORPHIC_ID, POLYMORPHIC_ON, CASCADE
|
|
|
|
|
|
class Device(Thing):
|
|
id = Column(BigInteger, Sequence('device_seq'), primary_key=True)
|
|
type = Column(Unicode)
|
|
pid = Column(Unicode(STR_SIZE), unique=True)
|
|
gid = Column(Unicode(STR_SIZE), unique=True)
|
|
hid = Column(Unicode(STR_BIG_SIZE), unique=True)
|
|
model = Column(Unicode(STR_BIG_SIZE))
|
|
manufacturer = Column(Unicode(STR_SIZE))
|
|
serial_number = Column(Unicode(STR_SIZE))
|
|
weight = Column(Float(precision=3), check_range('weight', min=0.1))
|
|
width = Column(Float(precision=3), check_range('width', min=0.1))
|
|
height = Column(Float(precision=3), check_range('height', min=0.1))
|
|
|
|
@declared_attr
|
|
def __mapper_args__(cls):
|
|
"""
|
|
Defines inheritance.
|
|
|
|
From `the guide <http://docs.sqlalchemy.org/en/latest/orm/
|
|
extensions/declarative/api.html
|
|
#sqlalchemy.ext.declarative.declared_attr>`_
|
|
"""
|
|
args = {POLYMORPHIC_ID: cls.__name__}
|
|
if cls.__name__ == 'Device':
|
|
args[POLYMORPHIC_ON] = cls.type
|
|
return args
|
|
|
|
|
|
class Computer(Device):
|
|
id = Column(BigInteger, ForeignKey(Device.id), primary_key=True)
|
|
|
|
|
|
class Desktop(Computer):
|
|
pass
|
|
|
|
|
|
class Laptop(Computer):
|
|
pass
|
|
|
|
|
|
class Netbook(Computer):
|
|
pass
|
|
|
|
|
|
class Server(Computer):
|
|
pass
|
|
|
|
|
|
class Microtower(Computer):
|
|
pass
|
|
|
|
|
|
class Component(Device):
|
|
id = Column(BigInteger, ForeignKey(Device.id), primary_key=True)
|
|
|
|
parent_id = Column(BigInteger, ForeignKey('computer.id'))
|
|
parent = relationship(Computer,
|
|
backref=backref('components', lazy=True, cascade=CASCADE),
|
|
primaryjoin='Component.parent_id == Computer.id')
|
|
|
|
|
|
class GraphicCard(Component):
|
|
memory = Column(SmallInteger, check_range('memory', min=0.1))
|
|
|
|
|
|
class HardDrive(Component):
|
|
size = Column(Integer, check_range('size', min=0.1))
|
|
|
|
|
|
class Motherboard(Component):
|
|
slots = Column(SmallInteger, check_range('slots'))
|
|
usb = Column(SmallInteger, check_range('usb'))
|
|
firewire = Column(SmallInteger, check_range('firewire'))
|
|
serial = Column(SmallInteger, check_range('serial'))
|
|
pcmcia = Column(SmallInteger, check_range('pcmcia'))
|
|
|
|
|
|
class NetworkAdapter(Component):
|
|
speed = Column(SmallInteger, check_range('speed'))
|