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.
- migrations/0002_rollover_shards.py +1 -2
- migrations/0003_allfields_key.py +2 -37
- migrations/0004_rollover_shards.py +1 -2
- migrations/0005_rollover_shards.py +1 -2
- migrations/0006_rollover_shards.py +2 -4
- migrations/0008_cleanup_leftover_rollover_metadata.py +1 -2
- migrations/0009_upgrade_relations_and_texts_to_v2.py +5 -4
- migrations/0010_fix_corrupt_indexes.py +11 -12
- migrations/0011_materialize_labelset_ids.py +2 -18
- migrations/0012_rollover_shards.py +6 -12
- migrations/0013_rollover_shards.py +2 -4
- migrations/0014_rollover_shards.py +5 -7
- migrations/0015_targeted_rollover.py +6 -12
- migrations/0016_upgrade_to_paragraphs_v2.py +27 -32
- migrations/0017_multiple_writable_shards.py +3 -6
- migrations/0018_purge_orphan_kbslugs.py +59 -0
- migrations/0019_upgrade_to_paragraphs_v3.py +66 -0
- migrations/0020_drain_nodes_from_cluster.py +83 -0
- nucliadb/standalone/tests/unit/test_run.py → migrations/0021_overwrite_vectorsets_key.py +17 -18
- nucliadb/tests/unit/test_openapi.py → migrations/0022_fix_paragraph_deletion_bug.py +16 -11
- migrations/0023_backfill_pg_catalog.py +80 -0
- migrations/0025_assign_models_to_kbs_v2.py +113 -0
- migrations/0026_fix_high_cardinality_content_types.py +61 -0
- migrations/0027_rollover_texts3.py +73 -0
- nucliadb/ingest/fields/date.py → migrations/pg/0001_bootstrap.py +10 -12
- migrations/pg/0002_catalog.py +42 -0
- nucliadb/ingest/tests/unit/test_settings.py → migrations/pg/0003_catalog_kbid_index.py +5 -3
- nucliadb/common/cluster/base.py +41 -24
- nucliadb/common/cluster/discovery/base.py +6 -14
- nucliadb/common/cluster/discovery/k8s.py +9 -19
- nucliadb/common/cluster/discovery/manual.py +1 -3
- nucliadb/common/cluster/discovery/single.py +1 -2
- nucliadb/common/cluster/discovery/utils.py +1 -3
- nucliadb/common/cluster/grpc_node_dummy.py +11 -16
- nucliadb/common/cluster/index_node.py +10 -19
- nucliadb/common/cluster/manager.py +223 -102
- nucliadb/common/cluster/rebalance.py +42 -37
- nucliadb/common/cluster/rollover.py +377 -204
- nucliadb/common/cluster/settings.py +16 -9
- nucliadb/common/cluster/standalone/grpc_node_binding.py +24 -76
- nucliadb/common/cluster/standalone/index_node.py +4 -11
- nucliadb/common/cluster/standalone/service.py +2 -6
- nucliadb/common/cluster/standalone/utils.py +9 -6
- nucliadb/common/cluster/utils.py +43 -29
- nucliadb/common/constants.py +20 -0
- nucliadb/common/context/__init__.py +6 -4
- nucliadb/common/context/fastapi.py +8 -5
- nucliadb/{tests/knowledgeboxes/__init__.py → common/counters.py} +8 -2
- nucliadb/common/datamanagers/__init__.py +24 -5
- nucliadb/common/datamanagers/atomic.py +102 -0
- nucliadb/common/datamanagers/cluster.py +5 -5
- nucliadb/common/datamanagers/entities.py +6 -16
- nucliadb/common/datamanagers/fields.py +84 -0
- nucliadb/common/datamanagers/kb.py +101 -24
- nucliadb/common/datamanagers/labels.py +26 -56
- nucliadb/common/datamanagers/processing.py +2 -6
- nucliadb/common/datamanagers/resources.py +214 -117
- nucliadb/common/datamanagers/rollover.py +77 -16
- nucliadb/{ingest/orm → common/datamanagers}/synonyms.py +16 -28
- nucliadb/common/datamanagers/utils.py +19 -11
- nucliadb/common/datamanagers/vectorsets.py +110 -0
- nucliadb/common/external_index_providers/base.py +257 -0
- nucliadb/{ingest/tests/unit/test_cache.py → common/external_index_providers/exceptions.py} +9 -8
- nucliadb/common/external_index_providers/manager.py +101 -0
- nucliadb/common/external_index_providers/pinecone.py +933 -0
- nucliadb/common/external_index_providers/settings.py +52 -0
- nucliadb/common/http_clients/auth.py +3 -6
- nucliadb/common/http_clients/processing.py +6 -11
- nucliadb/common/http_clients/utils.py +1 -3
- nucliadb/common/ids.py +240 -0
- nucliadb/common/locking.py +43 -13
- nucliadb/common/maindb/driver.py +11 -35
- nucliadb/common/maindb/exceptions.py +6 -6
- nucliadb/common/maindb/local.py +22 -9
- nucliadb/common/maindb/pg.py +206 -111
- nucliadb/common/maindb/utils.py +13 -44
- nucliadb/common/models_utils/from_proto.py +479 -0
- nucliadb/common/models_utils/to_proto.py +60 -0
- nucliadb/common/nidx.py +260 -0
- nucliadb/export_import/datamanager.py +25 -19
- nucliadb/export_import/exceptions.py +8 -0
- nucliadb/export_import/exporter.py +20 -7
- nucliadb/export_import/importer.py +6 -11
- nucliadb/export_import/models.py +5 -5
- nucliadb/export_import/tasks.py +4 -4
- nucliadb/export_import/utils.py +94 -54
- nucliadb/health.py +1 -3
- nucliadb/ingest/app.py +15 -11
- nucliadb/ingest/consumer/auditing.py +30 -147
- nucliadb/ingest/consumer/consumer.py +96 -52
- nucliadb/ingest/consumer/materializer.py +10 -12
- nucliadb/ingest/consumer/pull.py +12 -27
- nucliadb/ingest/consumer/service.py +20 -19
- nucliadb/ingest/consumer/shard_creator.py +7 -14
- nucliadb/ingest/consumer/utils.py +1 -3
- nucliadb/ingest/fields/base.py +139 -188
- nucliadb/ingest/fields/conversation.py +18 -5
- nucliadb/ingest/fields/exceptions.py +1 -4
- nucliadb/ingest/fields/file.py +7 -25
- nucliadb/ingest/fields/link.py +11 -16
- nucliadb/ingest/fields/text.py +9 -4
- nucliadb/ingest/orm/brain.py +255 -262
- nucliadb/ingest/orm/broker_message.py +181 -0
- nucliadb/ingest/orm/entities.py +36 -51
- nucliadb/ingest/orm/exceptions.py +12 -0
- nucliadb/ingest/orm/knowledgebox.py +334 -278
- nucliadb/ingest/orm/processor/__init__.py +2 -697
- nucliadb/ingest/orm/processor/auditing.py +117 -0
- nucliadb/ingest/orm/processor/data_augmentation.py +164 -0
- nucliadb/ingest/orm/processor/pgcatalog.py +84 -0
- nucliadb/ingest/orm/processor/processor.py +752 -0
- nucliadb/ingest/orm/processor/sequence_manager.py +1 -1
- nucliadb/ingest/orm/resource.py +280 -520
- nucliadb/ingest/orm/utils.py +25 -31
- nucliadb/ingest/partitions.py +3 -9
- nucliadb/ingest/processing.py +76 -81
- nucliadb/ingest/py.typed +0 -0
- nucliadb/ingest/serialize.py +37 -173
- nucliadb/ingest/service/__init__.py +1 -3
- nucliadb/ingest/service/writer.py +186 -577
- nucliadb/ingest/settings.py +13 -22
- nucliadb/ingest/utils.py +3 -6
- nucliadb/learning_proxy.py +264 -51
- nucliadb/metrics_exporter.py +30 -19
- nucliadb/middleware/__init__.py +1 -3
- nucliadb/migrator/command.py +1 -3
- nucliadb/migrator/datamanager.py +13 -13
- nucliadb/migrator/migrator.py +57 -37
- nucliadb/migrator/settings.py +2 -1
- nucliadb/migrator/utils.py +18 -10
- nucliadb/purge/__init__.py +139 -33
- nucliadb/purge/orphan_shards.py +7 -13
- nucliadb/reader/__init__.py +1 -3
- nucliadb/reader/api/models.py +3 -14
- nucliadb/reader/api/v1/__init__.py +0 -1
- nucliadb/reader/api/v1/download.py +27 -94
- nucliadb/reader/api/v1/export_import.py +4 -4
- nucliadb/reader/api/v1/knowledgebox.py +13 -13
- nucliadb/reader/api/v1/learning_config.py +8 -12
- nucliadb/reader/api/v1/resource.py +67 -93
- nucliadb/reader/api/v1/services.py +70 -125
- nucliadb/reader/app.py +16 -46
- nucliadb/reader/lifecycle.py +18 -4
- nucliadb/reader/py.typed +0 -0
- nucliadb/reader/reader/notifications.py +10 -31
- nucliadb/search/__init__.py +1 -3
- nucliadb/search/api/v1/__init__.py +2 -2
- nucliadb/search/api/v1/ask.py +112 -0
- nucliadb/search/api/v1/catalog.py +184 -0
- nucliadb/search/api/v1/feedback.py +17 -25
- nucliadb/search/api/v1/find.py +41 -41
- nucliadb/search/api/v1/knowledgebox.py +90 -62
- nucliadb/search/api/v1/predict_proxy.py +2 -2
- nucliadb/search/api/v1/resource/ask.py +66 -117
- nucliadb/search/api/v1/resource/search.py +51 -72
- nucliadb/search/api/v1/router.py +1 -0
- nucliadb/search/api/v1/search.py +50 -197
- nucliadb/search/api/v1/suggest.py +40 -54
- nucliadb/search/api/v1/summarize.py +9 -5
- nucliadb/search/api/v1/utils.py +2 -1
- nucliadb/search/app.py +16 -48
- nucliadb/search/lifecycle.py +10 -3
- nucliadb/search/predict.py +176 -188
- nucliadb/search/py.typed +0 -0
- nucliadb/search/requesters/utils.py +41 -63
- nucliadb/search/search/cache.py +149 -20
- nucliadb/search/search/chat/ask.py +918 -0
- nucliadb/search/{tests/unit/test_run.py → search/chat/exceptions.py} +14 -13
- nucliadb/search/search/chat/images.py +41 -17
- nucliadb/search/search/chat/prompt.py +851 -282
- nucliadb/search/search/chat/query.py +274 -267
- nucliadb/{writer/resource/slug.py → search/search/cut.py} +8 -6
- nucliadb/search/search/fetch.py +43 -36
- nucliadb/search/search/filters.py +9 -15
- nucliadb/search/search/find.py +214 -54
- nucliadb/search/search/find_merge.py +408 -391
- nucliadb/search/search/hydrator.py +191 -0
- nucliadb/search/search/merge.py +198 -234
- nucliadb/search/search/metrics.py +73 -2
- nucliadb/search/search/paragraphs.py +64 -106
- nucliadb/search/search/pgcatalog.py +233 -0
- nucliadb/search/search/predict_proxy.py +1 -1
- nucliadb/search/search/query.py +386 -257
- nucliadb/search/search/query_parser/exceptions.py +22 -0
- nucliadb/search/search/query_parser/models.py +101 -0
- nucliadb/search/search/query_parser/parser.py +183 -0
- nucliadb/search/search/rank_fusion.py +204 -0
- nucliadb/search/search/rerankers.py +270 -0
- nucliadb/search/search/shards.py +4 -38
- nucliadb/search/search/summarize.py +14 -18
- nucliadb/search/search/utils.py +27 -4
- nucliadb/search/settings.py +15 -1
- nucliadb/standalone/api_router.py +4 -10
- nucliadb/standalone/app.py +17 -14
- nucliadb/standalone/auth.py +7 -21
- nucliadb/standalone/config.py +9 -12
- nucliadb/standalone/introspect.py +5 -5
- nucliadb/standalone/lifecycle.py +26 -25
- nucliadb/standalone/migrations.py +58 -0
- nucliadb/standalone/purge.py +9 -8
- nucliadb/standalone/py.typed +0 -0
- nucliadb/standalone/run.py +25 -18
- nucliadb/standalone/settings.py +10 -14
- nucliadb/standalone/versions.py +15 -5
- nucliadb/tasks/consumer.py +8 -12
- nucliadb/tasks/producer.py +7 -6
- nucliadb/tests/config.py +53 -0
- nucliadb/train/__init__.py +1 -3
- nucliadb/train/api/utils.py +1 -2
- nucliadb/train/api/v1/shards.py +2 -2
- nucliadb/train/api/v1/trainset.py +4 -6
- nucliadb/train/app.py +14 -47
- nucliadb/train/generator.py +10 -19
- nucliadb/train/generators/field_classifier.py +7 -19
- nucliadb/train/generators/field_streaming.py +156 -0
- nucliadb/train/generators/image_classifier.py +12 -18
- nucliadb/train/generators/paragraph_classifier.py +5 -9
- nucliadb/train/generators/paragraph_streaming.py +6 -9
- nucliadb/train/generators/question_answer_streaming.py +19 -20
- nucliadb/train/generators/sentence_classifier.py +9 -15
- nucliadb/train/generators/token_classifier.py +45 -36
- nucliadb/train/generators/utils.py +14 -18
- nucliadb/train/lifecycle.py +7 -3
- nucliadb/train/nodes.py +23 -32
- nucliadb/train/py.typed +0 -0
- nucliadb/train/servicer.py +13 -21
- nucliadb/train/settings.py +2 -6
- nucliadb/train/types.py +13 -10
- nucliadb/train/upload.py +3 -6
- nucliadb/train/uploader.py +20 -25
- nucliadb/train/utils.py +1 -1
- nucliadb/writer/__init__.py +1 -3
- nucliadb/writer/api/constants.py +0 -5
- nucliadb/{ingest/fields/keywordset.py → writer/api/utils.py} +13 -10
- nucliadb/writer/api/v1/export_import.py +102 -49
- nucliadb/writer/api/v1/field.py +196 -620
- nucliadb/writer/api/v1/knowledgebox.py +221 -71
- nucliadb/writer/api/v1/learning_config.py +2 -2
- nucliadb/writer/api/v1/resource.py +114 -216
- nucliadb/writer/api/v1/services.py +64 -132
- nucliadb/writer/api/v1/slug.py +61 -0
- nucliadb/writer/api/v1/transaction.py +67 -0
- nucliadb/writer/api/v1/upload.py +184 -215
- nucliadb/writer/app.py +11 -61
- nucliadb/writer/back_pressure.py +62 -43
- nucliadb/writer/exceptions.py +0 -4
- nucliadb/writer/lifecycle.py +21 -15
- nucliadb/writer/py.typed +0 -0
- nucliadb/writer/resource/audit.py +2 -1
- nucliadb/writer/resource/basic.py +48 -62
- nucliadb/writer/resource/field.py +45 -135
- nucliadb/writer/resource/origin.py +1 -2
- nucliadb/writer/settings.py +14 -5
- nucliadb/writer/tus/__init__.py +17 -15
- nucliadb/writer/tus/azure.py +111 -0
- nucliadb/writer/tus/dm.py +17 -5
- nucliadb/writer/tus/exceptions.py +1 -3
- nucliadb/writer/tus/gcs.py +56 -84
- nucliadb/writer/tus/local.py +21 -37
- nucliadb/writer/tus/s3.py +28 -68
- nucliadb/writer/tus/storage.py +5 -56
- nucliadb/writer/vectorsets.py +125 -0
- nucliadb-6.2.1.post2777.dist-info/METADATA +148 -0
- nucliadb-6.2.1.post2777.dist-info/RECORD +343 -0
- {nucliadb-2.46.1.post382.dist-info → nucliadb-6.2.1.post2777.dist-info}/WHEEL +1 -1
- nucliadb/common/maindb/redis.py +0 -194
- nucliadb/common/maindb/tikv.py +0 -412
- nucliadb/ingest/fields/layout.py +0 -58
- nucliadb/ingest/tests/conftest.py +0 -30
- nucliadb/ingest/tests/fixtures.py +0 -771
- nucliadb/ingest/tests/integration/consumer/__init__.py +0 -18
- nucliadb/ingest/tests/integration/consumer/test_auditing.py +0 -80
- nucliadb/ingest/tests/integration/consumer/test_materializer.py +0 -89
- nucliadb/ingest/tests/integration/consumer/test_pull.py +0 -144
- nucliadb/ingest/tests/integration/consumer/test_service.py +0 -81
- nucliadb/ingest/tests/integration/consumer/test_shard_creator.py +0 -68
- nucliadb/ingest/tests/integration/ingest/test_ingest.py +0 -691
- nucliadb/ingest/tests/integration/ingest/test_processing_engine.py +0 -95
- nucliadb/ingest/tests/integration/ingest/test_relations.py +0 -272
- nucliadb/ingest/tests/unit/consumer/__init__.py +0 -18
- nucliadb/ingest/tests/unit/consumer/test_auditing.py +0 -140
- nucliadb/ingest/tests/unit/consumer/test_consumer.py +0 -69
- nucliadb/ingest/tests/unit/consumer/test_pull.py +0 -60
- nucliadb/ingest/tests/unit/consumer/test_shard_creator.py +0 -139
- nucliadb/ingest/tests/unit/consumer/test_utils.py +0 -67
- nucliadb/ingest/tests/unit/orm/__init__.py +0 -19
- nucliadb/ingest/tests/unit/orm/test_brain.py +0 -247
- nucliadb/ingest/tests/unit/orm/test_processor.py +0 -131
- nucliadb/ingest/tests/unit/orm/test_resource.py +0 -275
- nucliadb/ingest/tests/unit/test_partitions.py +0 -40
- nucliadb/ingest/tests/unit/test_processing.py +0 -171
- nucliadb/middleware/transaction.py +0 -117
- nucliadb/reader/api/v1/learning_collector.py +0 -63
- nucliadb/reader/tests/__init__.py +0 -19
- nucliadb/reader/tests/conftest.py +0 -31
- nucliadb/reader/tests/fixtures.py +0 -136
- nucliadb/reader/tests/test_list_resources.py +0 -75
- nucliadb/reader/tests/test_reader_file_download.py +0 -273
- nucliadb/reader/tests/test_reader_resource.py +0 -379
- nucliadb/reader/tests/test_reader_resource_field.py +0 -219
- nucliadb/search/api/v1/chat.py +0 -258
- nucliadb/search/api/v1/resource/chat.py +0 -94
- nucliadb/search/tests/__init__.py +0 -19
- nucliadb/search/tests/conftest.py +0 -33
- nucliadb/search/tests/fixtures.py +0 -199
- nucliadb/search/tests/node.py +0 -465
- nucliadb/search/tests/unit/__init__.py +0 -18
- nucliadb/search/tests/unit/api/__init__.py +0 -19
- nucliadb/search/tests/unit/api/v1/__init__.py +0 -19
- nucliadb/search/tests/unit/api/v1/resource/__init__.py +0 -19
- nucliadb/search/tests/unit/api/v1/resource/test_ask.py +0 -67
- nucliadb/search/tests/unit/api/v1/resource/test_chat.py +0 -97
- nucliadb/search/tests/unit/api/v1/test_chat.py +0 -96
- nucliadb/search/tests/unit/api/v1/test_predict_proxy.py +0 -98
- nucliadb/search/tests/unit/api/v1/test_summarize.py +0 -93
- nucliadb/search/tests/unit/search/__init__.py +0 -18
- nucliadb/search/tests/unit/search/requesters/__init__.py +0 -18
- nucliadb/search/tests/unit/search/requesters/test_utils.py +0 -210
- nucliadb/search/tests/unit/search/search/__init__.py +0 -19
- nucliadb/search/tests/unit/search/search/test_shards.py +0 -45
- nucliadb/search/tests/unit/search/search/test_utils.py +0 -82
- nucliadb/search/tests/unit/search/test_chat_prompt.py +0 -266
- nucliadb/search/tests/unit/search/test_fetch.py +0 -108
- nucliadb/search/tests/unit/search/test_filters.py +0 -125
- nucliadb/search/tests/unit/search/test_paragraphs.py +0 -157
- nucliadb/search/tests/unit/search/test_predict_proxy.py +0 -106
- nucliadb/search/tests/unit/search/test_query.py +0 -201
- nucliadb/search/tests/unit/test_app.py +0 -79
- nucliadb/search/tests/unit/test_find_merge.py +0 -112
- nucliadb/search/tests/unit/test_merge.py +0 -34
- nucliadb/search/tests/unit/test_predict.py +0 -584
- nucliadb/standalone/tests/__init__.py +0 -19
- nucliadb/standalone/tests/conftest.py +0 -33
- nucliadb/standalone/tests/fixtures.py +0 -38
- nucliadb/standalone/tests/unit/__init__.py +0 -18
- nucliadb/standalone/tests/unit/test_api_router.py +0 -61
- nucliadb/standalone/tests/unit/test_auth.py +0 -169
- nucliadb/standalone/tests/unit/test_introspect.py +0 -35
- nucliadb/standalone/tests/unit/test_versions.py +0 -68
- nucliadb/tests/benchmarks/__init__.py +0 -19
- nucliadb/tests/benchmarks/test_search.py +0 -99
- nucliadb/tests/conftest.py +0 -32
- nucliadb/tests/fixtures.py +0 -736
- nucliadb/tests/knowledgeboxes/philosophy_books.py +0 -203
- nucliadb/tests/knowledgeboxes/ten_dummy_resources.py +0 -109
- nucliadb/tests/migrations/__init__.py +0 -19
- nucliadb/tests/migrations/test_migration_0017.py +0 -80
- nucliadb/tests/tikv.py +0 -240
- nucliadb/tests/unit/__init__.py +0 -19
- nucliadb/tests/unit/common/__init__.py +0 -19
- nucliadb/tests/unit/common/cluster/__init__.py +0 -19
- nucliadb/tests/unit/common/cluster/discovery/__init__.py +0 -19
- nucliadb/tests/unit/common/cluster/discovery/test_k8s.py +0 -170
- nucliadb/tests/unit/common/cluster/standalone/__init__.py +0 -18
- nucliadb/tests/unit/common/cluster/standalone/test_service.py +0 -113
- nucliadb/tests/unit/common/cluster/standalone/test_utils.py +0 -59
- nucliadb/tests/unit/common/cluster/test_cluster.py +0 -399
- nucliadb/tests/unit/common/cluster/test_kb_shard_manager.py +0 -178
- nucliadb/tests/unit/common/cluster/test_rollover.py +0 -279
- nucliadb/tests/unit/common/maindb/__init__.py +0 -18
- nucliadb/tests/unit/common/maindb/test_driver.py +0 -127
- nucliadb/tests/unit/common/maindb/test_tikv.py +0 -53
- nucliadb/tests/unit/common/maindb/test_utils.py +0 -81
- nucliadb/tests/unit/common/test_context.py +0 -36
- nucliadb/tests/unit/export_import/__init__.py +0 -19
- nucliadb/tests/unit/export_import/test_datamanager.py +0 -37
- nucliadb/tests/unit/export_import/test_utils.py +0 -294
- nucliadb/tests/unit/migrator/__init__.py +0 -19
- nucliadb/tests/unit/migrator/test_migrator.py +0 -87
- nucliadb/tests/unit/tasks/__init__.py +0 -19
- nucliadb/tests/unit/tasks/conftest.py +0 -42
- nucliadb/tests/unit/tasks/test_consumer.py +0 -93
- nucliadb/tests/unit/tasks/test_producer.py +0 -95
- nucliadb/tests/unit/tasks/test_tasks.py +0 -60
- nucliadb/tests/unit/test_field_ids.py +0 -49
- nucliadb/tests/unit/test_health.py +0 -84
- nucliadb/tests/unit/test_kb_slugs.py +0 -54
- nucliadb/tests/unit/test_learning_proxy.py +0 -252
- nucliadb/tests/unit/test_metrics_exporter.py +0 -77
- nucliadb/tests/unit/test_purge.py +0 -138
- nucliadb/tests/utils/__init__.py +0 -74
- nucliadb/tests/utils/aiohttp_session.py +0 -44
- nucliadb/tests/utils/broker_messages/__init__.py +0 -167
- nucliadb/tests/utils/broker_messages/fields.py +0 -181
- nucliadb/tests/utils/broker_messages/helpers.py +0 -33
- nucliadb/tests/utils/entities.py +0 -78
- nucliadb/train/api/v1/check.py +0 -60
- nucliadb/train/tests/__init__.py +0 -19
- nucliadb/train/tests/conftest.py +0 -29
- nucliadb/train/tests/fixtures.py +0 -342
- nucliadb/train/tests/test_field_classification.py +0 -122
- nucliadb/train/tests/test_get_entities.py +0 -80
- nucliadb/train/tests/test_get_info.py +0 -51
- nucliadb/train/tests/test_get_ontology.py +0 -34
- nucliadb/train/tests/test_get_ontology_count.py +0 -63
- nucliadb/train/tests/test_image_classification.py +0 -222
- nucliadb/train/tests/test_list_fields.py +0 -39
- nucliadb/train/tests/test_list_paragraphs.py +0 -73
- nucliadb/train/tests/test_list_resources.py +0 -39
- nucliadb/train/tests/test_list_sentences.py +0 -71
- nucliadb/train/tests/test_paragraph_classification.py +0 -123
- nucliadb/train/tests/test_paragraph_streaming.py +0 -118
- nucliadb/train/tests/test_question_answer_streaming.py +0 -239
- nucliadb/train/tests/test_sentence_classification.py +0 -143
- nucliadb/train/tests/test_token_classification.py +0 -136
- nucliadb/train/tests/utils.py +0 -108
- nucliadb/writer/layouts/__init__.py +0 -51
- nucliadb/writer/layouts/v1.py +0 -59
- nucliadb/writer/resource/vectors.py +0 -120
- nucliadb/writer/tests/__init__.py +0 -19
- nucliadb/writer/tests/conftest.py +0 -31
- nucliadb/writer/tests/fixtures.py +0 -192
- nucliadb/writer/tests/test_fields.py +0 -486
- nucliadb/writer/tests/test_files.py +0 -743
- nucliadb/writer/tests/test_knowledgebox.py +0 -49
- nucliadb/writer/tests/test_reprocess_file_field.py +0 -139
- nucliadb/writer/tests/test_resources.py +0 -546
- nucliadb/writer/tests/test_service.py +0 -137
- nucliadb/writer/tests/test_tus.py +0 -203
- nucliadb/writer/tests/utils.py +0 -35
- nucliadb/writer/tus/pg.py +0 -125
- nucliadb-2.46.1.post382.dist-info/METADATA +0 -134
- nucliadb-2.46.1.post382.dist-info/RECORD +0 -451
- {nucliadb/ingest/tests → migrations/pg}/__init__.py +0 -0
- /nucliadb/{ingest/tests/integration → common/external_index_providers}/__init__.py +0 -0
- /nucliadb/{ingest/tests/integration/ingest → common/models_utils}/__init__.py +0 -0
- /nucliadb/{ingest/tests/unit → search/search/query_parser}/__init__.py +0 -0
- /nucliadb/{ingest/tests → tests}/vectors.py +0 -0
- {nucliadb-2.46.1.post382.dist-info → nucliadb-6.2.1.post2777.dist-info}/entry_points.txt +0 -0
- {nucliadb-2.46.1.post382.dist-info → nucliadb-6.2.1.post2777.dist-info}/top_level.txt +0 -0
- {nucliadb-2.46.1.post382.dist-info → nucliadb-6.2.1.post2777.dist-info}/zip-safe +0 -0
nucliadb/writer/api/v1/field.py
CHANGED
@@ -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
|
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
|
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
|
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.
|
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.
|
75
|
-
models.FieldTypeName.
|
76
|
-
models.FieldTypeName.
|
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
|
84
|
-
|
85
|
-
|
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
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
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
|
-
|
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
|
-
|
139
|
-
field_id:
|
140
|
-
field_payload:
|
141
|
-
|
142
|
-
)
|
143
|
-
|
144
|
-
|
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
|
-
|
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
|
-
|
167
|
-
|
168
|
-
|
169
|
-
|
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
|
-
|
181
|
-
|
182
|
-
|
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
|
-
|
163
|
+
writer.kbid = kbid
|
164
|
+
writer.uuid = rid
|
192
165
|
|
193
|
-
|
194
|
-
|
195
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
218
|
-
|
219
|
-
|
220
|
-
|
221
|
-
|
222
|
-
return await
|
223
|
-
request,
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
287
|
-
field_id:
|
288
|
-
field_payload: models.
|
289
|
-
|
290
|
-
|
291
|
-
|
292
|
-
|
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
|
-
|
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:
|
310
|
-
field_payload: models.
|
311
|
-
|
312
|
-
|
313
|
-
|
314
|
-
|
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
|
-
|
319
|
-
|
320
|
-
|
321
|
-
|
322
|
-
|
323
|
-
|
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
|
-
|
251
|
+
# API endpoints
|
341
252
|
|
342
253
|
|
343
254
|
@api.put(
|
344
|
-
f"/{KB_PREFIX}/{{kbid}}/{RSLUG_PREFIX}/{{rslug}}/
|
255
|
+
f"/{KB_PREFIX}/{{kbid}}/{RSLUG_PREFIX}/{{rslug}}/text/{{field_id}}",
|
345
256
|
status_code=201,
|
346
|
-
|
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
|
263
|
+
async def add_resource_field_text_rslug_prefix(
|
353
264
|
request: Request,
|
354
265
|
kbid: str,
|
355
266
|
rslug: str,
|
356
|
-
field_id:
|
357
|
-
field_payload: models.
|
358
|
-
x_synchronous: bool = SYNC_CALL,
|
267
|
+
field_id: FieldIdString,
|
268
|
+
field_payload: models.TextField,
|
359
269
|
) -> ResourceFieldAdded:
|
360
|
-
return await
|
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}}/
|
274
|
+
f"/{KB_PREFIX}/{{kbid}}/{RESOURCE_PREFIX}/{{rid}}/text/{{field_id}}",
|
367
275
|
status_code=201,
|
368
|
-
|
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
|
282
|
+
async def add_resource_field_text_rid_prefix(
|
375
283
|
request: Request,
|
376
284
|
kbid: str,
|
377
285
|
rid: str,
|
378
|
-
field_id:
|
379
|
-
field_payload: models.
|
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
|
-
|
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}}/
|
293
|
+
f"/{KB_PREFIX}/{{kbid}}/{RSLUG_PREFIX}/{{rslug}}/link/{{field_id}}",
|
414
294
|
status_code=201,
|
415
|
-
|
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
|
301
|
+
async def add_resource_field_link_rslug_prefix(
|
422
302
|
request: Request,
|
423
303
|
kbid: str,
|
424
304
|
rslug: str,
|
425
|
-
field_id:
|
426
|
-
field_payload: models.
|
427
|
-
x_synchronous: bool = SYNC_CALL,
|
305
|
+
field_id: FieldIdString,
|
306
|
+
field_payload: models.LinkField,
|
428
307
|
) -> ResourceFieldAdded:
|
429
|
-
return await
|
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}}/
|
312
|
+
f"/{KB_PREFIX}/{{kbid}}/{RESOURCE_PREFIX}/{{rid}}/link/{{field_id}}",
|
441
313
|
status_code=201,
|
442
|
-
|
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
|
320
|
+
async def add_resource_field_link_rid_prefix(
|
449
321
|
request: Request,
|
450
322
|
kbid: str,
|
451
323
|
rid: str,
|
452
|
-
field_id:
|
453
|
-
field_payload: models.
|
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
|
-
|
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
|
-
|
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:
|
343
|
+
field_id: FieldIdString,
|
500
344
|
field_payload: models.InputConversationField,
|
501
|
-
x_synchronous: bool = SYNC_CALL,
|
502
345
|
) -> ResourceFieldAdded:
|
503
|
-
return await
|
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
|
-
|
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:
|
362
|
+
field_id: FieldIdString,
|
522
363
|
field_payload: models.InputConversationField,
|
523
|
-
x_synchronous: bool = SYNC_CALL,
|
524
364
|
) -> ResourceFieldAdded:
|
525
|
-
return await
|
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
|
-
|
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:
|
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
|
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
|
-
|
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:
|
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
|
-
|
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
|
-
|
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:
|
425
|
+
field_id: FieldIdString,
|
654
426
|
messages: list[models.InputMessage],
|
655
|
-
x_synchronous: bool = SYNC_CALL,
|
656
427
|
) -> ResourceFieldAdded:
|
657
|
-
|
658
|
-
|
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
|
-
|
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:
|
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
|
-
|
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:
|
850
|
-
x_synchronous: bool = SYNC_CALL,
|
468
|
+
field_id: FieldIdString,
|
851
469
|
):
|
852
|
-
return await
|
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
|
-
|
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:
|
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
|
-
|
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
|
-
|
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:
|
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)
|