Skip to content

Commit a4ee522

Browse files
committed
address comments
1 parent 9e6223b commit a4ee522

File tree

6 files changed

+23
-20
lines changed

6 files changed

+23
-20
lines changed

components/renku_data_services/project/blueprints.py

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
from sanic import HTTPResponse, Request, json
77
from sanic.response import JSONResponse
88
from sanic_ext import validate
9+
from ulid import ULID
910

1011
import renku_data_services.base_models as base_models
1112
from renku_data_services.authz.models import Member, Role, Visibility
@@ -110,7 +111,7 @@ def get_one(self) -> BlueprintFactoryResponse:
110111
@authenticate(self.authenticator)
111112
@validate_path_project_id
112113
async def _get_one(request: Request, user: base_models.APIUser, project_id: str) -> JSONResponse | HTTPResponse:
113-
project = await self.project_repo.get_project(user=user, project_id=project_id)
114+
project = await self.project_repo.get_project(user=user, project_id=ULID.from_str(project_id))
114115

115116
etag = request.headers.get("If-None-Match")
116117
if project.etag is not None and project.etag == etag:
@@ -176,7 +177,7 @@ def delete(self) -> BlueprintFactoryResponse:
176177
@only_authenticated
177178
@validate_path_project_id
178179
async def _delete(_: Request, user: base_models.APIUser, project_id: str) -> HTTPResponse:
179-
await self.project_repo.delete_project(user=user, project_id=project_id)
180+
await self.project_repo.delete_project(user=user, project_id=ULID.from_str(project_id))
180181
return HTTPResponse(status=204)
181182

182183
return "/projects/<project_id>", ["DELETE"], _delete
@@ -195,7 +196,7 @@ async def _patch(
195196
body_dict = body.model_dump(exclude_none=True)
196197

197198
project_update = await self.project_repo.update_project(
198-
user=user, project_id=project_id, etag=etag, payload=body_dict
199+
user=user, project_id=ULID.from_str(project_id), etag=etag, payload=body_dict
199200
)
200201
if not isinstance(project_update, project_models.ProjectUpdate):
201202
raise errors.ProgrammingError(
@@ -229,7 +230,7 @@ def get_all_members(self) -> BlueprintFactoryResponse:
229230
@authenticate(self.authenticator)
230231
@validate_path_project_id
231232
async def _get_all_members(_: Request, user: base_models.APIUser, project_id: str) -> JSONResponse:
232-
members = await self.project_member_repo.get_members(user, project_id)
233+
members = await self.project_member_repo.get_members(user, ULID.from_str(project_id))
233234

234235
users = []
235236

@@ -261,7 +262,7 @@ def update_members(self) -> BlueprintFactoryResponse:
261262
async def _update_members(request: Request, user: base_models.APIUser, project_id: str) -> HTTPResponse:
262263
body_dump = apispec.ProjectMemberListPatchRequest.model_validate(request.json)
263264
members = [Member(Role(i.role.value), i.id, project_id) for i in body_dump.root]
264-
await self.project_member_repo.update_members(user, project_id, members)
265+
await self.project_member_repo.update_members(user, ULID.from_str(project_id), members)
265266
return HTTPResponse(status=200)
266267

267268
return "/projects/<project_id>/members", ["PATCH"], _update_members
@@ -275,7 +276,7 @@ def delete_member(self) -> BlueprintFactoryResponse:
275276
async def _delete_member(
276277
_: Request, user: base_models.APIUser, project_id: str, member_id: str
277278
) -> HTTPResponse:
278-
await self.project_member_repo.delete_members(user, project_id, [member_id])
279+
await self.project_member_repo.delete_members(user, ULID.from_str(project_id), [member_id])
279280
return HTTPResponse(status=204)
280281

281282
return "/projects/<project_id>/members/<member_id>", ["DELETE"], _delete_member

components/renku_data_services/project/db.py

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ async def get_projects(
7676

7777
async def get_project(self, user: base_models.APIUser, project_id: ULID) -> models.Project:
7878
"""Get one project from the database."""
79-
authorized = await self.authz.has_permission(user, ResourceType.project, project_id, Scope.READ)
79+
authorized = await self.authz.has_permission(user, ResourceType.project, str(project_id), Scope.READ)
8080
if not authorized:
8181
raise errors.MissingResourceError(
8282
message=f"Project with id '{project_id}' does not exist or you do not have access to it."
@@ -113,7 +113,7 @@ async def get_project_by_namespace_slug(
113113
authorized = await self.authz.has_permission(
114114
user=user,
115115
resource_type=ResourceType.project,
116-
resource_id=project_orm.id,
116+
resource_id=str(project_orm.id),
117117
scope=Scope.READ,
118118
)
119119
if not authorized:
@@ -212,7 +212,7 @@ async def update_project(
212212
if "namespace" in payload and payload["namespace"] != old_project.namespace:
213213
# NOTE: changing the namespace requires the user to be owner which means they should have DELETE permission
214214
required_scope = Scope.DELETE
215-
authorized = await self.authz.has_permission(user, ResourceType.project, project_id, required_scope)
215+
authorized = await self.authz.has_permission(user, ResourceType.project, str(project_id), required_scope)
216216
if not authorized:
217217
raise errors.MissingResourceError(
218218
message=f"Project with id '{project_id_str}' does not exist or you do not have access to it."
@@ -273,7 +273,7 @@ async def delete_project(
273273
"""Delete a project."""
274274
if not session:
275275
raise errors.ProgrammingError(message="A database session is required")
276-
authorized = await self.authz.has_permission(user, ResourceType.project, project_id, Scope.DELETE)
276+
authorized = await self.authz.has_permission(user, ResourceType.project, str(project_id), Scope.DELETE)
277277
if not authorized:
278278
raise errors.MissingResourceError(
279279
message=f"Project with id '{project_id}' does not exist or you do not have access to it."
@@ -359,7 +359,7 @@ async def get_members(
359359
self, user: base_models.APIUser, project_id: ULID, *, session: AsyncSession | None = None
360360
) -> list[Member]:
361361
"""Get all members of a project."""
362-
members = await self.authz.members(user, ResourceType.project, project_id)
362+
members = await self.authz.members(user, ResourceType.project, str(project_id))
363363
members = [member for member in members if member.user_id and member.user_id != "*"]
364364
return members
365365

@@ -391,7 +391,7 @@ async def update_members(
391391
f"{requested_member_ids_set.difference(existing_member_ids)} cannot be found"
392392
)
393393

394-
output = await self.authz.upsert_project_members(user, ResourceType.project, project_id, members)
394+
output = await self.authz.upsert_project_members(user, ResourceType.project, str(project_id), members)
395395
return output
396396

397397
@with_db_transaction
@@ -404,5 +404,5 @@ async def delete_members(
404404
if len(user_ids) == 0:
405405
raise errors.ValidationError(message="Please request at least 1 member to be removed from the project")
406406

407-
members = await self.authz.remove_project_members(user, ResourceType.project, project_id, user_ids)
407+
members = await self.authz.remove_project_members(user, ResourceType.project, str(project_id), user_ids)
408408
return members

components/renku_data_services/project/orm.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ class ProjectORM(BaseORM):
5454
def dump(self) -> models.Project:
5555
"""Create a project model from the ProjectORM."""
5656
return models.Project(
57-
id=self.id,
57+
id=str(self.id),
5858
name=self.name,
5959
slug=self.slug.slug,
6060
namespace=self.slug.namespace.dump(),

components/renku_data_services/session/db.py

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -157,7 +157,9 @@ async def get_launcher(self, user: base_models.APIUser, launcher_id: ULID) -> mo
157157
launcher = res.one_or_none()
158158

159159
authorized = (
160-
await self.project_authz.has_permission(user, ResourceType.project, launcher.project_id, Scope.READ)
160+
await self.project_authz.has_permission(
161+
user, ResourceType.project, str(launcher.project_id), Scope.READ
162+
)
161163
if launcher is not None
162164
else False
163165
)
@@ -259,7 +261,7 @@ async def update_launcher(
259261
authorized = await self.project_authz.has_permission(
260262
user,
261263
ResourceType.project,
262-
launcher.project_id,
264+
str(launcher.project_id),
263265
Scope.WRITE,
264266
)
265267
if not authorized:
@@ -336,7 +338,7 @@ async def delete_launcher(self, user: base_models.APIUser, launcher_id: ULID) ->
336338
authorized = await self.project_authz.has_permission(
337339
user,
338340
ResourceType.project,
339-
launcher.project_id,
341+
str(launcher.project_id),
340342
Scope.WRITE,
341343
)
342344
if not authorized:

components/renku_data_services/session/orm.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -133,7 +133,7 @@ def load(cls, launcher: models.SessionLauncher) -> "SessionLauncherORM":
133133
description=launcher.description,
134134
environment_kind=launcher.environment_kind,
135135
container_image=launcher.container_image,
136-
project_id=launcher.project_id,
136+
project_id=ULID.from_str(launcher.project_id),
137137
environment_id=launcher.environment_id,
138138
resource_class_id=launcher.resource_class_id,
139139
default_url=launcher.default_url,
@@ -143,7 +143,7 @@ def dump(self) -> models.SessionLauncher:
143143
"""Create a session launcher model from the SessionLauncherORM."""
144144
return models.SessionLauncher(
145145
id=self.id,
146-
project_id=self.project_id,
146+
project_id=str(self.project_id),
147147
name=self.name,
148148
created_by=models.Member(id=self.created_by_id),
149149
creation_date=self.creation_date,

components/renku_data_services/utils/sqlalchemy.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,4 +22,4 @@ def process_result_value(self, value: str | None, dialect: Dialect) -> ULID | No
2222
"""Transform string from database into ULID."""
2323
if value is None:
2424
return None
25-
return cast(ULID, ULID.from_str(value))
25+
return cast(ULID, ULID.from_str(value)) # cast because mypy doesn't understand ULID type annotations

0 commit comments

Comments
 (0)