Exemple #1
0
class SensorType(db.Model):
    """
    Sensor types model.
    """
    __tablename__ = "sensor_types"

    # query_class = query_callable(regions)

    id = db.Column(db.Integer, primary_key=True)

    # Title for Sensor Type
    title = db.Column(db.String)

    # type for sensor type. lower case unique name
    type = db.Column(db.String, unique=True)

    # Inactivity duration after which sensor will be assumed as down.
    status_timeout = db.Column(db.Integer)

    # Is this sensor type is available to all users. Created by Admin User
    is_public = db.Column(db.Boolean, default=True)

    # Created by the user
    created_by = db.Column(db.Integer, db.ForeignKey('users.id'))

    value_fields = db.Column(db.JSON)
    config_fields = db.Column(db.JSON)
    created_at = db.Column(db.DateTime, default=datetime.utcnow)
    # TODO: Use deleted_at(Timestamp for soft deletes)
    deleted = db.Column(db.Boolean, default=False)
class SensorAlertStatus(db.Model):
    """Association table for sensors and alerts"""
    __tablename__ = 'sensor_alert_status'
    __table_args__ = (db.PrimaryKeyConstraint('sensor_id', 'alert_id'), )

    sensor_id = db.Column(db.Integer,
                          db.ForeignKey('sensors.id', ondelete="CASCADE"))
    alert_id = db.Column(db.Integer,
                         db.ForeignKey('alerts.id', ondelete="CASCADE"))
    last_execute = db.Column(db.DateTime)
    triggered = db.Column(db.Boolean)
class UserMetaData(db.Model):
    """Database model for user meta details"""
    __tablename__ = 'users_meta_data'

    id = db.Column(db.Integer, primary_key=True)
    user_id = db.Column(db.Integer,
                        db.ForeignKey('users.id', ondelete="CASCADE"))
    key = db.Column(db.String)
    value = db.Column(db.String)
    description = db.Column(db.String)

    unique_user_key = db.UniqueConstraint('user_id', 'key')
class NetworkAlertAssociation(db.Model):
    """Association table for network alerts"""
    __tablename__ = 'network_alerts'
    __table_args__ = (db.PrimaryKeyConstraint('alert_id', 'network_id'), )

    network_id = db.Column(db.Integer,
                           db.ForeignKey('networks.id', ondelete="CASCADE"))
    alert_id = db.Column(db.Integer,
                         db.ForeignKey('alerts.id', ondelete="CASCADE"))

    networks = db.relationship("Network", back_populates="alerts")
    alert = db.relationship("Alert", back_populates="networks")
class CompanyUserAssociation(db.Model):
    """Association table for sensors and alerts"""
    __tablename__ = 'company_user'
    __table_args__ = (db.PrimaryKeyConstraint('user_id', 'company_id'), )

    user_id = db.Column(db.Integer,
                        db.ForeignKey('users.id', ondelete="CASCADE"))
    company_id = db.Column(db.Integer,
                           db.ForeignKey('companies.id', ondelete="CASCADE"))
    role = db.Column(db.String, default=C_ROLE_DEFAULT)

    user = db.relationship("User", back_populates="companies")
    company = db.relationship("Company", back_populates="users")
 def created_dt(cls):
     """The date/time when the file was uploaded"""
     if not cls.add_file_date_column:
         return None
     return db.Column(UTCDateTime,
                      nullable=not cls.file_required,
                      default=now_utc)
    def md5(cls):
        """
        An MD5 hash of the file.

        Automatically assigned when `save()` is called.
        """
        return db.Column(db.String, nullable=not cls.file_required)
Exemple #8
0
class SensorEventAssociation(db.Model):
    """
    Association table for sensors and events
    """
    __tablename__ = 'sensor_event'
    __table_args__ = (db.PrimaryKeyConstraint('sensor_id', 'event_id'), )

    sensor_id = db.Column(db.Integer,
                          db.ForeignKey('sensors.id', ondelete="CASCADE"))
    event_id = db.Column(db.String,
                         db.ForeignKey('events.id', ondelete="CASCADE"))
    # last_execute = db.Column(db.DateTime)
    # actuator_id = db.Column(db.Integer)

    sensor = db.relationship("Sensor", back_populates="events")
    event = db.relationship("Event", back_populates="sensors")
    def size(cls):
        """
        The size of the file (in bytes).

        Automatically assigned when `save()` is called.
        """
        return db.Column(db.BigInteger, nullable=not cls.file_required)
Exemple #10
0
class Network(StoredFileMixin, db.Model):
    """Network database model."""
    __tablename__ = 'networks'
    add_file_date_column = False
    file_required = False

    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String)
    company_id = db.Column(db.Integer, db.ForeignKey('companies.id'))
    deleted = db.Column(db.Boolean, default=False)
    uid = db.Column(db.String, unique=True)

    last_update = db.Column(db.DateTime, default=datetime.utcnow)
    created_at = db.Column(db.DateTime, default=datetime.utcnow)

    sensors = db.relationship("Sensor",
                              secondary=network_sensor_table,
                              back_populates="networks")
    company = db.relationship("Company", back_populates="networks")
    alerts = db.relationship("NetworkAlertAssociation",
                             back_populates="networks")

    def _build_storage_path(self):
        self.assign_id()
        path_segments = ['floormaps', (self.uid)]
        path = posixpath.join(*(path_segments +
                                ['{}_{}'.format(self.id, self.filename)]))
        return config.FLOORMAP_STORAGE, path
class SensorAlertAssociation(db.Model):
    """
    Association table for sensors and alerts

    actuator_id: Change config value of Sensor on alert.
    If alert action is a trigger type the actuator_id will be required.
    """
    __tablename__ = 'sensor_alert'
    __table_args__ = (db.PrimaryKeyConstraint('sensor_id', 'alert_id'), )

    sensor_id = db.Column(db.Integer,
                          db.ForeignKey('sensors.id', ondelete="CASCADE"))
    alert_id = db.Column(db.Integer,
                         db.ForeignKey('alerts.id', ondelete="CASCADE"))
    last_execute = db.Column(db.DateTime)
    actuator_id = db.Column(db.Integer)

    sensor = db.relationship("Sensor", back_populates="alerts")
    alert = db.relationship("Alert", back_populates="sensors")
Exemple #12
0
class Setting(db.Model):
    """Web settings model"""

    __tablename__ = 'settings'

    id = db.Column(db.Integer, primary_key=True)
    key = db.Column(db.String, unique=True)
    value = db.Column(db.String)
    label = db.Column(db.String)
    group = db.Column(db.String)
    access = db.Column(db.String, default='public')
    description = db.Column(db.String)
    order = db.Column(db.Integer, default=1)
class UserInvite(db.Model):
    __tablename__ = 'user_invites'

    id = db.Column(db.Integer, primary_key=True)
    company_id = db.Column(db.Integer, db.ForeignKey('companies.id'))
    email = db.Column(db.String(200))
    role = db.Column(db.String(20), default=C_ROLE_DEFAULT)
    status = db.Column(db.Boolean, default=False)
    created_at = db.Column(db.DateTime, default=datetime.utcnow)
class BinFile(db.Model):
    """
    Binary files storage table
    """
    __tablename__ = 'bin_files'
    __bind_key__ = 'files'

    id = db.Column(db.Integer, primary_key=True)
    file = db.Column(db.LargeBinary())
    sensor_id = db.Column(db.Integer)
    uid = db.Column(db.String)
    meta_info = db.Column(db.JSON)
    created_at = db.Column(db.DateTime, default=datetime.utcnow)
Exemple #15
0
class Firmware(StoredFileMixin, db.Model):
    """
    Firmware Database Model.

    """
    __tablename__ = "firmwares"
    add_file_date_column = False
    file_required = False

    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String)
    version = db.Column(db.String)
    sensor_type = db.Column(db.String(50))
    is_deployed = db.Column(db.Boolean, default=False)
    test_sensors = db.Column(db.JSON) # UID list of sensors to test with
    last_update = db.Column(db.DateTime, default=datetime.utcnow)
    created_at = db.Column(db.DateTime, default=datetime.utcnow)

    def _build_storage_path(self):
        self.assign_id()
        path_segments = ['firmwares', (self.sensor_type)]
        path = posixpath.join(*(path_segments + [self.filename]))
        return config.FLOORMAP_STORAGE, path
class Company(db.Model):
    __tablename__ = 'companies'

    id = db.Column(db.Integer, primary_key=True)

    name = db.Column(db.String)

    owner_id = db.Column(db.Integer, db.ForeignKey('users.id'))

    deleted = db.Column(db.Boolean, default=False)

    uid = db.Column(db.String, unique=True)

    key = db.Column(db.String)

    owner = db.relationship("User",
                            back_populates="own_companies",
                            lazy="joined")

    sensors = db.relationship("Sensor",
                              back_populates="company",
                              cascade="all, delete, delete-orphan")

    networks = db.relationship("Network",
                               back_populates="company",
                               cascade="all, delete, delete-orphan")

    alerts = db.relationship("Alert",
                             back_populates="company",
                             cascade="all, delete, delete-orphan")

    events = db.relationship("Event",
                             back_populates="company",
                             cascade="all, delete, delete-orphan")

    users = db.relationship("CompanyUserAssociation", back_populates="company")

    def __repr__(self):
        return "<Company(uid='%s' name='%s')>" % (self.uid, self.name)
Exemple #17
0
class Event(db.Model):
    """Events model for scheduling

    unit if repeat is True
    """

    __tablename__ = "events"

    id = db.Column(db.String, primary_key=True)
    name = db.Column(db.String)
    company_id = db.Column(db.Integer, db.ForeignKey('companies.id'))
    is_active = db.Column(db.Boolean, default=True)

    repeat = db.Column(db.Boolean, default=False)
    unit = db.Column(db.String)  # day, week, month, year

    actuator_type = db.Column(db.String)
    config_field = db.Column(db.String)
    config_value = db.Column(db.String)

    start_date = db.Column(db.DateTime)
    next_runtime = db.Column(db.DateTime)
    created_at = db.Column(db.DateTime, default=datetime.utcnow)
    deleted_at = db.Column(db.DateTime)

    company = db.relationship("Company", back_populates="events")

    sensors = db.relationship("SensorEventAssociation",
                              back_populates="event",
                              cascade="all, delete-orphan")
class Alert(db.Model):
    """
    Alerts database model.

    Table Name: alerts

    Columns:-
    id: Unique ID, Primary Key
    name: Name of the notification
    company_id: Company ID
    type: Alert type [ less_then, equal_to, grater_then, geo_in, geo_out, ... ]
    value: Compare Value
    between_start: Check for alerts between duration
    between_end: Check for alerts between duration
    send_to:
    send_method:

    created_at: Alert added on
    """
    __tablename__ = 'alerts'

    id = db.Column(db.Integer, primary_key=True)
    uid = db.Column(db.String, unique=True)
    name = db.Column(db.String)
    company_id = db.Column(db.Integer, db.ForeignKey('companies.id'))
    type = db.Column(db.String)
    sensor_type = db.Column(db.String)
    value = db.Column(db.String)
    field = db.Column(db.String)
    between_start = db.Column(db.Time)
    between_end = db.Column(db.Time)
    snooze = db.Column(db.Integer)
    threshold_duration = db.Column(
        db.Integer, default=0
    )  # Trigger only if alert is active for this duration in minutes
    alert_text = db.Column(db.String)
    recipients = db.Column(db.JSON)
    web_hooks = db.Column(db.JSON)
    alert_if = db.Column(db.String)  # Alert if point is inside or outside
    polygon = db.Column(db.JSON)
    is_active = db.Column(db.Boolean, default=True)
    deleted = db.Column(db.Boolean, default=False)

    action_type = db.Column(db.String, default=ALERT_ACTION_NITIFICATION)
    actuator_type = db.Column(db.String)
    config_field = db.Column(db.String)
    config_value = db.Column(db.String)

    created_at = db.Column(db.DateTime, default=datetime.utcnow)

    company = db.relationship("Company", back_populates="alerts")
    sensors = db.relationship("SensorAlertAssociation",
                              back_populates="alert",
                              cascade="all, delete-orphan")
    networks = db.relationship("NetworkAlertAssociation",
                               back_populates="alert",
                               cascade="all, delete-orphan")
Exemple #19
0
# This file is part of SwarmSense IoT Platform
# Copyright (c) 2018, Baseapp Systems And Softwares Private Limited
# Authors: Gopal Lal
#
# License: www.baseapp.com/swarmsense-whitelabel-iot-platoform
"""Network Database Model"""
import posixpath
from datetime import datetime

from snms.core.db import db
from snms.core.storage import StoredFileMixin
from snms.core.config import config

network_sensor_table = db.Table(
    'network_sensor', db.Model.metadata,
    db.Column('network_id', db.Integer, db.ForeignKey('networks.id')),
    db.Column('sensor_id', db.Integer, db.ForeignKey('sensors.id')),
    db.PrimaryKeyConstraint('network_id', 'sensor_id'))


class Network(StoredFileMixin, db.Model):
    """Network database model."""
    __tablename__ = 'networks'
    add_file_date_column = False
    file_required = False

    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String)
    company_id = db.Column(db.Integer, db.ForeignKey('companies.id'))
    deleted = db.Column(db.Boolean, default=False)
    uid = db.Column(db.String, unique=True)
class User(db.Model):
    """User database model."""
    __tablename__ = 'users'

    id = db.Column(db.Integer, primary_key=True)
    uid = db.Column(db.String, unique=True)
    name = db.Column(db.String)
    email = db.Column(db.String, unique=True)
    password = db.Column(db.String)
    phone = db.Column(db.String)
    data = db.Column(db.Text)
    role = db.Column(db.String, default='user')
    reset_password = db.Column(db.Boolean, default=False)
    reset_code = db.Column(db.String, nullable=True)
    verification_code = db.Column(db.String, nullable=True)
    is_verified = db.Column(db.Boolean, default=False)
    created_at = db.Column(db.DateTime, default=datetime.utcnow)
    deleted = db.Column(db.Boolean, default=False)

    own_companies = db.relationship("Company", back_populates="owner", cascade="all, delete, delete-orphan")

    companies = db.relationship(
        "CompanyUserAssociation",
        back_populates="user")

    def __repr__(self):
        return "<User(name='%s', email='%s', role='%s')>" % (
            self.name, self.email, self.role)

    # @property
    def is_super_admin(self):
        """Check if user is super admin or not."""
        return self.role == 'super_admin'

    def can_be_modified(self, user):
        """If this user can be modified by the given user"""
        return self == user or user.is_super_admin
 def file_id(cls):
     return db.Column(db.Integer,
                      db.ForeignKey(
                          cls.stored_file_class.__table__.fullname + '.id',
                          use_alter=True),
                      nullable=True)
 def content_type(cls):
     """The MIME type of the file"""
     return db.Column(db.String, nullable=not cls.file_required)
 def filename(cls):
     """The name of the file"""
     return db.Column(db.String, nullable=not cls.file_required)
 def storage_file_id(cls):
     return db.Column(db.String, nullable=not cls.file_required)
Exemple #25
0
class Sensor(db.Model):
    """
    Sensor database model.

    This is a common model for all type of sensors. It have some general
    columns to save sensor details.

    """
    __tablename__ = 'sensors'
    __table_args__ = (db.UniqueConstraint(
        'company_id', 'hid', name="sensors_unique_company_id_hid"), )

    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String)
    type = db.Column(db.String(100))
    company_id = db.Column(db.Integer, db.ForeignKey('companies.id'))
    description = db.Column(db.String)
    location_lat = db.Column(db.Float)
    location_long = db.Column(db.Float)
    uid = db.Column(db.String, unique=True)
    hid = db.Column(db.String)
    # TODO: Key field size update.
    key = db.Column(db.String)
    is_down = db.Column(db.Boolean, default=False)
    is_inactive = db.Column(db.Boolean, default=False)
    deleted = db.Column(db.Boolean, default=False)
    ip = db.Column(db.String)
    last_update = db.Column(db.DateTime)
    created_at = db.Column(db.DateTime, default=datetime.utcnow)
    config_updated = db.Column(db.DateTime)

    value = db.Column(db.JSON)
    config = db.Column(db.JSON)

    time_start = db.Column(db.Time, default=time.min)
    time_end = db.Column(db.Time, default=time.max)

    # TODO: Add heart_beat(DateTime) field
    networks = db.relationship("Network",
                               secondary='network_sensor',
                               back_populates="sensors")
    company = db.relationship("Company", back_populates="sensors")

    alerts = db.relationship("SensorAlertAssociation", back_populates="sensor")

    events = db.relationship("SensorEventAssociation", back_populates="sensor")

    sensor_type = db.relationship("SensorType",
                                  foreign_keys=[type],
                                  primaryjoin='Sensor.type == SensorType.type')