-
Notifications
You must be signed in to change notification settings - Fork 9.1k
Refactor: migrate document change status API #14300
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from all commits
39d348e
c7faf8d
2a71377
b6a00e8
0db5a62
b7e07ca
996de89
d96360e
4e9e9b2
49959b4
9098ca3
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -1019,3 +1019,122 @@ async def update_metadata(tenant_id, dataset_id): | |
| target_doc_ids = list(target_doc_ids) | ||
| updated = DocMetadataService.batch_update_metadata(dataset_id, target_doc_ids, updates, deletes) | ||
| return get_result(data={"updated": updated, "matched_docs": len(target_doc_ids)}) | ||
|
|
||
|
|
||
| @manager.route("/datasets/<dataset_id>/documents/batch-update-status", methods=["POST"]) # noqa: F821 | ||
| @login_required | ||
| @add_tenant_id_to_kwargs | ||
| async def batch_update_document_status(tenant_id, dataset_id): | ||
| """ | ||
| Batch update status of documents within a dataset. | ||
| --- | ||
| tags: | ||
| - Documents | ||
| security: | ||
| - ApiKeyAuth: [] | ||
| parameters: | ||
| - in: path | ||
| name: dataset_id | ||
| type: string | ||
| required: true | ||
| description: ID of the dataset. | ||
| - in: header | ||
| name: Authorization | ||
| type: string | ||
| required: true | ||
| description: Bearer token for authentication. | ||
| - in: body | ||
| name: body | ||
| description: Document status update parameters. | ||
| required: true | ||
| schema: | ||
| type: object | ||
| required: | ||
| - doc_ids | ||
| - status | ||
| properties: | ||
| doc_ids: | ||
| type: array | ||
| items: | ||
| type: string | ||
| description: List of document IDs to update. | ||
| status: | ||
| type: string | ||
| enum: ["0", "1"] | ||
| description: New status (0 = disabled, 1 = enabled). | ||
| responses: | ||
| 200: | ||
| description: Document statuses updated successfully. | ||
| """ | ||
| from common import settings | ||
| from rag.nlp import search | ||
|
|
||
| req = await get_request_json() | ||
| doc_ids = req.get("doc_ids", []) | ||
| status = str(req.get("status", -1)) | ||
|
|
||
| if status not in ["0", "1"]: | ||
| return get_error_argument_result(message=f'"Status" must be either 0 or 1:{status}!') | ||
|
|
||
| # Verify dataset ownership | ||
| if not KnowledgebaseService.query(id=dataset_id, tenant_id=tenant_id): | ||
| return get_error_data_result(message="You don't own the dataset.") | ||
|
|
||
| e, kb = KnowledgebaseService.get_by_id(dataset_id) | ||
| if not e: | ||
| return get_error_data_result(message="Can't find this dataset!") | ||
|
|
||
| result = {} | ||
| has_error = False | ||
| for doc_id in doc_ids: | ||
| try: | ||
| e, doc = DocumentService.get_by_id(doc_id) | ||
| if not e: | ||
| result[doc_id] = {"error": "Document not found"} | ||
| has_error = True | ||
| continue | ||
|
|
||
| if doc.kb_id != dataset_id: | ||
| logging.warning(f"Document {doc.kb_id} not in dataset {dataset_id}") | ||
| result[doc_id] = {"error": "Document not found in this dataset."} | ||
| has_error = True | ||
| continue | ||
|
|
||
| current_status = str(doc.status) | ||
| if current_status == status: | ||
| result[doc_id] = {"status": status} | ||
| continue | ||
| if not DocumentService.update_by_id(doc_id, {"status": str(status)}): | ||
| result[doc_id] = {"error": "Database error (Document update)!"} | ||
| has_error = True | ||
| continue | ||
|
|
||
| status_int = int(status) | ||
| if getattr(doc, "chunk_num", 0) > 0: | ||
| try: | ||
| ok = settings.docStoreConn.update( | ||
| {"doc_id": doc_id}, | ||
| {"available_int": status_int}, | ||
| search.index_name(kb.tenant_id), | ||
| doc.kb_id, | ||
| ) | ||
| except Exception as exc: | ||
| msg = str(exc) | ||
| if "3022" in msg: | ||
| result[doc_id] = {"error": "Document store table missing."} | ||
| else: | ||
| result[doc_id] = {"error": f"Document store update failed: {msg}"} | ||
| has_error = True | ||
| continue | ||
| if not ok: | ||
| result[doc_id] = {"error": "Database error (docStore update)!"} | ||
| has_error = True | ||
| continue | ||
| result[doc_id] = {"status": status} | ||
| except Exception as e: | ||
| result[doc_id] = {"error": f"Internal server error: {str(e)}"} | ||
| has_error = True | ||
|
|
||
| if has_error: | ||
| return get_json_result(data=result, message="Partial failure", code=RetCode.SERVER_ERROR) | ||
| return get_json_result(data=result) | ||
|
Comment on lines
+1138
to
+1140
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Partial-failure response should not use When 🤖 Prompt for AI Agents |
||
Uh oh!
There was an error while loading. Please reload this page.