fractal-server 2.17.0a3__py3-none-any.whl → 2.17.0a5__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.
Files changed (65) hide show
  1. fractal_server/__init__.py +1 -1
  2. fractal_server/__main__.py +137 -120
  3. fractal_server/app/models/security.py +19 -21
  4. fractal_server/app/models/user_settings.py +1 -0
  5. fractal_server/app/models/v2/task_group.py +1 -0
  6. fractal_server/app/routes/admin/v2/accounting.py +3 -3
  7. fractal_server/app/routes/admin/v2/impersonate.py +2 -2
  8. fractal_server/app/routes/admin/v2/job.py +6 -6
  9. fractal_server/app/routes/admin/v2/profile.py +4 -4
  10. fractal_server/app/routes/admin/v2/project.py +2 -2
  11. fractal_server/app/routes/admin/v2/resource.py +42 -8
  12. fractal_server/app/routes/admin/v2/task.py +2 -2
  13. fractal_server/app/routes/admin/v2/task_group.py +5 -5
  14. fractal_server/app/routes/admin/v2/task_group_lifecycle.py +4 -4
  15. fractal_server/app/routes/api/__init__.py +5 -5
  16. fractal_server/app/routes/api/v2/dataset.py +10 -19
  17. fractal_server/app/routes/api/v2/history.py +8 -8
  18. fractal_server/app/routes/api/v2/images.py +5 -5
  19. fractal_server/app/routes/api/v2/job.py +8 -8
  20. fractal_server/app/routes/api/v2/pre_submission_checks.py +3 -3
  21. fractal_server/app/routes/api/v2/project.py +6 -6
  22. fractal_server/app/routes/api/v2/status_legacy.py +2 -2
  23. fractal_server/app/routes/api/v2/submit.py +24 -26
  24. fractal_server/app/routes/api/v2/task.py +6 -7
  25. fractal_server/app/routes/api/v2/task_collection.py +4 -3
  26. fractal_server/app/routes/api/v2/task_collection_custom.py +4 -3
  27. fractal_server/app/routes/api/v2/task_collection_pixi.py +2 -2
  28. fractal_server/app/routes/api/v2/task_group.py +6 -6
  29. fractal_server/app/routes/api/v2/task_group_lifecycle.py +4 -4
  30. fractal_server/app/routes/api/v2/task_version_update.py +3 -3
  31. fractal_server/app/routes/api/v2/workflow.py +9 -9
  32. fractal_server/app/routes/api/v2/workflow_import.py +2 -2
  33. fractal_server/app/routes/api/v2/workflowtask.py +5 -5
  34. fractal_server/app/routes/auth/__init__.py +34 -5
  35. fractal_server/app/routes/auth/current_user.py +22 -67
  36. fractal_server/app/routes/auth/group.py +8 -35
  37. fractal_server/app/routes/auth/register.py +2 -2
  38. fractal_server/app/routes/auth/users.py +5 -46
  39. fractal_server/app/schemas/__init__.py +0 -1
  40. fractal_server/app/schemas/user.py +23 -0
  41. fractal_server/app/schemas/v2/task_group.py +1 -0
  42. fractal_server/app/security/__init__.py +134 -46
  43. fractal_server/app/security/signup_email.py +52 -34
  44. fractal_server/config/__init__.py +1 -7
  45. fractal_server/config/_email.py +10 -47
  46. fractal_server/config/_main.py +14 -3
  47. fractal_server/migrations/versions/f65ee53991e3_user_settings_related.py +67 -0
  48. fractal_server/runner/config/_slurm.py +3 -2
  49. fractal_server/runner/executors/slurm_common/base_slurm_runner.py +2 -2
  50. fractal_server/runner/executors/slurm_common/get_slurm_config.py +1 -1
  51. fractal_server/runner/executors/slurm_common/slurm_config.py +7 -13
  52. fractal_server/runner/executors/slurm_ssh/runner.py +1 -1
  53. fractal_server/runner/executors/slurm_sudo/runner.py +1 -1
  54. fractal_server/runner/v2/_slurm_ssh.py +2 -1
  55. fractal_server/runner/v2/_slurm_sudo.py +1 -1
  56. fractal_server/runner/v2/submit_workflow.py +12 -12
  57. {fractal_server-2.17.0a3.dist-info → fractal_server-2.17.0a5.dist-info}/METADATA +1 -2
  58. {fractal_server-2.17.0a3.dist-info → fractal_server-2.17.0a5.dist-info}/RECORD +61 -64
  59. fractal_server/app/routes/aux/validate_user_settings.py +0 -76
  60. fractal_server/app/schemas/user_settings.py +0 -63
  61. fractal_server/app/user_settings.py +0 -32
  62. fractal_server/config/_init_data.py +0 -27
  63. {fractal_server-2.17.0a3.dist-info → fractal_server-2.17.0a5.dist-info}/WHEEL +0 -0
  64. {fractal_server-2.17.0a3.dist-info → fractal_server-2.17.0a5.dist-info}/entry_points.txt +0 -0
  65. {fractal_server-2.17.0a3.dist-info → fractal_server-2.17.0a5.dist-info}/licenses/LICENSE +0 -0
@@ -54,7 +54,7 @@ class SudoSlurmRunner(BaseSlurmRunner):
54
54
  resource: Resource,
55
55
  # Specific
56
56
  profile: Profile,
57
- user_cache_dir: str | None = None, # FIXME: make required?
57
+ user_cache_dir: str,
58
58
  slurm_account: str | None = None,
59
59
  ) -> None:
60
60
  """
@@ -50,7 +50,7 @@ def process_workflow(
50
50
  fractal_ssh: FractalSSH | None = None,
51
51
  slurm_account: str | None = None,
52
52
  worker_init: str | None = None,
53
- user_cache_dir: str | None = None,
53
+ user_cache_dir: str,
54
54
  ) -> None:
55
55
  """
56
56
  Run a workflow through a `slurm_ssh` backend.
@@ -105,6 +105,7 @@ def process_workflow(
105
105
  resource=resource,
106
106
  profile=profile,
107
107
  common_script_lines=worker_init,
108
+ user_cache_dir=user_cache_dir,
108
109
  ) as runner:
109
110
  execute_tasks_v2(
110
111
  wf_task_list=workflow.task_list[
@@ -44,7 +44,7 @@ def process_workflow(
44
44
  user_id: int,
45
45
  resource: Resource,
46
46
  profile: Profile,
47
- user_cache_dir: str | None = None,
47
+ user_cache_dir: str,
48
48
  slurm_account: str | None = None,
49
49
  worker_init: str | None = None,
50
50
  fractal_ssh: FractalSSH | None = None,
@@ -52,6 +52,7 @@ class ProcessWorkflowType(Protocol):
52
52
  user_id: int,
53
53
  resource: Resource,
54
54
  profile: Profile,
55
+ user_cache_dir: str,
55
56
  ) -> None:
56
57
  ...
57
58
 
@@ -84,10 +85,10 @@ def submit_workflow(
84
85
  dataset_id: int,
85
86
  job_id: int,
86
87
  user_id: int,
87
- worker_init: str | None = None,
88
- user_cache_dir: str | None = None, # FIXME: review this
88
+ user_cache_dir: str,
89
89
  resource: Resource,
90
90
  profile: Profile,
91
+ worker_init: str | None = None,
91
92
  fractal_ssh: FractalSSH | None = None,
92
93
  ) -> None:
93
94
  """
@@ -110,8 +111,10 @@ def submit_workflow(
110
111
  Custom executor parameters that get parsed before the execution of
111
112
  each task.
112
113
  user_cache_dir:
113
- Cache directory (namely a path where the user can write); for the
114
- slurm backend, this is used as a base directory for FIXME.
114
+ Cache directory (namely a path where the user can write). For
115
+ `slurm_sudo` backend, this is both a base directory for
116
+ `job.working_dir_user`. For `slurm_sudo` and `slurm_ssh` backends,
117
+ this is used for `user_local_exports`.
115
118
  resource:
116
119
  Computational resource to be used for this job (e.g. a SLURM
117
120
  cluster).
@@ -224,22 +227,18 @@ def submit_workflow(
224
227
  job_working_dir = job.working_dir
225
228
 
226
229
  try:
230
+ process_workflow: ProcessWorkflowType
227
231
  match resource.type:
228
232
  case ResourceType.LOCAL:
229
- process_workflow: ProcessWorkflowType = local_process_workflow
233
+ process_workflow = local_process_workflow
230
234
  backend_specific_kwargs = {}
231
235
  case ResourceType.SLURM_SUDO:
232
- process_workflow: ProcessWorkflowType = (
233
- slurm_sudo_process_workflow
234
- )
236
+ process_workflow = slurm_sudo_process_workflow
235
237
  backend_specific_kwargs = dict(
236
238
  slurm_account=job.slurm_account,
237
- user_cache_dir=user_cache_dir,
238
239
  )
239
240
  case ResourceType.SLURM_SSH:
240
- process_workflow: ProcessWorkflowType = (
241
- slurm_ssh_process_workflow
242
- )
241
+ process_workflow = slurm_ssh_process_workflow
243
242
  backend_specific_kwargs = dict(
244
243
  fractal_ssh=fractal_ssh,
245
244
  slurm_account=job.slurm_account,
@@ -260,6 +259,7 @@ def submit_workflow(
260
259
  job_type_filters=job.type_filters,
261
260
  resource=resource,
262
261
  profile=profile,
262
+ user_cache_dir=user_cache_dir,
263
263
  **backend_specific_kwargs,
264
264
  )
265
265
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: fractal-server
3
- Version: 2.17.0a3
3
+ Version: 2.17.0a5
4
4
  Summary: Backend component of the Fractal analytics platform
5
5
  License-Expression: BSD-3-Clause
6
6
  License-File: LICENSE
@@ -12,7 +12,6 @@ Classifier: Programming Language :: Python :: 3.11
12
12
  Classifier: Programming Language :: Python :: 3.12
13
13
  Classifier: Programming Language :: Python :: 3.13
14
14
  Requires-Dist: alembic (>=1.13.1,<2.0.0)
15
- Requires-Dist: cryptography (>=46.0.0,<47.0.0)
16
15
  Requires-Dist: fabric (>=3.2.2,<3.3.0)
17
16
  Requires-Dist: fastapi (>=0.118.0,<0.119.0)
18
17
  Requires-Dist: fastapi-users[oauth] (>=14,<15)
@@ -1,13 +1,13 @@
1
- fractal_server/__init__.py,sha256=YYkQ4fP_RQVqWwpST5d0s-RJ5FtY5G_sNYWamXlyRME,25
2
- fractal_server/__main__.py,sha256=UubAVie8iODHu1jj3brTFVqzsEZrL070LjnE3XacpF0,10777
1
+ fractal_server/__init__.py,sha256=twgXmjGJdfHSKap7ALSL1NPDHaBCT4z5bFl9BlhdIyk,25
2
+ fractal_server/__main__.py,sha256=68FlTuST3zbzVofFI8JSYsSBrBQ07Bv3Mu3PsZX9Fw0,11423
3
3
  fractal_server/alembic.ini,sha256=MWwi7GzjzawI9cCAK1LW7NxIBQDUqD12-ptJoq5JpP0,3153
4
4
  fractal_server/app/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
5
5
  fractal_server/app/db/__init__.py,sha256=sttX0mHVV0ESI1SJ1kcxUKiuEwqeP-BWsst0o_9Yo44,2810
6
6
  fractal_server/app/models/__init__.py,sha256=xJWiGAwpXmCpnFMC4c_HTqoUCzMOXrakoGLUH_uMvdA,415
7
7
  fractal_server/app/models/linkusergroup.py,sha256=3KkkE4QIUAlTrBAZs_tVy0pGvAxUAq6yOEjflct_z2M,678
8
8
  fractal_server/app/models/linkuserproject.py,sha256=hvaxh3Lkiy2uUCwB8gvn8RorCpvxSSdzWdCS_U1GL7g,315
9
- fractal_server/app/models/security.py,sha256=R20lgbRx8I_6xcaCUcg1TP8uhsnNAmqcswAXGad5xjw,3948
10
- fractal_server/app/models/user_settings.py,sha256=Mel2DGZzFSeS8xfWjiQcdpb6MR29c21e-W7zweLm_uI,1091
9
+ fractal_server/app/models/security.py,sha256=snHmvnjYnq37qcXlUfieTUDz9bf-djOMeXMixP5EW3g,3736
10
+ fractal_server/app/models/user_settings.py,sha256=6Cc4r6ZVcASwlcPtnKZfKe2OidzOafQlmzWYZNTpRYU,1126
11
11
  fractal_server/app/models/v2/__init__.py,sha256=A668GF4z_UPar6kAOwC-o_qUo3CIRJ3SmBGYTs3Xc7k,923
12
12
  fractal_server/app/models/v2/accounting.py,sha256=i-2TsjqyuclxFQ21C-TeDoss7ZBTRuXdzIJfVr2UxwE,1081
13
13
  fractal_server/app/models/v2/dataset.py,sha256=P_zy4dPQAqrCALQ6737VkAFk1SvcgYjnslGUZhPI8sc,1226
@@ -17,23 +17,23 @@ fractal_server/app/models/v2/profile.py,sha256=dH5xftMYThd6xqw86a--2MPCysxGTLTsy
17
17
  fractal_server/app/models/v2/project.py,sha256=b6QZaMutwTfT1e_1mDDuwccgKVs4pcB0SMSYTtvfMrg,866
18
18
  fractal_server/app/models/v2/resource.py,sha256=RPQqOp1auoiXdPf27QazSXvzuUz9iPN1qfh7cRwxF64,3536
19
19
  fractal_server/app/models/v2/task.py,sha256=iBIQB8POQE5MyKvLZhw7jZWlBhbrThzCDzRTcgiAczQ,1493
20
- fractal_server/app/models/v2/task_group.py,sha256=kqjm76Ozb5BrklV_qMR9Q_ONzGMH9gu7h-3f-Xg5Eeg,4702
20
+ fractal_server/app/models/v2/task_group.py,sha256=sOlBhOkDyIJN19yD358TsQtDJOVSeGhHffrxgB3KkkQ,4753
21
21
  fractal_server/app/models/v2/workflow.py,sha256=gBjDXO-RytVT81aAlesImBhmVHrwNUrmsF_UsGa1qLM,1057
22
22
  fractal_server/app/models/v2/workflowtask.py,sha256=qkTc-hcFLpJUVsEUbnDq2BJL0qg9jagy2doZeusF1ek,1266
23
23
  fractal_server/app/routes/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
24
24
  fractal_server/app/routes/admin/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
25
25
  fractal_server/app/routes/admin/v2/__init__.py,sha256=SzLurEzKBRWHcIFh2mpac2wrGAWJwv9WW-Ry2DiNkZY,1161
26
26
  fractal_server/app/routes/admin/v2/_aux_functions.py,sha256=fqA5sUCFuD2iVANQt2WUUfVOEVz5egQA7inzUKYGCw0,1684
27
- fractal_server/app/routes/admin/v2/accounting.py,sha256=-eLzBirENvdhjhrCf6bs1pTriIui19DAr_k-zuJB7Y8,3593
28
- fractal_server/app/routes/admin/v2/impersonate.py,sha256=gc4lshfEPFR6W2asH7aKu6hqE6chzusdhAUVV9p51eU,1131
29
- fractal_server/app/routes/admin/v2/job.py,sha256=6NG93I-yQTlJZ1AIhMPwuizQcQvFlvI7kGJ8jG94Igg,8595
30
- fractal_server/app/routes/admin/v2/profile.py,sha256=yK42jYTo2cEETx6oWbe3ZJCORtZHqCVS2uQq91H6wG8,2745
31
- fractal_server/app/routes/admin/v2/project.py,sha256=MA_LdoEuSuisSGRO43TapMuJ080y5iaUGSAUgKuuKOg,1188
32
- fractal_server/app/routes/admin/v2/resource.py,sha256=ogUBRPIDUYEuwo7yYzVXz6w11nAquPZl52rT5aCz9Xw,6557
33
- fractal_server/app/routes/admin/v2/task.py,sha256=e1UxsA6CWeYqvnHqxySE78ckRuE0EK60X02VMnkG2gg,4309
34
- fractal_server/app/routes/admin/v2/task_group.py,sha256=7-Axk5SG6Nw02p7pc6Q6_EtO9Ncy74pVXvt2GCG-Iuc,6043
35
- fractal_server/app/routes/admin/v2/task_group_lifecycle.py,sha256=h3OYIwhzG8eCaXFGTZlAIQlpgvlaknrskbVVaTBwCp8,10006
36
- fractal_server/app/routes/api/__init__.py,sha256=wyEcQ8hXPvqU8M-YPVaRHMFheuDdfRvdX2sDQtMgxpg,1423
27
+ fractal_server/app/routes/admin/v2/accounting.py,sha256=DjgMqzdrL8hYMn19cZj2pkwtLKl3QfBwxd473kH4KaI,3584
28
+ fractal_server/app/routes/admin/v2/impersonate.py,sha256=ictDjuvBr3iLv3YtwkVRMNQRq5qtPAeAXbbC7STSsEg,1125
29
+ fractal_server/app/routes/admin/v2/job.py,sha256=sFgMbOtUCIJ-ri6YD3ZWP7XETZZDQsLqPfT1kaH9RHQ,8577
30
+ fractal_server/app/routes/admin/v2/profile.py,sha256=h9R4bwZQXBg0FAm2lj-DQ3vKQSFDtvjRARFpxfI3WR4,2733
31
+ fractal_server/app/routes/admin/v2/project.py,sha256=rRq7ZDngr_29skASnte1xfycZCjK-WPdeTf7siBXiCU,1182
32
+ fractal_server/app/routes/admin/v2/resource.py,sha256=uel-MN3f9TkkIJ7flEC4yPH7q2qGQxoaxPB0LxfZzYs,7796
33
+ fractal_server/app/routes/admin/v2/task.py,sha256=B_RfL320acBKFkOa34S0sWI44VCFBE_jg_jGHZASKO8,4303
34
+ fractal_server/app/routes/admin/v2/task_group.py,sha256=sxASS5948inqcP2IU3C2tcLB5egXfxef0TPlVcRtP-U,6028
35
+ fractal_server/app/routes/admin/v2/task_group_lifecycle.py,sha256=W7LjIBAheyjrn0fEz0SsWINqcZK5HMB5GRGMjPrc6a4,9994
36
+ fractal_server/app/routes/api/__init__.py,sha256=wJE77LxZ51p1N9AIX-kd4VdUDEk0RYbCy-T_pn2V73I,1408
37
37
  fractal_server/app/routes/api/v2/__init__.py,sha256=D3sRRsqkmZO6kBxUjg40q0aRDsnuXI4sOOfn0xF9JsM,2820
38
38
  fractal_server/app/routes/api/v2/_aux_functions.py,sha256=8xnXYPjzo1yZfcg18b5ZY5tu9OQ1e55fOnX1IEmDSHk,15019
39
39
  fractal_server/app/routes/api/v2/_aux_functions_history.py,sha256=PXsqMQ3sfkABqAMI7v1_VAzUEDF_-kvaZyyhEicqsCw,4431
@@ -41,43 +41,41 @@ fractal_server/app/routes/api/v2/_aux_functions_task_lifecycle.py,sha256=5gNt35r
41
41
  fractal_server/app/routes/api/v2/_aux_functions_task_version_update.py,sha256=PKjV7r8YsPRXoNiVSnOK4KBYVV3l_Yb_ZPrqAkMkXrQ,1182
42
42
  fractal_server/app/routes/api/v2/_aux_functions_tasks.py,sha256=eAXGnC7yEYGn1g2VDfSGvApN2mw79r4fW7ykRlDY2CY,12468
43
43
  fractal_server/app/routes/api/v2/_aux_task_group_disambiguation.py,sha256=8x1_q9FyCzItnPmdSdLQuwUTy4B9xCsXscp97_lJcpM,4635
44
- fractal_server/app/routes/api/v2/dataset.py,sha256=7hSqqE3sFjQjJOZf_QvYbMersjXXbS3YM3a1WDgv1rM,8893
45
- fractal_server/app/routes/api/v2/history.py,sha256=kEhD-TKkORenUUsfyODNBi1jOsGc82h_EWbRKyRkD5k,17102
46
- fractal_server/app/routes/api/v2/images.py,sha256=foA5ZNjMzZWlcYMgYuGSZsm1I-po-8NSYBIMz4ZbkPc,7867
47
- fractal_server/app/routes/api/v2/job.py,sha256=FyK4Aa9XoIcfD0ZpKM-4Bkj3ZcIc93UzDc8jF85uHps,6478
48
- fractal_server/app/routes/api/v2/pre_submission_checks.py,sha256=AEN6w2X5kCkSpZydudvuTPhl_VZUQ4zUav6D3NiF6r8,4935
49
- fractal_server/app/routes/api/v2/project.py,sha256=4NFnMV2pTCwAE5C2dA6NJr_7J1fB-QovAMqoUGFPrhs,4746
50
- fractal_server/app/routes/api/v2/status_legacy.py,sha256=GG-AUdAngFL1QpE8Alo3xPxyKC4csG7DbomYlIfqTEs,6318
51
- fractal_server/app/routes/api/v2/submit.py,sha256=5K7Q7xBCwuBpTHJaC3a3danKWIEBva1HPSbmGp1BU7k,9400
52
- fractal_server/app/routes/api/v2/task.py,sha256=zGB9fMLv71o9aCS6DWXpccHyNvTbYVbnKHhaNHGSLmY,7214
53
- fractal_server/app/routes/api/v2/task_collection.py,sha256=QeT9Eidp1Sm7nhzWgHw_kWYxjRkNSwqxCjXRzCgaSKg,12279
54
- fractal_server/app/routes/api/v2/task_collection_custom.py,sha256=JaO8CQrN5z3hB_YNqE3kOpEsBUXqYOStlN-xf01qK7U,7008
55
- fractal_server/app/routes/api/v2/task_collection_pixi.py,sha256=B8xF9w2nZt-VTiHtAeQ-SCXEg383aLKEFqlXk8Yyl0Y,7250
56
- fractal_server/app/routes/api/v2/task_group.py,sha256=An8EAwZDNx53TVnGBhjgeW7RI_uk-bAlu-6NrqYuaWY,8068
57
- fractal_server/app/routes/api/v2/task_group_lifecycle.py,sha256=3jWQcUvnFlcGsHbSyQSem5TwzP08ADGgO3YIxFZQWIs,10569
58
- fractal_server/app/routes/api/v2/task_version_update.py,sha256=zBYlyqN0UvCfnkqcg945b5jNMRNjSUKJvBz6IPxC0qo,8236
59
- fractal_server/app/routes/api/v2/workflow.py,sha256=iTIasNP2I5ovhHafQ2P8JJuImAl41ucy5y64J7FiP3w,10701
60
- fractal_server/app/routes/api/v2/workflow_import.py,sha256=fsYnFAOwtOR7u2Hod1ij7i_BQjnA2jv2EKzuSPG_pEc,9083
61
- fractal_server/app/routes/api/v2/workflowtask.py,sha256=gwFvC-qU4yb-Q5ey30rOD4u3D0-4jlJzBTuq8udqpzc,7930
62
- fractal_server/app/routes/auth/__init__.py,sha256=fao6CS0WiAjHDTvBzgBVV_bSXFpEAeDBF6Z6q7rRkPc,1658
44
+ fractal_server/app/routes/api/v2/dataset.py,sha256=HhRrReo_isFJFMaUhQfxEQkLj0_lXNfGblzwpLG81VU,8623
45
+ fractal_server/app/routes/api/v2/history.py,sha256=T-7GDLZ_x4cp9PMEozJoEFt4cGFYPDqv9-akYmN2JSU,17150
46
+ fractal_server/app/routes/api/v2/images.py,sha256=_R-F1qrsFv3PPukrwXSa-5swNS4kNghY0DTrxjLC_7E,7897
47
+ fractal_server/app/routes/api/v2/job.py,sha256=fyIYGcplsxzx91FxYWlImp1ATPk5IC8bfIcJkuZOhws,6526
48
+ fractal_server/app/routes/api/v2/pre_submission_checks.py,sha256=DEnlFj6PMNMy9DrnH6_pMW9evdKl6iTlAb0zlzBR1Qs,4953
49
+ fractal_server/app/routes/api/v2/project.py,sha256=eQcQs0ElMpUN0OTcgG7DXk70t9Dn8Fdd6oHeQ0WbgJI,4782
50
+ fractal_server/app/routes/api/v2/status_legacy.py,sha256=vZA4AYMehXbNFgekl4j6p8idETC3IylQQL64CmFCr98,6330
51
+ fractal_server/app/routes/api/v2/submit.py,sha256=jPPvJNeLBcPVl0BsLnOZn_KtxoQvdBnAVnzFVihUJIc,9364
52
+ fractal_server/app/routes/api/v2/task.py,sha256=KDIBrQpIbbVrffOBtxah-gXiOnN-EG84ujXeGPOqKhg,7160
53
+ fractal_server/app/routes/api/v2/task_collection.py,sha256=A0mfajyJVVrWNuI7YaPih7juSWOnks78NnJDwnGfvdo,12281
54
+ fractal_server/app/routes/api/v2/task_collection_custom.py,sha256=9SqiMPuED5LEGKo3Tiq5KfXFqmjaZPg9KWL-Yn5jdLo,7010
55
+ fractal_server/app/routes/api/v2/task_collection_pixi.py,sha256=QHqdnaddTW-DZKrnzLKwCPP5j3UiqxOtFO04aZeexdk,7244
56
+ fractal_server/app/routes/api/v2/task_group.py,sha256=_M_munannm0wMmLdOwo-qATqrl0Vu_TsrpLb-2554fs,8104
57
+ fractal_server/app/routes/api/v2/task_group_lifecycle.py,sha256=ZSn8Ibjwkp89v87OPBquULPc9xsdpBfRvV1PiQdiicw,10593
58
+ fractal_server/app/routes/api/v2/task_version_update.py,sha256=JO5xggiRqay4zNlbjlRa26ygMEue2klSFPyLrXS215k,8254
59
+ fractal_server/app/routes/api/v2/workflow.py,sha256=szb6t9OWOjr0CwboF0fJUyO5jUPj_HRpf5N0CDuHkqc,10755
60
+ fractal_server/app/routes/api/v2/workflow_import.py,sha256=iFy8jPuMMt1DpIcs5iJc5Gzcq-wbMtnk05NdU1y5nkQ,9095
61
+ fractal_server/app/routes/api/v2/workflowtask.py,sha256=-V7WjTfYb2L7i3_dQ0Am_ydqepdqs-j3BY67_5iZPfU,7960
62
+ fractal_server/app/routes/auth/__init__.py,sha256=Y-RQMwY5V25ZVgyYYoFIXvEDQgm6PGTDgxH755oa_NM,2358
63
63
  fractal_server/app/routes/auth/_aux_auth.py,sha256=fyGxBVb6yrVrsE7-2tTyiJ7orb9Jzkg36m_q-rP7Zs8,4868
64
- fractal_server/app/routes/auth/current_user.py,sha256=jvr5AX3tSmxV7HMY8OIiojcYxcX4mF-UIUNwG8CqvVo,7110
65
- fractal_server/app/routes/auth/group.py,sha256=gSyB9iuwCqT6CMDHyO8hYIQ1J341gs8SDrRdHppOMT0,7890
64
+ fractal_server/app/routes/auth/current_user.py,sha256=A8GJpWV90FnheuhhYsAGjiuQn8IAoOVNAR0e53JHwPU,5611
65
+ fractal_server/app/routes/auth/group.py,sha256=wZnqzIOZHpoUW2Yp6dkAMRqIiM_otVdG4fZuBYmLocA,6919
66
66
  fractal_server/app/routes/auth/login.py,sha256=tSu6OBLOieoBtMZB4JkBAdEgH2Y8KqPGSbwy7NIypIo,566
67
67
  fractal_server/app/routes/auth/oauth.py,sha256=iI2vEdvDlEE5BrFz5Krq96VUk39HDuE0NzqW9fS3dDE,2261
68
- fractal_server/app/routes/auth/register.py,sha256=DlHq79iOvGd_gt2v9uwtsqIKeO6i_GKaW59VIkllPqY,587
68
+ fractal_server/app/routes/auth/register.py,sha256=Ola-lNdYYEOK8Wh0Q-TFKwIJ25e6UswlUojJ8QGBCfc,581
69
69
  fractal_server/app/routes/auth/router.py,sha256=-E87A8h2UvcLucy5xjzKiWbXHVKcqxUmmZGeV_utEzA,598
70
- fractal_server/app/routes/auth/users.py,sha256=8QMjZ3nq-UGX4pamCTesEtWO8I9BYalLh1FlLwRp9BA,8310
70
+ fractal_server/app/routes/auth/users.py,sha256=L94-1A62FFfASflURggYsVDOxtWNRU-gK6eSx8ZckyA,6921
71
71
  fractal_server/app/routes/aux/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
72
72
  fractal_server/app/routes/aux/_job.py,sha256=nqqdcW5B7fL_PbvHf57_TcifjUfcMgl04tKNvG2sV1U,628
73
73
  fractal_server/app/routes/aux/_runner.py,sha256=SDzI7glEfkW_XecWFuRQitbSWSvAPegI-J5c7i5d0_w,957
74
74
  fractal_server/app/routes/aux/validate_user_profile.py,sha256=fGqJDdAFkbQoEIjqZ5F9-SDY_4os63R2EUMqODC7eBg,1969
75
- fractal_server/app/routes/aux/validate_user_settings.py,sha256=C_V5QhnBppyr-YYoni_yVrooU5bKfSTrwM-ea2m5pqU,2405
76
75
  fractal_server/app/routes/pagination.py,sha256=IGy8Ll5lYr6ENYE18h3huH5s0GMX1DCs5VdCi6j1cdk,1174
77
- fractal_server/app/schemas/__init__.py,sha256=stURAU_t3AOBaH0HSUbV-GKhlPKngnnIMoqWc3orFyI,135
78
- fractal_server/app/schemas/user.py,sha256=gMvnEZcbHIoFTzyZE9VX-GGut3iYcpbs0Xo33eKC9aw,2136
76
+ fractal_server/app/schemas/__init__.py,sha256=VIWJCaqokte3OljDLX00o-EC2d12rFoPb5HOLKQI94Y,86
77
+ fractal_server/app/schemas/user.py,sha256=nXsE4yEt8xiMlr2IhLoul0M0x2vYWaXIJBG_-NmRj6w,2919
79
78
  fractal_server/app/schemas/user_group.py,sha256=x3-kqbo0q2wTP7QI0iZ7PU_9Dr957UYrFMKqS7BXLhE,1425
80
- fractal_server/app/schemas/user_settings.py,sha256=x-MS4Hq0RWkE3in6Su454Yk_cmbfY1lnIzjM82jij5U,1692
81
79
  fractal_server/app/schemas/v2/__init__.py,sha256=ShdbfHQe_MNMQzyjaEl7NGj30h2u8mUD9-UX3hsS3sA,3669
82
80
  fractal_server/app/schemas/v2/accounting.py,sha256=C_ekrYQwhi7PtrxxB07oVAG2y1NLigXjYwyp4E38fao,396
83
81
  fractal_server/app/schemas/v2/dataset.py,sha256=NKCjBwGBC7mPiSlXktZAcleJsvlLY6KfNKw7Wx4Zfqk,1728
@@ -91,18 +89,16 @@ fractal_server/app/schemas/v2/resource.py,sha256=4iXzZJeHVLcXYY08-okoJM_4gqpzhG4
91
89
  fractal_server/app/schemas/v2/status_legacy.py,sha256=eQT1zGxbkzSwd0EqclsOdZ60n1x6J3DB1CZ3m4LYyxc,955
92
90
  fractal_server/app/schemas/v2/task.py,sha256=IJv8loB4kx9FBkaIHoiMsswQyq02FxvyAnHK1u074fU,4364
93
91
  fractal_server/app/schemas/v2/task_collection.py,sha256=BzHQXq2_zLZTbigWauOR5Zi-mlsqCIF2NEF_z12Nqxg,4480
94
- fractal_server/app/schemas/v2/task_group.py,sha256=DzgcUvn3rZvttk6Zrbyr3Kw8YYYF-rPiGkGzV_fdzSQ,3415
92
+ fractal_server/app/schemas/v2/task_group.py,sha256=anC7YPiOEcLmxN2JyARLMMHp6l7NfvsCpx3sMcnug4o,3436
95
93
  fractal_server/app/schemas/v2/workflow.py,sha256=L-dW6SzCH_VNoH6ENip44lTgGGqVYHHBk_3PtM-Ooy8,1772
96
94
  fractal_server/app/schemas/v2/workflowtask.py,sha256=6eweAMyziwaoMT-7R1fVJYunIeZKzT0-7fAVgPO_FEc,3639
97
- fractal_server/app/security/__init__.py,sha256=eiYSoUA0XrRGKGKnBOK1KxLhQT9gK0H11ndok2md46c,13841
98
- fractal_server/app/security/signup_email.py,sha256=RgU9ia092778j35W4Iil3Ke9wNpPzKH6rjpE0zM9Zb4,1486
95
+ fractal_server/app/security/__init__.py,sha256=gtfJkwdXTm_F38sFgb5LH3AcdvKs42fOUJa8jo8Cmbw,17484
96
+ fractal_server/app/security/signup_email.py,sha256=kphjq6TAygvPpYpg95QJWefyqmzdVrGz7fyRMctUJWE,1982
99
97
  fractal_server/app/shutdown.py,sha256=ViSNJyXWU_iWPSDOOMGNh_iQdUFrdPh_jvf8vVKLpAo,1950
100
- fractal_server/app/user_settings.py,sha256=5thFLR6de-CiaUyDZG9Bpn-P97vraDk4TP85eDuh8io,898
101
- fractal_server/config/__init__.py,sha256=VrS810yeeEcZg_NI2-x8KJoAuVMnbumA-sWOLAeHEI4,729
98
+ fractal_server/config/__init__.py,sha256=EDk6ylmCXc8FoCYWTQ1bC-27yZ7iYHWxbhcjjMbQX2A,611
102
99
  fractal_server/config/_database.py,sha256=YOBi3xuJno5wLGw1hKsjLm-bftaxVWiBNIQWVTMX3Ag,1661
103
- fractal_server/config/_email.py,sha256=iiUP5Be9AzDDJmVsWfTFzLt9XreTFt9pRcX7f9eRNvw,5682
104
- fractal_server/config/_init_data.py,sha256=w4fUSFhQtCeN_HiUnLldLBL19Yvawva5iUV-vJcdvcA,838
105
- fractal_server/config/_main.py,sha256=NaKnNjkGZQdHjWPRuwa42I2a024Yqg3zuFUM0vMJzlo,3630
100
+ fractal_server/config/_email.py,sha256=j1QmZCyspNbD1xxkypc9Kv299tU3vTO1AqDFJ8-LZzQ,4201
101
+ fractal_server/config/_main.py,sha256=Xtcz2q2HuHYdk7DaD6uBG1KtQeBiQhKz6CANvevg1AA,3877
106
102
  fractal_server/config/_oauth.py,sha256=OYWqJnL0yn8ymagKb4fK-2zNqXVBbumRWwZrr9TFUms,1926
107
103
  fractal_server/config/_settings_config.py,sha256=tsyXQOnn9QKCFJD6hRo_dJXlQQyl70DbqgHMJoZ1xnY,144
108
104
  fractal_server/data_migrations/2_14_10.py,sha256=jzMg2c1zNO8C_Nho_9_EZJD6kR1-gkFNpNrMR5Hr8hM,1598
@@ -162,13 +158,14 @@ fractal_server/migrations/versions/e81103413827_add_job_type_filters.py,sha256=t
162
158
  fractal_server/migrations/versions/efa89c30e0a4_add_project_timestamp_created.py,sha256=jilQW3QIqYQ4Q6hCnUiG7UtNMpA41ujqrB3tPFiPM1Q,1221
163
159
  fractal_server/migrations/versions/f37aceb45062_make_historyunit_logfile_required.py,sha256=jLHcVq9z0Ou20u-mwPf6EICDKY4dwFAzBgbRRx9_xDw,1007
164
160
  fractal_server/migrations/versions/f384e1c0cf5d_drop_task_default_args_columns.py,sha256=9BwqUS9Gf7UW_KjrzHbtViC880qhD452KAytkHWWZyk,746
161
+ fractal_server/migrations/versions/f65ee53991e3_user_settings_related.py,sha256=q9oaVpp85X4EZt3f33ThyBDZD3_9trO2va9uAIh2yK0,1883
165
162
  fractal_server/migrations/versions/fbce16ff4e47_new_history_items.py,sha256=TDWCaIoM0Q4SpRWmR9zr_rdp3lJXhCfBPTMhtrP5xYE,3950
166
163
  fractal_server/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
167
164
  fractal_server/runner/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
168
165
  fractal_server/runner/components.py,sha256=-Ii5l8d_V6f5DFOd-Zsr8VYmOsyqw0Hox9fEFQiuqxY,66
169
166
  fractal_server/runner/config/__init__.py,sha256=a-vSrvWBeMVnxTtYoy-f5Ibt_mM8MM3F7jqnPvvjHSY,108
170
167
  fractal_server/runner/config/_local.py,sha256=_t3s56MAfg5jI8ZOiRSdbvCJLqvQK6kjyAzJ_Fh0KqY,603
171
- fractal_server/runner/config/_slurm.py,sha256=IXw8LOisjH7uRK8-ejBXireFrnnqDwy8_cMEHqybyks,3574
168
+ fractal_server/runner/config/_slurm.py,sha256=g8zv-r2aP3vfkY-orKRGO6JbC6yxprR4yOwtpP3uKcg,3633
172
169
  fractal_server/runner/config/slurm_mem_to_MB.py,sha256=twtBHIyY3SITe9q1uvH5rQx0QbY_AzexgYB9gaMkVok,2004
173
170
  fractal_server/runner/exceptions.py,sha256=N8DLn7tuV8zMSdr8xdJN0aIdytPveSCeQ1Y5IoxXW-8,1778
174
171
  fractal_server/runner/executors/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -180,31 +177,31 @@ fractal_server/runner/executors/local/runner.py,sha256=cwQyPfSXyvLTigU4hfyQuCTps
180
177
  fractal_server/runner/executors/slurm_common/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
181
178
  fractal_server/runner/executors/slurm_common/_batching.py,sha256=la_FXt4ErYU63vkmk2SGZcSOqq-Jzp_L9tZfzBY7rlU,8806
182
179
  fractal_server/runner/executors/slurm_common/_job_states.py,sha256=nuV-Zba38kDrRESOVB3gaGbrSPZc4q7YGichQaeqTW0,238
183
- fractal_server/runner/executors/slurm_common/base_slurm_runner.py,sha256=y0sT_xgWKe3KF-b6d6IG46_CMnkeWFwkOmSeozVUsKY,41014
184
- fractal_server/runner/executors/slurm_common/get_slurm_config.py,sha256=04uml3J4Cv0aOhzOYphGNtYQAuCy3hegDXNTpBFBSNM,7024
180
+ fractal_server/runner/executors/slurm_common/base_slurm_runner.py,sha256=jnUuoHDwNu1UL0FWu61PjY8GLgK20PvVBpJRwRCKJP8,40969
181
+ fractal_server/runner/executors/slurm_common/get_slurm_config.py,sha256=kQQtc4o5Ya3gLMB6x9xuuyDX6jKpa0bSqkHeiAz7lTM,7071
185
182
  fractal_server/runner/executors/slurm_common/remote.py,sha256=2ByWIHFKL1bW6CS04ijrJvX4jH8CpX2Pp-QhAncc-Hs,3806
186
- fractal_server/runner/executors/slurm_common/slurm_config.py,sha256=odTA7KiscnyhyLZp6gqT02N1jWFY72b8TWYi12BNczA,8145
183
+ fractal_server/runner/executors/slurm_common/slurm_config.py,sha256=hnZWxgXZsawubPNRHPXMHe1eD8cT44z1BTuKaYqPLTU,7895
187
184
  fractal_server/runner/executors/slurm_common/slurm_job_task_models.py,sha256=wOVtACSFLulc0gUwXlj_SXJHIQmgHpseohw-SahT1DM,3517
188
185
  fractal_server/runner/executors/slurm_ssh/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
189
186
  fractal_server/runner/executors/slurm_ssh/run_subprocess.py,sha256=SyW6t4egvbiARph2YkFjc88Hj94fCamZVi50L7ph8VM,996
190
- fractal_server/runner/executors/slurm_ssh/runner.py,sha256=ejViETgV0GF5tRipJy_-PlZu-Y8pDQwO6C4j5S9oILI,10217
187
+ fractal_server/runner/executors/slurm_ssh/runner.py,sha256=1ehjRxcbChvk9mZgqCUCQY69Xpn8JyYH-Db6cQ7Xrt4,10203
191
188
  fractal_server/runner/executors/slurm_ssh/tar_commands.py,sha256=yqBjWTLmh_FzhCllt_KfbuCUGvRhsHLVWlPOZlRWLzY,1762
192
189
  fractal_server/runner/executors/slurm_sudo/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
193
190
  fractal_server/runner/executors/slurm_sudo/_subprocess_run_as_user.py,sha256=9pN0N409M24TXIyhuWJb-Tj0Ztaud68xtQ7wfAibmfk,2566
194
- fractal_server/runner/executors/slurm_sudo/runner.py,sha256=h5YYtgBz2WQ5fu6_ny5B9aK7bgVde5g5nMLKqrDLZf8,5955
191
+ fractal_server/runner/executors/slurm_sudo/runner.py,sha256=a_9c29735U3xqiWGv8WsyBN8SX9SgkGTY1mepNUUh64,5916
195
192
  fractal_server/runner/filenames.py,sha256=lPnxKHtdRizr6FqG3zOdjDPyWA7GoaJGTtiuJV0gA8E,70
196
193
  fractal_server/runner/set_start_and_last_task_index.py,sha256=NsioSzfEpGyo9ZKrV5KsbxeI7d5V3tE678Y3IAo5rHM,1218
197
194
  fractal_server/runner/task_files.py,sha256=MvOrklZrN8iLj3oPx7G-iaEFj2N_mkTOnxIBX-okH1E,4037
198
195
  fractal_server/runner/v2/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
199
196
  fractal_server/runner/v2/_local.py,sha256=js1W8_9QQad_kbvMM8ytjfWX_BEoq8OER9BLdxH0JRs,3759
200
- fractal_server/runner/v2/_slurm_ssh.py,sha256=mZ4G1MTXR1-gI9FY1ckwTzpUROwWSfZ4oTA2odweMZ0,4412
201
- fractal_server/runner/v2/_slurm_sudo.py,sha256=Vi82KecepFM0AH5XXNV3eJ174JZVnMqbdSIJxpf30Gs,4358
197
+ fractal_server/runner/v2/_slurm_ssh.py,sha256=F7Zcs9NpmXDktTX_fQQke99Ov06Hi4XUUDsDKZwOmOI,4437
198
+ fractal_server/runner/v2/_slurm_sudo.py,sha256=f34B6KWtn1Wwm7Y-D95Ecub0vKpA03zYL7jZAF53tfI,4344
202
199
  fractal_server/runner/v2/db_tools.py,sha256=kLB0sGYNuCMPPoP4XDSClPIf7x5lSseTKUjzGk6gAfc,3318
203
200
  fractal_server/runner/v2/deduplicate_list.py,sha256=vidkd7K6u3w0A4zVgsGZkc9mwoP6ihTYJZQUhBNorfE,667
204
201
  fractal_server/runner/v2/merge_outputs.py,sha256=0ahaSwdMFAoEhxVaEaO9nSJuKIcWg9pDZ356ktSHcC0,897
205
202
  fractal_server/runner/v2/runner.py,sha256=1vj6m_ir6RrYNr3Ew98h5hnEAms_TaHPhee52swQ_gA,19404
206
203
  fractal_server/runner/v2/runner_functions.py,sha256=w_i74LCt_9f07w511wslTFhoDUtoE1R-IKcglEGWPIc,19618
207
- fractal_server/runner/v2/submit_workflow.py,sha256=T8Y9OuX9eudNP_b2qpKlsnVOq956oDgaiKDXOIG5W8E,11447
204
+ fractal_server/runner/v2/submit_workflow.py,sha256=s3mo5pLZH5x8V01IZjoJXcbpCl9geZwvISEr5StSBeI,11458
208
205
  fractal_server/runner/v2/task_interface.py,sha256=ftPPpOU16rbJD8q-QV7o_3ey8W7MQTFuWJiYUr4OmF4,2532
209
206
  fractal_server/runner/versions.py,sha256=uz59Dxj7BphnFnr-p0kyaZRH0h4w5Xkd0UJNVGtt4ds,474
210
207
  fractal_server/ssh/__init__.py,sha256=sVUmzxf7_DuXG1xoLQ1_00fo5NPhi2LJipSmU5EAkPs,124
@@ -259,8 +256,8 @@ fractal_server/types/validators/_workflow_task_arguments_validators.py,sha256=HL
259
256
  fractal_server/urls.py,sha256=QjIKAC1a46bCdiPMu3AlpgFbcv6a4l3ABcd5xz190Og,471
260
257
  fractal_server/utils.py,sha256=SYVVUuXe_nWyrJLsy7QA-KJscwc5PHEXjvsW4TK7XQI,2180
261
258
  fractal_server/zip_tools.py,sha256=H0w7wS5yE4ebj7hw1_77YQ959dl2c-L0WX6J_ro1TY4,4884
262
- fractal_server-2.17.0a3.dist-info/METADATA,sha256=c9gB6tEdMduGbJBOJtWzmffCMDEeT0EMQoQVJay9Agg,4319
263
- fractal_server-2.17.0a3.dist-info/WHEEL,sha256=zp0Cn7JsFoX2ATtOhtaFYIiE2rmFAD4OcMhtUki8W3U,88
264
- fractal_server-2.17.0a3.dist-info/entry_points.txt,sha256=8tV2kynvFkjnhbtDnxAqImL6HMVKsopgGfew0DOp5UY,58
265
- fractal_server-2.17.0a3.dist-info/licenses/LICENSE,sha256=QKAharUuhxL58kSoLizKJeZE3mTCBnX6ucmz8W0lxlk,1576
266
- fractal_server-2.17.0a3.dist-info/RECORD,,
259
+ fractal_server-2.17.0a5.dist-info/METADATA,sha256=oUgYkhW5EongBJTrbWUUyPKU6j64g8F9GG4PPY0NR0c,4272
260
+ fractal_server-2.17.0a5.dist-info/WHEEL,sha256=zp0Cn7JsFoX2ATtOhtaFYIiE2rmFAD4OcMhtUki8W3U,88
261
+ fractal_server-2.17.0a5.dist-info/entry_points.txt,sha256=8tV2kynvFkjnhbtDnxAqImL6HMVKsopgGfew0DOp5UY,58
262
+ fractal_server-2.17.0a5.dist-info/licenses/LICENSE,sha256=QKAharUuhxL58kSoLizKJeZE3mTCBnX6ucmz8W0lxlk,1576
263
+ fractal_server-2.17.0a5.dist-info/RECORD,,
@@ -1,76 +0,0 @@
1
- from fastapi import HTTPException
2
- from fastapi import status
3
- from pydantic import ValidationError
4
-
5
- from fractal_server.app.db import AsyncSession
6
- from fractal_server.app.models import UserOAuth
7
- from fractal_server.app.models import UserSettings
8
- from fractal_server.app.schemas.v2 import ResourceType
9
- from fractal_server.app.user_settings import SlurmSshUserSettings
10
- from fractal_server.app.user_settings import SlurmSudoUserSettings
11
- from fractal_server.logger import set_logger
12
-
13
-
14
- logger = set_logger(__name__)
15
-
16
-
17
- def verify_user_has_settings(user: UserOAuth) -> None:
18
- """
19
- Check that the `user.user_settings_id` foreign-key is set.
20
-
21
- NOTE: This check will become useless when we make the foreign-key column
22
- required, but for the moment (as of v2.6.0) we have to keep it in place.
23
-
24
- Args:
25
- user: The user to be checked.
26
- """
27
- if user.user_settings_id is None:
28
- raise HTTPException(
29
- status_code=status.HTTP_422_UNPROCESSABLE_CONTENT,
30
- detail=f"Error: user '{user.email}' has no settings.",
31
- )
32
-
33
-
34
- async def validate_user_settings(
35
- *, user: UserOAuth, backend: str, db: AsyncSession
36
- ) -> UserSettings:
37
- """
38
- Get a UserSettings object and validate it based on a given Fractal backend.
39
-
40
- Args:
41
- user: The user whose settings we should validate.
42
- backend: The value of `FRACTAL_RUNNER_BACKEND`
43
- db: An async DB session
44
-
45
- Returns:
46
- `UserSetting` object associated to `user`, if valid.
47
- """
48
-
49
- verify_user_has_settings(user)
50
-
51
- user_settings = await db.get(UserSettings, user.user_settings_id)
52
-
53
- match backend:
54
- case ResourceType.SLURM_SSH:
55
- UserSettingsValidationModel = SlurmSshUserSettings
56
- case ResourceType.SLURM_SUDO:
57
- UserSettingsValidationModel = SlurmSudoUserSettings
58
- case _:
59
- # For other backends, we don't validate anything
60
- return user_settings
61
-
62
- try:
63
- UserSettingsValidationModel(**user_settings.model_dump())
64
- except ValidationError as e:
65
- error_msg = (
66
- "User settings are not valid for "
67
- f"FRACTAL_RUNNER_BACKEND='{backend}'. "
68
- f"Original error: {str(e)}"
69
- )
70
- logger.warning(error_msg)
71
- raise HTTPException(
72
- status_code=status.HTTP_422_UNPROCESSABLE_CONTENT,
73
- detail=error_msg,
74
- )
75
-
76
- return user_settings
@@ -1,63 +0,0 @@
1
- from pydantic import BaseModel
2
- from pydantic import ConfigDict
3
- from pydantic import field_validator
4
-
5
- from fractal_server.string_tools import validate_cmd
6
- from fractal_server.types import AbsolutePathStr
7
- from fractal_server.types import ListUniqueNonEmptyString
8
- from fractal_server.types import NonEmptyStr
9
-
10
- __all__ = (
11
- "UserSettingsRead",
12
- "UserSettingsReadStrict",
13
- "UserSettingsUpdate",
14
- "UserSettingsUpdateStrict",
15
- )
16
-
17
-
18
- class UserSettingsRead(BaseModel):
19
- """
20
- Schema reserved for superusers
21
- """
22
-
23
- id: int
24
- ssh_host: str | None = None
25
- ssh_username: str | None = None
26
- ssh_private_key_path: str | None = None
27
- slurm_user: str | None = None
28
- slurm_accounts: list[str]
29
- project_dir: str | None = None
30
-
31
-
32
- class UserSettingsReadStrict(BaseModel):
33
- slurm_user: str | None = None
34
- slurm_accounts: list[str]
35
- ssh_username: str | None = None
36
- project_dir: str | None = None
37
-
38
-
39
- class UserSettingsUpdate(BaseModel):
40
- """
41
- Schema reserved for superusers
42
- """
43
-
44
- model_config = ConfigDict(extra="forbid")
45
-
46
- ssh_host: NonEmptyStr | None = None
47
- ssh_username: NonEmptyStr | None = None
48
- ssh_private_key_path: AbsolutePathStr | None = None
49
- slurm_user: NonEmptyStr | None = None
50
- slurm_accounts: ListUniqueNonEmptyString | None = None
51
- project_dir: AbsolutePathStr | None = None
52
-
53
- @field_validator("project_dir", mode="after")
54
- @classmethod
55
- def validate_project_dir(cls, value):
56
- if value is not None:
57
- validate_cmd(value)
58
- return value
59
-
60
-
61
- class UserSettingsUpdateStrict(BaseModel):
62
- model_config = ConfigDict(extra="forbid")
63
- slurm_accounts: ListUniqueNonEmptyString | None = None
@@ -1,32 +0,0 @@
1
- # TODO: move this file to the appropriate path
2
- from pydantic import BaseModel
3
-
4
-
5
- class SlurmSshUserSettings(BaseModel):
6
- """
7
- Subset of user settings which must be present for task collection and job
8
- execution when using the Slurm-SSH runner.
9
-
10
- Attributes:
11
- project_dir: Folder where `slurm_user` can write.
12
- slurm_accounts:
13
- List of SLURM accounts, to be used upon Fractal job submission.
14
- """
15
-
16
- project_dir: str
17
- slurm_accounts: list[str]
18
-
19
-
20
- class SlurmSudoUserSettings(BaseModel):
21
- """
22
- Subset of user settings which must be present for task collection and job
23
- execution when using the Slurm-sudo runner.
24
-
25
- Attributes:
26
- project_dir: Folder where `slurm_user` can write.
27
- slurm_accounts:
28
- List of SLURM accounts, to be used upon Fractal job submission.
29
- """
30
-
31
- project_dir: str
32
- slurm_accounts: list[str]
@@ -1,27 +0,0 @@
1
- from pydantic import SecretStr
2
- from pydantic_settings import BaseSettings
3
- from pydantic_settings import SettingsConfigDict
4
-
5
- from ._settings_config import SETTINGS_CONFIG_DICT
6
-
7
-
8
- class InitDataSettings(BaseSettings):
9
- model_config = SettingsConfigDict(**SETTINGS_CONFIG_DICT)
10
-
11
- FRACTAL_DEFAULT_ADMIN_EMAIL: str = "admin@fractal.xy"
12
- """
13
- Admin default email, used upon creation of the first superuser during
14
- server startup.
15
-
16
- ⚠️ **IMPORTANT**: After the server startup, you should always edit the
17
- default admin credentials.
18
- """
19
-
20
- FRACTAL_DEFAULT_ADMIN_PASSWORD: SecretStr = "1234"
21
- """
22
- Admin default password, used upon creation of the first superuser during
23
- server startup.
24
-
25
- ⚠️ **IMPORTANT**: After the server startup, you should always edit the
26
- default admin credentials.
27
- """