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: //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