""" 文档处理工具Admin 独立的Admin模块 """ from __future__ import annotations from typing import Any from django import forms from django.contrib import admin from django.http import HttpRequest, HttpResponse, HttpResponseRedirect from django.middleware.csrf import get_token from django.urls import path, reverse from apps.automation.models import AutomationTool from apps.automation.services.document.document_processing import process_uploaded_document class DocumentProcessorForm(forms.Form): """文档处理工具表单""" upload = forms.FileField(required=True, help_text="支持PDF、DOCX和图片文件(JPG、PNG、BMP、TIFF等)") limit = forms.IntegerField(required=False, help_text="文字提取限制(留空使用默认值1500字)") preview_page = forms.IntegerField(required=False, min_value=1, help_text="PDF预览页码(留空使用默认值第1页)") # @admin.register(AutomationTool) # 隐藏文档处理模块,不在Django后台显示 class DocumentProcessorAdmin(admin.ModelAdmin[AutomationTool]): """文档处理工具管理类""" change_list_template = None def get_urls(self) -> list[Any]: urls = super().get_urls() info = self.model._meta.app_label, self.model._meta.model_name custom: list[Any] = [ path( "process-document/", self.admin_site.admin_view(self.process_view), name="{}_{}_process_document".format(*info), ), path("", self.admin_site.admin_view(self.redirect_to_process)), ] return custom + urls def redirect_to_process(self, request: HttpRequest) -> HttpResponseRedirect: info = self.model._meta.app_label, self.model._meta.model_name return HttpResponseRedirect(reverse("admin:{}_{}_process_document".format(*info))) def process_view(self, request: HttpRequest) -> HttpResponse: """文档处理主视图""" if request.method == "POST": form = DocumentProcessorForm(request.POST, request.FILES) if form.is_valid(): fp = form.cleaned_data["upload"] limit = form.cleaned_data.get("limit") preview_page = form.cleaned_data.get("preview_page") try: extraction = process_uploaded_document(fp, limit=limit, preview_page=preview_page) except ValueError as e: return HttpResponse(str(e)) # 构建响应信息 file_info = f"

文件类型: {extraction.kind.upper()}

" file_info += f"

文件路径: {extraction.file_path}

" if extraction.text: html = f"""

文档处理(文件预览/文本抽取)

{file_info}

📝 提取的文本内容

{extraction.text}

文本长度: {len(extraction.text)} 字符

← 返回

""" return HttpResponse(html) elif extraction.image_url: html = f"""

文档处理(文件预览/文本抽取)

{file_info}

🖼️ 预览图(无法提取文本)

该文件无法直接提取文字内容,已生成预览图供查看:

← 返回

""" return HttpResponse(html) else: html = f"""

文档处理(文件预览/文本抽取)

{file_info}

❌ 处理结果

未提取到可展示的内容。可能的原因:

← 返回重新上传

""" return HttpResponse(html) else: form = DocumentProcessorForm() csrf_token = get_token(request) html = f"""

文档处理(文件预览/文本抽取)




""" return HttpResponse(html) def has_add_permission(self, request: HttpRequest) -> bool: return False def has_change_permission(self, request: HttpRequest, obj: AutomationTool | None = None) -> bool: return True def has_view_permission(self, request: HttpRequest, obj: AutomationTool | None = None) -> bool: return False def has_delete_permission(self, request: HttpRequest, obj: AutomationTool | None = None) -> bool: return False