File: //home/arjun/projects/buyercall_forms/buyercall/buyercall/blueprints/issue/models.py
from collections import OrderedDict
from sqlalchemy import or_
from sqlalchemy.sql import text
from buyercall.lib.util_sqlalchemy import ResourceMixin
from buyercall.extensions import db
class Issue(ResourceMixin, db.Model):
STATUS = OrderedDict([
('unread', 'Unread'),
('open', 'Open'),
('contacted', 'Contacted'),
('closed', 'Closed')
])
LABEL = OrderedDict([
('login', 'I cannot access my account'),
('form', 'I require a dealer form and id'),
('phone', 'I require a phone number for calling and texting'),
('data', 'I am not seeing my data or the data is incorrect'),
('billing', 'I have a billing question'),
('email', 'I am not receiving e-mails'),
('request', 'I want to request a feature'),
('other', 'Other')
])
__tablename__ = 'issues'
id = db.Column(db.Integer, primary_key=True)
status = db.Column(db.Enum(*STATUS.keys(), name='status_types'),
index=True, nullable=False, server_default='unread')
label = db.Column(db.Enum(*LABEL.keys(), name='label_types'),
index=True, nullable=False, server_default='login')
email = db.Column(db.String(255), index=True, nullable=False,
server_default='')
question = db.Column(db.Text())
partnership_id = db.Column(db.Integer, db.ForeignKey('partnerships.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)
@classmethod
def search(cls, query):
"""
Search a resource by 1 or more fields.
:param query: Search query
:type query: str
:return: SQLAlchemy filter
"""
if not query:
return text('')
search_query = '%{0}%'.format(query)
return text(or_(Issue.email.ilike(search_query)))
@classmethod
def unread_to_open(cls, issue):
"""
Change unread issues to open.
:param issue: Issue instance
:type issue: Issue instance
:return: Issue instance
"""
issue.status = 'open'
issue.save()
return issue
@classmethod
def set_as_contacted(cls, issue):
"""
Change an unknown issue type to contacted.
:param issue: Issue instance
:type issue: Issue instance
:return: Issue instance
"""
issue.status = 'contacted'
issue.save()
return issue