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/workflows/models.py
import uuid

from sqlalchemy.dialects import postgresql
from sqlalchemy.dialects.postgresql import UUID

from buyercall.blueprints.agents.models import Team
from buyercall.extensions import db
from buyercall.lib.util_sqlalchemy import ResourceMixin


class WordkflowType(ResourceMixin, db.Model):
    __tablename__ = 'workflow_type'

    id = db.Column(db.Integer, primary_key=True)
    sid = db.Column(UUID(as_uuid=True), unique=True, default=uuid.uuid4, index=True)
    name = db.Column(db.String(64), nullable=False, server_default='')
    is_active = db.Column(db.Boolean(), nullable=False, server_default='1', default=True)

    def __str__(self):
        return self.name

    @classmethod
    def is_name_exists(cls, name):
        return True if cls.query.filter(cls.name == name).first() else False


class WorkflowConditionAction(ResourceMixin, db.Model):
    __tablename__ = 'workflow_condition_action'

    id = db.Column(db.Integer, primary_key=True)
    sid = db.Column(UUID(as_uuid=True), unique=True, default=uuid.uuid4, index=True)
    is_new_contact = db.Column(db.Boolean(), nullable=False, server_default='1', default=True)
    conditions = db.Column(postgresql.JSON, nullable=False, server_default='{}')
    actions = db.Column(postgresql.JSON, nullable=False, server_default='{}')
    meta_data = db.Column(postgresql.JSON, nullable=True, default='{}')

    def __str__(self):
        return str(self.sid)

    @classmethod
    def get_condition_by_id(cls, aid):
        detail = cls.query.filter(cls.id == aid).first()
        return detail.conditions if detail else {}

    @classmethod
    def get_actions_by_id(cls, aid):
        detail = cls.query.filter(cls.id == aid).first()
        return detail.actions if detail else {}


class Workflow(ResourceMixin, db.Model):
    __tablename__ = 'workflow'

    id = db.Column(db.Integer, primary_key=True)
    sid = db.Column(UUID(as_uuid=True), unique=True, default=uuid.uuid4, index=True)
    name = db.Column(db.String(64), nullable=False, server_default='')
    description = db.Column(db.String(512), nullable=True)
    is_active = db.Column(db.Boolean(), nullable=False, server_default='1', default=True)
    status = db.Column(db.Integer, nullable=False, default='0')
    workflow_type = db.Column(db.Integer, db.ForeignKey('workflow_type.id', onupdate='CASCADE',
                                                        ondelete='CASCADE'), index=True, nullable=True)
    workflow_detail = db.Column(db.Integer, db.ForeignKey('workflow_condition_action.id', onupdate='CASCADE',
                                                          ondelete='CASCADE'), index=True, nullable=True)
    created_by = db.Column(db.Integer, db.ForeignKey('users.id', onupdate='CASCADE',
                                                     ondelete='CASCADE'), index=True, nullable=True)

    updated_by = db.Column(db.Integer, db.ForeignKey('users.id', onupdate='CASCADE',
                                                     ondelete='CASCADE'), index=True, nullable=True)

    partnership_account_id = db.Column(db.Integer, db.ForeignKey(
        'partnership_accounts.id', onupdate='CASCADE', ondelete='CASCADE'), index=True, nullable=True)

    partnership_id = db.Column(db.Integer, db.ForeignKey(
        'partnerships.id', onupdate='CASCADE', ondelete='CASCADE'), index=True, nullable=False)

    def __str__(self):
        return self.name

    @classmethod
    def is_name_exists(cls, name):
        return True if cls.query.filter(cls.name == name).first() else False

    @classmethod
    def get_by_partnership_account(cls, pa_id):
        return cls.query.filter(cls.partnership_account_id == pa_id, cls.is_active == True).all()

    def get_conditions(self):
        return WorkflowConditionAction.get_condition_by_id(self.workflow_detail)

    def get_actions(self):
        """"""
        return WorkflowConditionAction.get_actions_by_id(self.workflow_detail)

    def get_detail(self):
        return WorkflowConditionAction.query.filter(WorkflowConditionAction.id == self.workflow_detail).first()

    def get_agents_assigned_in_actions(self):
        meta_data = self.get_detail().meta_data
        agent_ids = meta_data.get('agentIds', [])
        team_ids = meta_data.get('teamIds', [])
        for tid in team_ids:
            team_agent_ids = Team.get_agent_sids_by_team_sid(tid)
            agent_ids.extend(team_agent_ids)
        return list(set(agent_ids))