aignostics 0.2.93__tar.gz → 0.2.96__tar.gz

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 (164) hide show
  1. {aignostics-0.2.93 → aignostics-0.2.96}/PKG-INFO +1 -1
  2. {aignostics-0.2.93 → aignostics-0.2.96}/examples/notebook.py +1 -1
  3. {aignostics-0.2.93 → aignostics-0.2.96}/pyproject.toml +2 -2
  4. {aignostics-0.2.93 → aignostics-0.2.96}/src/aignostics/application/_gui/_page_application_describe.py +7 -15
  5. {aignostics-0.2.93 → aignostics-0.2.96}/src/aignostics/application/_gui/_page_index.py +3 -1
  6. {aignostics-0.2.93 → aignostics-0.2.96}/src/aignostics/gui/_frame.py +1 -1
  7. {aignostics-0.2.93 → aignostics-0.2.96}/src/aignostics/platform/_authentication.py +7 -0
  8. {aignostics-0.2.93 → aignostics-0.2.96}/.gitignore +0 -0
  9. {aignostics-0.2.93 → aignostics-0.2.96}/LICENSE +0 -0
  10. {aignostics-0.2.93 → aignostics-0.2.96}/README.md +0 -0
  11. {aignostics-0.2.93 → aignostics-0.2.96}/codegen/out/.openapi-generator/FILES +0 -0
  12. {aignostics-0.2.93 → aignostics-0.2.96}/codegen/out/.openapi-generator/VERSION +0 -0
  13. {aignostics-0.2.93 → aignostics-0.2.96}/codegen/out/aignx/codegen/api/public_api.py +0 -0
  14. {aignostics-0.2.93 → aignostics-0.2.96}/codegen/out/aignx/codegen/api_client.py +0 -0
  15. {aignostics-0.2.93 → aignostics-0.2.96}/codegen/out/aignx/codegen/api_response.py +0 -0
  16. {aignostics-0.2.93 → aignostics-0.2.96}/codegen/out/aignx/codegen/configuration.py +0 -0
  17. {aignostics-0.2.93 → aignostics-0.2.96}/codegen/out/aignx/codegen/exceptions.py +0 -0
  18. {aignostics-0.2.93 → aignostics-0.2.96}/codegen/out/aignx/codegen/models/__init__.py +0 -0
  19. {aignostics-0.2.93 → aignostics-0.2.96}/codegen/out/aignx/codegen/models/application_read_response.py +0 -0
  20. {aignostics-0.2.93 → aignostics-0.2.96}/codegen/out/aignx/codegen/models/application_run_status.py +0 -0
  21. {aignostics-0.2.93 → aignostics-0.2.96}/codegen/out/aignx/codegen/models/application_version_read_response.py +0 -0
  22. {aignostics-0.2.93 → aignostics-0.2.96}/codegen/out/aignx/codegen/models/http_validation_error.py +0 -0
  23. {aignostics-0.2.93 → aignostics-0.2.96}/codegen/out/aignx/codegen/models/input_artifact_creation_request.py +0 -0
  24. {aignostics-0.2.93 → aignostics-0.2.96}/codegen/out/aignx/codegen/models/input_artifact_read_response.py +0 -0
  25. {aignostics-0.2.93 → aignostics-0.2.96}/codegen/out/aignx/codegen/models/item_creation_request.py +0 -0
  26. {aignostics-0.2.93 → aignostics-0.2.96}/codegen/out/aignx/codegen/models/item_result_read_response.py +0 -0
  27. {aignostics-0.2.93 → aignostics-0.2.96}/codegen/out/aignx/codegen/models/item_status.py +0 -0
  28. {aignostics-0.2.93 → aignostics-0.2.96}/codegen/out/aignx/codegen/models/output_artifact_read_response.py +0 -0
  29. {aignostics-0.2.93 → aignostics-0.2.96}/codegen/out/aignx/codegen/models/output_artifact_result_read_response.py +0 -0
  30. {aignostics-0.2.93 → aignostics-0.2.96}/codegen/out/aignx/codegen/models/output_artifact_scope.py +0 -0
  31. {aignostics-0.2.93 → aignostics-0.2.96}/codegen/out/aignx/codegen/models/payload_input_artifact.py +0 -0
  32. {aignostics-0.2.93 → aignostics-0.2.96}/codegen/out/aignx/codegen/models/payload_item.py +0 -0
  33. {aignostics-0.2.93 → aignostics-0.2.96}/codegen/out/aignx/codegen/models/payload_output_artifact.py +0 -0
  34. {aignostics-0.2.93 → aignostics-0.2.96}/codegen/out/aignx/codegen/models/run_creation_request.py +0 -0
  35. {aignostics-0.2.93 → aignostics-0.2.96}/codegen/out/aignx/codegen/models/run_creation_response.py +0 -0
  36. {aignostics-0.2.93 → aignostics-0.2.96}/codegen/out/aignx/codegen/models/run_read_response.py +0 -0
  37. {aignostics-0.2.93 → aignostics-0.2.96}/codegen/out/aignx/codegen/models/transfer_urls.py +0 -0
  38. {aignostics-0.2.93 → aignostics-0.2.96}/codegen/out/aignx/codegen/models/user_payload.py +0 -0
  39. {aignostics-0.2.93 → aignostics-0.2.96}/codegen/out/aignx/codegen/models/validation_error.py +0 -0
  40. {aignostics-0.2.93 → aignostics-0.2.96}/codegen/out/aignx/codegen/models/validation_error_loc_inner.py +0 -0
  41. {aignostics-0.2.93 → aignostics-0.2.96}/codegen/out/aignx/codegen/rest.py +0 -0
  42. {aignostics-0.2.93 → aignostics-0.2.96}/codegen/out/docs/PublicApi.md +0 -0
  43. {aignostics-0.2.93 → aignostics-0.2.96}/dist_native_all/dist_native-macos-13/extracted/aignostics.app/Contents/Frameworks/boto3/examples/cloudfront.rst +0 -0
  44. {aignostics-0.2.93 → aignostics-0.2.96}/dist_native_all/dist_native-macos-13/extracted/aignostics.app/Contents/Frameworks/boto3/examples/s3.rst +0 -0
  45. {aignostics-0.2.93 → aignostics-0.2.96}/dist_native_all/dist_native-macos-latest/extracted/aignostics.app/Contents/Frameworks/boto3/examples/cloudfront.rst +0 -0
  46. {aignostics-0.2.93 → aignostics-0.2.96}/dist_native_all/dist_native-macos-latest/extracted/aignostics.app/Contents/Frameworks/boto3/examples/s3.rst +0 -0
  47. {aignostics-0.2.93 → aignostics-0.2.96}/dist_native_all/dist_native-ubuntu-24.04-arm/extracted/aignostics/_internal/boto3/examples/cloudfront.rst +0 -0
  48. {aignostics-0.2.93 → aignostics-0.2.96}/dist_native_all/dist_native-ubuntu-24.04-arm/extracted/aignostics/_internal/boto3/examples/s3.rst +0 -0
  49. {aignostics-0.2.93 → aignostics-0.2.96}/dist_native_all/dist_native-ubuntu-latest/extracted/aignostics/_internal/boto3/examples/cloudfront.rst +0 -0
  50. {aignostics-0.2.93 → aignostics-0.2.96}/dist_native_all/dist_native-ubuntu-latest/extracted/aignostics/_internal/boto3/examples/s3.rst +0 -0
  51. {aignostics-0.2.93 → aignostics-0.2.96}/dist_native_all/dist_native-windows-11-arm/extracted/aignostics/_internal/boto3/examples/cloudfront.rst +0 -0
  52. {aignostics-0.2.93 → aignostics-0.2.96}/dist_native_all/dist_native-windows-11-arm/extracted/aignostics/_internal/boto3/examples/s3.rst +0 -0
  53. {aignostics-0.2.93 → aignostics-0.2.96}/dist_native_all/dist_native-windows-latest/extracted/aignostics/_internal/boto3/examples/cloudfront.rst +0 -0
  54. {aignostics-0.2.93 → aignostics-0.2.96}/dist_native_all/dist_native-windows-latest/extracted/aignostics/_internal/boto3/examples/s3.rst +0 -0
  55. {aignostics-0.2.93 → aignostics-0.2.96}/examples/__init__.py +0 -0
  56. {aignostics-0.2.93 → aignostics-0.2.96}/examples/notebook.ipynb +0 -0
  57. {aignostics-0.2.93 → aignostics-0.2.96}/examples/script.py +0 -0
  58. {aignostics-0.2.93 → aignostics-0.2.96}/src/aignostics/__init__.py +0 -0
  59. {aignostics-0.2.93 → aignostics-0.2.96}/src/aignostics/application/__init__.py +0 -0
  60. {aignostics-0.2.93 → aignostics-0.2.96}/src/aignostics/application/_cli.py +0 -0
  61. {aignostics-0.2.93 → aignostics-0.2.96}/src/aignostics/application/_gui/_frame.py +0 -0
  62. {aignostics-0.2.93 → aignostics-0.2.96}/src/aignostics/application/_gui/_page_application_run_describe.py +0 -0
  63. {aignostics-0.2.93 → aignostics-0.2.96}/src/aignostics/application/_gui/_page_builder.py +0 -0
  64. {aignostics-0.2.93 → aignostics-0.2.96}/src/aignostics/application/_gui/_utils.py +0 -0
  65. {aignostics-0.2.93 → aignostics-0.2.96}/src/aignostics/application/_gui/assets/.gitignore +0 -0
  66. {aignostics-0.2.93 → aignostics-0.2.96}/src/aignostics/application/_gui/assets/canceled.lottie +0 -0
  67. {aignostics-0.2.93 → aignostics-0.2.96}/src/aignostics/application/_gui/assets/done.lottie +0 -0
  68. {aignostics-0.2.93 → aignostics-0.2.96}/src/aignostics/application/_gui/assets/empty.lottie +0 -0
  69. {aignostics-0.2.93 → aignostics-0.2.96}/src/aignostics/application/_gui/assets/error.lottie +0 -0
  70. {aignostics-0.2.93 → aignostics-0.2.96}/src/aignostics/application/_gui/assets/error_alt.lottie +0 -0
  71. {aignostics-0.2.93 → aignostics-0.2.96}/src/aignostics/application/_gui/assets/home-card-1.png +0 -0
  72. {aignostics-0.2.93 → aignostics-0.2.96}/src/aignostics/application/_gui/assets/home-card-2.png +0 -0
  73. {aignostics-0.2.93 → aignostics-0.2.96}/src/aignostics/application/_gui/assets/home-card-3.png +0 -0
  74. {aignostics-0.2.93 → aignostics-0.2.96}/src/aignostics/application/_gui/assets/home-card-4.png +0 -0
  75. {aignostics-0.2.93 → aignostics-0.2.96}/src/aignostics/application/_gui/assets/home-card-5.png +0 -0
  76. {aignostics-0.2.93 → aignostics-0.2.96}/src/aignostics/application/_gui/assets/image-not-found.png +0 -0
  77. {aignostics-0.2.93 → aignostics-0.2.96}/src/aignostics/application/_gui/assets/pending.lottie +0 -0
  78. {aignostics-0.2.93 → aignostics-0.2.96}/src/aignostics/application/_gui/assets/pending_alt.lottie +0 -0
  79. {aignostics-0.2.93 → aignostics-0.2.96}/src/aignostics/application/_gui/assets/ruo.png +0 -0
  80. {aignostics-0.2.93 → aignostics-0.2.96}/src/aignostics/application/_gui/assets/ruo.svg +0 -0
  81. {aignostics-0.2.93 → aignostics-0.2.96}/src/aignostics/application/_service.py +0 -0
  82. {aignostics-0.2.93 → aignostics-0.2.96}/src/aignostics/application/_settings.py +0 -0
  83. {aignostics-0.2.93 → aignostics-0.2.96}/src/aignostics/application/_utils.py +0 -0
  84. {aignostics-0.2.93 → aignostics-0.2.96}/src/aignostics/bucket/__init__.py +0 -0
  85. {aignostics-0.2.93 → aignostics-0.2.96}/src/aignostics/bucket/_cli.py +0 -0
  86. {aignostics-0.2.93 → aignostics-0.2.96}/src/aignostics/bucket/_gui.py +0 -0
  87. {aignostics-0.2.93 → aignostics-0.2.96}/src/aignostics/bucket/_service.py +0 -0
  88. {aignostics-0.2.93 → aignostics-0.2.96}/src/aignostics/bucket/_settings.py +0 -0
  89. {aignostics-0.2.93 → aignostics-0.2.96}/src/aignostics/bucket/assets/Google-Cloud-logo.png +0 -0
  90. {aignostics-0.2.93 → aignostics-0.2.96}/src/aignostics/bucket/assets/Google-Cloud-logo.svg +0 -0
  91. {aignostics-0.2.93 → aignostics-0.2.96}/src/aignostics/cli.py +0 -0
  92. {aignostics-0.2.93 → aignostics-0.2.96}/src/aignostics/constants.py +0 -0
  93. {aignostics-0.2.93 → aignostics-0.2.96}/src/aignostics/dataset/__init__.py +0 -0
  94. {aignostics-0.2.93 → aignostics-0.2.96}/src/aignostics/dataset/_cli.py +0 -0
  95. {aignostics-0.2.93 → aignostics-0.2.96}/src/aignostics/dataset/_gui.py +0 -0
  96. {aignostics-0.2.93 → aignostics-0.2.96}/src/aignostics/dataset/_service.py +0 -0
  97. {aignostics-0.2.93 → aignostics-0.2.96}/src/aignostics/dataset/assets/NIH-IDC-logo.svg +0 -0
  98. {aignostics-0.2.93 → aignostics-0.2.96}/src/aignostics/gui/__init__.py +0 -0
  99. {aignostics-0.2.93 → aignostics-0.2.96}/src/aignostics/gui/_theme.py +0 -0
  100. {aignostics-0.2.93 → aignostics-0.2.96}/src/aignostics/gui/assets/cabin-v27-latin-regular.woff2 +0 -0
  101. {aignostics-0.2.93 → aignostics-0.2.96}/src/aignostics/gui/assets/logo.png +0 -0
  102. {aignostics-0.2.93 → aignostics-0.2.96}/src/aignostics/notebook/__init__.py +0 -0
  103. {aignostics-0.2.93 → aignostics-0.2.96}/src/aignostics/notebook/_gui.py +0 -0
  104. {aignostics-0.2.93 → aignostics-0.2.96}/src/aignostics/notebook/_notebook.py +0 -0
  105. {aignostics-0.2.93 → aignostics-0.2.96}/src/aignostics/notebook/_service.py +0 -0
  106. {aignostics-0.2.93 → aignostics-0.2.96}/src/aignostics/notebook/assets/python.lottie +0 -0
  107. {aignostics-0.2.93 → aignostics-0.2.96}/src/aignostics/platform/__init__.py +0 -0
  108. {aignostics-0.2.93 → aignostics-0.2.96}/src/aignostics/platform/_cli.py +0 -0
  109. {aignostics-0.2.93 → aignostics-0.2.96}/src/aignostics/platform/_client.py +0 -0
  110. {aignostics-0.2.93 → aignostics-0.2.96}/src/aignostics/platform/_constants.py +0 -0
  111. {aignostics-0.2.93 → aignostics-0.2.96}/src/aignostics/platform/_messages.py +0 -0
  112. {aignostics-0.2.93 → aignostics-0.2.96}/src/aignostics/platform/_service.py +0 -0
  113. {aignostics-0.2.93 → aignostics-0.2.96}/src/aignostics/platform/_settings.py +0 -0
  114. {aignostics-0.2.93 → aignostics-0.2.96}/src/aignostics/platform/_utils.py +0 -0
  115. {aignostics-0.2.93 → aignostics-0.2.96}/src/aignostics/platform/resources/__init__.py +0 -0
  116. {aignostics-0.2.93 → aignostics-0.2.96}/src/aignostics/platform/resources/applications.py +0 -0
  117. {aignostics-0.2.93 → aignostics-0.2.96}/src/aignostics/platform/resources/runs.py +0 -0
  118. {aignostics-0.2.93 → aignostics-0.2.96}/src/aignostics/platform/resources/utils.py +0 -0
  119. {aignostics-0.2.93 → aignostics-0.2.96}/src/aignostics/qupath/__init__.py +0 -0
  120. {aignostics-0.2.93 → aignostics-0.2.96}/src/aignostics/qupath/_cli.py +0 -0
  121. {aignostics-0.2.93 → aignostics-0.2.96}/src/aignostics/qupath/_gui.py +0 -0
  122. {aignostics-0.2.93 → aignostics-0.2.96}/src/aignostics/qupath/_service.py +0 -0
  123. {aignostics-0.2.93 → aignostics-0.2.96}/src/aignostics/qupath/_settings.py +0 -0
  124. {aignostics-0.2.93 → aignostics-0.2.96}/src/aignostics/qupath/assets/download.lottie +0 -0
  125. {aignostics-0.2.93 → aignostics-0.2.96}/src/aignostics/qupath/assets/microscope.lottie +0 -0
  126. {aignostics-0.2.93 → aignostics-0.2.96}/src/aignostics/qupath/assets/update.lottie +0 -0
  127. {aignostics-0.2.93 → aignostics-0.2.96}/src/aignostics/qupath/scripts/add.groovy +0 -0
  128. {aignostics-0.2.93 → aignostics-0.2.96}/src/aignostics/qupath/scripts/annotate.groovy +0 -0
  129. {aignostics-0.2.93 → aignostics-0.2.96}/src/aignostics/qupath/scripts/inspect.groovy +0 -0
  130. {aignostics-0.2.93 → aignostics-0.2.96}/src/aignostics/qupath/scripts/test.groovy +0 -0
  131. {aignostics-0.2.93 → aignostics-0.2.96}/src/aignostics/system/__init__.py +0 -0
  132. {aignostics-0.2.93 → aignostics-0.2.96}/src/aignostics/system/_cli.py +0 -0
  133. {aignostics-0.2.93 → aignostics-0.2.96}/src/aignostics/system/_exceptions.py +0 -0
  134. {aignostics-0.2.93 → aignostics-0.2.96}/src/aignostics/system/_gui.py +0 -0
  135. {aignostics-0.2.93 → aignostics-0.2.96}/src/aignostics/system/_service.py +0 -0
  136. {aignostics-0.2.93 → aignostics-0.2.96}/src/aignostics/system/_settings.py +0 -0
  137. {aignostics-0.2.93 → aignostics-0.2.96}/src/aignostics/system/assets/system.lottie +0 -0
  138. {aignostics-0.2.93 → aignostics-0.2.96}/src/aignostics/third_party/bottle.py +0 -0
  139. {aignostics-0.2.93 → aignostics-0.2.96}/src/aignostics/third_party/idc_index.py +0 -0
  140. {aignostics-0.2.93 → aignostics-0.2.96}/src/aignostics/utils/__init__.py +0 -0
  141. {aignostics-0.2.93 → aignostics-0.2.96}/src/aignostics/utils/_cli.py +0 -0
  142. {aignostics-0.2.93 → aignostics-0.2.96}/src/aignostics/utils/_console.py +0 -0
  143. {aignostics-0.2.93 → aignostics-0.2.96}/src/aignostics/utils/_constants.py +0 -0
  144. {aignostics-0.2.93 → aignostics-0.2.96}/src/aignostics/utils/_di.py +0 -0
  145. {aignostics-0.2.93 → aignostics-0.2.96}/src/aignostics/utils/_fs.py +0 -0
  146. {aignostics-0.2.93 → aignostics-0.2.96}/src/aignostics/utils/_gui.py +0 -0
  147. {aignostics-0.2.93 → aignostics-0.2.96}/src/aignostics/utils/_health.py +0 -0
  148. {aignostics-0.2.93 → aignostics-0.2.96}/src/aignostics/utils/_log.py +0 -0
  149. {aignostics-0.2.93 → aignostics-0.2.96}/src/aignostics/utils/_logfire.py +0 -0
  150. {aignostics-0.2.93 → aignostics-0.2.96}/src/aignostics/utils/_notebook.py +0 -0
  151. {aignostics-0.2.93 → aignostics-0.2.96}/src/aignostics/utils/_process.py +0 -0
  152. {aignostics-0.2.93 → aignostics-0.2.96}/src/aignostics/utils/_sentry.py +0 -0
  153. {aignostics-0.2.93 → aignostics-0.2.96}/src/aignostics/utils/_service.py +0 -0
  154. {aignostics-0.2.93 → aignostics-0.2.96}/src/aignostics/utils/_settings.py +0 -0
  155. {aignostics-0.2.93 → aignostics-0.2.96}/src/aignostics/utils/boot.py +0 -0
  156. {aignostics-0.2.93 → aignostics-0.2.96}/src/aignostics/wsi/__init__.py +0 -0
  157. {aignostics-0.2.93 → aignostics-0.2.96}/src/aignostics/wsi/_cli.py +0 -0
  158. {aignostics-0.2.93 → aignostics-0.2.96}/src/aignostics/wsi/_gui.py +0 -0
  159. {aignostics-0.2.93 → aignostics-0.2.96}/src/aignostics/wsi/_openslide_handler.py +0 -0
  160. {aignostics-0.2.93 → aignostics-0.2.96}/src/aignostics/wsi/_pydicom_handler.py +0 -0
  161. {aignostics-0.2.93 → aignostics-0.2.96}/src/aignostics/wsi/_service.py +0 -0
  162. {aignostics-0.2.93 → aignostics-0.2.96}/src/aignostics/wsi/_utils.py +0 -0
  163. {aignostics-0.2.93 → aignostics-0.2.96}/src/aignostics/wsi/assets/fallback.png +0 -0
  164. {aignostics-0.2.93 → aignostics-0.2.96}/src/aignostics.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: aignostics
3
- Version: 0.2.93
3
+ Version: 0.2.96
4
4
  Summary: 🔬 Python SDK providing access to the Aignostics Platform. Includes Aignostics Launchpad (Desktop Application), Aignostics CLI (Command-Line Interface), example notebooks, and Aignostics Client Library.
5
5
  Project-URL: Homepage, https://aignostics.readthedocs.io/en/latest/
6
6
  Project-URL: Documentation, https://aignostics.readthedocs.io/en/latest/
@@ -2,7 +2,7 @@
2
2
  # requires-python = ">=3.13"
3
3
  # dependencies = [
4
4
  # "marimo",
5
- # "aignostics==0.2.93",
5
+ # "aignostics==0.2.96",
6
6
  # ]
7
7
  # ///
8
8
 
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "aignostics"
3
- version = "0.2.93"
3
+ version = "0.2.96"
4
4
  description = "🔬 Python SDK providing access to the Aignostics Platform. Includes Aignostics Launchpad (Desktop Application), Aignostics CLI (Command-Line Interface), example notebooks, and Aignostics Client Library."
5
5
  readme = "README.md"
6
6
  authors = [
@@ -352,7 +352,7 @@ source = ["src/"]
352
352
 
353
353
 
354
354
  [tool.bumpversion]
355
- current_version = "0.2.93"
355
+ current_version = "0.2.96"
356
356
  parse = "(?P<major>\\d+)\\.(?P<minor>\\d+)\\.(?P<patch>\\d+)"
357
357
  serialize = ["{major}.{minor}.{patch}"]
358
358
  search = "{current_version}"
@@ -39,8 +39,7 @@ class SubmitForm:
39
39
  metadata_grid: ui.aggrid | None = None
40
40
  metadata_exclude_button: ui.button | None = None
41
41
  metadata_next_button: ui.button | None = None
42
- submission_upload_button: ui.button | None = None
43
- submission_submit_button: ui.button | None = None
42
+ upload_and_submit_button: ui.button | None = None
44
43
 
45
44
 
46
45
  submit_form = SubmitForm()
@@ -376,7 +375,7 @@ async def _page_application_describe(application_id: str) -> None: # noqa: C901
376
375
  submit_form.metadata_grid.run_grid_method("autoSizeAllColumns")
377
376
 
378
377
  async def _metadata_next() -> None:
379
- if submit_form.metadata_grid is None or submit_form.submission_upload_button is None:
378
+ if submit_form.metadata_grid is None or submit_form.upload_and_submit_button is None:
380
379
  logger.error(MESSAGE_METADATA_GRID_IS_NOT_INITIALIZED)
381
380
  return
382
381
  if "pytest" in sys.modules:
@@ -388,7 +387,7 @@ async def _page_application_describe(application_id: str) -> None: # noqa: C901
388
387
  else:
389
388
  submit_form.metadata = await submit_form.metadata_grid.get_client_data()
390
389
  _upload_ui.refresh(submit_form.metadata)
391
- submit_form.submission_upload_button.enable()
390
+ submit_form.upload_and_submit_button.enable()
392
391
  if "pytest" in sys.modules:
393
392
  message = f"Prepared upload UI with metadata '{submit_form.metadata}' for pytest."
394
393
  logger.debug(message)
@@ -408,6 +407,7 @@ async def _page_application_describe(application_id: str) -> None: # noqa: C901
408
407
  submit_form.metadata_grid.update()
409
408
  submit_form.metadata_exclude_button.set_text("Exclude")
410
409
  submit_form.metadata_exclude_button.disable()
410
+ await _validate()
411
411
 
412
412
  async def _handle_grid_selection_changed() -> None:
413
413
  if submit_form.metadata_grid is None or submit_form.metadata_exclude_button is None:
@@ -568,10 +568,11 @@ async def _page_application_describe(application_id: str) -> None: # noqa: C901
568
568
  async def _upload() -> None:
569
569
  """Upload prepared slides."""
570
570
  global upload_message_queue # noqa: PLW0602
571
- if submit_form.submission_submit_button is None or submit_form.submission_upload_button is None:
571
+ if submit_form.upload_and_submit_button is None:
572
572
  logger.error("Submission submit button is not initialized.")
573
573
  return
574
574
  ui.notify("Uploading whole slide images to Aignostics Platform ...", type="info")
575
+ submit_form.upload_and_submit_button.disable()
575
576
 
576
577
  await nicegui_run.cpu_bound(
577
578
  Service.application_run_upload,
@@ -581,8 +582,6 @@ async def _page_application_describe(application_id: str) -> None: # noqa: C901
581
582
  upload_message_queue,
582
583
  )
583
584
  ui.notify("Upload to Aignostics Platform completed.", type="positive")
584
- submit_form.submission_submit_button.enable()
585
- submit_form.submission_upload_button.disable()
586
585
  _submit()
587
586
 
588
587
  @ui.refreshable
@@ -630,12 +629,5 @@ async def _page_application_describe(application_id: str) -> None: # noqa: C901
630
629
  "Upload selected slides to Aignostics platform bucket, "
631
630
  "and submit application run when uploaded."
632
631
  )
633
- submit_form.submission_upload_button = submission_upload_button
634
- submit_form.submission_submit_button = ui.button(
635
- "Submit",
636
- on_click=_submit,
637
- icon="check",
638
- )
639
- submit_form.submission_submit_button.set_visibility(False)
640
- submit_form.submission_submit_button.mark("BUTTON_SUBMISSION_SUBMIT").disable()
632
+ submit_form.upload_and_submit_button = submission_upload_button
641
633
  ui.button("Back", on_click=stepper.previous).props("flat")
@@ -24,7 +24,9 @@ async def _page_index(client: Client) -> None:
24
24
  app.storage.tab,
25
25
  "user_info",
26
26
  lambda user_info: (
27
- f"Welcome {user_info.profile.given_name if user_info.profile else ''} to the Aignostics Launchpad"
27
+ f"Welcome "
28
+ f"{user_info.profile.given_name if hasattr(user_info, 'profile') and user_info.profile else ''} "
29
+ f"to the Aignostics Launchpad"
28
30
  ),
29
31
  ).classes("text-4xl mb-2")
30
32
  ui.label(
@@ -102,7 +102,7 @@ def frame( # noqa: C901, PLR0915
102
102
  app.storage.tab["user_info"] = user_info
103
103
  _user_info_ui.refresh()
104
104
  with contextlib.suppress(Exception):
105
- user_info = await run.cpu_bound(PlatformService.get_user_info, relogin=True)
105
+ user_info = await run.io_bound(PlatformService.get_user_info, relogin=True)
106
106
  app.storage.tab["user_info"] = user_info
107
107
  ui.navigate.reload()
108
108
 
@@ -318,6 +318,11 @@ def _perform_authorization_code_with_pkce_flow() -> str:
318
318
  # start the server
319
319
  try:
320
320
  with HTTPServer((host, port), OAuthCallbackHandler) as server:
321
+ # Enable socket reuse to prevent "Address already in use" errors
322
+ # This allows the socket to be reused immediately after the server closes,
323
+ # even if the previous connection is in TIME_WAIT state
324
+ server.socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
325
+
321
326
  # Call Auth0 with challenge and redirect to localhost with code after successful authN
322
327
  webbrowser.open_new(authorization_url)
323
328
  # Extract authorization_code from redirected request, see: OAuthCallbackHandler
@@ -438,6 +443,8 @@ def _ensure_local_port_is_available(port: int, max_retries: int = CALLBACK_PORT_
438
443
  def is_port_available() -> bool:
439
444
  with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
440
445
  try:
446
+ # Enable socket reuse to match the behavior of the actual HTTPServer
447
+ s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
441
448
  s.bind(("localhost", port))
442
449
  return True
443
450
  except OSError:
File without changes
File without changes
File without changes