File: //proc/thread-self/root/home/arjun/projects/buyercall/buyercall/blueprints/partnership/endpoints.py
import json
import logging as log
import math
import uuid
from flask import Blueprint, jsonify, request, current_app
from flask_login import current_user
from flask_login.utils import login_required
from buyercall.blueprints.contacts.models import Contact
from buyercall.blueprints.email.models import EmailIdentity
from buyercall.blueprints.form_leads.models import FormLead
from buyercall.blueprints.issue.models import Issue
from buyercall.blueprints.leads.models import Lead
from buyercall.blueprints.notification.utilities import send_notifications
from buyercall.blueprints.partnership.models import Partnership, PartnershipAccount, PartnershipAccountOperatingHours
from buyercall.blueprints.partnership.serializers import PartnershipAccountOutSchema, \
PartnershipAccountOperatingHoursOutSchema
from buyercall.blueprints.phonenumbers.models import Phone
from buyercall.blueprints.sms.models import Message
from buyercall.blueprints.user.decorators import role_required, api_role_required
from buyercall.blueprints.user.models import User
from buyercall.extensions import ses_client
from buyercall.lib.util_crypto import AESCipherDome
from buyercall.lib.util_datetime import tza_to_date
from buyercall.lib.util_query import get_by_partnership_account_expr
from buyercall.lib.util_rest import api_jsonify
partnership_api = Blueprint('partnershipapi', __name__, url_prefix='/api/partnership')
logger = log.getLogger(__name__)
@role_required('partner', 'sysadmin')
def update_partnership(sid):
try:
if request.method == 'POST':
status_code = 200
success = True
message = "Partnership details updated successfully!"
data = []
partnership = None
avatar_large = request.files.get('file', None)
avatar_small = request.files.get('filesmall', None)
partnership_data = request.form.get('data', None)
if partnership_data:
try:
partnership_data = json.loads(partnership_data)
except:
partnership_data = {}
partnership = Partnership.query.filter(Partnership.sid == sid).first()
if partnership_data and partnership:
if partnership_data.get('partnershipName', None):
partnership.name = partnership_data.get('partnershipName')
partnership.save()
from buyercall.lib.util_boto3_s3 import generate_presigned_file_url, upload_file_object
if avatar_large and partnership:
result = None
avatar_ext = avatar_large.filename.split('.')[-1]
key = f'large_logos/partnership_logo_{partnership.sid}_lg.{avatar_ext}'
resp = upload_file_object(avatar_large, current_app.config['PARTNERSHIP_BUCKET'], key)
if resp:
partnership.logo = f"{current_app.config['PARTNERSHIP_BUCKET']}::{key}"
partnership.save()
else:
logger.error("Error in uploading the large logo.!")
status_code = 200
success = False
message = "Partnership large image uploading failed!"
data = []
if avatar_small and partnership:
result = None
avatar_ext = avatar_small.filename.split('.')[-1]
key = f'small_logos/partnership_logo_{partnership.sid}_sm.{avatar_ext}'
resp = upload_file_object(avatar_small, current_app.config['PARTNERSHIP_BUCKET'], key)
if resp:
partnership.logo_small = f"{current_app.config['PARTNERSHIP_BUCKET']}::{key}"
partnership.save()
else:
logger.error("Error in uploading the small logo.!")
status_code = 200
success = False
message = "Partnership small image uploading failed!"
data = []
partner_email = partnership_data.get('partneruseremail', None)
if partner_email:
params = {
'role': 'partner',
'email': partner_email,
'password': 'password',
'company': partnership.name,
'tos_agreement': False,
'partnership_id': partnership.id
}
try:
u = User.query.filter(User.email == partner_email).first()
if not u:
partner = User(**params)
partner.save()
# send email invitation
reset_token = partner.serialize_token()
from buyercall.blueprints.user.tasks import send_partners_invitation_email
# TODO: can't call celery's delay() method. says not serializable
send_partners_invitation_email.delay(partner.id, reset_token, partnership.name)
else:
message += " Invited user already exists!"
except Exception as e:
print(e)
else:
status_code = 200
success = True
message = "You sent a get request here!"
data = []
except Exception as e:
print(e)
status_code = 500
success = False
message = f"Partnership details fetching failed!"
data = []
response = jsonify({
"statusCode": status_code,
"success": success,
"message": message,
"data": data
})
return response
@role_required('partner')
def white_label_config():
try:
status_code = 200
success = True
message = "Partnership details updated successfully!"
data = []
partnership = None
partnership_data = request.get_json()
pid = current_user.partnership_id
partnership = Partnership.query.filter(Partnership.id == pid).first()
if not partnership:
partnership = Partnership.query.get(1)
if 'data' in partnership_data:
partnership_data = partnership_data['data']
if partnership_data and partnership:
if partnership_data.get('partnerUrl', None):
partnership.partner_url = partnership_data.get('partnerUrl')
if partnership_data.get('systemEmail', None):
partnership.email_sender = partnership_data.get('systemEmail')
if partnership_data.get('sidebarColor', None):
partnership.primary_color = partnership_data.get('sidebarColor')
if 'isExpandedMenu' in partnership_data:
if isinstance(partnership_data.get('isExpandedMenu'), bool):
partnership.is_expanded_menu = partnership_data.get('isExpandedMenu')
partnership.save()
except Exception as e:
status_code = 500
success = False
message = f"Partnership details updation failed!: {str(e)}"
data = []
response = jsonify({
"statusCode": status_code,
"success": success,
"message": message,
"data": data
})
return response
@api_role_required('partner', 'sysadmin', 'admin')
def partnership_settings():
"""
Updates/Retrieves user partnership.
"""
try:
if request.method == 'POST':
try:
status_code = 200
success = True
message = "Partnership details updated successfully!"
data = []
logo_large = request.files.get('file', None)
logo_large_alt = request.files.get('fileAlt', None)
logo_small = request.files.get('fileSmall', None)
logo_small_alt = request.files.get('fileSmallAlt', None)
partnership_data = request.form.get('data', None)
if partnership_data:
try:
partnership_data = json.loads(partnership_data)
except:
partnership_data = {}
partnership = Partnership.query.get(current_user.partnership_id)
if partnership_data and partnership:
if partnership_data.get('partnershipName', None):
partnership.name = partnership_data.get('partnershipName')
if partnership_data.get('isLargeImageDeleted', None):
partnership.logo = ''
if partnership_data.get('isAltLargeImageDeleted', None):
partnership.alternative_logo = ''
if partnership_data.get('isSmallImageDeleted', None):
partnership.logo_small = ''
if partnership_data.get('isAltSmallImageDeleted', None):
partnership.alternative_logo_small = ''
from buyercall.lib.util_boto3_s3 import generate_presigned_file_url, upload_file_object
if logo_large and partnership:
avatar_ext = logo_large.filename.split('.')[-1]
key = f'large_logos/partnership_logo_{partnership.sid}_lg.{avatar_ext}'
resp = upload_file_object(logo_large, current_app.config['PARTNERSHIP_BUCKET'], key)
if resp:
# result = generate_presigned_file_url(key=key, bucket=current_app.config['PARTNERSHIP_BUCKET'])
result = f"{current_app.config['PARTNERSHIP_BUCKET']}::{key}"
partnership.logo = result
else:
status_code = 200
success = False
message = "Partnership large image uploading failed!"
data = []
if logo_large_alt and partnership:
avatar_ext = logo_large_alt.filename.split('.')[-1]
key = f'large_logos/partnership_logo_{partnership.sid}_lg_alt.{avatar_ext}'
resp = upload_file_object(logo_large_alt, current_app.config['PARTNERSHIP_BUCKET'], key)
if resp:
# result = generate_presigned_file_url(key=key, bucket=current_app.config['PARTNERSHIP_BUCKET'])
result = f"{current_app.config['PARTNERSHIP_BUCKET']}::{key}"
partnership.alternative_logo = result
else:
status_code = 200
success = False
message = "Partnership alternative large image uploading failed!"
data = []
if logo_small and partnership:
avatar_ext = logo_small.filename.split('.')[-1]
key = f'small_logos/partnership_logo_{partnership.sid}_sm.{avatar_ext}'
resp = upload_file_object(logo_small, current_app.config['PARTNERSHIP_BUCKET'], key)
if resp:
# result = generate_presigned_file_url(key=key, bucket=current_app.config['PARTNERSHIP_BUCKET'])
result = f"{current_app.config['PARTNERSHIP_BUCKET']}::{key}"
partnership.logo_small = result
else:
status_code = 200
success = False
message = "Partnership small image uploading failed!"
data = []
if logo_small_alt and partnership:
avatar_ext = logo_small_alt.filename.split('.')[-1]
key = f'small_logos/partnership_logo_{partnership.sid}_sm_alt.{avatar_ext}'
resp = upload_file_object(logo_small_alt, current_app.config['PARTNERSHIP_BUCKET'], key)
if resp:
# result = generate_presigned_file_url(key=key, bucket=current_app.config['PARTNERSHIP_BUCKET'])
result = f"{current_app.config['PARTNERSHIP_BUCKET']}::{key}"
partnership.alternative_logo_small = result
else:
status_code = 200
success = False
message = "Partnership small image uploading failed!"
data = []
partnership.save()
es_data = {
'user_id': current_user.sid,
'notify_message_type': 'PARTNERSHIP_SETTINGS_EDITED',
'user_related_entities': "You've",
'other_user_related_entities': f'{current_user.firstname} {current_user.lastname}',
'hyperlink': f'{partnership.partner_url}/partnership/settings'
}
es_response = send_notifications(**es_data)
except Exception as e:
print('Errrrr ', e)
status_code = 500
success = False
message = f"Partnership Fetching Failed!"
data = []
else:
status_code = 200
if current_user.partnership_id:
user_partnership_id = current_user.partnership_id
else:
user_partnership_id = 1
partnership = Partnership.query.get(user_partnership_id)
message = 'Partnership fetched successfully!'
success = True
p_acs = partnership.partnership_accounts
p_users = partnership.users
is_restricted = True
for pa in p_acs:
if pa.active:
is_restricted = False
for pu in p_users:
if pu.active and pu.role in ['partner', 'agent', 'admin', 'member']:
is_restricted = False
partner_image_lg = partnership.logo
partner_image_lg_alt = partnership.alternative_logo
partner_image_sm = partnership.logo_small
partner_image_sm_alt = partnership.alternative_logo_small
from buyercall.lib.util_boto3_s3 import generate_presigned_file_url
if partnership.logo:
if '::' in partnership.logo:
bucket_name, key = partnership.logo.split("::")
partner_image_lg = generate_presigned_file_url(key, bucket_name)
if partnership.alternative_logo:
if '::' in partnership.alternative_logo:
bucket_name, key = partnership.alternative_logo.split("::")
partner_image_lg_alt = generate_presigned_file_url(key, bucket_name)
if partnership.logo_small:
if '::' in partnership.logo_small:
bucket_name, key = partnership.logo_small.split("::")
partner_image_sm = generate_presigned_file_url(key, bucket_name)
if partnership.alternative_logo_small:
if '::' in partnership.alternative_logo_small:
bucket_name, key = partnership.alternative_logo_small.split("::")
partner_image_sm_alt = generate_presigned_file_url(key, bucket_name)
enc_key = current_app.config['CRYPTO_SECRET_KEY']
cipher = AESCipherDome(enc_key)
dkim_records = []
if partnership.dkim_records:
for dkimr in partnership.dkim_records:
dkimr_decrypted = cipher.decrypt(dkimr)
dkim_records.append(
{
"type": "CNAME",
"name": f"{dkimr_decrypted}._domainkey.{partnership.partner_url}",
"value": f"{dkimr_decrypted}.dkim.amazonses.com"
}
)
ses_identities = [partnership.email_sender, partnership.partner_url]
identity_status = ses_client.check_identity_verify_status(ses_identities)
ses_identity_status = []
if 'VerificationAttributes' in identity_status['data']:
for idt, val in identity_status['data']['VerificationAttributes'].items():
_idt = {'identityName': idt, 'identityStatus': val['VerificationStatus'],
'identityType': 'email' if '@' in idt else 'domain'}
ses_identity_status.append(_idt)
data = {
'name': partnership.name,
'sid': partnership.sid,
'isActive': partnership.active,
'createdOn': tza_to_date(partnership.created_on),
'updateOn': tza_to_date(partnership.updated_on),
'partnerUrl': partnership.partner_url,
'email': partnership.email_sender,
'sidebarColor': partnership.primary_color,
'partnerImage': partner_image_lg,
'partnerImageAlt': partner_image_lg_alt,
'partnerImageSmall': partner_image_sm,
'partnerImageSmallAlt': partner_image_sm_alt,
'isExpandedMenu': partnership.is_expanded_menu,
'signUpLink': f"{partnership.partner_url}/signup?partnership={partnership.account_invitation_url_token}",
'dkimRecords': dkim_records,
'sesIdentityStatus': ses_identity_status,
}
users = []
for u in partnership.users:
if u.email and u.firstname and u.support_notification:
_user = {
'id': u.id,
'sid': u.sid,
'firstName': u.firstname,
'lastName': u.lastname,
'email': u.email,
'isActive': u.active,
}
users.append(_user)
data['notificationUsers'] = users
accounts = partnership.partnership_accounts
# Placeholder initializatins
campaigns = 0
landing_page_visits = 0
third_party_subs = 0
widget_i10s_count_this_month = 0
widget_i10s_count_last_month = 0
widget_i10s_count_total = 0
# Initilize to add count for multiple accounts
leads_count_this_month = 0
leads_count_last_month = 0
leads_count_total = 0
phone_nums_count_this_month = 0
phone_nums_count_last_month = 0
phone_nums_count_total = 0
web_form_subs_count_this_month = 0
web_form_subs_count_last_month = 0
web_form_subs_count_total = 0
call_seconds_this_month = 0
call_seconds_last_month = 0
call_seconds_total = 0
text_msgs_this_month = 0
text_msgs_last_month = 0
text_msgs_total = 0
users_count_this_month = User.get_by_partnership_datetime_expr(
partnership.id, count_only=True, date_range_expr='this_month')
users_count_last_month = User.get_by_partnership_datetime_expr(
partnership.id, count_only=True, date_range_expr='last_month')
users_count_total = User.get_by_partnership_datetime_expr(partnership.id, count_only=True)
issues_count_this_month = Issue.get_by_partnership_datetime_expr(
partnership.id, count_only=True, date_range_expr='this_month')
issues_count_last_month = Issue.get_by_partnership_datetime_expr(
partnership.id, count_only=True, date_range_expr='last_month')
issues_count_total = Issue.get_by_partnership_datetime_expr(partnership.id, count_only=True)
for ac in accounts:
leads_count_this_month += get_by_partnership_account_expr(
Contact, ac.id, count_only=True, date_range_expr='this_month')
leads_count_last_month += get_by_partnership_account_expr(
Contact, ac.id, count_only=True, date_range_expr='last_month')
leads_count_total += get_by_partnership_account_expr(Contact, ac.id, count_only=True)
phone_nums_count_this_month += get_by_partnership_account_expr(
Phone, ac.id, count_only=True, date_range_expr='this_month')
phone_nums_count_last_month += get_by_partnership_account_expr(
Phone, ac.id, count_only=True, date_range_expr='last_month')
phone_nums_count_total += get_by_partnership_account_expr(Phone, ac.id, count_only=True)
web_form_subs_count_this_month += get_by_partnership_account_expr(
FormLead, ac.id, count_only=True, date_range_expr='this_month')
web_form_subs_count_last_month += get_by_partnership_account_expr(
FormLead, ac.id, count_only=True, date_range_expr='last_month')
web_form_subs_count_total += get_by_partnership_account_expr(FormLead, ac.id, count_only=True)
text_msgs_this_month += get_by_partnership_account_expr(
Message, ac.id, count_only=True, date_range_expr='this_month')
text_msgs_last_month += get_by_partnership_account_expr(
Message, ac.id, count_only=True, date_range_expr='last_month')
text_msgs_total += get_by_partnership_account_expr(Message, ac.id, count_only=True)
leads_this_month = get_by_partnership_account_expr(Lead, ac.id, date_range_expr='this_month')
for lead1 in leads_this_month:
if lead1.duration:
call_seconds_this_month += lead1.duration
leads_last_month = get_by_partnership_account_expr(Lead, ac.id, date_range_expr='last_month')
for lead2 in leads_last_month:
if lead2.duration:
call_seconds_last_month += lead2.duration
leads_total = get_by_partnership_account_expr(Lead, ac.id)
for leadt in leads_total:
if leadt.duration:
call_seconds_total += leadt.duration
call_minutes_this_month = int(math.ceil(call_seconds_this_month / 60))
call_minutes_last_month = int(math.ceil(call_seconds_last_month / 60))
call_minutes_total = int(math.ceil(call_seconds_total / 60))
data['usage'] = [
{
'label': "Leads",
'currentMonthTotal': leads_count_this_month,
'lastMonthTotal': leads_count_last_month,
'total': leads_count_total,
},
{
'label': "Accounts",
'currentMonthTotal': 0,
'lastMonthTotal': 0,
'total': len(accounts),
},
{
'label': "Users",
'currentMonthTotal': users_count_this_month,
'lastMonthTotal': users_count_last_month,
'total': users_count_total,
},
{
'label': "Campaigns",
'currentMonthTotal': 0,
'lastMonthTotal': 0,
'total': campaigns,
},
{
'label': "SupportTickets",
'currentMonthTotal': issues_count_this_month,
'lastMonthTotal': issues_count_last_month,
'total': issues_count_total,
},
{
'label': "PhoneNumbers",
'currentMonthTotal': phone_nums_count_this_month,
'lastMonthTotal': phone_nums_count_last_month,
'total': phone_nums_count_total,
},
{
'label': "WidgetInteractions",
'currentMonthTotal': widget_i10s_count_this_month,
'lastMonthTotal': widget_i10s_count_last_month,
'total': widget_i10s_count_total,
},
{
'label': "WebFormSubmissions",
'currentMonthTotal': web_form_subs_count_this_month,
'lastMonthTotal': web_form_subs_count_last_month,
'total': web_form_subs_count_total,
},
{
'label': "LandingPageVisitors",
'currentMonthTotal': 0,
'lastMonthTotal': 0,
'total': landing_page_visits,
},
{
'label': "CallMinutes",
'currentMonthTotal': call_minutes_this_month,
'lastMonthTotal': call_minutes_last_month,
'total': call_minutes_total,
},
{
'label': "TextMessages",
'currentMonthTotal': text_msgs_this_month,
'lastMonthTotal': text_msgs_last_month,
'total': text_msgs_total,
},
{
'label': "ThirdPartySubmissions",
'currentMonthTotal': 0,
'lastMonthTotal': 0,
'total': third_party_subs,
},
]
except Exception as e:
print('Error =========== : ', e)
status_code = 500
success = False
message = f"Partnership Fetching Failed!"
data = []
response = api_jsonify(status_code=status_code,
success=success,
message=message,
data=data
)
return response
@role_required('partner', 'sysadmin')
def get_partnership_users():
try:
success = True
message = "Users fetched successfully!"
status_code = 200
data = []
partnership = Partnership.query \
.filter(Partnership.id == current_user.partnership_id).first()
if not partnership:
partnership = Partnership.query.get(1)
for u in partnership.users:
if u.firstname and u.email:
_user = {'value': u.sid, 'label': f'{u.firstname} {u.lastname}'}
data.append(_user)
except Exception as e:
status_code = 500
success = False
message = f"Users fetching failed!"
data = []
response = jsonify({
"statusCode": status_code,
"success": success,
"message": message,
"data": data
})
return response
@role_required('partner', 'sysadmin')
def partnership_notify_users():
try:
if request.method == 'POST':
success = True
message = "Notification Users updated successfully!"
status_code = 200
data = []
notify_data = request.get_json()
for uid in notify_data['data']:
user = User.query.filter(User.sid == uid).first()
if user:
user.support_notification = True
user.save()
else:
success = False
message = "User not found!"
else:
success = True
message = "Notification Users fetched successfully!"
status_code = 200
data = []
partnership = Partnership.query \
.filter(Partnership.id == current_user.partnership_id).first()
for u in partnership.users:
if u.support_notification:
_user = {}
_user['firstName'] = u.firstname
_user['lastName'] = u.lastname
_user['email'] = u.email
_user['userId'] = u.id
_user['supportNotification'] = u.support_notification
data.append(_user)
print(data)
except Exception as e:
print(e)
status_code = 500
success = False
message = f"Partnership Notification users get/update Failed!"
data = []
response = jsonify({
"statusCode": status_code,
"success": success,
"message": message,
"data": data
})
return response
@api_role_required('sysadmin', 'partner')
def remove_notify_user(sid):
try:
success = True
message = "User notification disabled successfully!"
status_code = 200
data = []
u = User.query.filter(User.sid == sid).first()
if u:
u.support_notification = False
u.save()
except Exception as e:
print(e)
status_code = 500
success = False
message = f"Partnership user notification disabling failed!"
data = []
response = jsonify({
"statusCode": status_code,
"success": success,
"message": message,
"data": data
})
return response
@api_role_required('sysadmin', 'partner')
def get_accounts():
try:
success = True
message = "Partnership accounts fetched successfully!"
status_code = 200
partnership = Partnership.query.filter(Partnership.id == current_user.partnership_id).first()
if not partnership:
partnership = Partnership.query.get(1)
accounts = []
for pa in partnership.partnership_accounts:
_account = {'sid': pa.sid, 'account_name': pa.name, 'partnerId': partnership.sid,
'partnershipName': partnership.name, 'active': pa.active, 'email': pa.email,
'created_on': pa.created_on, 'updated_on': pa.updated_on, 'business_type': pa.business_type,
'billing_type': pa.billing_type}
accounts.append(_account)
data = accounts
except Exception as e:
status_code = 500
success = False
message = f"Partnership accounts fetching failed!"
data = []
response = jsonify({
"statusCode": status_code,
"success": success,
"message": message,
"data": data
})
return response
@api_role_required('partner')
def create_account():
try:
success = True
message = "Partnership account created successfully!"
status_code = 200
data = {}
account = None
partnership = Partnership.query.filter(Partnership.id == current_user.partnership_id).first()
if not partnership:
partnership = Partnership.query.get(1)
account_data = request.get_json()
pa_name = account_data.get('name', None)
description = account_data.get('description', "")
safety_information = account_data.get('safety_information', "")
address_1 = account_data.get('address_1', "")
address_2 = account_data.get('address_2', "")
city = account_data.get('city', "")
state = account_data.get('state', "")
zip_code = account_data.get('zip_code', "")
country = account_data.get('country', 'united states')
timezone = account_data.get('timezone', 'US/Eastern')
email = account_data.get('email', "")
active = account_data.get('active', False)
billing_type = account_data.get('billing_type', None)
business_type = account_data.get('business_type', None)
is_all_hours = account_data.get('all_hours', False)
general_schedule_data = account_data.get('generalScheduleData', {})
service_schedule_data = account_data.get('serviceScheduleData', {})
if pa_name and billing_type and email and business_type:
test_server_domain = current_app.config.get('TEST_SERVER_DOMAIN', None)
if test_server_domain and current_app.config.get('DEBUG', False):
domain = test_server_domain
else:
domain = partnership.partner_url
email_address = email + '@' + domain
account = PartnershipAccount.create(name=pa_name,
description=description,
safety_information=safety_information,
address_1=address_1,
address_2=address_2,
city=city,
state=state,
zip_code=zip_code,
country=country,
timezone=timezone,
partnership_id=partnership.id,
active=active,
billing_type=billing_type,
business_type=business_type,
email=email_address,
all_hours=is_all_hours,
account_invitation_url_token=str(uuid.uuid4()))
if general_schedule_data and account:
general_is_all_hours = general_schedule_data.get('allHours', False)
days = []
for gidx, ghours in enumerate(general_schedule_data.get('availableHours', {})):
days.append({
'day': gidx,
'available_from': ghours.get('start', '08:00 AM'),
'available_to': ghours.get('stop', '05:00 PM'),
'is_active': ghours.get('is_active', False),
'partnership_account_id': account.id,
'operating_type': 'general',
'is_all_hours': general_is_all_hours
})
day_result = PartnershipAccountOperatingHours.create(*days)
if service_schedule_data and account:
service_is_all_hours = service_schedule_data.get('allHours', False)
days = []
for sidx, shours in enumerate(service_schedule_data.get('availableHours', {})):
days.append({
'day': sidx,
'available_from': shours.get('start', '08:00 AM'),
'available_to': shours.get('stop', '05:00 PM'),
'is_active': shours.get('is_active', False),
'partnership_account_id': account.id,
'operating_type': 'service',
'is_all_hours': service_is_all_hours
})
day_result = PartnershipAccountOperatingHours.create(*days)
email_add_resp = ses_client.verify_email_identity(email_address)
es_data = {
'user_id': current_user.sid,
'notify_message_type': 'PARTNERSHIP_ACCOUNT_CREATED',
'user_related_entities': "You've",
'other_user_related_entities': f'{current_user.firstname} {current_user.lastname}',
'hyperlink': f'{partnership.partner_url}/dashboard'
}
es_response = send_notifications(**es_data)
if not account:
status_code = 404
success = False
message = "Missing parameters"
except Exception as e:
print(e)
status_code = 500
success = False
message = f"Partnership account creating failed!"
data = []
return api_jsonify(data, status_code, message, success)
# @api_role_required('partner')
def update_account(paid):
message = "Partnership account updated successfully!"
partnership_account = PartnershipAccount.get_by_sid(paid)
if not partnership_account:
status_code = 404
success = False
message = "Invalid partnership account ID."
return api_jsonify(status_code=status_code, success=success, message=message)
partnership = Partnership.get_by_id(partnership_account.partnership_id)
account_data = request.get_json()
general_schedule_data = account_data.get('generalScheduleData', {})
service_schedule_data = account_data.get('serviceScheduleData', {})
params = {
"name": account_data.get('name', None),
"description": account_data.get('description', ""),
"safety_information": account_data.get('safety_information', ""),
"address_1": account_data.get('address_1', ""),
"address_2": account_data.get('address_2', ""),
"city": account_data.get('city', ""),
"state": account_data.get('state', ""),
"zip_code": account_data.get('zip_code', ""),
"country": account_data.get('country', 'united states'),
"timezone": account_data.get('timezone', 'US/Eastern'),
"active": account_data.get('active', partnership_account.active),
"billing_type": account_data.get('billing_type', None),
"business_type": account_data.get('business_type', None),
"all_hours": account_data.get('all_hours', False)
}
for k, v in params.items():
if k in account_data:
setattr(partnership_account, k, v)
partnership_account.save()
if general_schedule_data:
general_is_all_hours = general_schedule_data.get('allHours', False)
existing_operating_hours = PartnershipAccountOperatingHours.get_by_account_id(partnership_account.id)
if existing_operating_hours:
for hours in general_schedule_data.get('availableHours', []):
if hours.get('schedule_id', None):
day = {
'operating_id': hours.get('schedule_id'),
'available_from': hours.get('start', '08:00 AM'),
'available_to': hours.get('stop', '05:00 PM'),
'is_active': hours.get('is_active', False),
'is_all_hours': general_is_all_hours
}
day_result = PartnershipAccountOperatingHours.update(**day)
else:
days = []
for hours in general_schedule_data.get('availableHours', []):
days.append({
'day': hours.get('day_id', 0),
'available_from': hours.get('start', '08:00 AM'),
'available_to': hours.get('stop', '05:00 PM'),
'is_active': hours.get('is_active', False),
'partnership_account_id': partnership_account.id,
'operating_type': 'general',
'is_all_hours': general_is_all_hours
})
day_result = PartnershipAccountOperatingHours.create(*days)
if service_schedule_data:
service_is_all_hours = service_schedule_data.get('allHours', False)
existing_operating_hours = PartnershipAccountOperatingHours.get_by_account_id(partnership_account.id)
if existing_operating_hours:
for hours in service_schedule_data.get('availableHours', []):
if hours.get('schedule_id', None):
day = {
'operating_id': hours.get('schedule_id'),
'available_from': hours.get('start', '08:00 AM'),
'available_to': hours.get('stop', '05:00 PM'),
'is_active': hours.get('is_active', False),
'is_all_hours': service_is_all_hours
}
day_result = PartnershipAccountOperatingHours.update(**day)
else:
days = []
for hours in service_schedule_data.get('availableHours', []):
days.append({
'day': hours.get('day_id', 0),
'available_from': hours.get('start', '08:00 AM'),
'available_to': hours.get('stop', '05:00 PM'),
'is_active': hours.get('is_active', False),
'partnership_account_id': partnership_account.id,
'operating_type': 'service',
'is_all_hours': service_is_all_hours
})
day_result = PartnershipAccountOperatingHours.create(*days)
es_data = {
'user_id': current_user.sid,
'notify_message_type': 'PARTNERSHIP_ACCOUNT_UPDATED',
'user_related_entities': "You've",
'other_user_related_entities': f'{current_user.firstname} {current_user.lastname}',
'hyperlink': f'{partnership.partner_url}/dashboard'
}
es_response = send_notifications(**es_data)
return api_jsonify(message=message)
@api_role_required('partner')
def get_account_by_sid(sid):
try:
success = True
message = "Partnership account created successfully!"
status_code = 200
data = {}
if sid:
pa_account = PartnershipAccount.get_by_sid(sid)
if pa_account:
data = PartnershipAccountOutSchema().dump(pa_account)
general_schedule = PartnershipAccountOperatingHours.get_general_by_account(pa_account.id)
service_schedule = PartnershipAccountOperatingHours.get_service_by_account(pa_account.id)
available_all_hours = all([hour.is_all_hours for hour in general_schedule])
service_available_all_hours = all([hour.is_all_hours for hour in service_schedule])
data['generalScheduleData'] = {
'allHours': available_all_hours,
'availableHours': PartnershipAccountOperatingHoursOutSchema(many=True).dump(
general_schedule) if general_schedule else []
}
data['serviceScheduleData'] = {
'allHours': service_available_all_hours,
'availableHours': PartnershipAccountOperatingHoursOutSchema(many=True).dump(
service_schedule) if service_schedule else []
}
else:
success = False
message = "Partnership account not found!"
status_code = 404
else:
success = False
message = "Partnership account id missing!"
status_code = 404
except Exception as e:
print(e)
status_code = 500
success = False
message = f"Partnership account fetching failed!"
data = []
return api_jsonify(data=data, success=success, status_code=status_code, message=message)
@login_required
def check_email_availability():
success = True
message = "Email is available!"
status_code = 200
data = {}
received = request.get_json()
partnership_id = received.get('partnership_id', None)
email = received.get('email', None)
if partnership_id and email:
email_in_pa, email_in_p = PartnershipAccount.query.filter(PartnershipAccount.partnership_id == partnership_id,
PartnershipAccount.email == email), Partnership.query.filter(
Partnership.email_sender == email)
custom_email = EmailIdentity.query.filter(EmailIdentity.email == email).first()
if email_in_pa or email_in_p or custom_email:
success = False
message = "Email already exists!"
status_code = 409
else:
success = False
message = "Invalid data!"
status_code = 400
return api_jsonify(data, status_code, message, success)