Skip to content

Commit 4478f63

Browse files
committed
Fix: Allow managers of a project to edit partnerships
1 parent 0a97174 commit 4478f63

File tree

1 file changed

+69
-69
lines changed

1 file changed

+69
-69
lines changed

backend/api/projects/partnerships.py

+69-69
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
from flask_restful import Resource, request
22
from backend.services.project_partnership_service import ProjectPartnershipService
33
from backend.services.users.authentication_service import token_auth
4-
from backend.services.users.user_service import UserService
4+
from backend.services.project_admin_service import ProjectAdminService
55
from backend.models.dtos.project_partner_dto import (
66
ProjectPartnershipDTO,
77
ProjectPartnershipUpdateDTO,
@@ -88,46 +88,44 @@ def post(self):
8888
400:
8989
description: Ivalid dates or started_on was after ended_on
9090
401:
91-
description: Forbidden, if user is not an admin
91+
description: Forbidden, if user is not a manager of this project
9292
403:
9393
description: Forbidden, if user is not authenticated
9494
404:
9595
description: Not found
9696
500:
9797
description: Internal Server Error
9898
"""
99-
try:
100-
partnership_dto = ProjectPartnershipDTO(request.get_json())
101-
is_admin = UserService.is_user_an_admin(token_auth.current_user())
99+
partnership_dto = ProjectPartnershipDTO(request.get_json())
102100

103-
if not is_admin:
104-
raise ValueError()
105-
106-
if partnership_dto.started_on is None:
107-
partnership_dto.started_on = timestamp()
108-
109-
partnership_dto = ProjectPartnershipDTO(request.get_json())
110-
partnership_id = ProjectPartnershipService.create_partnership(
111-
partnership_dto.project_id,
112-
partnership_dto.partner_id,
113-
partnership_dto.started_on,
114-
partnership_dto.ended_on,
115-
)
116-
return (
117-
{
118-
"Success": "Partner {} assigned to project {}".format(
119-
partnership_dto.partner_id, partnership_dto.project_id
120-
),
121-
"partnershipId": partnership_id,
122-
},
123-
201,
124-
)
125-
except ValueError:
101+
if not ProjectAdminService.is_user_action_permitted_on_project(
102+
token_auth.current_user(), partnership_dto.project_id
103+
):
126104
return {
127-
"Error": "User is not an admin",
105+
"Error": "User is not a manager of the project",
128106
"SubCode": "UserPermissionError",
129107
}, 401
130108

109+
if partnership_dto.started_on is None:
110+
partnership_dto.started_on = timestamp()
111+
112+
partnership_dto = ProjectPartnershipDTO(request.get_json())
113+
partnership_id = ProjectPartnershipService.create_partnership(
114+
partnership_dto.project_id,
115+
partnership_dto.partner_id,
116+
partnership_dto.started_on,
117+
partnership_dto.ended_on,
118+
)
119+
return (
120+
{
121+
"Success": "Partner {} assigned to project {}".format(
122+
partnership_dto.partner_id, partnership_dto.project_id
123+
),
124+
"partnershipId": partnership_id,
125+
},
126+
201,
127+
)
128+
131129
@staticmethod
132130
@token_auth.login_required
133131
def patch(partnership_id: int):
@@ -172,43 +170,44 @@ def patch(partnership_id: int):
172170
400:
173171
description: Ivalid dates or started_on was after ended_on
174172
401:
175-
description: Forbidden, if user is not an admin
173+
description: Forbidden, if user is not a manager of this project
176174
403:
177175
description: Forbidden, if user is not authenticated
178176
404:
179177
description: Not found
180178
500:
181179
description: Internal Server Error
182180
"""
183-
try:
184-
partnership_updates = ProjectPartnershipUpdateDTO(request.get_json())
185-
is_admin = UserService.is_user_an_admin(token_auth.current_user())
186-
187-
if not is_admin:
188-
raise ValueError()
189-
190-
partnership = ProjectPartnershipService.update_partnership_time_range(
191-
partnership_id,
192-
partnership_updates.started_on,
193-
partnership_updates.ended_on,
194-
)
181+
partnership_updates = ProjectPartnershipUpdateDTO(request.get_json())
182+
partnership_dto = ProjectPartnershipService.get_partnership_as_dto(
183+
partnership_id
184+
)
195185

196-
return (
197-
{
198-
"Success": "Updated time range. startedOn: {}, endedOn: {}".format(
199-
partnership.started_on, partnership.ended_on
200-
),
201-
"startedOn": f"{partnership.started_on}",
202-
"endedOn": f"{partnership.ended_on}",
203-
},
204-
200,
205-
)
206-
except ValueError:
186+
if not ProjectAdminService.is_user_action_permitted_on_project(
187+
token_auth.current_user(), partnership_dto.project_id
188+
):
207189
return {
208-
"Error": "User is not an admin",
190+
"Error": "User is not a manager of the project",
209191
"SubCode": "UserPermissionError",
210192
}, 401
211193

194+
partnership = ProjectPartnershipService.update_partnership_time_range(
195+
partnership_id,
196+
partnership_updates.started_on,
197+
partnership_updates.ended_on,
198+
)
199+
200+
return (
201+
{
202+
"Success": "Updated time range. startedOn: {}, endedOn: {}".format(
203+
partnership.started_on, partnership.ended_on
204+
),
205+
"startedOn": f"{partnership.started_on}",
206+
"endedOn": f"{partnership.ended_on}",
207+
},
208+
200,
209+
)
210+
212211
@staticmethod
213212
@token_auth.login_required
214213
def delete(partnership_id: int):
@@ -237,33 +236,34 @@ def delete(partnership_id: int):
237236
201:
238237
description: Partner project association created
239238
401:
240-
description: Forbidden, if user is not an admin
239+
description: Forbidden, if user is not a manager of this project
241240
403:
242241
description: Forbidden, if user is not authenticated
243242
404:
244243
description: Not found
245244
500:
246245
description: Internal Server Error
247246
"""
248-
try:
249-
is_admin = UserService.is_user_an_admin(token_auth.current_user())
250-
251-
if not is_admin:
252-
raise ValueError()
247+
partnership_dto = ProjectPartnershipService.get_partnership_as_dto(
248+
partnership_id
249+
)
253250

254-
ProjectPartnershipService.delete_partnership(partnership_id)
255-
return (
256-
{
257-
"Success": "Partnership ID {} deleted".format(partnership_id),
258-
},
259-
200,
260-
)
261-
except ValueError:
251+
if not ProjectAdminService.is_user_action_permitted_on_project(
252+
token_auth.current_user(), partnership_dto.project_id
253+
):
262254
return {
263-
"Error": "User is not an admin",
255+
"Error": "User is not a manager of the project",
264256
"SubCode": "UserPermissionError",
265257
}, 401
266258

259+
ProjectPartnershipService.delete_partnership(partnership_id)
260+
return (
261+
{
262+
"Success": "Partnership ID {} deleted".format(partnership_id),
263+
},
264+
200,
265+
)
266+
267267

268268
class PartnersByProjectAPI(Resource):
269269
@staticmethod

0 commit comments

Comments
 (0)