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/api2/doc/endpoints/forms.py
import logging

from html.parser import HTMLParser
from flask import (
    Blueprint,
    make_response,
    request,
    jsonify)
from flask_babel import gettext as _
from flask import Blueprint, jsonify, make_response
from buyercall.lib.util_rest import rest_partnership_account, rest_partnership, requires_auth, \
    rest_is_partnership_account, rest_is_partnership
from buyercall.blueprints.widgets.models import Widget
from buyercall.blueprints.phonenumbers.models import Phone
from flask_restx import Resource
from buyercall.blueprints.api2.doc import serializers
from buyercall.blueprints.api2.restplus import api
from buyercall.blueprints.form_leads.models import ExternalForm, \
    ExternalFormField, \
    FormLeadField, \
    FormLead, \
    ExternalFormFieldDefinition
from buyercall.blueprints.partnership.models import Partnership, PartnershipAccount
from sqlalchemy import func, or_, and_, extract


log = logging.getLogger(__name__)
ns = api.namespace('Forms', description='Operations related to forms.', path='/accounts')


class MLStripper(HTMLParser):
    def __init__(self):
        super().__init__()
        self.reset()
        self.fed = []

    def handle_data(self, d):
        self.fed.append(d)

    def get_data(self):
        return ''.join(self.fed)


def strip_tags(html):
    s = MLStripper()
    s.feed(html)
    return s.get_data()


@ns.route('/<int:paid>/forms')
@api.doc(responses={200: 'OK',
                    400: 'Error performing operation.',
                    401: 'Unauthorized request.'},
         params={'paid': 'The partner account Id'})
class ApiFormGet(Resource):
    @requires_auth
    def get(self, paid):
        """
        Retrieves all the forms for a partnership account.

        <p>
        The Forms API GET endpoint should be used to retrieve information on all forms
        associated with a partner account.
        </p>
        <br />
        <p>
        You will require a partner authentication token and a partner account id to make a
        successful request. A response will
        be returned, similar to the example below, based
        on a successful request:
        <br />
        <br />
        </p>
        <pre class="code-background" style="color: white">
        {
          "forms": [
            {
              "adf_email_addresses": "",
              "created_on": "2019-09-23 08:13:24",
              "deactivated_on": "",
              "display_name": "testing more - Finance App",
              "email_addresses": "",
              "email_subject": "Finance App Notification",
              "full_submit_email": true,
              "id": 6,
              "is_deactivated": false,
              "is_external_api_auto": false,
              "partial_data_email": false,
              "routing_id": null,
              "send_auto_email": false,
              "send_auto_email_msg": "",
              "send_auto_email_subject": "",
              "send_auto_sms": false,
              "send_auto_sms_inbound_id": null,
              "send_auto_sms_msg": "",
              "updated_on": "2019-09-23 08:13:24"
            },
            {
              "adf_email_addresses": "",
              "created_on": "2019-10-21 08:13:24",
              "deactivated_on": "",
              "display_name": "Northtown Motor Homes - Finance App",
              "email_addresses": "",
              "email_subject": "Finance App Notification",
              "full_submit_email": true,
              "id": 7,
              "is_deactivated": false,
              "is_external_api_auto": false,
              "partial_data_email": false,
              "routing_id": null,
              "send_auto_email": false,
              "send_auto_email_msg": "",
              "send_auto_email_subject": "",
              "send_auto_sms": false,
              "send_auto_sms_inbound_id": null,
              "send_auto_sms_msg": "",
              "updated_on": "2019-10-21 08:13:24"
            }
            ]
        }
        </pre>

        """
        if rest_is_partnership and rest_partnership is not None:
            form_list = []
            partnership_account = PartnershipAccount \
                .query \
                .filter(and_(PartnershipAccount.id == paid,
                             PartnershipAccount.partnership_id == rest_partnership.id)) \
                .first()

            if partnership_account is not None:
                forms = ExternalForm.query.filter(ExternalForm.partnership_account_id == paid).all()

                if forms is not None:
                    for form in forms:
                        adf_email_addresses = ''
                        email_addresses = ''
                        auto_prequalify_credit = False

                        if form.adf_email_addresses is not None:
                            if 'emails' in form.adf_email_addresses:
                                adf_email_addresses = form.adf_email_addresses['emails']

                        if form.email_addresses is not None:
                            if 'emails' in form.adf_email_addresses:
                                email_addresses = form.email_addresses['emails']

                        if form.auto_prequalify_credit is not None:
                            auto_prequalify_credit = form.auto_prequalify_credit

                        add_form = {
                            'id': form.id,
                            'created_on': form.created_datetime,
                            'updated_on': form.updated_datetime,
                            'routing_id': form.routing_id,
                            'display_name': form.display_name,
                            'is_external_api_auto': form.is_external_api_auto,
                            'email_addresses': email_addresses,
                            'adf_email_addresses': adf_email_addresses,
                            'email_subject': form.email_subject,
                            'partial_data_email': form.partial_data_email,
                            'full_submit_email': form.full_submit_email,
                            'send_auto_email': form.send_auto_email,
                            'send_auto_email_subject': form.send_auto_email_subject,
                            'send_auto_email_msg': form.send_auto_email_msg,
                            'send_auto_sms': form.send_auto_sms,
                            'send_auto_sms_inbound_id': form.send_auto_sms_inbound_id,
                            'send_auto_sms_msg': form.send_auto_sms_msg,
                            'auto_prequalify_credit': auto_prequalify_credit,
                            'is_deactivated': form.is_deactivated,
                            'deactivated_on': form.deactivated_on_datetime
                        }
                        form_list.append(add_form)

                return jsonify(
                    forms=form_list
                )
            else:
                return api.abort(400, message='Partnership account not found.')
        else:
            return api.abort(401, message='Unauthorized request.')


@ns.route('/<int:paid>/form')
@api.doc(responses={200: 'OK',
                    400: 'Error performing operation.',
                    401: 'Unauthorized request.'},
         params={'paid': 'The partner account Id'})
class ApiFormAdd(Resource):
    @api.response(204, 'Form successfully created.')
    @api.expect(serializers.form_add, validate=True)
    @requires_auth
    def post(self, paid):
        """
        Add a form for a partnership account.
        <P>
        This Form API POST endpoint can be used to create forms for an account associated with a partnership.
        </P>
         <br />
        <p>
        You will require a partner authentication token, a partner account Id as well as a form Id to make a
        successful request.
         A response will
        be returned, similar to the example below, based
        on a successful request:
        <br />
        <br />
        </p>
        <pre class="code-background" style="color: white">
        {
          "form_id": 10,
          "partnership_account_id": 1
        }
        </pre>

        """
        if rest_is_partnership and rest_partnership is not None:
            error_message = ''

            partnership_account = PartnershipAccount \
                .query \
                .filter(and_(PartnershipAccount.id == paid,
                             PartnershipAccount.partnership_id == rest_partnership.id)) \
                .first()

            if partnership_account is not None:
                auto_email_subject = ''
                auto_email_body = ''

                received = request.get_json()
                result_display_name = received['display_name']
                result_is_external_api_auto = None
                result_email_addresses = None
                result_adf_email_addresses = None
                result_email_subject = None
                result_partial_data_email = None
                result_full_submit_email = None
                result_send_auto_email = None
                result_send_auto_email_subject = None
                result_send_auto_email_msg = None
                result_send_auto_sms = None
                result_send_auto_sms_inbound_id = None
                result_send_auto_sms_msg = None
                result_widget_id = None
                result_auto_prequalify_credit = None

                if received is not None:

                    if result_display_name:
                        result_display_name = strip_tags(result_display_name)

                    if 'widget_id' in received:
                        result_widget_id = received['widget_id']
                        widget = Widget\
                            .query\
                            .filter(and_(Widget.id == result_widget_id, Widget.partnership_account_id == paid))\
                            .first()

                        if widget is None:
                            return api.abort(code=400,
                                             message="Error creating form. Field widget_id "
                                                     + str(result_widget_id) +
                                                     ' not linked to partnership account.')

                    if 'is_external_api_auto' in received:
                        result_is_external_api_auto = received['is_external_api_auto']

                    if 'email_addresses' in received:
                        result_email_addresses = received['email_addresses']

                    if 'adf_email_addresses' in received:
                        result_adf_email_addresses = received['adf_email_addresses']

                    if 'email_subject' in received:
                        result_email_subject = received['email_subject']

                        if result_email_subject:
                            result_email_subject = strip_tags(result_email_subject)

                    if 'partial_data_email' in received:
                        result_partial_data_email = received['partial_data_email']

                    if 'full_submit_email' in received:
                        result_full_submit_email = received['full_submit_email']

                    if 'send_auto_email' in received:
                        result_send_auto_email = received['send_auto_email']

                    if 'auto_prequalify_credit' in received:
                        result_auto_prequalify_credit = received['auto_prequalify_credit']

                    if 'send_auto_email_subject' in received:
                        result_send_auto_email_subject = received['send_auto_email_subject']

                        if result_send_auto_email_subject:
                            result_send_auto_email_subject = strip_tags(result_send_auto_email_subject)

                        if not result_send_auto_email_subject:
                            result_send_auto_email_subject = '#COMPANY# -' + ' ' + 'Thank you for your submission'

                    if 'send_auto_email_msg' in received:
                        result_send_auto_email_msg = received['send_auto_email_msg']

                        if result_send_auto_email_msg:
                            result_send_auto_email_msg = strip_tags(result_send_auto_email_msg)

                        if not result_send_auto_email_msg:
                            body_string = '\n\nThank you for your submission\n---\n{0}\n---\n' \
                                .format('We are in the process of reviewing your submission for the #FORM#. '
                                        'Once we will be in contact as soon as possible')
                            result_send_auto_email_msg = _('Hi #NAME#,%(body)s Thanks,\n#COMPANY# support team'
                                                '\n\n Please note this is an automated email notification. Do not reply to this email.',
                                                body=body_string)

                    if 'send_auto_sms' in received:
                        result_send_auto_sms = received['send_auto_sms']

                    if 'send_auto_sms_inbound_id' in received:
                        result_send_auto_sms_inbound_id = received['send_auto_sms_inbound_id']
                        phonenumber = Phone\
                            .query\
                            .filter(and_(Phone.id == result_send_auto_sms_inbound_id, Phone.partnership_account_id == paid))\
                            .first()

                        if phonenumber is None:
                            return api.abort(code=400,
                                             message="Error creating form. Field send_auto_sms_inbound_id "
                                                     + str(result_send_auto_sms_inbound_id) +
                                                     ' not linked to partnership account.')

                    if 'send_auto_sms_msg' in received:
                        result_send_auto_sms_msg = received['send_auto_sms_msg']

                        if result_send_auto_sms_msg:
                            result_send_auto_sms_msg = strip_tags(result_send_auto_sms_msg)

                        if not result_send_auto_sms_msg:
                            result_send_auto_sms_msg = _('Hi #NAME#, thanks for your form submission. We will review it and get back '
                                              'to you asap. #COMPANY#')

                    if len(error_message) > 0:
                        return api.abort(code=400, message="Error creating form. " + str(error_message))
                    else:
                        form_id, error_message = ExternalForm.api_create(paid,
                                                                          result_display_name,
                                                                          result_widget_id,
                                                                          result_is_external_api_auto,
                                                                          result_email_addresses,
                                                                          result_adf_email_addresses,
                                                                          result_email_subject,
                                                                          result_partial_data_email,
                                                                          result_full_submit_email,
                                                                          result_send_auto_email,
                                                                          result_send_auto_email_subject,
                                                                          result_send_auto_email_msg,
                                                                          result_send_auto_sms,
                                                                          result_send_auto_sms_inbound_id,
                                                                          result_send_auto_sms_msg,
                                                                          result_auto_prequalify_credit)
                        if form_id > 0:
                            return jsonify(
                                partnership_account_id=paid,
                                form_id=form_id
                            )
                        else:
                            return api.abort(code=400, message="Error creating form. " + str(error_message))
                else:
                    return api.abort(code=400, message="Error creating form.")
            else:
                return api.abort(404, message='Partnership account not found.')
        else:
            return api.abort(401)

"""
# DISABLE ENDPOINT
@ns.route('/<int:paid>/form/<int:fid>')
@api.doc(responses={200: 'OK',
                    400: 'Error performing operation.',
                    401: 'Unauthorized request.'},
         params={'paid': 'The partner account Id',
                'fid': 'The form Id'})
"""
class ApiFormSet(Resource):
    @requires_auth
    @api.response(204, 'Form successfully deleted.')
    def delete(self, paid, fid):
        """
        Delete form details.

        <p>
        The Form API DELETE endpoint should be used to delete a specific form for a partner account.
        </p>
        <br />
        <p>
        You will require a partner authentication token, a partner account id as well as a form Id to make a
        successful request.
        </p>

        """
        final_result = False

        if rest_is_partnership and rest_partnership is not None:
            partnership_account = PartnershipAccount \
                .query \
                .filter(and_(PartnershipAccount.id == paid,
                             PartnershipAccount.partnership_id == rest_partnership.id)) \
                .first()

            if partnership_account is not None:
                final_result = ExternalForm.api_deactivate(fid, partnership_account.id)

            if final_result:
                return final_result, 204
            else:
                api.abort(code=400, message="Error deleting form.")
        else:
            return api.abort(401)


    @api.response(204, 'Form successfully updated.')
    @api.expect(serializers.form_edit, validate=True)
    @requires_auth
    def put(self, paid, fid):
        """
        Update a form for a partnership account.
        <P>
        This Form API PUT endpoint can be used to update forms for an account associated with a partnership.
        </P>
         <br />
        <p>
        You will require a partner authentication token, a partner account id as well as a form Id to make a
        successful request.
        </p>

        """
        if rest_is_partnership and rest_partnership is not None:
            error_message = ''

            partnership_account = PartnershipAccount \
                .query \
                .filter(and_(PartnershipAccount.id == paid,
                             PartnershipAccount.partnership_id == rest_partnership.id)) \
                .first()

            if partnership_account is not None:
                received = request.get_json()
                result_display_name = None
                result_is_external_api_auto = None
                result_email_addresses = None
                result_adf_email_addresses = None
                result_email_subject = None
                result_partial_data_email = None
                result_full_submit_email = None
                result_send_auto_email = None
                result_send_auto_email_subject = None
                result_send_auto_email_msg = None
                result_send_auto_sms = None
                result_send_auto_sms_inbound_id = None
                result_send_auto_sms_msg = None
                result_widget_id = None
                result_auto_prequalify_credit = None

                if received is not None:
                    if 'display_name' in received:
                        result_display_name = received['display_name']

                        if result_display_name:
                            result_display_name = strip_tags(result_display_name)

                    if 'widget_id' in received:
                        result_widget_id = received['widget_id']
                        widget = Widget\
                            .query\
                            .filter(and_(Widget.id == result_widget_id, Widget.partnership_account_id == paid))\
                            .first()

                        if widget is None:
                            return api.abort(code=400,
                                             message="Error updating form. Field widget_id "
                                                     + str(result_widget_id) +
                                                     ' not linked to partnership account.')

                    if 'is_external_api_auto' in received:
                        result_is_external_api_auto = received['is_external_api_auto']

                    if 'email_addresses' in received:
                        result_email_addresses = received['email_addresses']

                    if 'adf_email_addresses' in received:
                        result_adf_email_addresses = received['adf_email_addresses']

                    if 'email_subject' in received:
                        result_email_subject = received['email_subject']

                        if result_email_subject:
                            result_email_subject = strip_tags(result_email_subject)

                    if 'partial_data_email' in received:
                        result_partial_data_email = received['partial_data_email']

                    if 'auto_prequalify_credit' in received:
                        result_auto_prequalify_credit = received['auto_prequalify_credit']

                    if 'full_submit_email' in received:
                        result_full_submit_email = received['full_submit_email']

                    if 'send_auto_email' in received:
                        result_send_auto_email = received['send_auto_email']

                    if 'send_auto_email_subject' in received:
                        result_send_auto_email_subject = received['send_auto_email_subject']

                        if result_send_auto_email_subject:
                            result_send_auto_email_subject = strip_tags(result_send_auto_email_subject)

                        if not result_send_auto_email_subject and result_send_auto_email:
                            result_send_auto_email_subject = '#COMPANY# -' + ' ' + 'Thank you for your submission'

                    if 'send_auto_email_msg' in received:
                        result_send_auto_email_msg = received['send_auto_email_msg']

                        if result_send_auto_email_msg:
                            result_send_auto_email_msg = strip_tags(result_send_auto_email_msg)

                        if not result_send_auto_email_msg and result_send_auto_email:
                            body_string = '\n\nThank you for your submission\n---\n{0}\n---\n' \
                                .format('We are in the process of reviewing your submission for the #FORM#. '
                                        'Once we will be in contact as soon as possible')
                            auto_email_body = _('Hi #NAME#,%(body)s Thanks,\n#COMPANY# support team'
                                                '\n\n Please note this is an automated email notification. Do not reply to this email.',
                                                body=body_string)
                            result_send_auto_email_msg = auto_email_body

                    if 'send_auto_sms' in received:
                        result_send_auto_sms = received['send_auto_sms']

                    if 'send_auto_sms_inbound_id' in received:
                        result_send_auto_sms_inbound_id = received['send_auto_sms_inbound_id']
                        phonenumber = Phone\
                            .query\
                            .filter(and_(Phone.id == result_send_auto_sms_inbound_id, Phone.partnership_account_id == paid))\
                            .first()

                        if phonenumber is None:
                            return api.abort(code=400,
                                             message="Error updating form. Field send_auto_sms_inbound_id "
                                                     + str(result_send_auto_sms_inbound_id) +
                                                     ' not linked to partnership account.')

                    if 'send_auto_sms_msg' in received:
                        result_send_auto_sms_msg = received['send_auto_sms_msg']

                        if result_send_auto_sms_msg:
                            result_send_auto_sms_msg = strip_tags(result_send_auto_sms_msg)

                        if not result_send_auto_sms_msg and result_send_auto_sms:
                            result_send_auto_sms_msg = _(
                                'Hi #NAME#, thanks for your form submission. We will review it and get back to you '
                                'asap. #COMPANY#')

                    form_updated, error_message = ExternalForm.api_update(paid,
                                                                          fid,
                                                                          result_display_name,
                                                                          result_widget_id,
                                                                          result_is_external_api_auto,
                                                                          result_email_addresses,
                                                                          result_adf_email_addresses,
                                                                          result_email_subject,
                                                                          result_partial_data_email,
                                                                          result_full_submit_email,
                                                                          result_send_auto_email,
                                                                          result_send_auto_email_subject,
                                                                          result_send_auto_email_msg,
                                                                          result_send_auto_sms,
                                                                          result_send_auto_sms_inbound_id,
                                                                          result_send_auto_sms_msg,
                                                                          result_auto_prequalify_credit)
                    if form_updated:
                        return form_updated, 204
                    else:
                        return api.abort(code=400, message="Error updating form. " + str(error_message))
                else:
                    return api.abort(code=400, message="Error updating form.")
            else:
                return api.abort(404, message='Partnership account not found.')
        else:
            return api.abort(401)