|  | 
| 3 | 3 | 
 | 
| 4 | 4 | from models_library.rpc_pagination import PageRpc | 
| 5 | 5 | from pydantic import BaseModel, ConfigDict, Field, HttpUrl, NonNegativeInt | 
|  | 6 | +from pydantic.config import JsonDict | 
| 6 | 7 | 
 | 
| 7 | 8 | from ..boot_options import BootOptions | 
| 8 | 9 | from ..emails import LowerCaseEmailStr | 
|  | 
| 21 | 22 | from ..services_types import ServiceKey, ServiceVersion | 
| 22 | 23 | from ..utils.change_case import snake_to_camel | 
| 23 | 24 | 
 | 
| 24 |  | - | 
| 25 |  | -class ServiceUpdate(ServiceMetaDataEditable, ServiceAccessRights): | 
| 26 |  | -    model_config = ConfigDict( | 
| 27 |  | -        json_schema_extra={ | 
| 28 |  | -            "example": { | 
| 29 |  | -                # ServiceAccessRights | 
| 30 |  | -                "accessRights": { | 
| 31 |  | -                    1: { | 
| 32 |  | -                        "execute_access": False, | 
| 33 |  | -                        "write_access": False, | 
| 34 |  | -                    },  # type: ignore[dict-item] | 
| 35 |  | -                    2: { | 
| 36 |  | -                        "execute_access": True, | 
| 37 |  | -                        "write_access": True, | 
| 38 |  | -                    },  # type: ignore[dict-item] | 
| 39 |  | -                    44: { | 
| 40 |  | -                        "execute_access": False, | 
| 41 |  | -                        "write_access": False, | 
| 42 |  | -                    },  # type: ignore[dict-item] | 
| 43 |  | -                }, | 
| 44 |  | -                # ServiceMetaData = ServiceCommonData + | 
| 45 |  | -                "name": "My Human Readable Service Name", | 
| 46 |  | -                "thumbnail": None, | 
| 47 |  | -                "description": "An interesting service that does something", | 
| 48 |  | -                "classifiers": ["RRID:SCR_018997", "RRID:SCR_019001"], | 
| 49 |  | -                "quality": { | 
| 50 |  | -                    "tsr": { | 
| 51 |  | -                        "r01": {"level": 3, "references": ""}, | 
| 52 |  | -                        "r02": {"level": 2, "references": ""}, | 
| 53 |  | -                        "r03": {"level": 0, "references": ""}, | 
| 54 |  | -                        "r04": {"level": 0, "references": ""}, | 
| 55 |  | -                        "r05": {"level": 2, "references": ""}, | 
| 56 |  | -                        "r06": {"level": 0, "references": ""}, | 
| 57 |  | -                        "r07": {"level": 0, "references": ""}, | 
| 58 |  | -                        "r08": {"level": 1, "references": ""}, | 
| 59 |  | -                        "r09": {"level": 0, "references": ""}, | 
| 60 |  | -                        "r10": {"level": 0, "references": ""}, | 
| 61 |  | -                    }, | 
| 62 |  | -                    "enabled": True, | 
| 63 |  | -                    "annotations": { | 
| 64 |  | -                        "vandv": "", | 
| 65 |  | -                        "purpose": "", | 
| 66 |  | -                        "standards": "", | 
| 67 |  | -                        "limitations": "", | 
| 68 |  | -                        "documentation": "", | 
| 69 |  | -                        "certificationLink": "", | 
| 70 |  | -                        "certificationStatus": "Uncertified", | 
| 71 |  | -                    }, | 
| 72 |  | -                }, | 
| 73 |  | -            } | 
| 74 |  | -        } | 
| 75 |  | -    ) | 
| 76 |  | - | 
| 77 |  | - | 
| 78 | 25 | _EXAMPLE_FILEPICKER: dict[str, Any] = { | 
| 79 | 26 |     "name": "File Picker", | 
| 80 | 27 |     "thumbnail": None, | 
| @@ -209,10 +156,14 @@ class ServiceGet( | 
| 209 | 156 |         description="None when the owner email cannot be found in the database" | 
| 210 | 157 |     ) | 
| 211 | 158 | 
 | 
|  | 159 | +    @staticmethod | 
|  | 160 | +    def _update_json_schema_extra(schema: JsonDict) -> None: | 
|  | 161 | +        schema.update({"examples": [_EXAMPLE_FILEPICKER, _EXAMPLE_SLEEPER]}) | 
|  | 162 | + | 
| 212 | 163 |     model_config = ConfigDict( | 
| 213 | 164 |         extra="ignore", | 
| 214 | 165 |         populate_by_name=True, | 
| 215 |  | -        json_schema_extra={"examples": [_EXAMPLE_FILEPICKER, _EXAMPLE_SLEEPER]}, | 
|  | 166 | +        json_schema_extra=_update_json_schema_extra, | 
| 216 | 167 |     ) | 
| 217 | 168 | 
 | 
| 218 | 169 | 
 | 
| @@ -254,62 +205,70 @@ class ServiceGetV2(BaseModel): | 
| 254 | 205 |         json_schema_extra={"default": []}, | 
| 255 | 206 |     ) | 
| 256 | 207 | 
 | 
|  | 208 | +    @staticmethod | 
|  | 209 | +    def _update_json_schema_extra(schema: JsonDict) -> None: | 
|  | 210 | +        schema.update( | 
|  | 211 | +            { | 
|  | 212 | +                "examples": [ | 
|  | 213 | +                    { | 
|  | 214 | +                        **_EXAMPLE_SLEEPER,  # v2.2.1  (latest) | 
|  | 215 | +                        "history": [ | 
|  | 216 | +                            { | 
|  | 217 | +                                "version": _EXAMPLE_SLEEPER["version"], | 
|  | 218 | +                                "version_display": "Summer Release", | 
|  | 219 | +                                "released": "2024-07-20T15:00:00", | 
|  | 220 | +                            }, | 
|  | 221 | +                            { | 
|  | 222 | +                                "version": "2.0.0", | 
|  | 223 | +                                "compatibility": { | 
|  | 224 | +                                    "canUpdateTo": { | 
|  | 225 | +                                        "version": _EXAMPLE_SLEEPER["version"] | 
|  | 226 | +                                    }, | 
|  | 227 | +                                }, | 
|  | 228 | +                            }, | 
|  | 229 | +                            {"version": "0.9.11"}, | 
|  | 230 | +                            {"version": "0.9.10"}, | 
|  | 231 | +                            { | 
|  | 232 | +                                "version": "0.9.8", | 
|  | 233 | +                                "compatibility": { | 
|  | 234 | +                                    "canUpdateTo": {"version": "0.9.11"}, | 
|  | 235 | +                                }, | 
|  | 236 | +                            }, | 
|  | 237 | +                            { | 
|  | 238 | +                                "version": "0.9.1", | 
|  | 239 | +                                "versionDisplay": "Matterhorn", | 
|  | 240 | +                                "released": "2024-01-20T18:49:17", | 
|  | 241 | +                                "compatibility": { | 
|  | 242 | +                                    "can_update_to": {"version": "0.9.11"}, | 
|  | 243 | +                                }, | 
|  | 244 | +                            }, | 
|  | 245 | +                            { | 
|  | 246 | +                                "version": "0.9.0", | 
|  | 247 | +                                "retired": "2024-07-20T15:00:00", | 
|  | 248 | +                            }, | 
|  | 249 | +                            {"version": "0.8.0"}, | 
|  | 250 | +                            {"version": "0.1.0"}, | 
|  | 251 | +                        ], | 
|  | 252 | +                    }, | 
|  | 253 | +                    { | 
|  | 254 | +                        **_EXAMPLE_FILEPICKER_V2, | 
|  | 255 | +                        "history": [ | 
|  | 256 | +                            { | 
|  | 257 | +                                "version": _EXAMPLE_FILEPICKER_V2["version"], | 
|  | 258 | +                                "version_display": "Odei Release", | 
|  | 259 | +                                "released": "2025-03-25T00:00:00", | 
|  | 260 | +                            } | 
|  | 261 | +                        ], | 
|  | 262 | +                    }, | 
|  | 263 | +                ] | 
|  | 264 | +            } | 
|  | 265 | +        ) | 
|  | 266 | + | 
| 257 | 267 |     model_config = ConfigDict( | 
| 258 | 268 |         extra="forbid", | 
| 259 | 269 |         populate_by_name=True, | 
| 260 | 270 |         alias_generator=snake_to_camel, | 
| 261 |  | -        json_schema_extra={ | 
| 262 |  | -            "examples": [ | 
| 263 |  | -                { | 
| 264 |  | -                    **_EXAMPLE_SLEEPER,  # v2.2.1  (latest) | 
| 265 |  | -                    "history": [ | 
| 266 |  | -                        { | 
| 267 |  | -                            "version": _EXAMPLE_SLEEPER["version"], | 
| 268 |  | -                            "version_display": "Summer Release", | 
| 269 |  | -                            "released": "2024-07-20T15:00:00", | 
| 270 |  | -                        }, | 
| 271 |  | -                        { | 
| 272 |  | -                            "version": "2.0.0", | 
| 273 |  | -                            "compatibility": { | 
| 274 |  | -                                "canUpdateTo": {"version": _EXAMPLE_SLEEPER["version"]}, | 
| 275 |  | -                            }, | 
| 276 |  | -                        }, | 
| 277 |  | -                        {"version": "0.9.11"}, | 
| 278 |  | -                        {"version": "0.9.10"}, | 
| 279 |  | -                        { | 
| 280 |  | -                            "version": "0.9.8", | 
| 281 |  | -                            "compatibility": { | 
| 282 |  | -                                "canUpdateTo": {"version": "0.9.11"}, | 
| 283 |  | -                            }, | 
| 284 |  | -                        }, | 
| 285 |  | -                        { | 
| 286 |  | -                            "version": "0.9.1", | 
| 287 |  | -                            "versionDisplay": "Matterhorn", | 
| 288 |  | -                            "released": "2024-01-20T18:49:17", | 
| 289 |  | -                            "compatibility": { | 
| 290 |  | -                                "can_update_to": {"version": "0.9.11"}, | 
| 291 |  | -                            }, | 
| 292 |  | -                        }, | 
| 293 |  | -                        { | 
| 294 |  | -                            "version": "0.9.0", | 
| 295 |  | -                            "retired": "2024-07-20T15:00:00", | 
| 296 |  | -                        }, | 
| 297 |  | -                        {"version": "0.8.0"}, | 
| 298 |  | -                        {"version": "0.1.0"}, | 
| 299 |  | -                    ], | 
| 300 |  | -                }, | 
| 301 |  | -                { | 
| 302 |  | -                    **_EXAMPLE_FILEPICKER_V2, | 
| 303 |  | -                    "history": [ | 
| 304 |  | -                        { | 
| 305 |  | -                            "version": _EXAMPLE_FILEPICKER_V2["version"], | 
| 306 |  | -                            "version_display": "Odei Release", | 
| 307 |  | -                            "released": "2025-03-25T00:00:00", | 
| 308 |  | -                        } | 
| 309 |  | -                    ], | 
| 310 |  | -                }, | 
| 311 |  | -            ] | 
| 312 |  | -        }, | 
|  | 271 | +        json_schema_extra=_update_json_schema_extra, | 
| 313 | 272 |     ) | 
| 314 | 273 | 
 | 
| 315 | 274 | 
 | 
|  | 
0 commit comments