File: //proc/self/root/home/arjun/projects/buyercall/buyercall/blueprints/notification/models.py
from buyercall.blueprints.user.models import User
import uuid
from buyercall.extensions import db
import logging
from buyercall.lib.util_sqlalchemy import ResourceMixin
from sqlalchemy.dialects.postgresql import UUID, ARRAY
from sqlalchemy.orm import backref
log = logging.getLogger(__name__)
class NotificationSettings(ResourceMixin, db.Model):
__tablename__ = 'notification_settings'
serialize_only = ('sid', 'user.sid', 'push_notification')
id = db.Column(db.Integer, primary_key=True)
sid = db.Column(UUID(as_uuid=True), unique=True, default=uuid.uuid4, index=True)
user_id = db.Column(db.Integer, db.ForeignKey('users.id'))
user = db.relationship("User", backref=backref("notification_settings", uselist=False))
push_notification = db.Column(db.Boolean(), nullable=False, server_default='true')
# ian = In App Notifications
ian_on_new_lead = db.Column(db.Boolean(), nullable=False, server_default='true')
ian_on_task_assign = db.Column(db.Boolean(), nullable=False, server_default='true')
ian_all_tasks = db.Column(db.Boolean(), nullable=False, server_default='false')
ian_on_account_activity = db.Column(db.Boolean(), nullable=False, server_default='true')
ian_on_account_security = db.Column(db.Boolean(), nullable=False, server_default='true')
ian_on_promo = db.Column(db.Boolean(), nullable=False, server_default='true')
# emn = E-Mail Notifications
emn_on_account_activity = db.Column(db.Boolean(), nullable=False, server_default='true')
emn_on_account_security = db.Column(db.Boolean(), nullable=False, server_default='true')
emn_on_promo = db.Column(db.Boolean(), nullable=False, server_default='true')
emn_on_new_lead = db.Column(db.Boolean(), nullable=False, server_default='true')
emn_on_new_task = db.Column(db.Boolean(), nullable=False, server_default='true')
emn_all_tasks = db.Column(db.Boolean(), nullable=False, server_default='false')
def __str__(self):
return str(self.sid)
@property
def is_web_push(self):
return self.push_notification
@classmethod
def get_or_create(cls, user_id, **kwargs):
instance = cls.query.filter(cls.user_id == user_id).first()
if instance:
return instance
else:
instance = cls(user_id=user_id)
instance = instance.save()
return instance
@classmethod
def get_or_create_sid(cls, user_sid, **kwargs):
instance = cls.query.filter(cls.user.sid == user_sid).first()
if instance:
return instance
else:
_user = User.query.filter(User.sid == user_sid).first()
instance = cls(user_id=_user.id)
instance = instance.save()
return instance
@classmethod
def is_webpush_enabled_bulk(cls, user_sids):
is_webpush_bulk_resp = {}
for sid in user_sids:
_user = User.query.filter(User.sid == sid).first()
_user_settings = cls.query.filter(cls.user_id == _user.id).first()
if not _user_settings:
_user_settings = cls(user_id=_user.id)
_user_settings = _user_settings.save()
is_webpush_bulk_resp[sid] = _user_settings.push_notification
return is_webpush_bulk_resp
class ActivitySettings(ResourceMixin, db.Model):
__tablename__ = 'activity_settings'
serialize_only = ('sid', 'activity_type', 'activity_mesage_type', 'is_notification', 'is_web_push')
id = db.Column(db.Integer, primary_key=True)
sid = db.Column(UUID(as_uuid=True), unique=True, default=uuid.uuid4, index=True, nullable=False)
activity_message_type = db.Column(
db.String(128),
index=True,
nullable=False,
server_default='',
unique=True
)
activity_type = db.Column(
db.String(128),
index=True,
nullable=False,
server_default=''
)
is_notification = db.Column(db.Boolean(), nullable=False, server_default='false')
is_email_notification = db.Column(db.Boolean(), nullable=False, server_default='false')
is_web_push = db.Column(db.Boolean(), nullable=False, server_default='false')
valid_user_roles = db.Column(ARRAY(db.String(64)))
message_literal = db.Column(
db.String(128),
nullable=False,
server_default=''
)
user_message_description = db.Column(
db.String(512),
nullable=False,
server_default=''
)
other_user_description = db.Column(
db.String(512),
nullable=False,
server_default=''
)
is_active = db.Column(db.Boolean(), nullable=False, server_default='true')
def __str__(self):
return self.activity_message_type
@classmethod
def upsert(cls, activity_message_type, activity_type=None, is_notification=None, is_web_push=None, valid_user_roles=None, message_literal=None,
user_message_description=None, other_user_description=None, is_active=None):
instance = cls.query.filter(cls.activity_message_type == activity_message_type).first()
if instance:
if activity_type:
instance.activity_type = activity_type
if is_notification:
instance.is_notification = is_notification
if is_web_push:
instance.is_web_push = is_web_push
if valid_user_roles:
instance.valid_user_roles = valid_user_roles
if message_literal:
instance.message_literal = message_literal
if user_message_description:
instance.user_message_description = user_message_description
if other_user_description:
instance.other_user_description = other_user_description
if is_active:
instance.is_active = is_active
else:
instance = cls(activity_message_type=activity_message_type, activity_type=activity_type, is_notification=is_notification,
is_web_push=is_web_push, valid_user_roles=valid_user_roles, message_literal=message_literal, is_active=is_active,
user_message_description=user_message_description, other_user_description=other_user_description)
instance.save()
return True