Skip to content

Commit dfcd530

Browse files
fix: Allow orgnizers to unlock sessions and add tests (#7186)
1 parent 4b605aa commit dfcd530

File tree

2 files changed

+152
-9
lines changed

2 files changed

+152
-9
lines changed

app/api/sessions.py

Lines changed: 2 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -249,16 +249,9 @@ def before_update_object(self, session, data, view_kwargs):
249249
is_organizer = has_access('is_admin') or has_access(
250250
'is_organizer', event_id=session.event_id
251251
)
252-
if session.is_locked:
253-
if not is_organizer:
254-
raise ForbiddenError(
255-
{'source': '/data/attributes/is-locked'},
256-
"You don't have enough permissions to change this property",
257-
)
258-
259-
if session.is_locked and data.get('is_locked') != session.is_locked:
252+
if session.is_locked and not is_organizer:
260253
raise ForbiddenError(
261-
{'source': '/data/attributes/is-locked'},
254+
{'pointer': '/data/attributes/is-locked'},
262255
"Locked sessions cannot be edited",
263256
)
264257

Lines changed: 150 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,150 @@
1+
import json
2+
3+
from app.api.helpers.db import get_or_create
4+
from app.models.role import Role
5+
from app.models.users_events_role import UsersEventsRoles
6+
from tests.factories.session import SessionSubFactory
7+
from tests.factories.speakers_call import SpeakersCallSubFactory
8+
from tests.factories.user import UserFactory
9+
10+
11+
def get_session(db, user, event_owner=False, **kwargs):
12+
new_user = UserFactory(is_admin=False, is_verified=False)
13+
14+
if event_owner:
15+
owner = user
16+
creator = new_user
17+
else:
18+
owner = new_user
19+
creator = user
20+
session = SessionSubFactory(creator_id=creator.id, **kwargs)
21+
role, _ = get_or_create(Role, name='owner', title_name='Owner')
22+
UsersEventsRoles(user=owner, event=session.event, role=role)
23+
SpeakersCallSubFactory(event=session.event)
24+
db.session.commit()
25+
26+
return session
27+
28+
29+
def test_session_edit_locked_fail(db, client, user, jwt):
30+
session = get_session(db, user, is_locked=True)
31+
data = json.dumps(
32+
{
33+
'data': {
34+
'type': 'session',
35+
'id': str(session.id),
36+
"attributes": {"title": "Sheesha"},
37+
}
38+
}
39+
)
40+
41+
response = client.patch(
42+
f'/v1/sessions/{session.id}',
43+
content_type='application/vnd.api+json',
44+
headers=jwt,
45+
data=data,
46+
)
47+
48+
db.session.refresh(session)
49+
50+
assert response.status_code == 403
51+
assert json.loads(response.data) == {
52+
'errors': [
53+
{
54+
'detail': "Locked sessions cannot be edited",
55+
'source': {'pointer': '/data/attributes/is-locked'},
56+
'status': 403,
57+
'title': 'Access Forbidden',
58+
}
59+
],
60+
'jsonapi': {'version': '1.0'},
61+
}
62+
63+
assert session.title == 'example'
64+
65+
66+
def test_session_edit_locked_allow_organizer(db, client, user, jwt):
67+
session = get_session(db, user, event_owner=True, is_locked=True)
68+
data = json.dumps(
69+
{
70+
'data': {
71+
'type': 'session',
72+
'id': str(session.id),
73+
"attributes": {"title": "Sheesha"},
74+
}
75+
}
76+
)
77+
78+
response = client.patch(
79+
f'/v1/sessions/{session.id}',
80+
content_type='application/vnd.api+json',
81+
headers=jwt,
82+
data=data,
83+
)
84+
85+
db.session.refresh(session)
86+
87+
assert response.status_code == 200
88+
assert session.title == 'Sheesha'
89+
90+
91+
def test_session_unlocked_locked_fail(db, client, user, jwt):
92+
session = get_session(db, user, is_locked=True)
93+
data = json.dumps(
94+
{
95+
'data': {
96+
'type': 'session',
97+
'id': str(session.id),
98+
"attributes": {"is-locked": False},
99+
}
100+
}
101+
)
102+
103+
response = client.patch(
104+
f'/v1/sessions/{session.id}',
105+
content_type='application/vnd.api+json',
106+
headers=jwt,
107+
data=data,
108+
)
109+
110+
db.session.refresh(session)
111+
112+
assert response.status_code == 403
113+
assert json.loads(response.data) == {
114+
'errors': [
115+
{
116+
'detail': "Locked sessions cannot be edited",
117+
'source': {'pointer': '/data/attributes/is-locked'},
118+
'status': 403,
119+
'title': 'Access Forbidden',
120+
}
121+
],
122+
'jsonapi': {'version': '1.0'},
123+
}
124+
125+
assert session.is_locked is True
126+
127+
128+
def test_session_unlock_locked_allow_organizer(db, client, user, jwt):
129+
session = get_session(db, user, event_owner=True, is_locked=True)
130+
data = json.dumps(
131+
{
132+
'data': {
133+
'type': 'session',
134+
'id': str(session.id),
135+
"attributes": {"is-locked": False},
136+
}
137+
}
138+
)
139+
140+
response = client.patch(
141+
f'/v1/sessions/{session.id}',
142+
content_type='application/vnd.api+json',
143+
headers=jwt,
144+
data=data,
145+
)
146+
147+
db.session.refresh(session)
148+
149+
assert response.status_code == 200
150+
assert session.is_locked is False

0 commit comments

Comments
 (0)