nucliadb 2.46.1.post382__py3-none-any.whl → 6.2.1.post2777__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 (431) hide show
  1. migrations/0002_rollover_shards.py +1 -2
  2. migrations/0003_allfields_key.py +2 -37
  3. migrations/0004_rollover_shards.py +1 -2
  4. migrations/0005_rollover_shards.py +1 -2
  5. migrations/0006_rollover_shards.py +2 -4
  6. migrations/0008_cleanup_leftover_rollover_metadata.py +1 -2
  7. migrations/0009_upgrade_relations_and_texts_to_v2.py +5 -4
  8. migrations/0010_fix_corrupt_indexes.py +11 -12
  9. migrations/0011_materialize_labelset_ids.py +2 -18
  10. migrations/0012_rollover_shards.py +6 -12
  11. migrations/0013_rollover_shards.py +2 -4
  12. migrations/0014_rollover_shards.py +5 -7
  13. migrations/0015_targeted_rollover.py +6 -12
  14. migrations/0016_upgrade_to_paragraphs_v2.py +27 -32
  15. migrations/0017_multiple_writable_shards.py +3 -6
  16. migrations/0018_purge_orphan_kbslugs.py +59 -0
  17. migrations/0019_upgrade_to_paragraphs_v3.py +66 -0
  18. migrations/0020_drain_nodes_from_cluster.py +83 -0
  19. nucliadb/standalone/tests/unit/test_run.py → migrations/0021_overwrite_vectorsets_key.py +17 -18
  20. nucliadb/tests/unit/test_openapi.py → migrations/0022_fix_paragraph_deletion_bug.py +16 -11
  21. migrations/0023_backfill_pg_catalog.py +80 -0
  22. migrations/0025_assign_models_to_kbs_v2.py +113 -0
  23. migrations/0026_fix_high_cardinality_content_types.py +61 -0
  24. migrations/0027_rollover_texts3.py +73 -0
  25. nucliadb/ingest/fields/date.py → migrations/pg/0001_bootstrap.py +10 -12
  26. migrations/pg/0002_catalog.py +42 -0
  27. nucliadb/ingest/tests/unit/test_settings.py → migrations/pg/0003_catalog_kbid_index.py +5 -3
  28. nucliadb/common/cluster/base.py +41 -24
  29. nucliadb/common/cluster/discovery/base.py +6 -14
  30. nucliadb/common/cluster/discovery/k8s.py +9 -19
  31. nucliadb/common/cluster/discovery/manual.py +1 -3
  32. nucliadb/common/cluster/discovery/single.py +1 -2
  33. nucliadb/common/cluster/discovery/utils.py +1 -3
  34. nucliadb/common/cluster/grpc_node_dummy.py +11 -16
  35. nucliadb/common/cluster/index_node.py +10 -19
  36. nucliadb/common/cluster/manager.py +223 -102
  37. nucliadb/common/cluster/rebalance.py +42 -37
  38. nucliadb/common/cluster/rollover.py +377 -204
  39. nucliadb/common/cluster/settings.py +16 -9
  40. nucliadb/common/cluster/standalone/grpc_node_binding.py +24 -76
  41. nucliadb/common/cluster/standalone/index_node.py +4 -11
  42. nucliadb/common/cluster/standalone/service.py +2 -6
  43. nucliadb/common/cluster/standalone/utils.py +9 -6
  44. nucliadb/common/cluster/utils.py +43 -29
  45. nucliadb/common/constants.py +20 -0
  46. nucliadb/common/context/__init__.py +6 -4
  47. nucliadb/common/context/fastapi.py +8 -5
  48. nucliadb/{tests/knowledgeboxes/__init__.py → common/counters.py} +8 -2
  49. nucliadb/common/datamanagers/__init__.py +24 -5
  50. nucliadb/common/datamanagers/atomic.py +102 -0
  51. nucliadb/common/datamanagers/cluster.py +5 -5
  52. nucliadb/common/datamanagers/entities.py +6 -16
  53. nucliadb/common/datamanagers/fields.py +84 -0
  54. nucliadb/common/datamanagers/kb.py +101 -24
  55. nucliadb/common/datamanagers/labels.py +26 -56
  56. nucliadb/common/datamanagers/processing.py +2 -6
  57. nucliadb/common/datamanagers/resources.py +214 -117
  58. nucliadb/common/datamanagers/rollover.py +77 -16
  59. nucliadb/{ingest/orm → common/datamanagers}/synonyms.py +16 -28
  60. nucliadb/common/datamanagers/utils.py +19 -11
  61. nucliadb/common/datamanagers/vectorsets.py +110 -0
  62. nucliadb/common/external_index_providers/base.py +257 -0
  63. nucliadb/{ingest/tests/unit/test_cache.py → common/external_index_providers/exceptions.py} +9 -8
  64. nucliadb/common/external_index_providers/manager.py +101 -0
  65. nucliadb/common/external_index_providers/pinecone.py +933 -0
  66. nucliadb/common/external_index_providers/settings.py +52 -0
  67. nucliadb/common/http_clients/auth.py +3 -6
  68. nucliadb/common/http_clients/processing.py +6 -11
  69. nucliadb/common/http_clients/utils.py +1 -3
  70. nucliadb/common/ids.py +240 -0
  71. nucliadb/common/locking.py +43 -13
  72. nucliadb/common/maindb/driver.py +11 -35
  73. nucliadb/common/maindb/exceptions.py +6 -6
  74. nucliadb/common/maindb/local.py +22 -9
  75. nucliadb/common/maindb/pg.py +206 -111
  76. nucliadb/common/maindb/utils.py +13 -44
  77. nucliadb/common/models_utils/from_proto.py +479 -0
  78. nucliadb/common/models_utils/to_proto.py +60 -0
  79. nucliadb/common/nidx.py +260 -0
  80. nucliadb/export_import/datamanager.py +25 -19
  81. nucliadb/export_import/exceptions.py +8 -0
  82. nucliadb/export_import/exporter.py +20 -7
  83. nucliadb/export_import/importer.py +6 -11
  84. nucliadb/export_import/models.py +5 -5
  85. nucliadb/export_import/tasks.py +4 -4
  86. nucliadb/export_import/utils.py +94 -54
  87. nucliadb/health.py +1 -3
  88. nucliadb/ingest/app.py +15 -11
  89. nucliadb/ingest/consumer/auditing.py +30 -147
  90. nucliadb/ingest/consumer/consumer.py +96 -52
  91. nucliadb/ingest/consumer/materializer.py +10 -12
  92. nucliadb/ingest/consumer/pull.py +12 -27
  93. nucliadb/ingest/consumer/service.py +20 -19
  94. nucliadb/ingest/consumer/shard_creator.py +7 -14
  95. nucliadb/ingest/consumer/utils.py +1 -3
  96. nucliadb/ingest/fields/base.py +139 -188
  97. nucliadb/ingest/fields/conversation.py +18 -5
  98. nucliadb/ingest/fields/exceptions.py +1 -4
  99. nucliadb/ingest/fields/file.py +7 -25
  100. nucliadb/ingest/fields/link.py +11 -16
  101. nucliadb/ingest/fields/text.py +9 -4
  102. nucliadb/ingest/orm/brain.py +255 -262
  103. nucliadb/ingest/orm/broker_message.py +181 -0
  104. nucliadb/ingest/orm/entities.py +36 -51
  105. nucliadb/ingest/orm/exceptions.py +12 -0
  106. nucliadb/ingest/orm/knowledgebox.py +334 -278
  107. nucliadb/ingest/orm/processor/__init__.py +2 -697
  108. nucliadb/ingest/orm/processor/auditing.py +117 -0
  109. nucliadb/ingest/orm/processor/data_augmentation.py +164 -0
  110. nucliadb/ingest/orm/processor/pgcatalog.py +84 -0
  111. nucliadb/ingest/orm/processor/processor.py +752 -0
  112. nucliadb/ingest/orm/processor/sequence_manager.py +1 -1
  113. nucliadb/ingest/orm/resource.py +280 -520
  114. nucliadb/ingest/orm/utils.py +25 -31
  115. nucliadb/ingest/partitions.py +3 -9
  116. nucliadb/ingest/processing.py +76 -81
  117. nucliadb/ingest/py.typed +0 -0
  118. nucliadb/ingest/serialize.py +37 -173
  119. nucliadb/ingest/service/__init__.py +1 -3
  120. nucliadb/ingest/service/writer.py +186 -577
  121. nucliadb/ingest/settings.py +13 -22
  122. nucliadb/ingest/utils.py +3 -6
  123. nucliadb/learning_proxy.py +264 -51
  124. nucliadb/metrics_exporter.py +30 -19
  125. nucliadb/middleware/__init__.py +1 -3
  126. nucliadb/migrator/command.py +1 -3
  127. nucliadb/migrator/datamanager.py +13 -13
  128. nucliadb/migrator/migrator.py +57 -37
  129. nucliadb/migrator/settings.py +2 -1
  130. nucliadb/migrator/utils.py +18 -10
  131. nucliadb/purge/__init__.py +139 -33
  132. nucliadb/purge/orphan_shards.py +7 -13
  133. nucliadb/reader/__init__.py +1 -3
  134. nucliadb/reader/api/models.py +3 -14
  135. nucliadb/reader/api/v1/__init__.py +0 -1
  136. nucliadb/reader/api/v1/download.py +27 -94
  137. nucliadb/reader/api/v1/export_import.py +4 -4
  138. nucliadb/reader/api/v1/knowledgebox.py +13 -13
  139. nucliadb/reader/api/v1/learning_config.py +8 -12
  140. nucliadb/reader/api/v1/resource.py +67 -93
  141. nucliadb/reader/api/v1/services.py +70 -125
  142. nucliadb/reader/app.py +16 -46
  143. nucliadb/reader/lifecycle.py +18 -4
  144. nucliadb/reader/py.typed +0 -0
  145. nucliadb/reader/reader/notifications.py +10 -31
  146. nucliadb/search/__init__.py +1 -3
  147. nucliadb/search/api/v1/__init__.py +2 -2
  148. nucliadb/search/api/v1/ask.py +112 -0
  149. nucliadb/search/api/v1/catalog.py +184 -0
  150. nucliadb/search/api/v1/feedback.py +17 -25
  151. nucliadb/search/api/v1/find.py +41 -41
  152. nucliadb/search/api/v1/knowledgebox.py +90 -62
  153. nucliadb/search/api/v1/predict_proxy.py +2 -2
  154. nucliadb/search/api/v1/resource/ask.py +66 -117
  155. nucliadb/search/api/v1/resource/search.py +51 -72
  156. nucliadb/search/api/v1/router.py +1 -0
  157. nucliadb/search/api/v1/search.py +50 -197
  158. nucliadb/search/api/v1/suggest.py +40 -54
  159. nucliadb/search/api/v1/summarize.py +9 -5
  160. nucliadb/search/api/v1/utils.py +2 -1
  161. nucliadb/search/app.py +16 -48
  162. nucliadb/search/lifecycle.py +10 -3
  163. nucliadb/search/predict.py +176 -188
  164. nucliadb/search/py.typed +0 -0
  165. nucliadb/search/requesters/utils.py +41 -63
  166. nucliadb/search/search/cache.py +149 -20
  167. nucliadb/search/search/chat/ask.py +918 -0
  168. nucliadb/search/{tests/unit/test_run.py → search/chat/exceptions.py} +14 -13
  169. nucliadb/search/search/chat/images.py +41 -17
  170. nucliadb/search/search/chat/prompt.py +851 -282
  171. nucliadb/search/search/chat/query.py +274 -267
  172. nucliadb/{writer/resource/slug.py → search/search/cut.py} +8 -6
  173. nucliadb/search/search/fetch.py +43 -36
  174. nucliadb/search/search/filters.py +9 -15
  175. nucliadb/search/search/find.py +214 -54
  176. nucliadb/search/search/find_merge.py +408 -391
  177. nucliadb/search/search/hydrator.py +191 -0
  178. nucliadb/search/search/merge.py +198 -234
  179. nucliadb/search/search/metrics.py +73 -2
  180. nucliadb/search/search/paragraphs.py +64 -106
  181. nucliadb/search/search/pgcatalog.py +233 -0
  182. nucliadb/search/search/predict_proxy.py +1 -1
  183. nucliadb/search/search/query.py +386 -257
  184. nucliadb/search/search/query_parser/exceptions.py +22 -0
  185. nucliadb/search/search/query_parser/models.py +101 -0
  186. nucliadb/search/search/query_parser/parser.py +183 -0
  187. nucliadb/search/search/rank_fusion.py +204 -0
  188. nucliadb/search/search/rerankers.py +270 -0
  189. nucliadb/search/search/shards.py +4 -38
  190. nucliadb/search/search/summarize.py +14 -18
  191. nucliadb/search/search/utils.py +27 -4
  192. nucliadb/search/settings.py +15 -1
  193. nucliadb/standalone/api_router.py +4 -10
  194. nucliadb/standalone/app.py +17 -14
  195. nucliadb/standalone/auth.py +7 -21
  196. nucliadb/standalone/config.py +9 -12
  197. nucliadb/standalone/introspect.py +5 -5
  198. nucliadb/standalone/lifecycle.py +26 -25
  199. nucliadb/standalone/migrations.py +58 -0
  200. nucliadb/standalone/purge.py +9 -8
  201. nucliadb/standalone/py.typed +0 -0
  202. nucliadb/standalone/run.py +25 -18
  203. nucliadb/standalone/settings.py +10 -14
  204. nucliadb/standalone/versions.py +15 -5
  205. nucliadb/tasks/consumer.py +8 -12
  206. nucliadb/tasks/producer.py +7 -6
  207. nucliadb/tests/config.py +53 -0
  208. nucliadb/train/__init__.py +1 -3
  209. nucliadb/train/api/utils.py +1 -2
  210. nucliadb/train/api/v1/shards.py +2 -2
  211. nucliadb/train/api/v1/trainset.py +4 -6
  212. nucliadb/train/app.py +14 -47
  213. nucliadb/train/generator.py +10 -19
  214. nucliadb/train/generators/field_classifier.py +7 -19
  215. nucliadb/train/generators/field_streaming.py +156 -0
  216. nucliadb/train/generators/image_classifier.py +12 -18
  217. nucliadb/train/generators/paragraph_classifier.py +5 -9
  218. nucliadb/train/generators/paragraph_streaming.py +6 -9
  219. nucliadb/train/generators/question_answer_streaming.py +19 -20
  220. nucliadb/train/generators/sentence_classifier.py +9 -15
  221. nucliadb/train/generators/token_classifier.py +45 -36
  222. nucliadb/train/generators/utils.py +14 -18
  223. nucliadb/train/lifecycle.py +7 -3
  224. nucliadb/train/nodes.py +23 -32
  225. nucliadb/train/py.typed +0 -0
  226. nucliadb/train/servicer.py +13 -21
  227. nucliadb/train/settings.py +2 -6
  228. nucliadb/train/types.py +13 -10
  229. nucliadb/train/upload.py +3 -6
  230. nucliadb/train/uploader.py +20 -25
  231. nucliadb/train/utils.py +1 -1
  232. nucliadb/writer/__init__.py +1 -3
  233. nucliadb/writer/api/constants.py +0 -5
  234. nucliadb/{ingest/fields/keywordset.py → writer/api/utils.py} +13 -10
  235. nucliadb/writer/api/v1/export_import.py +102 -49
  236. nucliadb/writer/api/v1/field.py +196 -620
  237. nucliadb/writer/api/v1/knowledgebox.py +221 -71
  238. nucliadb/writer/api/v1/learning_config.py +2 -2
  239. nucliadb/writer/api/v1/resource.py +114 -216
  240. nucliadb/writer/api/v1/services.py +64 -132
  241. nucliadb/writer/api/v1/slug.py +61 -0
  242. nucliadb/writer/api/v1/transaction.py +67 -0
  243. nucliadb/writer/api/v1/upload.py +184 -215
  244. nucliadb/writer/app.py +11 -61
  245. nucliadb/writer/back_pressure.py +62 -43
  246. nucliadb/writer/exceptions.py +0 -4
  247. nucliadb/writer/lifecycle.py +21 -15
  248. nucliadb/writer/py.typed +0 -0
  249. nucliadb/writer/resource/audit.py +2 -1
  250. nucliadb/writer/resource/basic.py +48 -62
  251. nucliadb/writer/resource/field.py +45 -135
  252. nucliadb/writer/resource/origin.py +1 -2
  253. nucliadb/writer/settings.py +14 -5
  254. nucliadb/writer/tus/__init__.py +17 -15
  255. nucliadb/writer/tus/azure.py +111 -0
  256. nucliadb/writer/tus/dm.py +17 -5
  257. nucliadb/writer/tus/exceptions.py +1 -3
  258. nucliadb/writer/tus/gcs.py +56 -84
  259. nucliadb/writer/tus/local.py +21 -37
  260. nucliadb/writer/tus/s3.py +28 -68
  261. nucliadb/writer/tus/storage.py +5 -56
  262. nucliadb/writer/vectorsets.py +125 -0
  263. nucliadb-6.2.1.post2777.dist-info/METADATA +148 -0
  264. nucliadb-6.2.1.post2777.dist-info/RECORD +343 -0
  265. {nucliadb-2.46.1.post382.dist-info → nucliadb-6.2.1.post2777.dist-info}/WHEEL +1 -1
  266. nucliadb/common/maindb/redis.py +0 -194
  267. nucliadb/common/maindb/tikv.py +0 -412
  268. nucliadb/ingest/fields/layout.py +0 -58
  269. nucliadb/ingest/tests/conftest.py +0 -30
  270. nucliadb/ingest/tests/fixtures.py +0 -771
  271. nucliadb/ingest/tests/integration/consumer/__init__.py +0 -18
  272. nucliadb/ingest/tests/integration/consumer/test_auditing.py +0 -80
  273. nucliadb/ingest/tests/integration/consumer/test_materializer.py +0 -89
  274. nucliadb/ingest/tests/integration/consumer/test_pull.py +0 -144
  275. nucliadb/ingest/tests/integration/consumer/test_service.py +0 -81
  276. nucliadb/ingest/tests/integration/consumer/test_shard_creator.py +0 -68
  277. nucliadb/ingest/tests/integration/ingest/test_ingest.py +0 -691
  278. nucliadb/ingest/tests/integration/ingest/test_processing_engine.py +0 -95
  279. nucliadb/ingest/tests/integration/ingest/test_relations.py +0 -272
  280. nucliadb/ingest/tests/unit/consumer/__init__.py +0 -18
  281. nucliadb/ingest/tests/unit/consumer/test_auditing.py +0 -140
  282. nucliadb/ingest/tests/unit/consumer/test_consumer.py +0 -69
  283. nucliadb/ingest/tests/unit/consumer/test_pull.py +0 -60
  284. nucliadb/ingest/tests/unit/consumer/test_shard_creator.py +0 -139
  285. nucliadb/ingest/tests/unit/consumer/test_utils.py +0 -67
  286. nucliadb/ingest/tests/unit/orm/__init__.py +0 -19
  287. nucliadb/ingest/tests/unit/orm/test_brain.py +0 -247
  288. nucliadb/ingest/tests/unit/orm/test_processor.py +0 -131
  289. nucliadb/ingest/tests/unit/orm/test_resource.py +0 -275
  290. nucliadb/ingest/tests/unit/test_partitions.py +0 -40
  291. nucliadb/ingest/tests/unit/test_processing.py +0 -171
  292. nucliadb/middleware/transaction.py +0 -117
  293. nucliadb/reader/api/v1/learning_collector.py +0 -63
  294. nucliadb/reader/tests/__init__.py +0 -19
  295. nucliadb/reader/tests/conftest.py +0 -31
  296. nucliadb/reader/tests/fixtures.py +0 -136
  297. nucliadb/reader/tests/test_list_resources.py +0 -75
  298. nucliadb/reader/tests/test_reader_file_download.py +0 -273
  299. nucliadb/reader/tests/test_reader_resource.py +0 -379
  300. nucliadb/reader/tests/test_reader_resource_field.py +0 -219
  301. nucliadb/search/api/v1/chat.py +0 -258
  302. nucliadb/search/api/v1/resource/chat.py +0 -94
  303. nucliadb/search/tests/__init__.py +0 -19
  304. nucliadb/search/tests/conftest.py +0 -33
  305. nucliadb/search/tests/fixtures.py +0 -199
  306. nucliadb/search/tests/node.py +0 -465
  307. nucliadb/search/tests/unit/__init__.py +0 -18
  308. nucliadb/search/tests/unit/api/__init__.py +0 -19
  309. nucliadb/search/tests/unit/api/v1/__init__.py +0 -19
  310. nucliadb/search/tests/unit/api/v1/resource/__init__.py +0 -19
  311. nucliadb/search/tests/unit/api/v1/resource/test_ask.py +0 -67
  312. nucliadb/search/tests/unit/api/v1/resource/test_chat.py +0 -97
  313. nucliadb/search/tests/unit/api/v1/test_chat.py +0 -96
  314. nucliadb/search/tests/unit/api/v1/test_predict_proxy.py +0 -98
  315. nucliadb/search/tests/unit/api/v1/test_summarize.py +0 -93
  316. nucliadb/search/tests/unit/search/__init__.py +0 -18
  317. nucliadb/search/tests/unit/search/requesters/__init__.py +0 -18
  318. nucliadb/search/tests/unit/search/requesters/test_utils.py +0 -210
  319. nucliadb/search/tests/unit/search/search/__init__.py +0 -19
  320. nucliadb/search/tests/unit/search/search/test_shards.py +0 -45
  321. nucliadb/search/tests/unit/search/search/test_utils.py +0 -82
  322. nucliadb/search/tests/unit/search/test_chat_prompt.py +0 -266
  323. nucliadb/search/tests/unit/search/test_fetch.py +0 -108
  324. nucliadb/search/tests/unit/search/test_filters.py +0 -125
  325. nucliadb/search/tests/unit/search/test_paragraphs.py +0 -157
  326. nucliadb/search/tests/unit/search/test_predict_proxy.py +0 -106
  327. nucliadb/search/tests/unit/search/test_query.py +0 -201
  328. nucliadb/search/tests/unit/test_app.py +0 -79
  329. nucliadb/search/tests/unit/test_find_merge.py +0 -112
  330. nucliadb/search/tests/unit/test_merge.py +0 -34
  331. nucliadb/search/tests/unit/test_predict.py +0 -584
  332. nucliadb/standalone/tests/__init__.py +0 -19
  333. nucliadb/standalone/tests/conftest.py +0 -33
  334. nucliadb/standalone/tests/fixtures.py +0 -38
  335. nucliadb/standalone/tests/unit/__init__.py +0 -18
  336. nucliadb/standalone/tests/unit/test_api_router.py +0 -61
  337. nucliadb/standalone/tests/unit/test_auth.py +0 -169
  338. nucliadb/standalone/tests/unit/test_introspect.py +0 -35
  339. nucliadb/standalone/tests/unit/test_versions.py +0 -68
  340. nucliadb/tests/benchmarks/__init__.py +0 -19
  341. nucliadb/tests/benchmarks/test_search.py +0 -99
  342. nucliadb/tests/conftest.py +0 -32
  343. nucliadb/tests/fixtures.py +0 -736
  344. nucliadb/tests/knowledgeboxes/philosophy_books.py +0 -203
  345. nucliadb/tests/knowledgeboxes/ten_dummy_resources.py +0 -109
  346. nucliadb/tests/migrations/__init__.py +0 -19
  347. nucliadb/tests/migrations/test_migration_0017.py +0 -80
  348. nucliadb/tests/tikv.py +0 -240
  349. nucliadb/tests/unit/__init__.py +0 -19
  350. nucliadb/tests/unit/common/__init__.py +0 -19
  351. nucliadb/tests/unit/common/cluster/__init__.py +0 -19
  352. nucliadb/tests/unit/common/cluster/discovery/__init__.py +0 -19
  353. nucliadb/tests/unit/common/cluster/discovery/test_k8s.py +0 -170
  354. nucliadb/tests/unit/common/cluster/standalone/__init__.py +0 -18
  355. nucliadb/tests/unit/common/cluster/standalone/test_service.py +0 -113
  356. nucliadb/tests/unit/common/cluster/standalone/test_utils.py +0 -59
  357. nucliadb/tests/unit/common/cluster/test_cluster.py +0 -399
  358. nucliadb/tests/unit/common/cluster/test_kb_shard_manager.py +0 -178
  359. nucliadb/tests/unit/common/cluster/test_rollover.py +0 -279
  360. nucliadb/tests/unit/common/maindb/__init__.py +0 -18
  361. nucliadb/tests/unit/common/maindb/test_driver.py +0 -127
  362. nucliadb/tests/unit/common/maindb/test_tikv.py +0 -53
  363. nucliadb/tests/unit/common/maindb/test_utils.py +0 -81
  364. nucliadb/tests/unit/common/test_context.py +0 -36
  365. nucliadb/tests/unit/export_import/__init__.py +0 -19
  366. nucliadb/tests/unit/export_import/test_datamanager.py +0 -37
  367. nucliadb/tests/unit/export_import/test_utils.py +0 -294
  368. nucliadb/tests/unit/migrator/__init__.py +0 -19
  369. nucliadb/tests/unit/migrator/test_migrator.py +0 -87
  370. nucliadb/tests/unit/tasks/__init__.py +0 -19
  371. nucliadb/tests/unit/tasks/conftest.py +0 -42
  372. nucliadb/tests/unit/tasks/test_consumer.py +0 -93
  373. nucliadb/tests/unit/tasks/test_producer.py +0 -95
  374. nucliadb/tests/unit/tasks/test_tasks.py +0 -60
  375. nucliadb/tests/unit/test_field_ids.py +0 -49
  376. nucliadb/tests/unit/test_health.py +0 -84
  377. nucliadb/tests/unit/test_kb_slugs.py +0 -54
  378. nucliadb/tests/unit/test_learning_proxy.py +0 -252
  379. nucliadb/tests/unit/test_metrics_exporter.py +0 -77
  380. nucliadb/tests/unit/test_purge.py +0 -138
  381. nucliadb/tests/utils/__init__.py +0 -74
  382. nucliadb/tests/utils/aiohttp_session.py +0 -44
  383. nucliadb/tests/utils/broker_messages/__init__.py +0 -167
  384. nucliadb/tests/utils/broker_messages/fields.py +0 -181
  385. nucliadb/tests/utils/broker_messages/helpers.py +0 -33
  386. nucliadb/tests/utils/entities.py +0 -78
  387. nucliadb/train/api/v1/check.py +0 -60
  388. nucliadb/train/tests/__init__.py +0 -19
  389. nucliadb/train/tests/conftest.py +0 -29
  390. nucliadb/train/tests/fixtures.py +0 -342
  391. nucliadb/train/tests/test_field_classification.py +0 -122
  392. nucliadb/train/tests/test_get_entities.py +0 -80
  393. nucliadb/train/tests/test_get_info.py +0 -51
  394. nucliadb/train/tests/test_get_ontology.py +0 -34
  395. nucliadb/train/tests/test_get_ontology_count.py +0 -63
  396. nucliadb/train/tests/test_image_classification.py +0 -222
  397. nucliadb/train/tests/test_list_fields.py +0 -39
  398. nucliadb/train/tests/test_list_paragraphs.py +0 -73
  399. nucliadb/train/tests/test_list_resources.py +0 -39
  400. nucliadb/train/tests/test_list_sentences.py +0 -71
  401. nucliadb/train/tests/test_paragraph_classification.py +0 -123
  402. nucliadb/train/tests/test_paragraph_streaming.py +0 -118
  403. nucliadb/train/tests/test_question_answer_streaming.py +0 -239
  404. nucliadb/train/tests/test_sentence_classification.py +0 -143
  405. nucliadb/train/tests/test_token_classification.py +0 -136
  406. nucliadb/train/tests/utils.py +0 -108
  407. nucliadb/writer/layouts/__init__.py +0 -51
  408. nucliadb/writer/layouts/v1.py +0 -59
  409. nucliadb/writer/resource/vectors.py +0 -120
  410. nucliadb/writer/tests/__init__.py +0 -19
  411. nucliadb/writer/tests/conftest.py +0 -31
  412. nucliadb/writer/tests/fixtures.py +0 -192
  413. nucliadb/writer/tests/test_fields.py +0 -486
  414. nucliadb/writer/tests/test_files.py +0 -743
  415. nucliadb/writer/tests/test_knowledgebox.py +0 -49
  416. nucliadb/writer/tests/test_reprocess_file_field.py +0 -139
  417. nucliadb/writer/tests/test_resources.py +0 -546
  418. nucliadb/writer/tests/test_service.py +0 -137
  419. nucliadb/writer/tests/test_tus.py +0 -203
  420. nucliadb/writer/tests/utils.py +0 -35
  421. nucliadb/writer/tus/pg.py +0 -125
  422. nucliadb-2.46.1.post382.dist-info/METADATA +0 -134
  423. nucliadb-2.46.1.post382.dist-info/RECORD +0 -451
  424. {nucliadb/ingest/tests → migrations/pg}/__init__.py +0 -0
  425. /nucliadb/{ingest/tests/integration → common/external_index_providers}/__init__.py +0 -0
  426. /nucliadb/{ingest/tests/integration/ingest → common/models_utils}/__init__.py +0 -0
  427. /nucliadb/{ingest/tests/unit → search/search/query_parser}/__init__.py +0 -0
  428. /nucliadb/{ingest/tests → tests}/vectors.py +0 -0
  429. {nucliadb-2.46.1.post382.dist-info → nucliadb-6.2.1.post2777.dist-info}/entry_points.txt +0 -0
  430. {nucliadb-2.46.1.post382.dist-info → nucliadb-6.2.1.post2777.dist-info}/top_level.txt +0 -0
  431. {nucliadb-2.46.1.post382.dist-info → nucliadb-6.2.1.post2777.dist-info}/zip-safe +0 -0
@@ -17,12 +17,11 @@
17
17
  # You should have received a copy of the GNU Affero General Public License
18
18
  # along with this program. If not, see <http://www.gnu.org/licenses/>.
19
19
  #
20
- from typing import TYPE_CHECKING, Optional
20
+ from inspect import iscoroutinefunction
21
+ from typing import TYPE_CHECKING, Callable, Optional, Type, Union
21
22
 
22
23
  from fastapi import HTTPException, Response
23
- from fastapi_versioning import version # type: ignore
24
- from nucliadb_protos.resources_pb2 import FieldID, FieldType, Metadata
25
- from nucliadb_protos.writer_pb2 import BrokerMessage
24
+ from fastapi_versioning import version
26
25
  from starlette.requests import Request
27
26
 
28
27
  import nucliadb_models as models
@@ -32,57 +31,70 @@ from nucliadb.ingest.processing import PushPayload, Source
32
31
  from nucliadb.writer import SERVICE_NAME
33
32
  from nucliadb.writer.api.constants import (
34
33
  SKIP_STORE_DEFAULT,
35
- SYNC_CALL,
36
34
  X_FILE_PASSWORD,
37
35
  X_NUCLIADB_USER,
38
36
  )
39
- from nucliadb.writer.api.v1.resource import get_rid_from_params_or_raise_error
37
+ from nucliadb.writer.api.v1 import transaction
38
+ from nucliadb.writer.api.v1.resource import (
39
+ get_rid_from_slug_or_raise_error,
40
+ validate_rid_exists_or_raise_error,
41
+ )
40
42
  from nucliadb.writer.api.v1.router import KB_PREFIX, RESOURCE_PREFIX, RSLUG_PREFIX, api
41
43
  from nucliadb.writer.back_pressure import maybe_back_pressure
42
44
  from nucliadb.writer.resource.audit import parse_audit
43
- from nucliadb.writer.resource.basic import set_processing_info
44
45
  from nucliadb.writer.resource.field import (
45
46
  extract_file_field,
46
47
  parse_conversation_field,
47
- parse_datetime_field,
48
48
  parse_file_field,
49
- parse_keywordset_field,
50
- parse_layout_field,
51
49
  parse_link_field,
52
50
  parse_text_field,
53
51
  )
54
52
  from nucliadb.writer.utilities import get_processing
55
53
  from nucliadb_models.resource import NucliaDBRoles
54
+ from nucliadb_models.utils import FieldIdString
56
55
  from nucliadb_models.writer import ResourceFieldAdded, ResourceUpdated
56
+ from nucliadb_protos import resources_pb2
57
+ from nucliadb_protos.resources_pb2 import FieldID, Metadata
58
+ from nucliadb_protos.writer_pb2 import BrokerMessage
57
59
  from nucliadb_utils.authentication import requires
58
60
  from nucliadb_utils.exceptions import LimitsExceededError, SendToProcessError
59
61
  from nucliadb_utils.utilities import (
60
62
  get_partitioning,
61
63
  get_storage,
62
- get_transaction_utility,
63
64
  )
64
65
 
65
66
  if TYPE_CHECKING: # pragma: no cover
66
- FIELD_TYPE_NAME_TO_FIELD_TYPE_MAP: dict[models.FieldTypeName, FieldType.V]
67
+ FIELD_TYPE_NAME_TO_FIELD_TYPE_MAP: dict[models.FieldTypeName, resources_pb2.FieldType.ValueType]
67
68
  else:
68
69
  FIELD_TYPE_NAME_TO_FIELD_TYPE_MAP: dict[models.FieldTypeName, int]
69
70
 
71
+ FieldModelType = Union[
72
+ models.TextField,
73
+ models.LinkField,
74
+ models.InputConversationField,
75
+ models.FileField,
76
+ ]
70
77
 
71
78
  FIELD_TYPE_NAME_TO_FIELD_TYPE_MAP = {
72
- models.FieldTypeName.FILE: FieldType.FILE,
73
- models.FieldTypeName.LINK: FieldType.LINK,
74
- models.FieldTypeName.DATETIME: FieldType.DATETIME,
75
- models.FieldTypeName.KEYWORDSET: FieldType.KEYWORDSET,
76
- models.FieldTypeName.TEXT: FieldType.TEXT,
77
- models.FieldTypeName.LAYOUT: FieldType.LAYOUT,
78
- # models.FieldTypeName.GENERIC: FieldType.GENERIC,
79
- models.FieldTypeName.CONVERSATION: FieldType.CONVERSATION,
79
+ models.FieldTypeName.FILE: resources_pb2.FieldType.FILE,
80
+ models.FieldTypeName.LINK: resources_pb2.FieldType.LINK,
81
+ models.FieldTypeName.TEXT: resources_pb2.FieldType.TEXT,
82
+ # models.FieldTypeName.GENERIC: resources_pb2.FieldType.GENERIC,
83
+ models.FieldTypeName.CONVERSATION: resources_pb2.FieldType.CONVERSATION,
80
84
  }
81
85
 
82
86
 
83
- def prepare_field_put(
84
- kbid: str, rid: str, request: Request
85
- ) -> tuple[BrokerMessage, PushPayload, int]:
87
+ async def add_field_to_resource(
88
+ request: Request,
89
+ kbid: str,
90
+ rid: str,
91
+ field_id: FieldIdString,
92
+ field_payload: FieldModelType,
93
+ **parser_kwargs,
94
+ ):
95
+ await validate_rid_exists_or_raise_error(kbid, rid)
96
+ await maybe_back_pressure(request, kbid, resource_uuid=rid)
97
+
86
98
  partitioning = get_partitioning()
87
99
  partition = partitioning.generate_partition(kbid, rid)
88
100
 
@@ -101,392 +113,224 @@ def prepare_field_put(
101
113
  toprocess.source = Source.HTTP
102
114
 
103
115
  parse_audit(writer.audit, request)
104
- return writer, toprocess, partition
105
116
 
117
+ parse_field = FIELD_PARSERS_MAP[type(field_payload)]
118
+ if iscoroutinefunction(parse_field):
119
+ await parse_field(kbid, rid, field_id, field_payload, writer, toprocess, **parser_kwargs)
120
+ else:
121
+ parse_field(kbid, rid, field_id, field_payload, writer, toprocess, **parser_kwargs)
106
122
 
107
- async def finish_field_put(
108
- writer: BrokerMessage,
109
- toprocess: PushPayload,
110
- partition: int,
111
- wait_on_commit: bool,
112
- ) -> Optional[int]:
113
- # Create processing message
114
- transaction = get_transaction_utility()
115
123
  processing = get_processing()
116
-
117
- processing_info = await processing.send_to_process(toprocess, partition)
118
-
119
- writer.source = BrokerMessage.MessageSource.WRITER
120
- set_processing_info(writer, processing_info)
121
- await transaction.commit(writer, partition, wait=wait_on_commit)
122
-
123
- return processing_info.seqid
124
+ await transaction.commit(writer, partition)
125
+ try:
126
+ processing_info = await processing.send_to_process(toprocess, partition)
127
+ except LimitsExceededError as exc:
128
+ raise HTTPException(status_code=exc.status_code, detail=exc.detail)
129
+ except SendToProcessError:
130
+ raise HTTPException(
131
+ status_code=500,
132
+ detail="Error while sending to process. Try calling /reprocess",
133
+ )
134
+ seqid = processing_info.seqid
135
+ return ResourceFieldAdded(seqid=seqid)
124
136
 
125
137
 
126
- @api.put(
127
- f"/{KB_PREFIX}/{{kbid}}/{RSLUG_PREFIX}/{{rslug}}/text/{{field_id}}",
128
- status_code=201,
129
- name="Add resource text field (by slug)",
130
- response_model=ResourceFieldAdded,
131
- tags=["Resource fields"],
132
- )
133
- @requires(NucliaDBRoles.WRITER)
134
- @version(1)
135
- async def add_resource_field_text_rslug_prefix(
138
+ async def add_field_to_resource_by_slug(
136
139
  request: Request,
137
140
  kbid: str,
138
- rslug: str,
139
- field_id: str,
140
- field_payload: models.TextField,
141
- x_synchronous: bool = SYNC_CALL,
142
- ) -> ResourceFieldAdded:
143
- return await _add_resource_field_text(
144
- request,
145
- kbid,
146
- field_id,
147
- field_payload,
148
- x_synchronous,
149
- rslug=rslug,
150
- )
141
+ slug: str,
142
+ field_id: FieldIdString,
143
+ field_payload: FieldModelType,
144
+ **parser_kwargs,
145
+ ):
146
+ rid = await get_rid_from_slug_or_raise_error(kbid, slug)
147
+ return await add_field_to_resource(request, kbid, rid, field_id, field_payload, **parser_kwargs)
151
148
 
152
149
 
153
- @api.put(
154
- f"/{KB_PREFIX}/{{kbid}}/{RESOURCE_PREFIX}/{{rid}}/text/{{field_id}}",
155
- status_code=201,
156
- name="Add resource text field (by id)",
157
- response_model=ResourceFieldAdded,
158
- tags=["Resource fields"],
159
- )
160
- @requires(NucliaDBRoles.WRITER)
161
- @version(1)
162
- async def add_resource_field_text_rid_prefix(
150
+ async def delete_resource_field(
163
151
  request: Request,
164
152
  kbid: str,
165
153
  rid: str,
166
- field_id: str,
167
- field_payload: models.TextField,
168
- x_synchronous: bool = SYNC_CALL,
169
- ) -> ResourceFieldAdded:
170
- return await _add_resource_field_text(
171
- request,
172
- kbid,
173
- field_id,
174
- field_payload,
175
- x_synchronous,
176
- rid=rid,
177
- )
178
-
154
+ field_type: models.FieldTypeName,
155
+ field_id: FieldIdString,
156
+ ):
157
+ await validate_rid_exists_or_raise_error(kbid, rid)
179
158
 
180
- async def _add_resource_field_text(
181
- request: Request,
182
- kbid: str,
183
- field_id: str,
184
- field_payload: models.TextField,
185
- x_synchronous: bool,
186
- rid: Optional[str] = None,
187
- rslug: Optional[str] = None,
188
- ) -> ResourceFieldAdded:
189
- rid = await get_rid_from_params_or_raise_error(kbid, rid, rslug)
159
+ partitioning = get_partitioning()
160
+ partition = partitioning.generate_partition(kbid, rid)
161
+ writer = BrokerMessage()
190
162
 
191
- await maybe_back_pressure(request, kbid, resource_uuid=rid)
163
+ writer.kbid = kbid
164
+ writer.uuid = rid
192
165
 
193
- writer, toprocess, partition = prepare_field_put(kbid, rid, request)
194
- parse_text_field(field_id, field_payload, writer, toprocess)
195
- try:
196
- seqid = await finish_field_put(writer, toprocess, partition, x_synchronous)
197
- except LimitsExceededError as exc:
198
- raise HTTPException(status_code=exc.status_code, detail=exc.detail)
199
- except SendToProcessError:
200
- raise HTTPException(status_code=500, detail="Error while sending to process")
166
+ pb_field_id = FieldID()
167
+ pb_field_id.field_type = FIELD_TYPE_NAME_TO_FIELD_TYPE_MAP[field_type]
168
+ pb_field_id.field = field_id
201
169
 
202
- return ResourceFieldAdded(seqid=seqid)
170
+ writer.delete_fields.append(pb_field_id)
171
+ parse_audit(writer.audit, request)
172
+ await transaction.commit(writer, partition)
173
+ return Response(status_code=204)
203
174
 
204
175
 
205
- @api.put(
206
- f"/{KB_PREFIX}/{{kbid}}/{RSLUG_PREFIX}/{{rslug}}/link/{{field_id}}",
207
- status_code=201,
208
- name="Add resource link field (by slug)",
209
- response_model=ResourceFieldAdded,
210
- tags=["Resource fields"],
211
- )
212
- @requires(NucliaDBRoles.WRITER)
213
- @version(1)
214
- async def add_resource_field_link_rslug_prefix(
176
+ async def delete_resource_field_by_slug(
215
177
  request: Request,
216
178
  kbid: str,
217
- rslug: str,
218
- field_id: str,
219
- field_payload: models.LinkField,
220
- x_synchronous: bool = SYNC_CALL,
221
- ) -> ResourceFieldAdded:
222
- return await _add_resource_field_link(
223
- request, kbid, field_id, field_payload, x_synchronous, rslug=rslug
179
+ slug: str,
180
+ field_type: models.FieldTypeName,
181
+ field_id: FieldIdString,
182
+ ):
183
+ rid = await get_rid_from_slug_or_raise_error(kbid, slug)
184
+ return await delete_resource_field(
185
+ request,
186
+ kbid,
187
+ rid,
188
+ field_type,
189
+ field_id,
224
190
  )
225
191
 
226
192
 
227
- @api.put(
228
- f"/{KB_PREFIX}/{{kbid}}/{RESOURCE_PREFIX}/{{rid}}/link/{{field_id}}",
229
- status_code=201,
230
- name="Add resource link field (by id)",
231
- response_model=ResourceFieldAdded,
232
- tags=["Resource fields"],
233
- )
234
- @requires(NucliaDBRoles.WRITER)
235
- @version(1)
236
- async def add_resource_field_link_rid_prefix(
237
- request: Request,
238
- kbid: str,
239
- rid: str,
240
- field_id: str,
241
- field_payload: models.LinkField,
242
- x_synchronous: bool = SYNC_CALL,
243
- ) -> ResourceFieldAdded:
244
- return await _add_resource_field_link(
245
- request, kbid, field_id, field_payload, x_synchronous, rid=rid
246
- )
247
-
193
+ # Adapters for each parse function
248
194
 
249
- async def _add_resource_field_link(
250
- request: Request,
251
- kbid: str,
252
- field_id: str,
253
- field_payload: models.LinkField,
254
- x_synchronous: bool,
255
- rid: Optional[str] = None,
256
- rslug: Optional[str] = None,
257
- ) -> ResourceFieldAdded:
258
- rid = await get_rid_from_params_or_raise_error(kbid, rid, rslug)
259
195
 
260
- await maybe_back_pressure(request, kbid, resource_uuid=rid)
196
+ def parse_text_field_adapter(
197
+ _kbid: str,
198
+ _rid: str,
199
+ field_id: FieldIdString,
200
+ field_payload: models.TextField,
201
+ writer: BrokerMessage,
202
+ toprocess: PushPayload,
203
+ ):
204
+ return parse_text_field(field_id, field_payload, writer, toprocess)
261
205
 
262
- writer, toprocess, partition = prepare_field_put(kbid, rid, request)
263
- parse_link_field(field_id, field_payload, writer, toprocess)
264
- try:
265
- seqid = await finish_field_put(writer, toprocess, partition, x_synchronous)
266
- except LimitsExceededError as exc:
267
- raise HTTPException(status_code=exc.status_code, detail=exc.detail)
268
- except SendToProcessError:
269
- raise HTTPException(status_code=500, detail="Error while sending to process")
270
206
 
271
- return ResourceFieldAdded(seqid=seqid)
207
+ def parse_link_field_adapter(
208
+ _kbid: str,
209
+ _rid: str,
210
+ field_id: FieldIdString,
211
+ field_payload: models.LinkField,
212
+ writer: BrokerMessage,
213
+ toprocess: PushPayload,
214
+ ):
215
+ return parse_link_field(field_id, field_payload, writer, toprocess)
272
216
 
273
217
 
274
- @api.put(
275
- f"/{KB_PREFIX}/{{kbid}}/{RSLUG_PREFIX}/{{rslug}}/keywordset/{{field_id}}",
276
- status_code=201,
277
- name="Add resource keywordset field (by slug)",
278
- response_model=ResourceFieldAdded,
279
- tags=["Resource fields"],
280
- )
281
- @requires(NucliaDBRoles.WRITER)
282
- @version(1)
283
- async def add_resource_field_keywordset_rslug_prefix(
284
- request: Request,
218
+ async def parse_conversation_field_adapter(
285
219
  kbid: str,
286
- rslug: str,
287
- field_id: str,
288
- field_payload: models.FieldKeywordset,
289
- x_synchronous: bool = SYNC_CALL,
290
- ) -> ResourceFieldAdded:
291
- return await _add_resource_field_keywordset(
292
- request, kbid, field_id, field_payload, x_synchronous, rslug=rslug
293
- )
220
+ rid: str,
221
+ field_id: FieldIdString,
222
+ field_payload: models.InputConversationField,
223
+ writer: BrokerMessage,
224
+ toprocess: PushPayload,
225
+ ):
226
+ return await parse_conversation_field(field_id, field_payload, writer, toprocess, kbid, rid)
294
227
 
295
228
 
296
- @api.put(
297
- f"/{KB_PREFIX}/{{kbid}}/{RESOURCE_PREFIX}/{{rid}}/keywordset/{{field_id}}",
298
- status_code=201,
299
- name="Add resource keywordset field (by id)",
300
- response_model=ResourceFieldAdded,
301
- tags=["Resource fields"],
302
- )
303
- @requires(NucliaDBRoles.WRITER)
304
- @version(1)
305
- async def add_resource_field_keywordset_rid_prefix(
306
- request: Request,
229
+ async def parse_file_field_adapter(
307
230
  kbid: str,
308
231
  rid: str,
309
- field_id: str,
310
- field_payload: models.FieldKeywordset,
311
- x_synchronous: bool = SYNC_CALL,
312
- ) -> ResourceFieldAdded:
313
- return await _add_resource_field_keywordset(
314
- request, kbid, field_id, field_payload, x_synchronous, rid=rid
232
+ field_id: FieldIdString,
233
+ field_payload: models.FileField,
234
+ writer: BrokerMessage,
235
+ toprocess: PushPayload,
236
+ skip_store: bool,
237
+ ):
238
+ return await parse_file_field(
239
+ field_id, field_payload, writer, toprocess, kbid, rid, skip_store=skip_store
315
240
  )
316
241
 
317
242
 
318
- async def _add_resource_field_keywordset(
319
- request: Request,
320
- kbid: str,
321
- field_id: str,
322
- field_payload: models.FieldKeywordset,
323
- x_synchronous: bool,
324
- rid: Optional[str] = None,
325
- rslug: Optional[str] = None,
326
- ) -> ResourceFieldAdded:
327
- rid = await get_rid_from_params_or_raise_error(kbid, rid, rslug)
328
-
329
- await maybe_back_pressure(request, kbid, resource_uuid=rid)
243
+ FIELD_PARSERS_MAP: dict[Type, Union[Callable]] = {
244
+ models.TextField: parse_text_field_adapter,
245
+ models.LinkField: parse_link_field_adapter,
246
+ models.InputConversationField: parse_conversation_field_adapter,
247
+ models.FileField: parse_file_field_adapter,
248
+ }
330
249
 
331
- writer, toprocess, partition = prepare_field_put(kbid, rid, request)
332
- parse_keywordset_field(field_id, field_payload, writer, toprocess)
333
- try:
334
- seqid = await finish_field_put(writer, toprocess, partition, x_synchronous)
335
- except LimitsExceededError as exc:
336
- raise HTTPException(status_code=exc.status_code, detail=exc.detail)
337
- except SendToProcessError:
338
- raise HTTPException(status_code=500, detail="Error while sending to process")
339
250
 
340
- return ResourceFieldAdded(seqid=seqid)
251
+ # API endpoints
341
252
 
342
253
 
343
254
  @api.put(
344
- f"/{KB_PREFIX}/{{kbid}}/{RSLUG_PREFIX}/{{rslug}}/datetime/{{field_id}}",
255
+ f"/{KB_PREFIX}/{{kbid}}/{RSLUG_PREFIX}/{{rslug}}/text/{{field_id}}",
345
256
  status_code=201,
346
- name="Add resource datetime field (by slug)",
257
+ summary="Add resource text field (by slug)",
347
258
  response_model=ResourceFieldAdded,
348
259
  tags=["Resource fields"],
349
260
  )
350
261
  @requires(NucliaDBRoles.WRITER)
351
262
  @version(1)
352
- async def add_resource_field_datetime_rslug_prefix(
263
+ async def add_resource_field_text_rslug_prefix(
353
264
  request: Request,
354
265
  kbid: str,
355
266
  rslug: str,
356
- field_id: str,
357
- field_payload: models.FieldDatetime,
358
- x_synchronous: bool = SYNC_CALL,
267
+ field_id: FieldIdString,
268
+ field_payload: models.TextField,
359
269
  ) -> ResourceFieldAdded:
360
- return await _add_resource_field_datetime(
361
- request, kbid, field_id, field_payload, x_synchronous, rslug=rslug
362
- )
270
+ return await add_field_to_resource_by_slug(request, kbid, rslug, field_id, field_payload)
363
271
 
364
272
 
365
273
  @api.put(
366
- f"/{KB_PREFIX}/{{kbid}}/{RESOURCE_PREFIX}/{{rid}}/datetime/{{field_id}}",
274
+ f"/{KB_PREFIX}/{{kbid}}/{RESOURCE_PREFIX}/{{rid}}/text/{{field_id}}",
367
275
  status_code=201,
368
- name="Add resource datetime field (by id)",
276
+ summary="Add resource text field (by id)",
369
277
  response_model=ResourceFieldAdded,
370
278
  tags=["Resource fields"],
371
279
  )
372
280
  @requires(NucliaDBRoles.WRITER)
373
281
  @version(1)
374
- async def add_resource_field_datetime_rid_prefix(
282
+ async def add_resource_field_text_rid_prefix(
375
283
  request: Request,
376
284
  kbid: str,
377
285
  rid: str,
378
- field_id: str,
379
- field_payload: models.FieldDatetime,
380
- x_synchronous: bool = SYNC_CALL,
381
- ) -> ResourceFieldAdded:
382
- return await _add_resource_field_datetime(
383
- request, kbid, field_id, field_payload, x_synchronous, rid=rid
384
- )
385
-
386
-
387
- async def _add_resource_field_datetime(
388
- request: Request,
389
- kbid: str,
390
- field_id: str,
391
- field_payload: models.FieldDatetime,
392
- x_synchronous: bool,
393
- rid: Optional[str] = None,
394
- rslug: Optional[str] = None,
286
+ field_id: FieldIdString,
287
+ field_payload: models.TextField,
395
288
  ) -> ResourceFieldAdded:
396
- rid = await get_rid_from_params_or_raise_error(kbid, rid, rslug)
397
-
398
- await maybe_back_pressure(request, kbid, resource_uuid=rid)
399
-
400
- writer, toprocess, partition = prepare_field_put(kbid, rid, request)
401
- parse_datetime_field(field_id, field_payload, writer, toprocess)
402
- try:
403
- seqid = await finish_field_put(writer, toprocess, partition, x_synchronous)
404
- except LimitsExceededError as exc:
405
- raise HTTPException(status_code=exc.status_code, detail=exc.detail)
406
- except SendToProcessError:
407
- raise HTTPException(status_code=500, detail="Error while sending to process")
408
-
409
- return ResourceFieldAdded(seqid=seqid)
289
+ return await add_field_to_resource(request, kbid, rid, field_id, field_payload)
410
290
 
411
291
 
412
292
  @api.put(
413
- f"/{KB_PREFIX}/{{kbid}}/{RSLUG_PREFIX}/{{rslug}}/layout/{{field_id}}",
293
+ f"/{KB_PREFIX}/{{kbid}}/{RSLUG_PREFIX}/{{rslug}}/link/{{field_id}}",
414
294
  status_code=201,
415
- name="Add resource layout field (by slug)",
295
+ summary="Add resource link field (by slug)",
416
296
  response_model=ResourceFieldAdded,
417
297
  tags=["Resource fields"],
418
298
  )
419
299
  @requires(NucliaDBRoles.WRITER)
420
300
  @version(1)
421
- async def add_resource_field_layout_rslug_prefix(
301
+ async def add_resource_field_link_rslug_prefix(
422
302
  request: Request,
423
303
  kbid: str,
424
304
  rslug: str,
425
- field_id: str,
426
- field_payload: models.InputLayoutField,
427
- x_synchronous: bool = SYNC_CALL,
305
+ field_id: FieldIdString,
306
+ field_payload: models.LinkField,
428
307
  ) -> ResourceFieldAdded:
429
- return await _add_resource_field_layout(
430
- request,
431
- kbid,
432
- field_id,
433
- field_payload,
434
- x_synchronous,
435
- rslug=rslug,
436
- )
308
+ return await add_field_to_resource_by_slug(request, kbid, rslug, field_id, field_payload)
437
309
 
438
310
 
439
311
  @api.put(
440
- f"/{KB_PREFIX}/{{kbid}}/{RESOURCE_PREFIX}/{{rid}}/layout/{{field_id}}",
312
+ f"/{KB_PREFIX}/{{kbid}}/{RESOURCE_PREFIX}/{{rid}}/link/{{field_id}}",
441
313
  status_code=201,
442
- name="Add resource layout field (by id)",
314
+ summary="Add resource link field (by id)",
443
315
  response_model=ResourceFieldAdded,
444
316
  tags=["Resource fields"],
445
317
  )
446
318
  @requires(NucliaDBRoles.WRITER)
447
319
  @version(1)
448
- async def add_resource_field_layout_rid_prefix(
320
+ async def add_resource_field_link_rid_prefix(
449
321
  request: Request,
450
322
  kbid: str,
451
323
  rid: str,
452
- field_id: str,
453
- field_payload: models.InputLayoutField,
454
- x_synchronous: bool = SYNC_CALL,
455
- ) -> ResourceFieldAdded:
456
- return await _add_resource_field_layout(
457
- request, kbid, field_id, field_payload, x_synchronous, rid=rid
458
- )
459
-
460
-
461
- async def _add_resource_field_layout(
462
- request: Request,
463
- kbid: str,
464
- field_id: str,
465
- field_payload: models.InputLayoutField,
466
- x_synchronous: bool,
467
- rid: Optional[str] = None,
468
- rslug: Optional[str] = None,
324
+ field_id: FieldIdString,
325
+ field_payload: models.LinkField,
469
326
  ) -> ResourceFieldAdded:
470
- rid = await get_rid_from_params_or_raise_error(kbid, rid, rslug)
471
-
472
- await maybe_back_pressure(request, kbid, resource_uuid=rid)
473
-
474
- writer, toprocess, partition = prepare_field_put(kbid, rid, request)
475
- await parse_layout_field(field_id, field_payload, writer, toprocess, kbid, rid)
476
- try:
477
- seqid = await finish_field_put(writer, toprocess, partition, x_synchronous)
478
- except LimitsExceededError as exc:
479
- raise HTTPException(status_code=exc.status_code, detail=exc.detail)
480
- except SendToProcessError:
481
- raise HTTPException(status_code=500, detail="Error while sending to process")
482
-
483
- return ResourceFieldAdded(seqid=seqid)
327
+ return await add_field_to_resource(request, kbid, rid, field_id, field_payload)
484
328
 
485
329
 
486
330
  @api.put(
487
331
  f"/{KB_PREFIX}/{{kbid}}/{RSLUG_PREFIX}/{{rslug}}/conversation/{{field_id}}",
488
332
  status_code=201,
489
- name="Add resource conversation field (by slug)",
333
+ summary="Add resource conversation field (by slug)",
490
334
  response_model=ResourceFieldAdded,
491
335
  tags=["Resource fields"],
492
336
  )
@@ -496,19 +340,16 @@ async def add_resource_field_conversation_rslug_prefix(
496
340
  request: Request,
497
341
  kbid: str,
498
342
  rslug: str,
499
- field_id: str,
343
+ field_id: FieldIdString,
500
344
  field_payload: models.InputConversationField,
501
- x_synchronous: bool = SYNC_CALL,
502
345
  ) -> ResourceFieldAdded:
503
- return await _add_resource_field_conversation(
504
- request, kbid, field_id, field_payload, x_synchronous, rslug=rslug
505
- )
346
+ return await add_field_to_resource_by_slug(request, kbid, rslug, field_id, field_payload)
506
347
 
507
348
 
508
349
  @api.put(
509
350
  f"/{KB_PREFIX}/{{kbid}}/{RESOURCE_PREFIX}/{{rid}}/conversation/{{field_id}}",
510
351
  status_code=201,
511
- name="Add resource conversation field (by id)",
352
+ summary="Add resource conversation field (by id)",
512
353
  response_model=ResourceFieldAdded,
513
354
  tags=["Resource fields"],
514
355
  )
@@ -518,46 +359,16 @@ async def add_resource_field_conversation_rid_prefix(
518
359
  request: Request,
519
360
  kbid: str,
520
361
  rid: str,
521
- field_id: str,
362
+ field_id: FieldIdString,
522
363
  field_payload: models.InputConversationField,
523
- x_synchronous: bool = SYNC_CALL,
524
364
  ) -> ResourceFieldAdded:
525
- return await _add_resource_field_conversation(
526
- request, kbid, field_id, field_payload, x_synchronous, rid=rid
527
- )
528
-
529
-
530
- async def _add_resource_field_conversation(
531
- request: Request,
532
- kbid: str,
533
- field_id: str,
534
- field_payload: models.InputConversationField,
535
- x_synchronous: bool,
536
- rid: Optional[str] = None,
537
- rslug: Optional[str] = None,
538
- ) -> ResourceFieldAdded:
539
- rid = await get_rid_from_params_or_raise_error(kbid, rid, rslug)
540
-
541
- await maybe_back_pressure(request, kbid, resource_uuid=rid)
542
-
543
- writer, toprocess, partition = prepare_field_put(kbid, rid, request)
544
- await parse_conversation_field(
545
- field_id, field_payload, writer, toprocess, kbid, rid
546
- )
547
- try:
548
- seqid = await finish_field_put(writer, toprocess, partition, x_synchronous)
549
- except LimitsExceededError as exc:
550
- raise HTTPException(status_code=exc.status_code, detail=exc.detail)
551
- except SendToProcessError:
552
- raise HTTPException(status_code=500, detail="Error while sending to process")
553
-
554
- return ResourceFieldAdded(seqid=seqid)
365
+ return await add_field_to_resource(request, kbid, rid, field_id, field_payload)
555
366
 
556
367
 
557
368
  @api.put(
558
369
  f"/{KB_PREFIX}/{{kbid}}/{RSLUG_PREFIX}/{{rslug}}/file/{{field_id}}",
559
370
  status_code=201,
560
- name="Add resource file field (by slug)",
371
+ summary="Add resource file field (by slug)",
561
372
  response_model=ResourceFieldAdded,
562
373
  tags=["Resource fields"],
563
374
  )
@@ -567,26 +378,19 @@ async def add_resource_field_file_rslug_prefix(
567
378
  request: Request,
568
379
  kbid: str,
569
380
  rslug: str,
570
- field_id: str,
381
+ field_id: FieldIdString,
571
382
  field_payload: models.FileField,
572
383
  x_skip_store: bool = SKIP_STORE_DEFAULT,
573
- x_synchronous: bool = SYNC_CALL,
574
384
  ) -> ResourceFieldAdded:
575
- return await _add_resource_field_file(
576
- request,
577
- kbid,
578
- field_id,
579
- field_payload,
580
- x_skip_store,
581
- x_synchronous,
582
- rslug=rslug,
385
+ return await add_field_to_resource_by_slug(
386
+ request, kbid, rslug, field_id, field_payload, skip_store=x_skip_store
583
387
  )
584
388
 
585
389
 
586
390
  @api.put(
587
391
  f"/{KB_PREFIX}/{{kbid}}/{RESOURCE_PREFIX}/{{rid}}/file/{{field_id}}",
588
392
  status_code=201,
589
- name="Add resource file field (by id)",
393
+ summary="Add resource file field (by id)",
590
394
  response_model=ResourceFieldAdded,
591
395
  tags=["Resource fields"],
592
396
  )
@@ -596,51 +400,19 @@ async def add_resource_field_file_rid_prefix(
596
400
  request: Request,
597
401
  kbid: str,
598
402
  rid: str,
599
- field_id: str,
403
+ field_id: FieldIdString,
600
404
  field_payload: models.FileField,
601
405
  x_skip_store: bool = SKIP_STORE_DEFAULT,
602
- x_synchronous: bool = SYNC_CALL,
603
- ) -> ResourceFieldAdded:
604
- return await _add_resource_field_file(
605
- request, kbid, field_id, field_payload, x_skip_store, x_synchronous, rid=rid
606
- )
607
-
608
-
609
- async def _add_resource_field_file(
610
- request: Request,
611
- kbid: str,
612
- field_id: str,
613
- field_payload: models.FileField,
614
- x_skip_store: bool,
615
- x_synchronous: bool,
616
- rid: Optional[str] = None,
617
- rslug: Optional[str] = None,
618
406
  ) -> ResourceFieldAdded:
619
- rid = await get_rid_from_params_or_raise_error(kbid, rid, rslug)
620
-
621
- await maybe_back_pressure(request, kbid, resource_uuid=rid)
622
-
623
- writer, toprocess, partition = prepare_field_put(kbid, rid, request)
624
- await parse_file_field(
625
- field_id, field_payload, writer, toprocess, kbid, rid, skip_store=x_skip_store
407
+ return await add_field_to_resource(
408
+ request, kbid, rid, field_id, field_payload, skip_store=x_skip_store
626
409
  )
627
410
 
628
- try:
629
- seqid = await finish_field_put(
630
- writer, toprocess, partition, wait_on_commit=x_synchronous
631
- )
632
- except LimitsExceededError as exc:
633
- raise HTTPException(status_code=exc.status_code, detail=exc.detail)
634
- except SendToProcessError:
635
- raise HTTPException(status_code=500, detail="Error while sending to process")
636
-
637
- return ResourceFieldAdded(seqid=seqid)
638
-
639
411
 
640
412
  @api.put(
641
413
  f"/{KB_PREFIX}/{{kbid}}/{RSLUG_PREFIX}/{{rslug}}/conversation/{{field_id}}/messages",
642
414
  status_code=200,
643
- name="Append messages to conversation field (by slug)",
415
+ summary="Append messages to conversation field (by slug)",
644
416
  response_model=ResourceFieldAdded,
645
417
  tags=["Resource fields"],
646
418
  )
@@ -650,19 +422,18 @@ async def append_messages_to_conversation_field_rslug_prefix(
650
422
  request: Request,
651
423
  kbid: str,
652
424
  rslug: str,
653
- field_id: str,
425
+ field_id: FieldIdString,
654
426
  messages: list[models.InputMessage],
655
- x_synchronous: bool = SYNC_CALL,
656
427
  ) -> ResourceFieldAdded:
657
- return await _append_messages_to_conversation_field(
658
- request, kbid, field_id, messages, x_synchronous, rslug=rslug
659
- )
428
+ field = models.InputConversationField()
429
+ field.messages.extend(messages)
430
+ return await add_field_to_resource_by_slug(request, kbid, rslug, field_id, field)
660
431
 
661
432
 
662
433
  @api.put(
663
434
  f"/{KB_PREFIX}/{{kbid}}/{RESOURCE_PREFIX}/{{rid}}/conversation/{{field_id}}/messages",
664
435
  status_code=200,
665
- name="Append messages to conversation field (by id)",
436
+ summary="Append messages to conversation field (by id)",
666
437
  response_model=ResourceFieldAdded,
667
438
  tags=["Resource fields"],
668
439
  )
@@ -672,170 +443,18 @@ async def append_messages_to_conversation_field_rid_prefix(
672
443
  request: Request,
673
444
  kbid: str,
674
445
  rid: str,
675
- field_id: str,
446
+ field_id: FieldIdString,
676
447
  messages: list[models.InputMessage],
677
- x_synchronous: bool = SYNC_CALL,
678
448
  ) -> ResourceFieldAdded:
679
- return await _append_messages_to_conversation_field(
680
- request, kbid, field_id, messages, x_synchronous, rid=rid
681
- )
682
-
683
-
684
- async def _append_messages_to_conversation_field(
685
- request: Request,
686
- kbid: str,
687
- field_id: str,
688
- messages: list[models.InputMessage],
689
- x_synchronous: bool,
690
- rid: Optional[str] = None,
691
- rslug: Optional[str] = None,
692
- ) -> ResourceFieldAdded:
693
- transaction = get_transaction_utility()
694
- processing = get_processing()
695
- partitioning = get_partitioning()
696
-
697
- rid = await get_rid_from_params_or_raise_error(kbid, rid, rslug)
698
-
699
- await maybe_back_pressure(request, kbid, resource_uuid=rid)
700
-
701
- partition = partitioning.generate_partition(kbid, rid)
702
-
703
- writer = BrokerMessage()
704
- toprocess = PushPayload(
705
- uuid=rid,
706
- kbid=kbid,
707
- partition=partition,
708
- userid=request.headers.get("X-NUCLIADB-USER", ""),
709
- )
710
-
711
- writer.kbid = kbid
712
- writer.uuid = rid
713
- toprocess.kbid = kbid
714
- toprocess.uuid = rid
715
- toprocess.source = Source.HTTP
716
-
717
- parse_audit(writer.audit, request)
718
-
719
449
  field = models.InputConversationField()
720
450
  field.messages.extend(messages)
721
-
722
- await parse_conversation_field(field_id, field, writer, toprocess, kbid, rid)
723
-
724
- try:
725
- processing_info = await processing.send_to_process(toprocess, partition)
726
- except LimitsExceededError as exc:
727
- raise HTTPException(status_code=exc.status_code, detail=exc.detail)
728
- except SendToProcessError:
729
- raise HTTPException(status_code=500, detail="Error while sending to process")
730
-
731
- writer.source = BrokerMessage.MessageSource.WRITER
732
- set_processing_info(writer, processing_info)
733
- await transaction.commit(writer, partition, wait=x_synchronous)
734
-
735
- return ResourceFieldAdded(seqid=processing_info.seqid)
736
-
737
-
738
- @api.put(
739
- f"/{KB_PREFIX}/{{kbid}}/{RSLUG_PREFIX}/{{rslug}}/layout/{{field_id}}/blocks",
740
- status_code=200,
741
- name="Append blocks to layout field (by slug)",
742
- response_model=ResourceFieldAdded,
743
- tags=["Resource fields"],
744
- )
745
- @requires(NucliaDBRoles.WRITER)
746
- @version(1)
747
- async def append_blocks_to_layout_field_rslug_prefix(
748
- request: Request,
749
- kbid: str,
750
- rslug: str,
751
- field_id: str,
752
- blocks: dict[str, models.InputBlock],
753
- x_synchronous: bool = SYNC_CALL,
754
- ) -> ResourceFieldAdded:
755
- return await _append_blocks_to_layout_field(
756
- request, kbid, field_id, blocks, x_synchronous, rslug=rslug
757
- )
758
-
759
-
760
- @api.put(
761
- f"/{KB_PREFIX}/{{kbid}}/{RESOURCE_PREFIX}/{{rid}}/layout/{{field_id}}/blocks",
762
- status_code=200,
763
- name="Append blocks to layout field (by id)",
764
- response_model=ResourceFieldAdded,
765
- tags=["Resource fields"],
766
- )
767
- @requires(NucliaDBRoles.WRITER)
768
- @version(1)
769
- async def append_blocks_to_layout_field_rid_prefix(
770
- request: Request,
771
- kbid: str,
772
- rid: str,
773
- field_id: str,
774
- blocks: dict[str, models.InputBlock],
775
- x_synchronous: bool = SYNC_CALL,
776
- ) -> ResourceFieldAdded:
777
- return await _append_blocks_to_layout_field(
778
- request, kbid, field_id, blocks, x_synchronous, rid=rid
779
- )
780
-
781
-
782
- async def _append_blocks_to_layout_field(
783
- request: Request,
784
- kbid: str,
785
- field_id: str,
786
- blocks: dict[str, models.InputBlock],
787
- x_synchronous: bool,
788
- rid: Optional[str] = None,
789
- rslug: Optional[str] = None,
790
- ) -> ResourceFieldAdded:
791
- transaction = get_transaction_utility()
792
- processing = get_processing()
793
- partitioning = get_partitioning()
794
-
795
- rid = await get_rid_from_params_or_raise_error(kbid, rid, rslug)
796
-
797
- await maybe_back_pressure(request, kbid, resource_uuid=rid)
798
-
799
- partition = partitioning.generate_partition(kbid, rid)
800
-
801
- writer = BrokerMessage()
802
- toprocess = PushPayload(
803
- uuid=rid,
804
- kbid=kbid,
805
- partition=partition,
806
- userid=request.headers.get("X-NUCLIADB-USER", ""),
807
- )
808
-
809
- writer.kbid = kbid
810
- writer.uuid = rid
811
- toprocess.kbid = kbid
812
- toprocess.uuid = rid
813
- toprocess.source = Source.HTTP
814
-
815
- parse_audit(writer.audit, request)
816
-
817
- field = models.InputLayoutField(body=models.InputLayoutContent())
818
- field.body.blocks.update(blocks)
819
- await parse_layout_field(field_id, field, writer, toprocess, kbid, rid)
820
-
821
- try:
822
- processing_info = await processing.send_to_process(toprocess, partition)
823
- except LimitsExceededError as exc:
824
- raise HTTPException(status_code=exc.status_code, detail=exc.detail)
825
- except SendToProcessError:
826
- raise HTTPException(status_code=500, detail="Error while sending to process")
827
-
828
- writer.source = BrokerMessage.MessageSource.WRITER
829
- set_processing_info(writer, processing_info)
830
- await transaction.commit(writer, partition, wait=x_synchronous)
831
-
832
- return ResourceFieldAdded(seqid=processing_info.seqid)
451
+ return await add_field_to_resource(request, kbid, rid, field_id, field)
833
452
 
834
453
 
835
454
  @api.delete(
836
455
  f"/{KB_PREFIX}/{{kbid}}/{RSLUG_PREFIX}/{{rslug}}/{{field_type}}/{{field_id}}",
837
456
  status_code=204,
838
- name="Delete Resource field (by slug)",
457
+ summary="Delete Resource field (by slug)",
839
458
  response_model_exclude_unset=True,
840
459
  tags=["Resource fields"],
841
460
  )
@@ -846,23 +465,15 @@ async def delete_resource_field_rslug_prefix(
846
465
  kbid: str,
847
466
  rslug: str,
848
467
  field_type: models.FieldTypeName,
849
- field_id: str,
850
- x_synchronous: bool = SYNC_CALL,
468
+ field_id: FieldIdString,
851
469
  ):
852
- return await _delete_resource_field(
853
- request,
854
- kbid,
855
- field_type,
856
- field_id,
857
- x_synchronous,
858
- rslug=rslug,
859
- )
470
+ return await delete_resource_field_by_slug(request, kbid, rslug, field_type, field_id)
860
471
 
861
472
 
862
473
  @api.delete(
863
474
  f"/{KB_PREFIX}/{{kbid}}/{RESOURCE_PREFIX}/{{rid}}/{{field_type}}/{{field_id}}",
864
475
  status_code=204,
865
- name="Delete Resource field (by id)",
476
+ summary="Delete Resource field (by id)",
866
477
  response_model_exclude_unset=True,
867
478
  tags=["Resource fields"],
868
479
  )
@@ -873,50 +484,15 @@ async def delete_resource_field_rid_prefix(
873
484
  kbid: str,
874
485
  rid: str,
875
486
  field_type: models.FieldTypeName,
876
- field_id: str,
877
- x_synchronous: bool = SYNC_CALL,
878
- ):
879
- return await _delete_resource_field(
880
- request, kbid, field_type, field_id, x_synchronous, rid=rid
881
- )
882
-
883
-
884
- async def _delete_resource_field(
885
- request: Request,
886
- kbid: str,
887
- field_type: models.FieldTypeName,
888
- field_id: str,
889
- x_synchronous: bool,
890
- rid: Optional[str] = None,
891
- rslug: Optional[str] = None,
487
+ field_id: FieldIdString,
892
488
  ):
893
- transaction = get_transaction_utility()
894
- partitioning = get_partitioning()
895
-
896
- rid = await get_rid_from_params_or_raise_error(kbid, rid, rslug)
897
-
898
- partition = partitioning.generate_partition(kbid, rid)
899
- writer = BrokerMessage()
900
-
901
- writer.kbid = kbid
902
- writer.uuid = rid
903
-
904
- pb_field_id = FieldID()
905
- pb_field_id.field_type = FIELD_TYPE_NAME_TO_FIELD_TYPE_MAP[field_type]
906
- pb_field_id.field = field_id
907
-
908
- writer.delete_fields.append(pb_field_id)
909
- parse_audit(writer.audit, request)
910
-
911
- await transaction.commit(writer, partition, wait=x_synchronous)
912
-
913
- return Response(status_code=204)
489
+ return await delete_resource_field(request, kbid, rid, field_type, field_id)
914
490
 
915
491
 
916
492
  @api.post(
917
493
  f"/{KB_PREFIX}/{{kbid}}/{RESOURCE_PREFIX}/{{rid}}/file/{{field_id}}/reprocess",
918
494
  status_code=202,
919
- name="Reprocess file field (by id)",
495
+ summary="Reprocess file field (by id)",
920
496
  response_model=models.writer.ResourceUpdated,
921
497
  tags=["Resource fields"],
922
498
  )
@@ -926,13 +502,12 @@ async def reprocess_file_field(
926
502
  request: Request,
927
503
  kbid: str,
928
504
  rid: str,
929
- field_id: str,
505
+ field_id: FieldIdString,
930
506
  x_nucliadb_user: str = X_NUCLIADB_USER,
931
507
  x_file_password: Optional[str] = X_FILE_PASSWORD,
932
508
  ) -> ResourceUpdated:
933
509
  await maybe_back_pressure(request, kbid, resource_uuid=rid)
934
510
 
935
- transaction = get_transaction_utility()
936
511
  processing = get_processing()
937
512
  partitioning = get_partitioning()
938
513
 
@@ -972,21 +547,22 @@ async def reprocess_file_field(
972
547
  except KeyError:
973
548
  raise HTTPException(status_code=404, detail="Field does not exist")
974
549
 
975
- # Send current resource to reprocess.
976
- try:
977
- processing_info = await processing.send_to_process(toprocess, partition)
978
- except LimitsExceededError as exc:
979
- raise HTTPException(status_code=exc.status_code, detail=exc.detail)
980
- except SendToProcessError:
981
- raise HTTPException(status_code=500, detail="Error while sending to process")
982
-
983
550
  writer = BrokerMessage()
984
551
  writer.kbid = kbid
985
552
  writer.uuid = rid
986
553
  writer.source = BrokerMessage.MessageSource.WRITER
987
554
  writer.basic.metadata.useful = True
988
555
  writer.basic.metadata.status = Metadata.Status.PENDING
989
- set_processing_info(writer, processing_info)
990
556
  await transaction.commit(writer, partition, wait=False)
557
+ # Send current resource to reprocess.
558
+ try:
559
+ processing_info = await processing.send_to_process(toprocess, partition)
560
+ except LimitsExceededError as exc:
561
+ raise HTTPException(status_code=exc.status_code, detail=exc.detail)
562
+ except SendToProcessError:
563
+ raise HTTPException(
564
+ status_code=500,
565
+ detail="Error while sending to process. Try calling /reprocess",
566
+ )
991
567
 
992
568
  return ResourceUpdated(seqid=processing_info.seqid)