Skip to content

Commit 0128dbc

Browse files
authored
Refactor: Create misc routes for token based role invites (fossasia#5578)
1 parent 0ab36fd commit 0128dbc

File tree

2 files changed

+60
-24
lines changed

2 files changed

+60
-24
lines changed

app/__init__.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -126,6 +126,7 @@ def create_app():
126126
from app.api.uploads import upload_routes
127127
from app.api.users import user_misc_routes
128128
from app.api.orders import order_misc_routes
129+
from app.api.role_invites import role_invites_misc_routes
129130

130131
app.register_blueprint(api_v1)
131132
app.register_blueprint(event_copy)
@@ -138,6 +139,7 @@ def create_app():
138139
app.register_blueprint(user_misc_routes)
139140
app.register_blueprint(attendee_misc_routes)
140141
app.register_blueprint(order_misc_routes)
142+
app.register_blueprint(role_invites_misc_routes)
141143

142144
sa.orm.configure_mappers()
143145

app/api/role_invites.py

Lines changed: 58 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,12 @@
1717
from app.models.user import User
1818
from app.models.users_events_role import UsersEventsRoles
1919
from app.settings import get_settings
20+
from flask import jsonify, request, Blueprint
21+
from app.api.helpers.errors import NotFoundError
22+
from sqlalchemy.orm.exc import NoResultFound
23+
24+
25+
role_invites_misc_routes = Blueprint('role_invites_misc', __name__, url_prefix='/v1')
2026

2127

2228
class RoleInviteListPost(ResourceList):
@@ -45,19 +51,10 @@ def after_create_object(self, role_invite, data, view_kwargs):
4551
:return:
4652
"""
4753
user = User.query.filter_by(email=role_invite.email).first()
48-
if 'status' in data and data['status'] == 'accepted':
49-
role = Role.query.filter_by(name=role_invite.role_name).first()
50-
event = Event.query.filter_by(id=role_invite.event_id).first()
51-
uer = UsersEventsRoles.query.filter_by(user=user).filter_by(
52-
event=event).filter_by(role=role).first()
53-
if not uer:
54-
uer = UsersEventsRoles(user, event, role)
55-
save_to_db(uer, 'Role Invite accepted')
56-
5754
event = Event.query.filter_by(id=role_invite.event_id).first()
5855
frontend_url = get_settings()['frontend_url']
59-
link = "{}/events/{}/role-invites/{}" \
60-
.format(frontend_url, event.id, role_invite.hash)
56+
link = "{}/e/{}/role-invites?token={}" \
57+
.format(frontend_url, event.identifier, role_invite.hash)
6158

6259
send_email_role_invite(role_invite.email, role_invite.role_name, event.name, link)
6360
if user:
@@ -90,7 +87,7 @@ def query(self, view_kwargs):
9087

9188
view_kwargs = True
9289
methods = ['GET']
93-
decorators = (api.has_permission('is_organizer', fetch='event_id', fetch_as="event_id"),)
90+
decorators = (api.has_permission('is_coorganizer', fetch='event_id', fetch_as="event_id"),)
9491
schema = RoleInviteSchema
9592
data_layer = {'session': db.session,
9693
'model': RoleInvite,
@@ -122,23 +119,12 @@ def before_update_object(self, role_invite, data, view_kwargs):
122119
'status' not in data):
123120
raise UnprocessableEntity({'source': ''}, "You can only change your status")
124121

125-
def after_update_object(self, role_invite, data, view_kwargs):
126-
user = User.query.filter_by(email=role_invite.email).first()
127-
if 'status' in data and data['status'] == 'accepted':
128-
role = Role.query.filter_by(name=role_invite.role_name).first()
129-
event = Event.query.filter_by(id=role_invite.event_id).first()
130-
uer = UsersEventsRoles.query.filter_by(user=user).filter_by(
131-
event=event).filter_by(role=role).first()
132-
if not uer:
133-
uer = UsersEventsRoles(user, event, role)
134-
save_to_db(uer, 'Role Invite accepted')
135122
decorators = (api.has_permission('is_organizer', methods="DELETE", fetch="event_id", fetch_as="event_id",
136123
model=RoleInvite),)
137124
schema = RoleInviteSchema
138125
data_layer = {'session': db.session,
139126
'model': RoleInvite,
140-
'methods': {'before_update_object': before_update_object,
141-
'after_update_object': after_update_object}}
127+
'methods': {'before_update_object': before_update_object}}
142128

143129

144130
class RoleInviteRelationship(ResourceRelationship):
@@ -149,3 +135,51 @@ class RoleInviteRelationship(ResourceRelationship):
149135
schema = RoleInviteSchema
150136
data_layer = {'session': db.session,
151137
'model': RoleInvite}
138+
139+
140+
@role_invites_misc_routes.route('/role_invites/accept-invite', methods=['POST'])
141+
def accept_invite():
142+
token = request.json['data']['token']
143+
try:
144+
role_invite = RoleInvite.query.filter_by(hash=token).one()
145+
except NoResultFound:
146+
return NotFoundError({'source': ''}, 'Role Invite Not Found').respond()
147+
else:
148+
try:
149+
user = User.query.filter_by(email=role_invite.email).first()
150+
except NoResultFound:
151+
return NotFoundError({'source': ''}, 'User corresponding to role invite not Found').respond()
152+
try:
153+
role = Role.query.filter_by(name=role_invite.role_name).first()
154+
except NoResultFound:
155+
return NotFoundError({'source': ''}, 'Role corresponding to role invite not Found').respond()
156+
event = Event.query.filter_by(id=role_invite.event_id).first()
157+
uer = UsersEventsRoles.query.filter_by(user=user).filter_by(
158+
event=event).filter_by(role=role).first()
159+
if not uer:
160+
role_invite.status = "accepted"
161+
save_to_db(role_invite, 'Role Invite Accepted')
162+
uer = UsersEventsRoles(user, event, role)
163+
save_to_db(uer, 'User Event Role Created')
164+
if not user.is_verified:
165+
user.is_verified = True
166+
save_to_db(user, 'User verified')
167+
168+
return jsonify({
169+
"email": user.email,
170+
"event": role_invite.event_id,
171+
"name": user.fullname if user.fullname else None
172+
})
173+
174+
175+
@role_invites_misc_routes.route('/role_invites/user', methods=['POST'])
176+
def fetch_user():
177+
token = request.json['data']['token']
178+
try:
179+
role_invite = RoleInvite.query.filter_by(hash=token).one()
180+
except NoResultFound:
181+
return NotFoundError({'source': ''}, 'Role Invite Not Found').respond()
182+
else:
183+
return jsonify({
184+
"email": role_invite.email
185+
})

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy