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))