HEX
Server: Apache/2.4.52 (Ubuntu)
System: Linux spn-python 5.15.0-89-generic #99-Ubuntu SMP Mon Oct 30 20:42:41 UTC 2023 x86_64
User: arjun (1000)
PHP: 8.1.2-1ubuntu2.20
Disabled: NONE
Upload Files
File: //proc/1233/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