fractal-server 2.4.0a1__py3-none-any.whl → 2.4.0a2__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- __VERSION__ = "2.4.0a1"
1
+ __VERSION__ = "2.4.0a2"
@@ -5,6 +5,7 @@ from fastapi import APIRouter
5
5
  from fastapi import Depends
6
6
  from fastapi import HTTPException
7
7
  from fastapi import status
8
+ from sqlalchemy.exc import IntegrityError
8
9
  from sqlalchemy.ext.asyncio import AsyncSession
9
10
  from sqlmodel import col
10
11
  from sqlmodel import func
@@ -19,6 +20,9 @@ from ._aux_auth import _get_single_group_with_user_ids
19
20
  from fractal_server.app.models import LinkUserGroup
20
21
  from fractal_server.app.models import UserGroup
21
22
  from fractal_server.app.models import UserOAuth
23
+ from fractal_server.logger import set_logger
24
+
25
+ logger = set_logger(__name__)
22
26
 
23
27
  router_group = APIRouter()
24
28
 
@@ -133,7 +137,20 @@ async def update_single_group(
133
137
  for user_id in group_update.new_user_ids:
134
138
  link = LinkUserGroup(user_id=user_id, group_id=group_id)
135
139
  db.add(link)
136
- await db.commit()
140
+ try:
141
+ await db.commit()
142
+ except IntegrityError as e:
143
+ error_msg = (
144
+ f"Cannot link users with IDs {group_update.new_user_ids} "
145
+ f"to group {group_id}. "
146
+ "Likely reason: one of these links already exists.\n"
147
+ f"Original error: {str(e)}"
148
+ )
149
+ logger.info(error_msg)
150
+ raise HTTPException(
151
+ status_code=status.HTTP_422_UNPROCESSABLE_ENTITY,
152
+ detail=error_msg,
153
+ )
137
154
 
138
155
  updated_group = await _get_single_group_with_user_ids(
139
156
  group_id=group_id, db=db
@@ -8,6 +8,7 @@ from fastapi import status
8
8
  from fastapi_users import exceptions
9
9
  from fastapi_users import schemas
10
10
  from fastapi_users.router.common import ErrorCode
11
+ from sqlalchemy.exc import IntegrityError
11
12
  from sqlalchemy.ext.asyncio import AsyncSession
12
13
  from sqlmodel import col
13
14
  from sqlmodel import func
@@ -25,10 +26,14 @@ from fractal_server.app.models import UserOAuth
25
26
  from fractal_server.app.routes.auth._aux_auth import _user_or_404
26
27
  from fractal_server.app.security import get_user_manager
27
28
  from fractal_server.app.security import UserManager
29
+ from fractal_server.logger import set_logger
28
30
 
29
31
  router_users = APIRouter()
30
32
 
31
33
 
34
+ logger = set_logger(__name__)
35
+
36
+
32
37
  @router_users.get("/users/{user_id}/", response_model=UserRead)
33
38
  async def get_user(
34
39
  user_id: int,
@@ -107,7 +112,21 @@ async def patch_user(
107
112
  for new_group_id in user_update.new_group_ids:
108
113
  link = LinkUserGroup(user_id=user_id, group_id=new_group_id)
109
114
  db.add(link)
110
- await db.commit()
115
+
116
+ try:
117
+ await db.commit()
118
+ except IntegrityError as e:
119
+ error_msg = (
120
+ f"Cannot link groups with IDs {user_update.new_group_ids} "
121
+ f"to user {user_id}. "
122
+ "Likely reason: one of these links already exists.\n"
123
+ f"Original error: {str(e)}"
124
+ )
125
+ logger.info(error_msg)
126
+ raise HTTPException(
127
+ status_code=status.HTTP_422_UNPROCESSABLE_ENTITY,
128
+ detail=error_msg,
129
+ )
111
130
 
112
131
  patched_user = user_to_patch
113
132
 
@@ -106,6 +106,10 @@ class UserUpdateStrict(BaseModel, extra=Extra.forbid):
106
106
  class UserUpdateWithNewGroupIds(UserUpdate):
107
107
  new_group_ids: Optional[list[int]] = None
108
108
 
109
+ _val_unique = validator("new_group_ids", allow_reuse=True)(
110
+ val_unique_list("new_group_ids")
111
+ )
112
+
109
113
 
110
114
  class UserCreate(schemas.BaseUserCreate):
111
115
  """
@@ -4,6 +4,10 @@ from typing import Optional
4
4
  from pydantic import BaseModel
5
5
  from pydantic import Extra
6
6
  from pydantic import Field
7
+ from pydantic import validator
8
+
9
+ from ._validators import val_unique_list
10
+
7
11
 
8
12
  __all__ = (
9
13
  "UserGroupRead",
@@ -55,3 +59,7 @@ class UserGroupUpdate(BaseModel, extra=Extra.forbid):
55
59
  """
56
60
 
57
61
  new_user_ids: list[int] = Field(default_factory=list)
62
+
63
+ _val_unique = validator("new_user_ids", allow_reuse=True)(
64
+ val_unique_list("new_user_ids")
65
+ )
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: fractal-server
3
- Version: 2.4.0a1
3
+ Version: 2.4.0a2
4
4
  Summary: Server component of the Fractal analytics platform
5
5
  Home-page: https://github.com/fractal-analytics-platform/fractal-server
6
6
  License: BSD-3-Clause
@@ -1,4 +1,4 @@
1
- fractal_server/__init__.py,sha256=82UdKyiu21w5Ad9EyPoIbpiHLVC1oA6id-sFK4o1cnc,24
1
+ fractal_server/__init__.py,sha256=LqB8PB8-x2CZLC5OUrNdxwSPLBLIrriGxEQXweZeNSc,24
2
2
  fractal_server/__main__.py,sha256=I9hF_SYc-GTZWDZZhihwyUBK7BMU5GAecbPLTjkpW4U,5830
3
3
  fractal_server/alembic.ini,sha256=MWwi7GzjzawI9cCAK1LW7NxIBQDUqD12-ptJoq5JpP0,3153
4
4
  fractal_server/app/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -53,13 +53,13 @@ fractal_server/app/routes/api/v2/workflowtask.py,sha256=HoHFnVRDa0Cw1oqTea1Of6A5
53
53
  fractal_server/app/routes/auth/__init__.py,sha256=fao6CS0WiAjHDTvBzgBVV_bSXFpEAeDBF6Z6q7rRkPc,1658
54
54
  fractal_server/app/routes/auth/_aux_auth.py,sha256=Kpgiw5q1eiCYLFkfhTT7XJGBu1d08YM71CEHhNtfJ5g,3126
55
55
  fractal_server/app/routes/auth/current_user.py,sha256=LK0Z13NgaXYQ3FaQ3MNec0p2RRiKxKN31XIt2g9mcGk,2003
56
- fractal_server/app/routes/auth/group.py,sha256=e0rVJQlocJ5RB8AEfQ5sufF4lJBmCFrGWQHvHqlpbIU,4817
56
+ fractal_server/app/routes/auth/group.py,sha256=az8kRJJU5rA0L8GCX5kvRNuQhrsoGWPuvQ26z7iFQ3E,5388
57
57
  fractal_server/app/routes/auth/group_names.py,sha256=zvYDfhxKlDmbSr-oLXYy6WUVkPPTvzH6ZJtuoNdGZbE,960
58
58
  fractal_server/app/routes/auth/login.py,sha256=tSu6OBLOieoBtMZB4JkBAdEgH2Y8KqPGSbwy7NIypIo,566
59
59
  fractal_server/app/routes/auth/oauth.py,sha256=AnFHbjqL2AgBX3eksI931xD6RTtmbciHBEuGf9YJLjU,1895
60
60
  fractal_server/app/routes/auth/register.py,sha256=DlHq79iOvGd_gt2v9uwtsqIKeO6i_GKaW59VIkllPqY,587
61
61
  fractal_server/app/routes/auth/router.py,sha256=zWoZWiO69U48QFQf5tLRYQDWu8PUCj7GacnaFeW1n_I,618
62
- fractal_server/app/routes/auth/users.py,sha256=bUhoAyEgcJL5FNSn7pYYycAbmzMUiWl7NfmKaYG7mxs,6048
62
+ fractal_server/app/routes/auth/users.py,sha256=hNTIR0e3QFbUUDvkzKNXJt4uKwONlI36i6UjjMPCgAA,6672
63
63
  fractal_server/app/routes/aux/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
64
64
  fractal_server/app/routes/aux/_job.py,sha256=q-RCiW17yXnZKAC_0La52RLvhqhxuvbgQJ2MlGXOj8A,702
65
65
  fractal_server/app/routes/aux/_runner.py,sha256=FdCVla5DxGAZ__aB7Z8dEJzD_RIeh5tftjrPyqkr8N8,895
@@ -126,8 +126,8 @@ fractal_server/app/runner/v2/v1_compat.py,sha256=t0ficzAHUFaaeI56nqTb4YEKxfARF7L
126
126
  fractal_server/app/runner/versions.py,sha256=dSaPRWqmFPHjg20kTCHmi_dmGNcCETflDtDLronNanU,852
127
127
  fractal_server/app/schemas/__init__.py,sha256=jiIf54owztXupv3PO6Ilh0qcrkh2RUzKq4bcEFqEfc4,40
128
128
  fractal_server/app/schemas/_validators.py,sha256=1dTOYr1IZykrxuQSV2-zuEMZbKe_nGwrfS7iUrsh-sE,3461
129
- fractal_server/app/schemas/user.py,sha256=__WVnUyQiWJ64JzlzyKowe2w2sBlF4S95RqdaUdA21c,3325
130
- fractal_server/app/schemas/user_group.py,sha256=CgW38Ett-DuRvN4tFEjG1jfX1csCFJIhVu5mjVlGEyI,1262
129
+ fractal_server/app/schemas/user.py,sha256=jRMUd3v7kmnOdHhGSoljKbCk6xyaJuGHRXkaxAxI8RA,3437
130
+ fractal_server/app/schemas/user_group.py,sha256=2f9XQ6kIar6NMY4UCN0yOnve6ZDHUVZaHv1dna1Vfjg,1446
131
131
  fractal_server/app/schemas/v1/__init__.py,sha256=CrBGgBhoemCvmZ70ZUchM-jfVAICnoa7AjZBAtL2UB0,1852
132
132
  fractal_server/app/schemas/v1/applyworkflow.py,sha256=uuIh7fHlHEL4yLqL-dePI6-nfCsqgBYATmht7w_KITw,4302
133
133
  fractal_server/app/schemas/v1/dataset.py,sha256=n71lNUO3JLy2K3IM9BZM2Fk1EnKQOTU7pm2s2rJ1FGY,3444
@@ -207,8 +207,8 @@ fractal_server/tasks/v2/utils.py,sha256=JOyCacb6MNvrwfLNTyLwcz8y79J29YuJeJ2MK5kq
207
207
  fractal_server/urls.py,sha256=5o_qq7PzKKbwq12NHSQZDmDitn5RAOeQ4xufu-2v9Zk,448
208
208
  fractal_server/utils.py,sha256=b7WwFdcFZ8unyT65mloFToYuEDXpQoHRcmRNqrhd_dQ,2115
209
209
  fractal_server/zip_tools.py,sha256=xYpzBshysD2nmxkD5WLYqMzPYUcCRM3kYy-7n9bJL-U,4426
210
- fractal_server-2.4.0a1.dist-info/LICENSE,sha256=QKAharUuhxL58kSoLizKJeZE3mTCBnX6ucmz8W0lxlk,1576
211
- fractal_server-2.4.0a1.dist-info/METADATA,sha256=npvr_yl8n-KwghMVxD6kUx3yHf2wB_xTnFUFrtf7w7Q,4630
212
- fractal_server-2.4.0a1.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
213
- fractal_server-2.4.0a1.dist-info/entry_points.txt,sha256=8tV2kynvFkjnhbtDnxAqImL6HMVKsopgGfew0DOp5UY,58
214
- fractal_server-2.4.0a1.dist-info/RECORD,,
210
+ fractal_server-2.4.0a2.dist-info/LICENSE,sha256=QKAharUuhxL58kSoLizKJeZE3mTCBnX6ucmz8W0lxlk,1576
211
+ fractal_server-2.4.0a2.dist-info/METADATA,sha256=ujcw0RxpRcxYPLLI1NdkZ8v0IaKQP3d3D_CXsaxua4U,4630
212
+ fractal_server-2.4.0a2.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
213
+ fractal_server-2.4.0a2.dist-info/entry_points.txt,sha256=8tV2kynvFkjnhbtDnxAqImL6HMVKsopgGfew0DOp5UY,58
214
+ fractal_server-2.4.0a2.dist-info/RECORD,,