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)