Skip to content

Commit ef4a01c

Browse files
shubham-padiaSaptakS
authored andcommitted
Implement order email updates for organisers (#2968)
* Implement order email updates for organisers * resolve merge conflicts
1 parent 9e9c61f commit ef4a01c

File tree

16 files changed

+123
-10
lines changed

16 files changed

+123
-10
lines changed

app/helpers/data.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -180,13 +180,15 @@ def toggle_email_notification_settings(user_id, value):
180180
email_notification.new_paper = value
181181
email_notification.session_schedule = value
182182
email_notification.session_accept_reject = value
183+
email_notification.after_ticket_purchase = value
183184
save_to_db(email_notification, "EmailSettings Toggled")
184185
notification_ids.append(email_notification.id)
185186
else:
186187
new_email_notification_setting = EmailNotification(next_event=value,
187188
new_paper=value,
188189
session_schedule=value,
189190
session_accept_reject=value,
191+
after_ticket_purchase=value,
190192
user_id=user_id,
191193
event_id=event.id)
192194
save_to_db(new_email_notification_setting, "EmailSetting Toggled")

app/helpers/data_getter.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -378,7 +378,8 @@ def get_user_event_role(role_id):
378378

379379
@staticmethod
380380
def get_user_event_roles_by_role_name(event_id, role_name):
381-
return UsersEventsRoles.query.filter_by(event_id=event_id).filter(Role.name == role_name)
381+
role = Role.query.filter_by(name=role_name).first()
382+
return UsersEventsRoles.query.filter_by(event_id=event_id).filter(UsersEventsRoles.role == role)
382383

383384
@staticmethod
384385
def get_user_events(user_id=None):

app/helpers/helpers.py

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
TICKET_PURCHASED as NOTIF_TICKET_PURCHASED,
2525
EVENT_EXPORT_FAIL as NOTIF_EVENT_EXPORT_FAIL,
2626
EVENT_EXPORTED as NOTIF_EVENT_EXPORTED,
27+
TICKET_PURCHASED_ORGANIZER as NOTIF_TICKET_PURCHASED_ORGANIZER
2728

2829
)
2930
from app.settings import get_settings
@@ -33,7 +34,7 @@
3334
USER_REGISTER, PASSWORD_RESET, SESSION_ACCEPT_REJECT, SESSION_SCHEDULE, EVENT_ROLE, EVENT_PUBLISH, Mail, \
3435
AFTER_EVENT, USER_CHANGE_EMAIL, USER_REGISTER_WITH_PASSWORD, TICKET_PURCHASED, EVENT_EXPORTED, \
3536
EVENT_EXPORT_FAIL, MAIL_TO_EXPIRED_ORDERS, MONTHLY_PAYMENT_FOLLOWUP_EMAIL, MONTHLY_PAYMENT_EMAIL, \
36-
EVENT_IMPORTED, EVENT_IMPORT_FAIL
37+
EVENT_IMPORTED, EVENT_IMPORT_FAIL, TICKET_PURCHASED_ORGANIZER
3738
from ..models.message_settings import MessageSettings
3839
from ..models.track import Track
3940

@@ -283,6 +284,16 @@ def send_email_for_after_purchase(email, invoice_id, order_url, event_name, even
283284
html=MAILS[TICKET_PURCHASED]['message'].format(order_url=order_url, event_name=event_name, event_organiser=event_organiser)
284285
)
285286

287+
def send_email_for_after_purchase_organizers(email, buyer_email, invoice_id, order_url, event_name, event_organiser):
288+
"""Send email with order invoice link after purchase"""
289+
send_email(
290+
to=email,
291+
action=TICKET_PURCHASED_ORGANIZER,
292+
subject=MAILS[TICKET_PURCHASED_ORGANIZER]['subject'].format(invoice_id=invoice_id, event_name=event_name, buyer_email=buyer_email),
293+
html=MAILS[TICKET_PURCHASED_ORGANIZER]['message'].format(order_url=order_url, buyer_email=buyer_email, event_name=event_name,
294+
event_organiser=event_organiser)
295+
)
296+
286297

287298
def send_email_for_expired_orders(email, event_name, invoice_id, order_url):
288299
"""Send email with order invoice link after purchase"""
@@ -457,6 +468,16 @@ def send_notif_for_after_purchase(user, invoice_id, order_url):
457468
)
458469

459470

471+
def send_notif_for_after_purchase_organizer(user, invoice_id, order_url, event_name, buyer_email):
472+
"""Send notification with order invoice link after purchase"""
473+
send_notification(
474+
user=user,
475+
action=NOTIF_TICKET_PURCHASED_ORGANIZER,
476+
title=NOTIFS[NOTIF_TICKET_PURCHASED_ORGANIZER]['title'].format(invoice_id=invoice_id, event_name=event_name, buyer_email=buyer_email),
477+
message=NOTIFS[NOTIF_TICKET_PURCHASED_ORGANIZER]['message'].format(order_url=order_url)
478+
)
479+
480+
460481
def send_notif_when_changes_email(user, old_email, new_email):
461482
send_notification(
462483
user=user,

app/helpers/notification_email_triggers.py

Lines changed: 29 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,9 @@
22

33
from app.helpers.data_getter import DataGetter
44
from app.helpers.helpers import send_new_session_organizer, send_notif_new_session_organizer, \
5-
send_notif_session_accept_reject, send_session_accept_reject, send_schedule_change, send_notif_session_schedule
6-
from ..models.mail import NEW_SESSION, SESSION_ACCEPT_REJECT, SESSION_SCHEDULE
5+
send_notif_session_accept_reject, send_session_accept_reject, send_schedule_change, send_notif_session_schedule, \
6+
send_email_for_after_purchase_organizers, send_notif_for_after_purchase_organizer
7+
from ..models.mail import NEW_SESSION, SESSION_ACCEPT_REJECT, SESSION_SCHEDULE, TICKET_PURCHASED
78

89

910
def trigger_new_session_notifications(session_id, event_id=None, event=None):
@@ -62,3 +63,29 @@ def trigger_session_schedule_change_notifications(session, event_id):
6263
# Send notification
6364
if speaker.user:
6465
send_notif_session_schedule(speaker.user, session.title, link)
66+
67+
68+
def trigger_after_purchase_notifications(buyer_email, event_id, event, invoice_id, order_url):
69+
if not event and not event_id:
70+
raise Exception('event or event_id is required')
71+
if not event:
72+
event = DataGetter.get_event(event_id)
73+
74+
admin_msg_setting = DataGetter.get_message_setting_by_action(TICKET_PURCHASED)
75+
organizers = DataGetter.get_user_event_roles_by_role_name(event.id, 'organizer')
76+
for organizer in organizers:
77+
email_notification_setting = DataGetter.get_email_notification_settings_by_event_id(organizer.user.id, event_id)
78+
if not admin_msg_setting or \
79+
(email_notification_setting and email_notification_setting.after_ticket_purchase == 1 and
80+
admin_msg_setting.user_control_status == 1) or admin_msg_setting.user_control_status == 0:
81+
send_email_for_after_purchase_organizers(organizer.user.email, buyer_email, invoice_id, order_url, event.name, event.organizer_name)
82+
send_notif_for_after_purchase_organizer(organizer.user, invoice_id, order_url, event.name, buyer_email)
83+
84+
coorganizers = DataGetter.get_user_event_roles_by_role_name(event.id, 'coorganizer')
85+
for coorganizer in coorganizers:
86+
email_notification_setting = DataGetter.get_email_notification_settings_by_event_id(coorganizer.user.id, event_id)
87+
if not admin_msg_setting or \
88+
(email_notification_setting and email_notification_setting.after_ticket_purchase == 1 and
89+
admin_msg_setting.user_control_status == 1) or admin_msg_setting.user_control_status == 0:
90+
send_email_for_after_purchase_organizers(coorganizer.user.email, buyer_email, invoice_id, order_url, event.name, event.organizer_name)
91+
send_notif_for_after_purchase_organizer(organizer.user, invoice_id, order_url, event.name, buyer_email)

app/helpers/system_mails.py

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
USER_REGISTER, PASSWORD_RESET, EVENT_ROLE, SESSION_ACCEPT_REJECT, \
77
SESSION_SCHEDULE, NEXT_EVENT, EVENT_PUBLISH, AFTER_EVENT, USER_CHANGE_EMAIL, USER_REGISTER_WITH_PASSWORD, \
88
TICKET_PURCHASED, EVENT_EXPORTED, EVENT_EXPORT_FAIL, MAIL_TO_EXPIRED_ORDERS, MONTHLY_PAYMENT_EMAIL, \
9-
MONTHLY_PAYMENT_FOLLOWUP_EMAIL, EVENT_IMPORTED, EVENT_IMPORT_FAIL
9+
MONTHLY_PAYMENT_FOLLOWUP_EMAIL, EVENT_IMPORTED, EVENT_IMPORT_FAIL, TICKET_PURCHASED_ORGANIZER
1010

1111
MAILS = {
1212
EVENT_PUBLISH: {
@@ -127,14 +127,24 @@
127127
'recipient': 'User',
128128
'subject': u'Your order invoice and tickets for {event_name} ({invoice_id}) ',
129129
'message': (
130-
u"Hi, this is a confirmation mail for your tickets for the event {event_name}"
130+
u"Hi, this is a confirmation mail of your tickets for the event {event_name}"
131131
u"<br/>The event is organised by {event_organiser}"
132132
u"<br/>Your order has been processed successfully." +
133133
u"<br/> <a href='{order_url}'>Click here</a> to view/download your invoice."
134134
u"<br><br><em>Looking forward to seeing you at the event."
135135
u"<br/>Login to manage your orders at https://eventyay.com </em>"
136136
)
137137
},
138+
TICKET_PURCHASED_ORGANIZER: {
139+
'recipient': 'Organizer, Coorganizer',
140+
'subject': u'New ticket purchase for {event_name} by {buyer_email} ({invoice_id}) ',
141+
'message': (
142+
u"Hi, {buyer_email} just bought tickets for the event {event_name}"
143+
u"<br/>The order has been processed successfully." +
144+
u"<br/> <a href='{order_url}'>Click here</a> to view/download the invoice."
145+
u"<br/>Login to manage the orders at https://eventyay.com </em>"
146+
)
147+
},
138148
EVENT_EXPORTED: {
139149
'recipient': 'User',
140150
'subject': u'Event {event_name} has been exported',

app/helpers/system_notifications.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
TICKET_PURCHASED,
1515
EVENT_EXPORT_FAIL,
1616
EVENT_EXPORTED,
17+
TICKET_PURCHASED_ORGANIZER
1718
)
1819

1920
NOTIFS = {
@@ -41,6 +42,14 @@
4142
u"<br><br><a href='{order_url}' class='btn btn-info btn-sm'>View Invoice</a>"
4243
)
4344
},
45+
TICKET_PURCHASED_ORGANIZER: {
46+
'recipient': 'Organizer',
47+
'title': u'New ticket purchase for {event_name} by {buyer_email} ({invoice_id}) ',
48+
'message': (
49+
u"The order has been processed successfully."
50+
u"<br><br><a href='{order_url}' class='btn btn-info btn-sm'>View Invoice</a>"
51+
)
52+
},
4453
USER_CHANGE_EMAIL: {
4554
'recipient': 'User',
4655
'title': u'Your email has been changed',

app/helpers/ticketing.py

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
from app.helpers.helpers import string_empty, send_email_for_after_purchase, get_count, \
1717
send_notif_for_after_purchase
1818
from app.helpers.payment import StripePaymentsManager, represents_int, PayPalPaymentsManager
19+
from app.helpers.notification_email_triggers import trigger_after_purchase_notifications
1920
from app.models import db
2021
from app.models.discount_code import DiscountCode, TICKET
2122
from app.models.access_code import AccessCode, TICKET
@@ -354,6 +355,7 @@ def initiate_order_payment(form, paid_via=None):
354355

355356
# add attendee role to user
356357
if order.status == "completed":
358+
trigger_after_purchase_notifications(email, order.event_id, order.event, invoice_id, order_url)
357359
send_email_for_after_purchase(email, invoice_id, order_url, order.event.name, order.event.organizer_name)
358360
DataManager.add_attendee_role_to_event(user, order.event_id)
359361
# save items
@@ -385,7 +387,7 @@ def charge_stripe_order_payment(form):
385387
order_url = url_for('ticketing.view_order_after_payment',
386388
order_identifier=order.identifier,
387389
_external=True)
388-
390+
trigger_after_purchase_notifications(order.user.email, order.event_id, order.event, invoice_id, order_url)
389391
send_email_for_after_purchase(order.user.email, invoice_id, order_url, order.event.name, order.event.organizer_name)
390392
send_notif_for_after_purchase(order.user, invoice_id, order_url)
391393

@@ -409,7 +411,8 @@ def charge_paypal_order_payment(order):
409411
order_url = url_for('ticketing.view_order_after_payment',
410412
order_identifier=order.identifier,
411413
_external=True)
412-
414+
trigger_after_purchase_notifications(order.user.email, order.event_id, order.event, invoice_id,
415+
order_url)
413416
send_email_for_after_purchase(order.user.email, invoice_id, order_url, order.event.name,
414417
order.event.organizer_name)
415418
send_notif_for_after_purchase(order.user, invoice_id, order_url)

app/helpers/wizard/clone.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ def create_event_copy(event_id):
3737
new_paper=1,
3838
session_schedule=1,
3939
session_accept_reject=1,
40+
after_ticket_purchase=1,
4041
user_id=login.current_user.id,
4142
event_id=event.id)
4243
save_to_db(new_email_notification_setting, "EmailSetting Saved")

app/helpers/wizard/event.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -287,6 +287,7 @@ def save_event_from_json(json, event_id=None):
287287
new_paper=1,
288288
session_schedule=1,
289289
session_accept_reject=1,
290+
after_ticket_purchase=1,
290291
user_id=login.current_user.id,
291292
event_id=event.id)
292293
save_to_db(new_email_notification_setting, "EmailSetting Saved")

app/models/email_notifications.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ class EmailNotification(db.Model):
1010
new_paper = db.Column(db.Integer)
1111
session_accept_reject = db.Column(db.Integer)
1212
session_schedule = db.Column(db.Integer)
13+
after_ticket_purchase = db.Column(db.Integer)
1314
user_id = db.Column(db.Integer, db.ForeignKey('user.id', ondelete='CASCADE'))
1415
event_id = db.Column(db.Integer, db.ForeignKey('events.id', ondelete='CASCADE'))
1516

@@ -18,6 +19,7 @@ def __init__(self,
1819
new_paper=0,
1920
session_accept_reject=0,
2021
session_schedule=0,
22+
after_ticket_purchase=1,
2123
user_id=None,
2224
event_id=None):
2325
self.next_event = next_event
@@ -26,6 +28,7 @@ def __init__(self,
2628
self.session_schedule = session_schedule
2729
self.user_id = user_id
2830
self.event_id = event_id
31+
self.after_ticket_purchase = after_ticket_purchase
2932

3033
def __str__(self):
3134
return 'User:' + unicode(self.user_id).encode('utf-8') + ' Event: ' + unicode(self.event_id).encode('utf-8')

0 commit comments

Comments
 (0)