class EventLog(db.Model): __tablename__ = "eventlog" eventId = db.Column(db.Integer, primary_key=True) deviceId = db.Column(db.Integer, db.ForeignKey("device.deviceId")) date = db.Column(DateTime, index=True, nullable=False) state = db.Column(db.Enum('OPENDOOR', 'CLOSEDOOR', 'OPENWINDOW', 'CLOSEWINDOW', 'ON', 'OFF', 'OFFLINE', 'ERROR', 'INTTEMP', 'EXTTEMP', name="device_event_state"), default='OFF', index=True, nullable=False) temperature = db.Column(db.Integer) device = db.relationship("Device", back_populates="events") def __repr__(self): return f'<EventLog | DeviceId: {self.deviceId}>' def __init__(self, device, state, date, temperature): self.device = device self.state = state self.date = date self.temperature = temperature
class Model(db.Model): id = db.Column(db.Integer, primary_key=True) date_created = db.Column(db.DateTime, default=db.func.current_timestamp()) parameter = db.Column(db.Text, nullable=False) def __repr__(self): return f"Parameter model: {self.parameter}, created at {self.date_created}"
class Location(db.Model): __tablename__ = "location" locationId = db.Column(db.Integer, primary_key=True) name = db.Column(db.String(255), unique=True, nullable=False) devices = db.relationship("Device", back_populates="location") def __repr__(self): return '<Location | Name: %r>' % self.name def __init__(self, name): self.name = name
class TaskEntity(db.Model, SerializerMixin): id = db.Column(db.Integer, primary_key=True) title = db.Column(db.String(80), unique=True, nullable=False) description = db.Column(db.String(1024), unique=True, nullable=False) def __repr__(self): return '<TaskEntity %r>' % self.title @property def to_text(self): # Return object data in any text format return {'title': self.title, 'description': self.description}
class Post(db.Model): __tablename__ = 'posts' id = db.Column(db.Integer, primary_key=True) created = db.Column(db.DateTime, default=datetime.datetime.utcnow) modified = db.Column(db.DateTime) title = db.Column(db.Unicode(100)) slug = db.Column(db.Unicode(100)) text = db.Column(db.Text) html = db.Column(db.Text) tags = db.Column(db.Unicode(60), index=True) def __str__(self): return self.title @classmethod def before_commit(sender, app, changes): for model, change in changes: if isinstance(model, Post) and change in ('insert', 'update'): # onupdate for field is only called if field is in the SET # this makes sure it is always called model.modified = datetime.datetime.utcnow() # as we don't want the html to be edited manually # the html has to be generated for each row update model.html = mistune.markdown(model.text)
class HVAC(Electric): __tablename__ = None __mapper_args__ = {'polymorphic_identity': 'hvac'} set_f = db.Column(db.INTEGER, default=0) high_f = db.Column(db.INTEGER, default=0) low_f = db.Column(db.INTEGER, default=0) ext_f = db.Column(db.INTEGER, default=0) int_f = db.Column(db.INTEGER, default=0) def __repr__(self): return f'<Device({self.__class__.__name__}) ' \ f'| Name: {self.name}, ' \ f'High({self.high_f}) ' \ f'Low({self.low_f}) ' \ f'Ext({self.ext_f}) ' \ f'Int({self.int_f})>'
class Usage(db.Model): __tablename__ = "usage" usageId = db.Column(db.Integer, primary_key=True) deviceId = db.Column(db.Integer, db.ForeignKey("device.deviceId")) date = db.Column(DateTime, nullable=False) type = db.Column(db.Enum('water', 'electric', name="utility_type"), nullable=False) data = db.Column(db.Float) device = db.relationship("Device", back_populates="usages") def __repr__(self): return f'<Usage | Type: {self.type} | Date: {self.date}>' def __init__(self, device: 'Device', date: datetime, type: str, data: int): self.device = device self.date = date self.type = type self.data = data
class Post(db.Model): __tablename__ = 'posts' id = db.Column(db.Integer, primary_key=True) created = db.Column(db.DateTime, default=datetime.datetime.utcnow) modified = db.Column(db.DateTime, onupdate=datetime.datetime.utcnow) title = db.Column(db.Unicode(100)) slug = db.Column(db.Unicode(100)) text = db.Column(db.Text) html = db.Column(db.Text) tags = db.Column(db.Unicode(60), index=True) def __str__(self): # noqa: D105 return self.title
class Electric(Device): __tablename__ = None __mapper_args__ = {'polymorphic_identity': 'electric'} wattage = db.Column(db.INTEGER) def __init__(self, location, x, y, name, wattage): self.x = x self.y = y self.name = name self.wattage = wattage self.location = location def __repr__(self): return f'<Device({self.__class__.__name__}) | Name: {self.name}, Wattage: {self.wattage}>'
class Device(db.Model): __tablename__ = "device" deviceId = db.Column(db.Integer, primary_key=True) locationId = db.Column(db.Integer, db.ForeignKey("location.locationId")) name = db.Column(db.String(255), unique=True, nullable=False) type = db.Column(db.Enum('door', 'window', 'water', 'electric', 'light', 'hvac', name="device_type"), nullable=False) state = db.Column(db.Enum('ON', 'OFF', 'OFFLINE', 'ERROR', name="device_state"), default='OFF', nullable=False) lastUpdated = db.Column(DateTime, nullable=False, server_default=db.text("CURRENT_TIMESTAMP")) x = db.Column(db.Integer) y = db.Column(db.Integer) location = db.relationship("Location", back_populates="devices") events = db.relationship("EventLog", back_populates="device") usages = db.relationship("Usage", back_populates="device") __mapper_args__ = {'polymorphic_on': type} def __init__(self, location, x, y, name): self.x = x self.y = y self.name = name self.location = location
class Water(Device): __tablename__ = None __mapper_args__ = {'polymorphic_identity': 'water'} # Gallons Per Minute for water flow gpm = db.Column(db.INTEGER, default=0)