11import logging
22
33from aiohttp import web
4+ from models_library .api_schemas_webserver ._base import InputSchema
45from models_library .groups import GroupID
56from models_library .projects import ProjectID
67from pydantic import BaseModel , ConfigDict , EmailStr
910 parse_request_body_as ,
1011 parse_request_path_parameters_as ,
1112)
13+ from servicelib .logging_utils import log_context
1214
1315from ..._meta import api_version_prefix as VTAG
16+ from ...application_settings_utils import requires_dev_feature_enabled
1417from ...login .decorators import login_required
1518from ...security .decorators import permission_required
1619from ...utils_aiohttp import envelope_json_response
2528routes = web .RouteTableDef ()
2629
2730
28- class _ProjectShare (BaseModel ):
29- email : EmailStr | None
30- primary_group_id : GroupID | None
31+ class _ProjectShare (InputSchema ):
32+ # TODO: move to models_library.api_schemas_webserver.groups together with the rest
33+ user_email : EmailStr
3134
3235 # sharing access
3336 read : bool
@@ -38,6 +41,7 @@ class _ProjectShare(BaseModel):
3841
3942
4043@routes .post (f"/{ VTAG } /projects/{{project_id}}:share" , name = "share_project" )
44+ @requires_dev_feature_enabled
4145@login_required
4246@permission_required ("project.access_rights.update" )
4347@handle_plugin_requests_exceptions
@@ -46,9 +50,21 @@ async def share_project(request: web.Request):
4650 path_params = parse_request_path_parameters_as (ProjectPathParams , request )
4751 body_params = await parse_request_body_as (_ProjectShare , request )
4852
49- # TODO: share project
53+ with log_context (
54+ _logger ,
55+ logging .DEBUG ,
56+ "User [%s] from product [%s] is sharing project [%s] with [%s]" ,
57+ req_ctx .user_id ,
58+ req_ctx .product_name ,
59+ path_params .project_id ,
60+ body_params .user_email ,
61+ ):
5062
51- return web .json_response (status = status .HTTP_204_NO_CONTENT )
63+ # TODO: share project
64+ if body_params .user_email :
65+ raise NotImplementedError
66+
67+ return web .json_response (status = status .HTTP_204_NO_CONTENT )
5268
5369
5470class _ProjectsGroupsPathParams (BaseModel ):
@@ -121,7 +137,7 @@ async def replace_project_group(request: web.Request):
121137 path_params = parse_request_path_parameters_as (_ProjectsGroupsPathParams , request )
122138 body_params = await parse_request_body_as (_ProjectsGroupsBodyParams , request )
123139
124- return await _groups_service .replace_project_group (
140+ new_project_group = await _groups_service .replace_project_group (
125141 app = request .app ,
126142 user_id = req_ctx .user_id ,
127143 project_id = path_params .project_id ,
@@ -131,6 +147,7 @@ async def replace_project_group(request: web.Request):
131147 delete = body_params .delete ,
132148 product_name = req_ctx .product_name ,
133149 )
150+ return envelope_json_response (new_project_group , web .HTTPOk )
134151
135152
136153@routes .delete (
0 commit comments