Skip to content

Commit 4743143

Browse files
Adds event owner role to the system
1 parent a6396cd commit 4743143

File tree

17 files changed

+148
-64
lines changed

17 files changed

+148
-64
lines changed

app/api/admin_sales/organizer.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ class AdminSalesByOrganizersList(ResourceList):
5353

5454
def query(self, _):
5555
query_ = self.session.query(User)
56-
query_ = query_.join(UsersEventsRoles).filter(Role.name == 'organizer')
56+
query_ = query_.join(UsersEventsRoles).filter(or_(Role.name == 'organizer', Role.name == 'owner'))
5757
query_ = query_.join(Event).outerjoin(Order).outerjoin(OrderTicket)
5858

5959
return query_

app/api/events.py

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@
4646
from app.models.ticket_holder import TicketHolder
4747
from app.models.track import Track
4848
from app.models.user_favourite_event import UserFavouriteEvent
49-
from app.models.user import User, ATTENDEE, ORGANIZER, COORGANIZER
49+
from app.models.user import User, ATTENDEE, OWNER, ORGANIZER, COORGANIZER
5050
from app.models.users_events_role import UsersEventsRoles
5151
from app.models.stripe_authorization import StripeAuthorization
5252

@@ -108,7 +108,7 @@ def query(self, view_kwargs):
108108
_jwt_required(current_app.config['JWT_DEFAULT_REALM'])
109109
query2 = self.session.query(Event)
110110
query2 = query2.join(Event.roles).filter_by(user_id=current_identity.id).join(UsersEventsRoles.role). \
111-
filter(or_(Role.name == COORGANIZER, Role.name == ORGANIZER))
111+
filter(or_(Role.name == COORGANIZER, Role.name == ORGANIZER, Role.name == OWNER))
112112
query_ = query_.union(query2)
113113

114114
if view_kwargs.get('user_id') and 'GET' in request.method:
@@ -154,19 +154,26 @@ def before_post(self, args, kwargs, data=None):
154154

155155
def after_create_object(self, event, data, view_kwargs):
156156
"""
157-
after create method to save roles for users and add the user as an accepted role(organizer)
157+
after create method to save roles for users and add the user as an accepted role(owner and organizer)
158158
:param event:
159159
:param data:
160160
:param view_kwargs:
161161
:return:
162162
"""
163-
role = Role.query.filter_by(name=ORGANIZER).first()
164163
user = User.query.filter_by(id=view_kwargs['user_id']).first()
164+
role = Role.query.filter_by(name=OWNER).first()
165165
uer = UsersEventsRoles(user, event, role)
166166
save_to_db(uer, 'Event Saved')
167167
role_invite = RoleInvite(user.email, role.title_name, event.id, role.id, datetime.now(pytz.utc),
168168
status='accepted')
169-
save_to_db(role_invite, 'Organiser Role Invite Added')
169+
save_to_db(role_invite, 'Owner Role Invite Added')
170+
171+
# role = Role.query.filter_by(name=ORGANIZER).first()
172+
# uer = UsersEventsRoles(user, event, role)
173+
# save_to_db(uer, 'Event Saved')
174+
# role_invite = RoleInvite(user.email, role.title_name, event.id, role.id, datetime.now(pytz.utc),
175+
# status='accepted')
176+
# save_to_db(role_invite, 'Organizer Role Invite Added')
170177

171178
# create custom forms for compulsory fields of attendee form.
172179
create_custom_forms_for_attendees(event)

app/api/helpers/import_helpers.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@
2929
from app.models.speaker import Speaker
3030
from app.models.sponsor import Sponsor
3131
from app.models.track import Track
32-
from app.models.user import User, ORGANIZER
32+
from app.models.user import User, OWNER
3333

3434
IMPORT_SERIES = [
3535
('social_links', SocialLink),
@@ -356,7 +356,7 @@ def import_event_json(task_handle, zip_path, creator_id):
356356
data = _delete_fields(srv, data)
357357
new_event = Event(**data)
358358
save_to_db(new_event)
359-
role = Role.query.filter_by(name=ORGANIZER).first()
359+
role = Role.query.filter_by(name=OWNER).first()
360360
user = User.query.filter_by(id=creator_id).first()
361361
uer = UsersEventsRoles(user_id=user.id, event_id=new_event.id, role_id=role.id)
362362
save_to_db(uer, 'Event Saved')

app/api/helpers/notification.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -293,6 +293,16 @@ def send_notif_ticket_cancel(order):
293293
invoice_id=order.invoice_number
294294
)
295295
)
296+
send_notification(
297+
user=order.event.owner,
298+
title=NOTIFS[TICKET_CANCELLED_ORGANIZER]['title'].format(
299+
invoice_id=order.invoice_number
300+
),
301+
message=NOTIFS[TICKET_CANCELLED_ORGANIZER]['message'].format(
302+
cancel_note=order.cancel_note,
303+
invoice_id=order.invoice_number
304+
)
305+
)
296306

297307

298308
def send_notification_with_action(user, action, **kwargs):

app/api/helpers/permission_manager.py

Lines changed: 39 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -40,26 +40,40 @@ def is_admin(view, view_args, view_kwargs, *args, **kwargs):
4040

4141

4242
@jwt_required
43-
def is_organizer(view, view_args, view_kwargs, *args, **kwargs):
43+
def is_owner(view, view_args, view_kwargs, *args, **kwargs):
4444
user = current_identity
4545

4646
if user.is_staff:
4747
return view(*view_args, **view_kwargs)
4848

49-
if not user.is_organizer(kwargs['event_id']):
50-
return ForbiddenError({'source': ''}, 'Organizer access is required').respond()
49+
if not user.is_owner(kwargs['event_id']):
50+
return ForbiddenError({'source': ''}, 'Owner access is required').respond()
5151

5252
return view(*view_args, **view_kwargs)
5353

5454

55+
@jwt_required
56+
def is_organizer(view, view_args, view_kwargs, *args, **kwargs):
57+
user = current_identity
58+
59+
if user.is_staff:
60+
return view(*view_args, **view_kwargs)
61+
62+
if user.is_owner(kwargs['event_id']) or user.is_organizer(kwargs['event_id']):
63+
return view(*view_args, **view_kwargs)
64+
65+
return ForbiddenError({'source': ''}, 'Organizer access is required').respond()
66+
67+
5568
@jwt_required
5669
def is_coorganizer(view, view_args, view_kwargs, *args, **kwargs):
5770
user = current_identity
5871

5972
if user.is_staff:
6073
return view(*view_args, **view_kwargs)
6174

62-
if user.is_organizer(kwargs['event_id']) or user.is_coorganizer(kwargs['event_id']):
75+
if user.is_owner(kwargs['event_id']) or user.is_organizer(kwargs['event_id']) or \
76+
user.is_coorganizer(kwargs['event_id']):
6377
return view(*view_args, **view_kwargs)
6478

6579
return ForbiddenError({'source': ''}, 'Co-organizer access is required.').respond()
@@ -69,7 +83,8 @@ def is_coorganizer(view, view_args, view_kwargs, *args, **kwargs):
6983
def is_coorganizer_but_not_admin(view, view_args, view_kwargs, *args, **kwargs):
7084
user = current_identity
7185

72-
if user.is_organizer(kwargs['event_id']) or user.is_coorganizer(kwargs['event_id']):
86+
if user.is_owner(kwargs['event_id']) or user.is_organizer(kwargs['event_id']) or \
87+
user.is_coorganizer(kwargs['event_id']):
7388
return view(*view_args, **view_kwargs)
7489

7590
return ForbiddenError({'source': ''}, 'Co-organizer access is required.').respond()
@@ -94,7 +109,8 @@ def is_coorganizer_endpoint_related_to_event(view, view_args, view_kwargs, *args
94109
_jwt_required(app.config['JWT_DEFAULT_REALM'])
95110
return view(*view_args, **view_kwargs)
96111

97-
if user.is_organizer(kwargs['event_id']) or user.is_coorganizer(kwargs['event_id']):
112+
if user.is_owner(kwargs['event_id']) or user.is_organizer(kwargs['event_id']) or \
113+
user.is_coorganizer(kwargs['event_id']):
98114
_jwt_required(app.config['JWT_DEFAULT_REALM'])
99115
return view(*view_args, **view_kwargs)
100116

@@ -127,7 +143,8 @@ def is_coorganizer_or_user_itself(view, view_args, view_kwargs, *args, **kwargs)
127143
if user.is_staff:
128144
return view(*view_args, **view_kwargs)
129145

130-
if user.is_organizer(kwargs['event_id']) or user.is_coorganizer(kwargs['event_id']):
146+
if user.is_owner(kwargs['event_id']) or user.is_organizer(kwargs['event_id']) or \
147+
user.is_coorganizer(kwargs['event_id']):
131148
return view(*view_args, **view_kwargs)
132149

133150
return ForbiddenError({'source': ''}, 'Co-organizer access is required.').respond()
@@ -151,7 +168,8 @@ def is_speaker_for_session(view, view_args, view_kwargs, *args, **kwargs):
151168
except NoResultFound:
152169
return NotFoundError({'parameter': 'id'}, 'Session not found.').respond()
153170

154-
if user.is_organizer(session.event_id) or user.is_coorganizer(session.event_id):
171+
if user.is_owner(kwargs['event_id']) or user.is_organizer(session.event_id) or \
172+
user.is_coorganizer(session.event_id):
155173
return view(*view_args, **view_kwargs)
156174

157175
if session.speakers:
@@ -176,7 +194,8 @@ def is_speaker_itself_or_admin(view, view_args, view_kwargs, *args, **kwargs):
176194
if user.is_admin or user.is_super_admin:
177195
return view(*view_args, **view_kwargs)
178196

179-
if user.is_organizer(kwargs['event_id']) or user.is_coorganizer(kwargs['event_id']):
197+
if user.is_owner(kwargs['event_id']) or user.is_organizer(kwargs['event_id']) or \
198+
user.is_coorganizer(kwargs['event_id']):
180199
return view(*view_args, **view_kwargs)
181200

182201
if ('model' in kwargs) and (kwargs['model'] == Speaker):
@@ -205,7 +224,8 @@ def is_session_self_submitted(view, view_args, view_kwargs, *args, **kwargs):
205224
except NoResultFound:
206225
return NotFoundError({'parameter': 'session_id'}, 'Session not found.').respond()
207226

208-
if user.is_organizer(session.event_id) or user.is_coorganizer(session.event_id):
227+
if user.is_owner(kwargs['event_id']) or user.is_organizer(session.event_id) or \
228+
user.is_coorganizer(session.event_id):
209229
return view(*view_args, **view_kwargs)
210230

211231
if session.creator_id == user.id:
@@ -224,7 +244,8 @@ def is_registrar(view, view_args, view_kwargs, *args, **kwargs):
224244

225245
if user.is_staff:
226246
return view(*view_args, **view_kwargs)
227-
if user.is_registrar(event_id) or user.is_organizer(event_id) or user.is_coorganizer(event_id):
247+
if user.is_registrar(event_id) or user.is_owner(kwargs['event_id']) or user.is_organizer(event_id) or \
248+
user.is_coorganizer(event_id):
228249
return view(*view_args, **view_kwargs)
229250
return ForbiddenError({'source': ''}, 'Registrar Access is Required.').respond()
230251

@@ -243,7 +264,8 @@ def is_registrar_or_user_itself(view, view_args, view_kwargs, *args, **kwargs):
243264
return view(*view_args, **view_kwargs)
244265

245266
event_id = kwargs['event_id']
246-
if user.is_registrar(event_id) or user.is_organizer(event_id) or user.is_coorganizer(event_id):
267+
if user.is_registrar(event_id) or user.is_owner(kwargs['event_id']) or user.is_organizer(event_id) or \
268+
user.is_coorganizer(event_id):
247269
return view(*view_args, **view_kwargs)
248270

249271
return ForbiddenError({'source': ''}, 'Registrar access is required.').respond()
@@ -259,7 +281,8 @@ def is_track_organizer(view, view_args, view_kwargs, *args, **kwargs):
259281

260282
if user.is_staff:
261283
return view(*view_args, **view_kwargs)
262-
if user.is_track_organizer(event_id) or user.is_organizer(event_id) or user.is_coorganizer(event_id):
284+
if user.is_track_organizer(event_id) or user.is_owner(kwargs['event_id']) or user.is_organizer(event_id) or \
285+
user.is_coorganizer(event_id):
263286
return view(*view_args, **view_kwargs)
264287
return ForbiddenError({'source': ''}, 'Track Organizer access is Required.').respond()
265288

@@ -273,7 +296,8 @@ def is_moderator(view, view_args, view_kwargs, *args, **kwargs):
273296
event_id = kwargs['event_id']
274297
if user.is_staff:
275298
return view(*view_args, **view_kwargs)
276-
if user.is_moderator(event_id) or user.is_organizer(event_id) or user.is_coorganizer(event_id):
299+
if user.is_moderator(event_id) or user.is_owner(kwargs['event_id']) or user.is_organizer(event_id) or \
300+
user.is_coorganizer(event_id):
277301
return view_kwargs(*view_args, **view_kwargs)
278302
return ForbiddenError({'source': ''}, 'Moderator Access is Required.').respond()
279303

@@ -315,6 +339,7 @@ def create_event(view, view_args, view_kwargs, *args, **kwargs):
315339
permissions = {
316340
'is_super_admin': is_super_admin,
317341
'is_admin': is_admin,
342+
'is_owner': is_owner,
318343
'is_organizer': is_organizer,
319344
'is_coorganizer': is_coorganizer,
320345
'is_track_organizer': is_track_organizer,

app/api/helpers/scheduled_jobs.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ def send_after_event_mail():
3333
upcoming_event_links += "</ul>"
3434
for event in events:
3535
organizers = get_user_event_roles_by_role_name(event.id, 'organizer')
36+
owners = get_user_event_roles_by_role_name(event.id, 'owner')
3637
speakers = get_user_event_roles_by_role_name(event.id, 'speaker')
3738
current_time = datetime.datetime.now(pytz.timezone(event.timezone))
3839
time_difference = current_time - event.ends_at
@@ -45,6 +46,9 @@ def send_after_event_mail():
4546
for organizer in organizers:
4647
send_email_after_event(organizer.user.email, event.name, upcoming_event_links)
4748
send_notif_after_event(organizer.user.email, event.name)
49+
for owner in owners:
50+
send_email_after_event(owner.user.email, event.name, upcoming_event_links)
51+
send_notif_after_event(owner.user.email, event.name)
4852

4953

5054
def change_session_state_on_event_completion():

app/api/helpers/system_mails.py

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111

1212
MAILS = {
1313
EVENT_PUBLISH: {
14-
'recipient': 'Organizer, Speaker',
14+
'recipient': 'Owner, Organizer, Speaker',
1515
'subject': u'{event_name} is Live',
1616
'message': (
1717
u"Hi {email}<br/>" +
@@ -38,7 +38,7 @@
3838
)
3939
},
4040
SESSION_SCHEDULE: {
41-
'recipient': 'Organizer, Speaker',
41+
'recipient': 'Owner, Organizer, Speaker',
4242
'subject': u'Schedule for Session {session_name} has been changed',
4343
'message': (
4444
u"Hi {email},<br/>" +
@@ -47,7 +47,7 @@
4747
)
4848
},
4949
NEXT_EVENT: {
50-
'recipient': 'Organizer, Speaker',
50+
'recipient': 'Owner, Organizer, Speaker',
5151
'subject': u'Event {event_name} is coming soon',
5252
'message': (
5353
u"Hi {email},<br/>" +
@@ -56,7 +56,7 @@
5656
)
5757
},
5858
AFTER_EVENT: {
59-
'recipient': 'Organizer, Speaker',
59+
'recipient': 'Owner, Organizer, Speaker',
6060
'subject': u'Event {event_name} is over',
6161
'message': (
6262
u"Hi {email},<br/>" +
@@ -67,7 +67,7 @@
6767
'sent_at': '1 day after the event'
6868
},
6969
NEW_SESSION: {
70-
'recipient': 'Organizer',
70+
'recipient': 'Owner, Organizer',
7171
'subject': u'New session proposal for {event_name}',
7272
'message': (
7373
u"Hi {email},<br/>" +
@@ -162,7 +162,7 @@
162162
},
163163

164164
TICKET_PURCHASED_ORGANIZER: {
165-
'recipient': 'Organizer, Coorganizer',
165+
'recipient': 'Owner, Organizer, Coorganizer',
166166
'subject': u'New ticket purchase for {event_name} by {buyer_email} ({invoice_id}) ',
167167
'message': (
168168
u"Hi, {buyer_email} just bought tickets for the event {event_name}"
@@ -209,7 +209,7 @@
209209
)
210210
},
211211
MONTHLY_PAYMENT_EMAIL: {
212-
'recipient': 'Organizer',
212+
'recipient': 'Owner, Organizer',
213213
'subject': u'{date} - Monthly service fee invoice for {event_name}',
214214
'message': (
215215
u"The total service fee for the ticket sales of {event_name} in the month of {date} is {amount}." +
@@ -220,7 +220,7 @@
220220
'sent_at': '1st day of the month'
221221
},
222222
MONTHLY_PAYMENT_FOLLOWUP_EMAIL: {
223-
'recipient': 'Organizer',
223+
'recipient': 'Owner, Organizer',
224224
'subject': u'Past Due: {date} - Monthly service fee invoice for {event_name}',
225225
'message': (
226226
u"The total service fee for the ticket sales of {event_name} in the month of {date} is {amount}." +

app/api/helpers/system_notifications.py

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -299,7 +299,7 @@ def get_invite_papers_notification_actions(cfs_link, submit_link):
299299
)
300300
},
301301
MONTHLY_PAYMENT_NOTIF: {
302-
'recipient': 'Organizer',
302+
'recipient': 'Owner, Organizer',
303303
'subject': u'{date} - Monthly service fee invoice for {event_name}',
304304
'message': (
305305
u"The total service fee for the ticket sales of {event_name} in the month of {date} is {amount}." +
@@ -309,7 +309,7 @@ def get_invite_papers_notification_actions(cfs_link, submit_link):
309309
'sent_at': '1st day of the month'
310310
},
311311
MONTHLY_PAYMENT_FOLLOWUP_NOTIF: {
312-
'recipient': 'Organizer',
312+
'recipient': 'Owner, Organizer',
313313
'subject': u'Past Due: {date} - Monthly service fee invoice for {event_name}',
314314
'message': (
315315
u"The total service fee for the ticket sales of {event_name} in the month of {date} is {amount}." +
@@ -333,14 +333,14 @@ def get_invite_papers_notification_actions(cfs_link, submit_link):
333333
)
334334
},
335335
TICKET_PURCHASED_ORGANIZER: {
336-
'recipient': 'Organizer',
336+
'recipient': 'Owner, Organizer',
337337
'title': u'New ticket purchase for {event_name} : ({invoice_id}) ',
338338
'message': (
339339
u"The order has been processed successfully."
340340
)
341341
},
342342
TICKET_RESEND_ORGANIZER: {
343-
'recipient': 'Organizer',
343+
'recipient': 'Owner, Organizer',
344344
'title': u'Email resent for {event_name} by {buyer_email} ({invoice_id}) ',
345345
'message': (
346346
u"Email has been sent successfully."
@@ -397,18 +397,18 @@ def get_invite_papers_notification_actions(cfs_link, submit_link):
397397
'title': u'New session proposal for {event_name}',
398398
'message': u"The event <strong>{event_name}</strong> has received" +
399399
u" a new session proposal.",
400-
'recipient': 'Organizer',
400+
'recipient': 'Owner, Organizer',
401401
},
402402
SESSION_SCHEDULE: {
403403
'title': u'Schedule for Session {session_name} has been changed',
404404
'message': u"The schedule for session <strong>{session_name}</strong>" +
405405
u" has been changed.",
406-
'recipient': 'Organizer, Speaker',
406+
'recipient': 'Owner, Organizer, Speaker',
407407
},
408408
NEXT_EVENT: {
409409
'title': u'Event {event_name} is coming soon',
410410
'message': u"Here are upcoming events: {up_coming_events}.",
411-
'recipient': 'Organizer, Speaker',
411+
'recipient': 'Owner, Organizer, Speaker',
412412
},
413413
SESSION_ACCEPT_REJECT: {
414414
'title': u'Session {session_name} has been {acceptance}',

0 commit comments

Comments
 (0)