Skip to content

Commit d78bc1b

Browse files
chore: Release v1.5.0 (#6278)
chore: Release v1.5.0
2 parents 5163c4c + 1ef10f5 commit d78bc1b

File tree

17 files changed

+277
-72
lines changed

17 files changed

+277
-72
lines changed

.github/release-drafter.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
name-template: v$NEXT_PATCH_VERSION 🌈
2-
tag-template: v$NEXT_PATCH_VERSION
1+
name-template: Release v$NEXT_MINOR_VERSION 🌈
2+
tag-template: v$NEXT_MINOR_VERSION
33
categories:
44
- title: 🚀 Features
55
label: feature

app/api/__init__.py

Lines changed: 18 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,7 @@
8787
from app.api.users import UserList, UserDetail, UserRelationship
8888

8989
# users
90-
api.route(UserList, 'user_list', '/users')
90+
api.route(UserList, 'user_list', '/users', '/events/<int:event_id>/organizers')
9191
api.route(UserDetail, 'user_detail', '/users/<int:id>', '/notifications/<int:notification_id>/user',
9292
'/event-invoices/<int:event_invoice_id>/user', '/speakers/<int:speaker_id>/user',
9393
'/access-codes/<int:access_code_id>/marketer', '/email-notifications/<int:email_notification_id>/user',
@@ -102,12 +102,12 @@
102102
api.route(UserRelationship, 'user_access_codes', '/users/<int:id>/relationships/access-codes')
103103
api.route(UserRelationship, 'user_discount_codes', '/users/<int:id>/relationships/discount-codes')
104104
api.route(UserRelationship, 'user_email_notifications', '/users/<int:id>/relationships/email-notifications')
105-
api.route(UserRelationship, 'user_owner_event', '/users/<int:id>/relationships/owner-events')
106-
api.route(UserRelationship, 'user_organizer_event', '/users/<int:id>/relationships/organizer-events')
107-
api.route(UserRelationship, 'user_coorganizer_event', '/users/<int:id>/relationships/coorganizer-events')
108-
api.route(UserRelationship, 'user_track_organizer_event', '/users/<int:id>/relationships/track-organizer-events')
109-
api.route(UserRelationship, 'user_registrar_event', '/users/<int:id>/relationships/registrar-events')
110-
api.route(UserRelationship, 'user_moderator_event', '/users/<int:id>/relationships/moderator-events')
105+
api.route(UserRelationship, 'user_owner_events', '/users/<int:id>/relationships/owner-events')
106+
api.route(UserRelationship, 'user_organizer_events', '/users/<int:id>/relationships/organizer-events')
107+
api.route(UserRelationship, 'user_coorganizer_events', '/users/<int:id>/relationships/coorganizer-events')
108+
api.route(UserRelationship, 'user_track_organizer_events', '/users/<int:id>/relationships/track-organizer-events')
109+
api.route(UserRelationship, 'user_registrar_events', '/users/<int:id>/relationships/registrar-events')
110+
api.route(UserRelationship, 'user_moderator_events', '/users/<int:id>/relationships/moderator-events')
111111
api.route(UserRelationship, 'user_attendees', '/users/<int:id>/relationships/attendees')
112112
api.route(UserRelationship, 'user_events', '/users/<int:id>/relationships/events')
113113
api.route(UserRelationship, 'user_orders', '/users/<int:id>/relationships/orders')
@@ -200,7 +200,6 @@
200200
api.route(PanelPermissionRelationship, 'panel_permissions_custom_system_roles',
201201
'/panel-permissions/<int:id>/relationships/custom-system-roles')
202202

203-
204203
# roles
205204
api.route(RoleList, 'role_list', '/roles')
206205
api.route(RoleDetail, 'role_detail', '/roles/<int:id>', '/role-invites/<int:role_invite_id>/role')
@@ -246,7 +245,16 @@
246245
api.route(EventList, 'event_list', '/events', '/event-types/<int:event_type_id>/events',
247246
'/event-topics/<int:event_topic_id>/events',
248247
'/event-sub-topics/<int:event_sub_topic_id>/events', '/discount-codes/<int:discount_code_id>/events',
249-
'/users/<int:user_id>/events')
248+
'/users/<int:user_id>/events',
249+
'/users/<int:user_owner_id>/owner-events',
250+
'/users/<int:user_organizer_id>/organizer-events',
251+
'/users/<int:user_coorganizer_id>/coorganizer-events',
252+
'/users/<int:user_track_organizer_id>/track-organizer-events',
253+
'/users/<int:user_registrar_id>/registrar-events',
254+
'/users/<int:user_moderator_id>/moderator-events',
255+
'/users/<int:user_marketer_id>/marketer-events',
256+
'/users/<int:user_sales_admin_id>/sales-admin-events')
257+
250258
api.route(EventDetail, 'event_detail', '/events/<int:id>', '/events/<identifier>',
251259
'/tickets/<int:ticket_id>/event', '/microlocations/<int:microlocation_id>/event',
252260
'/social-links/<int:social_link_id>/event',
@@ -544,7 +552,7 @@
544552
'/tickets/<int:ticket_id>/access-codes')
545553
api.route(AccessCodeDetail, 'access_code_detail', '/access-codes/<int:id>',
546554
'/events/<int:access_event_id>/access-codes/<code>',
547-
'/events/<int:access_event_identifier>/access-codes/<code>',)
555+
'/events/<access_event_identifier>/access-codes/<code>',)
548556
api.route(AccessCodeRelationshipRequired, 'access_code_event',
549557
'/access-codes/<int:id>/relationships/event')
550558
api.route(AccessCodeRelationshipOptional, 'access_code_user',

app/api/access_codes.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -115,7 +115,7 @@ def before_get(self, args, kwargs):
115115

116116
if kwargs.get('access_event_identifier'):
117117
event = safe_query(
118-
db, Event, 'identifier', kwargs['discount_event_identifier'],
118+
db, Event, 'identifier', kwargs['access_event_identifier'],
119119
'event_identifier')
120120
kwargs['access_event_id'] = event.id
121121
if kwargs.get('code') and kwargs.get('access_event_id'):

app/api/custom_forms.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,10 @@ def before_get_object(self, view_kwargs):
8888
fetch_as="event_id", model=CustomForms, methods="PATCH,DELETE"), )
8989
schema = CustomFormSchema
9090
data_layer = {'session': db.session,
91-
'model': CustomForms}
91+
'model': CustomForms,
92+
'methods': {
93+
'before_get_object': before_get_object
94+
}}
9295

9396

9497
class CustomFormRelationshipRequired(ResourceRelationship):

app/api/custom_system_roles.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,10 @@ def before_get_object(self, view_kwargs):
5454
decorators = (api.has_permission('is_admin', methods="PATCH,DELETE"),)
5555
schema = CustomSystemRoleSchema
5656
data_layer = {'session': db.session,
57-
'model': CustomSysRole}
57+
'model': CustomSysRole,
58+
'methods': {
59+
'before_get_object': before_get_object
60+
}}
5861

5962

6063
class CustomSystemRoleRelationship(ResourceRelationship):

app/api/events.py

Lines changed: 74 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -46,10 +46,12 @@
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, OWNER, ORGANIZER, COORGANIZER
49+
from app.models.user import User, ATTENDEE, OWNER, ORGANIZER, COORGANIZER, TRACK_ORGANIZER, REGISTRAR, MODERATOR, \
50+
SALES_ADMIN, MARKETER
5051
from app.models.users_events_role import UsersEventsRoles
5152
from app.models.stripe_authorization import StripeAuthorization
5253

54+
5355
def validate_event(user, modules, data):
5456
if not user.can_create_event():
5557
raise ForbiddenException({'source': ''},
@@ -105,8 +107,13 @@ def validate_date(event, data):
105107
"ends-at should be after starts-at")
106108

107109
if datetime.timestamp(data['starts_at']) <= datetime.timestamp(datetime.now()):
108-
raise UnprocessableEntity({'pointer': '/data/attributes/starts-at'},
109-
"starts-at should be after current date-time")
110+
if event and event.deleted_at and not data.get('deleted_at'):
111+
data['state'] = 'draft'
112+
elif event and not event.deleted_at and data.get('deleted_at'):
113+
pass
114+
else:
115+
raise UnprocessableEntity({'pointer': '/data/attributes/starts-at'},
116+
"starts-at should be after current date-time")
110117

111118
class EventList(ResourceList):
112119
def before_get(self, args, kwargs):
@@ -142,6 +149,62 @@ def query(self, view_kwargs):
142149
query_ = query_.join(Event.roles).filter_by(user_id=user.id).join(UsersEventsRoles.role). \
143150
filter(Role.name != ATTENDEE)
144151

152+
if view_kwargs.get('user_owner_id') and 'GET' in request.method:
153+
if not has_access('is_user_itself', user_id=int(view_kwargs['user_owner_id'])):
154+
raise ForbiddenException({'source': ''}, 'Access Forbidden')
155+
user = safe_query(db, User, 'id', view_kwargs['user_owner_id'], 'user_owner_id')
156+
query_ = query_.join(Event.roles).filter_by(user_id=user.id).join(UsersEventsRoles.role). \
157+
filter(Role.name == OWNER)
158+
159+
if view_kwargs.get('user_organizer_id') and 'GET' in request.method:
160+
if not has_access('is_user_itself', user_id=int(view_kwargs['user_organizer_id'])):
161+
raise ForbiddenException({'source': ''}, 'Access Forbidden')
162+
user = safe_query(db, User, 'id', view_kwargs['user_organizer_id'], 'user_organizer_id')
163+
query_ = query_.join(Event.roles).filter_by(user_id=user.id).join(UsersEventsRoles.role). \
164+
filter(Role.name == ORGANIZER)
165+
166+
if view_kwargs.get('user_coorganizer_id') and 'GET' in request.method:
167+
if not has_access('is_user_itself', user_id=int(view_kwargs['user_coorganizer_id'])):
168+
raise ForbiddenException({'source': ''}, 'Access Forbidden')
169+
user = safe_query(db, User, 'id', view_kwargs['user_coorganizer_id'], 'user_coorganizer_id')
170+
query_ = query_.join(Event.roles).filter_by(user_id=user.id).join(UsersEventsRoles.role). \
171+
filter(Role.name == COORGANIZER)
172+
173+
if view_kwargs.get('user_track_organizer_id') and 'GET' in request.method:
174+
if not has_access('is_user_itself', user_id=int(view_kwargs['user_track_organizer_id'])):
175+
raise ForbiddenException({'source': ''}, 'Access Forbidden')
176+
user = safe_query(db, User, 'id', view_kwargs['user_track_organizer_id'], 'user_organizer_id')
177+
query_ = query_.join(Event.roles).filter_by(user_id=user.id).join(UsersEventsRoles.role). \
178+
filter(Role.name == TRACK_ORGANIZER)
179+
180+
if view_kwargs.get('user_registrar_id') and 'GET' in request.method:
181+
if not has_access('is_user_itself', user_id=int(view_kwargs['user_registrar_id'])):
182+
raise ForbiddenException({'source': ''}, 'Access Forbidden')
183+
user = safe_query(db, User, 'id', view_kwargs['user_registrar_id'], 'user_registrar_id')
184+
query_ = query_.join(Event.roles).filter_by(user_id=user.id).join(UsersEventsRoles.role). \
185+
filter(Role.name == REGISTRAR)
186+
187+
if view_kwargs.get('user_moderator_id') and 'GET' in request.method:
188+
if not has_access('is_user_itself', user_id=int(view_kwargs['user_moderator_id'])):
189+
raise ForbiddenException({'source': ''}, 'Access Forbidden')
190+
user = safe_query(db, User, 'id', view_kwargs['user_moderator_id'], 'user_moderator_id')
191+
query_ = query_.join(Event.roles).filter_by(user_id=user.id).join(UsersEventsRoles.role). \
192+
filter(Role.name == MODERATOR)
193+
194+
if view_kwargs.get('user_marketer_id') and 'GET' in request.method:
195+
if not has_access('is_user_itself', user_id=int(view_kwargs['user_marketer_id'])):
196+
raise ForbiddenException({'source': ''}, 'Access Forbidden')
197+
user = safe_query(db, User, 'id', view_kwargs['user_marketer_id'], 'user_marketer_id')
198+
query_ = query_.join(Event.roles).filter_by(user_id=user.id).join(UsersEventsRoles.role). \
199+
filter(Role.name == MARKETER)
200+
201+
if view_kwargs.get('user_sales_admin_id') and 'GET' in request.method:
202+
if not has_access('is_user_itself', user_id=int(view_kwargs['user_sales_admin_id'])):
203+
raise ForbiddenException({'source': ''}, 'Access Forbidden')
204+
user = safe_query(db, User, 'id', view_kwargs['user_sales_admin_id'], 'user_sales_admin_id')
205+
query_ = query_.join(Event.roles).filter_by(user_id=user.id).join(UsersEventsRoles.role). \
206+
filter(Role.name == SALES_ADMIN)
207+
145208
if view_kwargs.get('event_type_id') and 'GET' in request.method:
146209
query_ = self.session.query(Event).filter(
147210
getattr(Event, 'event_type_id') == view_kwargs['event_type_id'])
@@ -175,7 +238,8 @@ def before_post(self, args, kwargs, data=None):
175238
user = User.query.filter_by(id=kwargs['user_id']).first()
176239
modules = Module.query.first()
177240
validate_event(user, modules, data)
178-
validate_date(None, data)
241+
if data['state'] != 'draft':
242+
validate_date(None, data)
179243

180244
def after_create_object(self, event, data, view_kwargs):
181245
"""
@@ -492,7 +556,11 @@ def before_update_object(self, event, data, view_kwargs):
492556
:param view_kwargs:
493557
:return:
494558
"""
495-
if data.get('starts_at') != event.starts_at or data.get('ends_at') != event.ends_at:
559+
is_date_updated = (data.get('starts_at') != event.starts_at or data.get('ends_at') != event.ends_at)
560+
is_draft_published = (event.state == "draft" and data.get('state') == "published")
561+
is_event_restored = (event.deleted_at and not data.get('deleted_at'))
562+
563+
if is_date_updated or is_draft_published or is_event_restored:
496564
validate_date(event, data)
497565

498566
if has_access('is_admin') and data.get('deleted_at') != event.deleted_at:
@@ -522,6 +590,7 @@ def after_update_object(self, event, data, view_kwargs):
522590
'model': Event,
523591
'methods': {
524592
'before_update_object': before_update_object,
593+
'before_get_object': before_get_object,
525594
'after_update_object': after_update_object,
526595
'before_patch': before_patch
527596
}}

app/api/feedbacks.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -146,7 +146,10 @@ def before_update_object(self, feedback, data, view_kwargs):
146146
schema = FeedbackSchema
147147
data_layer = {'session': db.session,
148148
'model': Feedback,
149-
'methods': {'before_update_object': before_update_object}}
149+
'methods': {
150+
'before_update_object': before_update_object,
151+
'before_get_object': before_get_object
152+
}}
150153

151154

152155
class FeedbackRelationship(ResourceRelationship):

app/api/helpers/notification.py

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -304,11 +304,15 @@ def send_notif_ticket_cancel(order):
304304
send_notification(
305305
user=order.event.owner,
306306
title=NOTIFS[TICKET_CANCELLED_ORGANIZER]['title'].format(
307-
invoice_id=order.invoice_number
307+
invoice_id=order.invoice_number,
308+
event_name=order.event.name
308309
),
309310
message=NOTIFS[TICKET_CANCELLED_ORGANIZER]['message'].format(
310311
cancel_note=order.cancel_note,
311-
invoice_id=order.invoice_number
312+
invoice_id=order.invoice_number,
313+
event_name=order.event.name,
314+
cancel_order_page=make_frontend_url('/events/{identifier}/tickets/orders/cancelled'
315+
.format(identifier=order.event.identifier))
312316
)
313317
)
314318

0 commit comments

Comments
 (0)