feat(documents): 增强上传反馈与状态展示
This commit is contained in:
@@ -3,14 +3,24 @@ from pathlib import Path
|
||||
from django import forms
|
||||
|
||||
from apps.scenarios.services import ScenarioNotFound, get_scenario
|
||||
from apps.scenarios.services import list_scenarios
|
||||
|
||||
SUPPORTED_EXTENSIONS = {".txt", ".md", ".pdf", ".docx"}
|
||||
|
||||
|
||||
class DocumentUploadForm(forms.Form):
|
||||
scenario_id = forms.CharField(label="场景")
|
||||
# 使用 ChoiceField 让表单自己维护场景选项,
|
||||
# 这样模板、校验和后续扩展都能围绕一个入口完成。
|
||||
scenario_id = forms.ChoiceField(label="场景", choices=())
|
||||
file = forms.FileField(label="文件")
|
||||
|
||||
def __init__(self, *args, **kwargs):
|
||||
super().__init__(*args, **kwargs)
|
||||
self.fields["scenario_id"].choices = [
|
||||
(scenario["id"], scenario["name"])
|
||||
for scenario in list_scenarios()
|
||||
]
|
||||
|
||||
def clean_scenario_id(self):
|
||||
scenario_id = self.cleaned_data["scenario_id"]
|
||||
try:
|
||||
|
||||
@@ -2,6 +2,7 @@ from django.db import models
|
||||
|
||||
|
||||
class UploadedDocument(models.Model):
|
||||
# 文档状态用于驱动前端提示和后续可操作项。
|
||||
STATUS_UPLOADED = "uploaded"
|
||||
STATUS_INDEXED = "indexed"
|
||||
STATUS_FAILED = "failed"
|
||||
@@ -21,3 +22,11 @@ class UploadedDocument(models.Model):
|
||||
|
||||
def __str__(self) -> str:
|
||||
return self.original_name
|
||||
|
||||
def get_status_display_text(self) -> str:
|
||||
"""为模板提供更适合演示的中文状态文案。"""
|
||||
return {
|
||||
self.STATUS_UPLOADED: "已上传,待入库",
|
||||
self.STATUS_INDEXED: "已入库,可检索",
|
||||
self.STATUS_FAILED: "入库失败",
|
||||
}.get(self.status, self.status)
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
from django.contrib import messages
|
||||
from django.shortcuts import get_object_or_404, redirect, render
|
||||
from django.views.decorators.http import require_POST
|
||||
|
||||
@@ -9,15 +10,18 @@ from .services import create_uploaded_document, index_document
|
||||
|
||||
|
||||
def document_list(request):
|
||||
# 列表页只负责展示文档元数据和可执行操作,不处理入库细节。
|
||||
documents = UploadedDocument.objects.all()
|
||||
return render(request, "documents/document_list.html", {"documents": documents})
|
||||
|
||||
|
||||
def upload(request):
|
||||
# 上传成功后仅保存文件和元数据,是否入库由用户显式触发。
|
||||
if request.method == "POST":
|
||||
form = DocumentUploadForm(request.POST, request.FILES)
|
||||
if form.is_valid():
|
||||
create_uploaded_document(form.cleaned_data["scenario_id"], form.cleaned_data["file"])
|
||||
messages.success(request, "文件已上传,可继续执行入库。")
|
||||
return redirect("documents:list")
|
||||
else:
|
||||
form = DocumentUploadForm()
|
||||
@@ -31,5 +35,9 @@ def upload(request):
|
||||
@require_POST
|
||||
def index(request, document_id: int):
|
||||
document = get_object_or_404(UploadedDocument, pk=document_id)
|
||||
index_document(document)
|
||||
document = index_document(document)
|
||||
if document.status == UploadedDocument.STATUS_INDEXED:
|
||||
messages.success(request, "文档入库成功,当前文档已可参与检索。")
|
||||
else:
|
||||
messages.error(request, "文档入库失败,请检查错误原因后重试。")
|
||||
return redirect("documents:list")
|
||||
|
||||
Reference in New Issue
Block a user