Example #1
0
class Device(db.Model, SerializationMixin):
    """device resource
    """
    id = db.Column(db.Integer, primary_key=True)
    user_id = db.Column(db.Integer,
                        db.ForeignKey('user.id'),
                        index=True,
                        nullable=False)
    platform = db.Column(db.String(10), index=True, nullable=False)
    platform_id = db.Column(db.Text, unique=True, nullable=False)
    mobile_app_id = db.Column(db.Text, index=True)
    mobile_app_ver = db.Column(db.Integer, index=True)
    mute = db.Column(db.Boolean, default=False, nullable=False)
    created_at = db.Column(db.DateTime, default=datetime.datetime.now)
    updated_at = db.Column(db.DateTime, onupdate=datetime.datetime.now)

    def subscribe_to_channels(self):
        """subscribe new device to existing channels
        """
        try:
            for channel in self.user.subscriptions.all():
                channel.devices.append(self)
            db.session.add(self.user)
            db.session.commit()
        except Exception as ex:
            db.session.rollback()
            app.logger.exception(ex)
            return False
        return True

    def __repr__(self):
        return '<Device %r>' % self.id
Example #2
0
class Alert(db.Model, SerializationMixin):
    """alert resource
    """
    id = db.Column(db.Integer, primary_key=True)
    channel_id = db.Column(db.Integer, db.ForeignKey('channel.id'), index=True)
    payload = db.Column(JSONB, nullable=False)
    created_at = db.Column(db.DateTime, default=datetime.datetime.now)
    updated_at = db.Column(db.DateTime, onupdate=datetime.datetime.now)

    def __repr__(self):
        return '<Alert %r>' % self.id
Example #3
0
class Channel(db.Model, SerializationMixin):
    """channel resource
    """
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(255), unique=True, nullable=False)
    description = db.Column(db.Text)
    devices = db.relationship('Device',
                              secondary=channel_devices,
                              lazy='dynamic',
                              backref=db.backref('channels', lazy='dynamic'))
    alerts = db.relationship('Alert',
                             backref='channel',
                             lazy='dynamic',
                             cascade='all, delete, delete-orphan')
    created_at = db.Column(db.DateTime, default=datetime.datetime.now)
    updated_at = db.Column(db.DateTime, onupdate=datetime.datetime.now)

    def subscribe_user(self, user):
        try:
            self.subscribers.append(user)
            for device in user.devices.all():
                self.devices.append(device)
            db.session.add(self)
            db.session.commit()
        except Exception as ex:
            db.session.rollback()
            app.logger.exception(ex)
            return False
        return True

    def unsubscribe_user(self, user):
        try:
            self.subscribers.remove(user)
            for device in user.devices.all():
                self.devices.remove(device)
            db.session.commit()
        except Exception as ex:
            db.session.rollback()
            app.logger.exception(ex)
            return False
        return True

    def __repr__(self):
        return '<Channel %r>' % self.id
Example #4
0
class User(db.Model, SerializationMixin):
    """user resource
    """
    id = db.Column(db.Integer, primary_key=True)
    # pns_id is a unique identifier for easy third-party integration (email, citizen id etc.)
    pns_id = db.Column(db.String(255), unique=True, nullable=False)
    subscriptions = db.relationship('Channel',
                                    secondary=subscriptions,
                                    lazy='dynamic',
                                    backref=db.backref('subscribers',
                                                       lazy='dynamic'))
    devices = db.relationship('Device',
                              backref='user',
                              lazy='dynamic',
                              cascade='all, delete, delete-orphan')
    created_at = db.Column(db.DateTime, default=datetime.datetime.now)
    updated_at = db.Column(db.DateTime, onupdate=datetime.datetime.now)

    def __repr__(self):
        return '<User %r>' % self.id
Example #5
0
    def to_dict(self, *exceptions, **extra_payload):
        """get dict representation of the object
        :param list exceptions: a list to discard from dict
        :param dict extra_payload: new parameters to add to dict
        """
        _dict = ({
            c.name: getattr(self, c.name)
            for c in self.__table__.columns if c.name not in exceptions
        })
        _dict.update(**extra_payload)
        return _dict


subscriptions = db.Table(
    'subscriptions',
    db.Column('user_id', db.Integer, db.ForeignKey('user.id'), nullable=False),
    db.Column('channel_id',
              db.Integer,
              db.ForeignKey('channel.id'),
              nullable=False), UniqueConstraint('user_id', 'channel_id'))

channel_devices = db.Table(
    'channel_devices',
    db.Column('channel_id',
              db.Integer,
              db.ForeignKey('channel.id'),
              nullable=False),
    db.Column('device_id',
              db.Integer,
              db.ForeignKey('device.id'),
              nullable=False), UniqueConstraint('channel_id', 'device_id'))