1+ import datetime
12from collections .abc import Mapping
23from enum import Enum
34from typing import Annotated , Any , Literal , TypeAlias
45from uuid import UUID
56
6- from common_library .errors_classes import OsparcErrorMixin
77from models_library import projects
88from models_library .basic_regex import UUID_RE_BASE
99from models_library .basic_types import ConstrainedStr
10+ from models_library .groups import GroupID
11+ from models_library .products import ProductName
1012from models_library .services_types import ServiceKey , ServiceVersion
11- from pydantic import BaseModel , Field
13+ from models_library .users import UserID
14+ from pydantic import BaseModel , ConfigDict , Field
1215
1316from .projects import ProjectID
17+ from .utils .change_case import snake_to_camel
1418
1519FunctionID : TypeAlias = UUID
1620FunctionJobID : TypeAlias = UUID
@@ -72,7 +76,10 @@ class FunctionClass(str, Enum):
7276# see here https://github.com/ITISFoundation/osparc-simcore/issues/7659
7377FunctionInputs : TypeAlias = dict [str , Any ] | None
7478
75- FunctionInputsList : TypeAlias = list [FunctionInputs ]
79+ FunctionInputsList : TypeAlias = Annotated [
80+ list [FunctionInputs ],
81+ Field (max_length = 50 ),
82+ ]
7683
7784FunctionOutputs : TypeAlias = dict [str , Any ] | None
7885
@@ -90,6 +97,7 @@ class FunctionBase(BaseModel):
9097
9198class RegisteredFunctionBase (FunctionBase ):
9299 uid : FunctionID
100+ created_at : datetime .datetime
93101
94102
95103class ProjectFunction (FunctionBase ):
@@ -146,6 +154,7 @@ class FunctionJobBase(BaseModel):
146154
147155class RegisteredFunctionJobBase (FunctionJobBase ):
148156 uid : FunctionJobID
157+ created_at : datetime .datetime
149158
150159
151160class ProjectFunctionJob (FunctionJobBase ):
@@ -201,46 +210,13 @@ class FunctionJobCollection(BaseModel):
201210
202211class RegisteredFunctionJobCollection (FunctionJobCollection ):
203212 uid : FunctionJobCollectionID
213+ created_at : datetime .datetime
204214
205215
206216class FunctionJobCollectionStatus (BaseModel ):
207217 status : list [str ]
208218
209219
210- class FunctionBaseError (OsparcErrorMixin , Exception ):
211- pass
212-
213-
214- class FunctionIDNotFoundError (FunctionBaseError ):
215- msg_template : str = "Function {function_id} not found"
216-
217-
218- class FunctionJobIDNotFoundError (FunctionBaseError ):
219- msg_template : str = "Function job {function_job_id} not found"
220-
221-
222- class FunctionJobCollectionIDNotFoundError (FunctionBaseError ):
223- msg_template : str = "Function job collection {function_job_collection_id} not found"
224-
225-
226- class UnsupportedFunctionClassError (FunctionBaseError ):
227- msg_template : str = "Function class {function_class} is not supported"
228-
229-
230- class UnsupportedFunctionJobClassError (FunctionBaseError ):
231- msg_template : str = "Function job class {function_job_class} is not supported"
232-
233-
234- class UnsupportedFunctionFunctionJobClassCombinationError (FunctionBaseError ):
235- msg_template : str = (
236- "Function class {function_class} and function job class {function_job_class} combination is not supported"
237- )
238-
239-
240- class FunctionInputsValidationError (FunctionBaseError ):
241- msg_template : str = "Function inputs validation failed: {error}"
242-
243-
244220class FunctionJobDB (BaseModel ):
245221 function_uuid : FunctionID
246222 title : str = ""
@@ -253,6 +229,7 @@ class FunctionJobDB(BaseModel):
253229
254230class RegisteredFunctionJobDB (FunctionJobDB ):
255231 uuid : FunctionJobID
232+ created : datetime .datetime
256233
257234
258235class FunctionDB (BaseModel ):
@@ -267,6 +244,7 @@ class FunctionDB(BaseModel):
267244
268245class RegisteredFunctionDB (FunctionDB ):
269246 uuid : FunctionID
247+ created : datetime .datetime
270248
271249
272250class FunctionJobCollectionDB (BaseModel ):
@@ -276,6 +254,7 @@ class FunctionJobCollectionDB(BaseModel):
276254
277255class RegisteredFunctionJobCollectionDB (FunctionJobCollectionDB ):
278256 uuid : FunctionJobCollectionID
257+ created : datetime .datetime
279258
280259
281260class FunctionIDString (ConstrainedStr ):
@@ -286,3 +265,48 @@ class FunctionJobCollectionsListFilters(BaseModel):
286265 """Filters for listing function job collections"""
287266
288267 has_function_id : FunctionIDString | None = None
268+
269+
270+ class FunctionAccessRights (BaseModel ):
271+ read : bool = False
272+ write : bool = False
273+ execute : bool = False
274+
275+ model_config = ConfigDict (
276+ alias_generator = snake_to_camel ,
277+ populate_by_name = True ,
278+ extra = "forbid" ,
279+ )
280+
281+
282+ class FunctionUserAccessRights (FunctionAccessRights ):
283+ user_id : UserID
284+
285+
286+ class FunctionGroupAccessRights (FunctionAccessRights ):
287+ group_id : GroupID
288+
289+
290+ class FunctionAccessRightsDB (BaseModel ):
291+ group_id : GroupID | None = None
292+ product_name : ProductName | None = None
293+ read : bool = False
294+ write : bool = False
295+ execute : bool = False
296+
297+ model_config = ConfigDict (
298+ alias_generator = snake_to_camel ,
299+ populate_by_name = True ,
300+ extra = "forbid" ,
301+ )
302+
303+
304+ FunctionJobAccessRights : TypeAlias = FunctionAccessRights
305+ FunctionJobAccessRightsDB : TypeAlias = FunctionAccessRightsDB
306+ FunctionJobUserAccessRights : TypeAlias = FunctionUserAccessRights
307+ FunctionJobGroupAccessRights : TypeAlias = FunctionGroupAccessRights
308+
309+ FunctionJobCollectionAccessRights : TypeAlias = FunctionAccessRights
310+ FunctionJobCollectionAccessRightsDB : TypeAlias = FunctionAccessRightsDB
311+ FunctionJobCollectionUserAccessRights : TypeAlias = FunctionUserAccessRights
312+ FunctionJobCollectionGroupAccessRights : TypeAlias = FunctionGroupAccessRights
0 commit comments