fc / apps /documents /migrations /0001_initial.py
jun2024's picture
Upload 2241 files
b4f2238 verified
Raw History Blame Contribute Delete
47.1 kB
# Generated by Django 6.0.2 on 2026-02-28 06:41 import apps.documents.models.evidence_storage import apps.documents.storage import django.db.models.deletion from django.conf import settings from django.db import migrations, models class Migration(migrations.Migration): initial = True dependencies = [ ("cases", "0002_initial"), ("contracts", "0001_initial"), ("organization", "0001_initial"), migrations.swappable_dependency(settings.AUTH_USER_MODEL), ] operations = [ migrations.CreateModel( name="Placeholder", fields=[ ("id", models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")), ( "key", models.CharField( help_text="模板中使用的占位符名称,如 case_name", max_length=100, unique=True, verbose_name="占位符键", ), ), ( "display_name", models.CharField(help_text="用于界面显示的友好名称", max_length=200, verbose_name="显示名称"), ), ( "example_value", models.CharField( blank=True, help_text="占位符的示例值,用于说明用途", max_length=200, verbose_name="示例值" ), ), ("description", models.TextField(blank=True, verbose_name="说明")), ("is_active", models.BooleanField(default=True, verbose_name="是否启用")), ], options={ "verbose_name": "替换词", "verbose_name_plural": "替换词", "ordering": ["key"], }, ), migrations.CreateModel( name="PromptVersion", fields=[ ("id", models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")), ( "name", models.CharField(help_text="如:complaint, defense", max_length=100, verbose_name="Prompt 名称"), ), ("version", models.CharField(help_text="如:v1.0, v1.1", max_length=50, verbose_name="版本号")), ("template", models.TextField(help_text="LangChain Prompt 模板字符串", verbose_name="模板内容")), ( "is_active", models.BooleanField(default=False, help_text="同一名称只能有一个激活版本", verbose_name="是否激活"), ), ( "description", models.TextField(blank=True, help_text="描述此版本的变更内容", verbose_name="版本说明"), ), ("created_at", models.DateTimeField(auto_now_add=True, verbose_name="创建时间")), ("updated_at", models.DateTimeField(auto_now=True, verbose_name="更新时间")), ], options={ "verbose_name": "Prompt 版本", "verbose_name_plural": "Prompt 版本", "ordering": ["-created_at"], }, ), migrations.CreateModel( name="ProxyMatterRule", fields=[ ("id", models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")), ( "case_type", models.CharField( blank=True, choices=[ ("civil", "民事"), ("administrative", "行政"), ("criminal", "刑事"), ("execution", "申请执行"), ("bankruptcy", "破产"), ], help_text="为空表示匹配任意案件类型", max_length=32, null=True, verbose_name="案件类型", ), ), ( "case_stage", models.CharField( blank=True, choices=[ ("first_trial", "一审"), ("second_trial", "二审"), ("enforcement", "执行"), ("labor_arbitration", "劳动仲裁"), ("administrative_review", "行政复议"), ("private_prosecution", "自诉"), ("investigation", "侦查"), ("prosecution_review", "审查起诉"), ("retrial_first", "重审一审"), ("retrial_second", "重审二审"), ("apply_retrial", "申请再审"), ("rehearing_first", "再审一审"), ("rehearing_second", "再审二审"), ("review", "提审"), ("death_penalty_review", "死刑复核程序"), ("petition", "申诉"), ("apply_protest", "申请抗诉"), ("petition_protest", "申诉抗诉"), ], help_text="为空表示匹配任意案件阶段", max_length=64, null=True, verbose_name="当前阶段", ), ), ( "legal_statuses", models.JSONField( blank=True, default=list, help_text="可单选或多选;为空表示匹配任意诉讼地位", verbose_name="我方诉讼地位", ), ), ( "legal_status_match_mode", models.CharField( choices=[("any", "任意匹配"), ("all", "全部包含"), ("exact", "完全一致")], default="any", max_length=16, verbose_name="诉讼地位匹配模式", ), ), ( "items_text", models.TextField(blank=True, default="", help_text="每行一条代理事项", verbose_name="代理事项条目"), ), ("priority", models.PositiveIntegerField(default=100, verbose_name="优先级")), ("is_active", models.BooleanField(default=True, verbose_name="是否启用")), ("created_at", models.DateTimeField(auto_now_add=True, verbose_name="创建时间")), ("updated_at", models.DateTimeField(auto_now=True, verbose_name="更新时间")), ], options={ "verbose_name": "代理事项规则", "verbose_name_plural": "代理事项规则", }, ), migrations.CreateModel( name="TemplateAuditLog", fields=[ ("id", models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")), ( "content_type", models.CharField( choices=[ ("folder_template", "文件夹模板"), ("document_template", "文件模板"), ("placeholder", "替换词"), ("generation_config", "生成配置"), ], max_length=50, verbose_name="对象类型", ), ), ("object_id", models.PositiveIntegerField(verbose_name="对象ID")), ("object_repr", models.CharField(max_length=500, verbose_name="对象描述")), ( "action", models.CharField( choices=[ ("create", "创建"), ("update", "更新"), ("delete", "删除"), ("activate", "启用"), ("deactivate", "禁用"), ("duplicate", "复制"), ("set_default", "设为默认"), ], max_length=20, verbose_name="操作类型", ), ), ( "changes", models.JSONField( blank=True, default=dict, help_text="JSON 格式记录字段变更", verbose_name="变更内容" ), ), ("ip_address", models.GenericIPAddressField(blank=True, null=True, verbose_name="IP地址")), ("user_agent", models.CharField(blank=True, max_length=500, verbose_name="User Agent")), ("created_at", models.DateTimeField(auto_now_add=True, verbose_name="操作时间")), ], options={ "verbose_name": "模板审计日志", "verbose_name_plural": "模板审计日志", "ordering": ["-created_at"], }, ), migrations.CreateModel( name="DocumentTemplate", fields=[ ("id", models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")), ("name", models.CharField(max_length=200, verbose_name="模板名称")), ("description", models.TextField(blank=True, verbose_name="描述")), ( "template_type", models.CharField( choices=[("contract", "合同文件模板"), ("case", "案件文件模板")], default="contract", help_text="选择此模板用于合同还是案件", max_length=20, verbose_name="模板类型", ), ), ( "contract_sub_type", models.CharField( blank=True, choices=[("contract", "合同模板"), ("supplementary_agreement", "补充协议模板")], help_text="仅在选择'合同文件模板'时有效,必须选择合同模板或补充协议模板", max_length=30, null=True, verbose_name="合同子类型", ), ), ( "case_sub_type", models.CharField( blank=True, choices=[ ("pleading_materials", "诉状材料"), ("evidence_materials", "证据材料"), ("power_of_attorney_materials", "授权委托材料"), ("property_preservation_materials", "财产保全材料"), ("service_address_materials", "送达地址材料"), ("refund_account_materials", "收款退费账户材料"), ("application_materials", "申请材料"), ("other_materials", "其他材料"), ], help_text="仅在选择'案件文件模板'时有效,可选择诉状材料、证据材料、授权委托材料等", max_length=50, null=True, verbose_name="案件文件子类型", ), ), ( "file", models.FileField( blank=True, null=True, storage=apps.documents.storage.DocumentTemplateStorage(), upload_to="", verbose_name="上传文件", ), ), ( "file_path", models.CharField( blank=True, help_text="相对于模板基础目录的路径", max_length=500, verbose_name="文件路径" ), ), ( "case_types", models.JSONField( default=list, help_text="JSON 数组,如 ['civil', 'criminal'],支持多选", verbose_name="案件类型" ), ), ( "case_stages", models.JSONField( default=list, help_text="JSON 数组,如 ['first_trial', 'second_trial'],支持多选", verbose_name="案件阶段", ), ), ( "contract_types", models.JSONField( default=list, help_text="JSON 数组,如 ['civil', 'criminal'],支持多选", verbose_name="合同类型" ), ), ( "legal_statuses", models.JSONField( blank=True, default=list, help_text="可单选或多选;为空表示匹配任意诉讼地位", verbose_name="我方诉讼地位", ), ), ( "legal_status_match_mode", models.CharField( choices=[("any", "任意匹配"), ("all", "全部包含"), ("exact", "完全一致")], default="any", max_length=16, verbose_name="诉讼地位匹配模式", ), ), ( "applicable_institutions", models.JSONField( blank=True, default=list, help_text="JSON 数组,如 ['北京市第一中级人民法院'],支持多选", verbose_name="适用机构", ), ), ("is_active", models.BooleanField(default=True, verbose_name="是否启用")), ("created_at", models.DateTimeField(auto_now_add=True, verbose_name="创建时间")), ("updated_at", models.DateTimeField(auto_now=True, verbose_name="更新时间")), ], options={ "verbose_name": "文件模板", "verbose_name_plural": "文件模板", "ordering": ["-updated_at"], "indexes": [ models.Index(fields=["template_type"], name="documents_d_templat_02b3bb_idx"), models.Index(fields=["is_active"], name="documents_d_is_acti_2dfb07_idx"), ], }, ), migrations.CreateModel( name="EvidenceList", fields=[ ("id", models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")), ( "list_type", models.CharField( choices=[ ("list_1", "证据清单一"), ("list_2", "证据清单二"), ("list_3", "证据清单三"), ("list_4", "证据清单四"), ("list_5", "证据清单五"), ("list_6", "证据清单六"), ], default="list_1", help_text="选择清单类型,系统自动处理序号和页码的连续性", max_length=20, verbose_name="清单类型", ), ), ( "title", models.CharField(blank=True, help_text="由清单类型自动生成", max_length=100, verbose_name="标题"), ), ("order", models.IntegerField(default=1, editable=False, verbose_name="顺序")), ( "merged_pdf", models.FileField( blank=True, help_text="将所有证据文件合并为一个PDF,便于打印和提交", null=True, storage=apps.documents.models.evidence_storage.EvidenceFileStorage( base_url="/media/evidence/", location="/Users/huangsong21/Downloads/Coding/AI/FachuanHybridSystem/backend/apiSystem/media/evidence", ), upload_to="evidence/merged/%Y/%m/", verbose_name="合并PDF", ), ), ("total_pages", models.IntegerField(default=0, verbose_name="总页数")), ( "export_version", models.IntegerField( default=1, help_text="由用户手动控制,用于导出文件名版本控制", verbose_name="导出版本号" ), ), ( "merge_status", models.CharField( choices=[ ("pending", "待合并"), ("processing", "合并中"), ("completed", "已完成"), ("failed", "失败"), ], default="pending", max_length=20, verbose_name="合并状态", ), ), ("merge_error", models.TextField(blank=True, verbose_name="合并错误信息")), ("merge_started_at", models.DateTimeField(blank=True, null=True, verbose_name="合并开始时间")), ("merge_finished_at", models.DateTimeField(blank=True, null=True, verbose_name="合并完成时间")), ("merge_progress", models.IntegerField(default=0, verbose_name="合并进度")), ("merge_current", models.IntegerField(default=0, verbose_name="合并进度-已处理文件数")), ("merge_total", models.IntegerField(default=0, verbose_name="合并进度-总文件数")), ("merge_message", models.CharField(blank=True, max_length=255, verbose_name="合并进度信息")), ("created_at", models.DateTimeField(auto_now_add=True, verbose_name="创建时间")), ("updated_at", models.DateTimeField(auto_now=True, verbose_name="更新时间")), ( "case", models.ForeignKey( on_delete=django.db.models.deletion.CASCADE, related_name="evidence_lists", to="cases.case", verbose_name="案件", ), ), ( "created_by", models.ForeignKey( blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name="created_evidence_lists", to=settings.AUTH_USER_MODEL, verbose_name="创建人", ), ), ( "export_template", models.ForeignKey( blank=True, help_text="选择用于导出证据清单的 Word 模板", limit_choices_to={ "case_sub_type": "evidence_materials", "is_active": True, "template_type": "case", }, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name="evidence_lists", to="documents.documenttemplate", verbose_name="导出模板", ), ), ( "previous_list", models.ForeignKey( blank=True, help_text="关联前一个清单,用于自动计算起始序号和页码", null=True, on_delete=django.db.models.deletion.SET_NULL, related_name="next_lists", to="documents.evidencelist", verbose_name="前置清单", ), ), ], options={ "verbose_name": "证据清单", "verbose_name_plural": "证据清单", "ordering": ["order", "created_at"], }, ), migrations.CreateModel( name="EvidenceItem", fields=[ ("id", models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")), ( "order", models.IntegerField(blank=True, default=0, help_text="证据在清单中的序号", verbose_name="序号"), ), ("name", models.CharField(max_length=200, verbose_name="证据名称")), ("purpose", models.TextField(verbose_name="证明内容")), ( "file", models.FileField(blank=True, null=True, upload_to="evidence/files/%Y/%m/", verbose_name="证据文件"), ), ("file_name", models.CharField(blank=True, max_length=255, verbose_name="原始文件名")), ("file_size", models.IntegerField(default=0, help_text="单位:字节", verbose_name="文件大小")), ("page_count", models.IntegerField(default=0, verbose_name="页数")), ("page_start", models.IntegerField(blank=True, null=True, verbose_name="起始页")), ("page_end", models.IntegerField(blank=True, null=True, verbose_name="结束页")), ( "ai_analysis", models.JSONField( blank=True, default=dict, help_text="预留字段,用于未来 LLM 自动分析", verbose_name="AI分析结果" ), ), ("created_at", models.DateTimeField(auto_now_add=True, verbose_name="创建时间")), ("updated_at", models.DateTimeField(auto_now=True, verbose_name="更新时间")), ( "evidence_list", models.ForeignKey( on_delete=django.db.models.deletion.CASCADE, related_name="items", to="documents.evidencelist", verbose_name="证据清单", ), ), ], options={ "verbose_name": "证据明细", "verbose_name_plural": "证据明细", "ordering": ["order"], }, ), migrations.CreateModel( name="ExternalTemplate", fields=[ ("id", models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")), ("name", models.CharField(max_length=255, verbose_name="模板名称")), ( "source_name", models.CharField( blank=True, default="", help_text="法院名称或其他机构名称", max_length=255, verbose_name="来源机构", ), ), ( "file_path", models.CharField(help_text="相对于 MEDIA_ROOT 的存储路径", max_length=500, verbose_name="文件路径"), ), ("original_filename", models.CharField(max_length=255, verbose_name="原始文件名")), ("file_size", models.PositiveIntegerField(verbose_name="文件大小(字节)")), ( "structure_fingerprint", models.CharField( blank=True, db_index=True, default="", help_text="基于模板 XML 结构计算的 SHA-256 哈希值", max_length=64, verbose_name="结构指纹", ), ), ("structure_json", models.JSONField(blank=True, default=dict, verbose_name="提取的结构JSON")), ( "status", models.CharField( choices=[ ("uploaded", "已上传"), ("analyzing", "分析中"), ("analysis_failed", "分析失败"), ("ready", "可填充"), ], default="uploaded", max_length=20, verbose_name="状态", ), ), ("version", models.PositiveIntegerField(default=1, verbose_name="版本号")), ("is_active", models.BooleanField(default=True, verbose_name="是否活跃")), ("status_changed_at", models.DateTimeField(auto_now=True, verbose_name="状态变更时间")), ("created_at", models.DateTimeField(auto_now_add=True, verbose_name="创建时间")), ("updated_at", models.DateTimeField(auto_now=True, verbose_name="更新时间")), ( "law_firm", models.ForeignKey( on_delete=django.db.models.deletion.CASCADE, related_name="external_templates", to="organization.lawfirm", verbose_name="所属律所", ), ), ( "mapping_source", models.ForeignKey( blank=True, help_text="结构指纹匹配时复用映射的原始模板", null=True, on_delete=django.db.models.deletion.SET_NULL, to="documents.externaltemplate", verbose_name="映射来源模板", ), ), ( "uploaded_by", models.ForeignKey( null=True, on_delete=django.db.models.deletion.SET_NULL, related_name="uploaded_external_templates", to=settings.AUTH_USER_MODEL, verbose_name="上传者", ), ), ], options={ "verbose_name": "外部模板", "verbose_name_plural": "外部模板", "ordering": ["-updated_at"], }, ), migrations.CreateModel( name="BatchFillTask", fields=[ ("id", models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")), ("started_at", models.DateTimeField(auto_now_add=True, verbose_name="发起时间")), ("finished_at", models.DateTimeField(blank=True, null=True, verbose_name="完成时间")), ( "zip_file_path", models.CharField( blank=True, default="", help_text="批量填充生成的 ZIP 压缩包路径", max_length=500, verbose_name="ZIP文件路径", ), ), ( "summary_json", models.JSONField( blank=True, default=dict, help_text="批量填充的汇总报告 JSON", verbose_name="汇总报告" ), ), ( "case", models.ForeignKey( help_text="批量填充关联的案件", on_delete=django.db.models.deletion.CASCADE, to="cases.case", verbose_name="关联案件", ), ), ( "initiated_by", models.ForeignKey( null=True, on_delete=django.db.models.deletion.SET_NULL, related_name="initiated_batch_fill_tasks", to=settings.AUTH_USER_MODEL, verbose_name="操作者", ), ), ( "templates", models.ManyToManyField( help_text="本次批量填充选择的外部模板", to="documents.externaltemplate", verbose_name="选择的模板", ), ), ], options={ "verbose_name": "批量填充任务", "verbose_name_plural": "批量填充任务", "ordering": ["-started_at"], }, ), migrations.CreateModel( name="ExternalTemplateFieldMapping", fields=[ ("id", models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")), ("position_locator", models.JSONField(verbose_name="位置定位器")), ( "position_description", models.CharField(blank=True, default="", max_length=500, verbose_name="位置描述"), ), ("semantic_label", models.CharField(max_length=255, verbose_name="语义标签")), ( "fill_type", models.CharField( choices=[ ("text", "文本替换"), ("checkbox", "勾选复选框"), ("delete_inapplicable", "删除不适用项"), ], default="text", max_length=30, verbose_name="填充类型", ), ), ("sort_order", models.PositiveIntegerField(default=0, verbose_name="排序")), ("created_at", models.DateTimeField(auto_now_add=True, verbose_name="创建时间")), ("updated_at", models.DateTimeField(auto_now=True, verbose_name="更新时间")), ( "template", models.ForeignKey( on_delete=django.db.models.deletion.CASCADE, related_name="field_mappings", to="documents.externaltemplate", verbose_name="关联模板", ), ), ], options={ "verbose_name": "字段映射", "verbose_name_plural": "字段映射", "ordering": ["sort_order", "id"], }, ), migrations.CreateModel( name="FillRecord", fields=[ ("id", models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")), ("filled_at", models.DateTimeField(auto_now_add=True, verbose_name="填充时间")), ( "file_path", models.CharField( help_text="填充生成的文件相对于 MEDIA_ROOT 的路径", max_length=500, verbose_name="生成文件路径" ), ), ( "original_output_name", models.CharField(help_text="填充生成的文件原始名称", max_length=255, verbose_name="输出文件名"), ), ( "report_json", models.JSONField( blank=True, default=dict, help_text="填充操作的详细报告 JSON", verbose_name="填充报告" ), ), ( "custom_values", models.JSONField( blank=True, default=dict, help_text="用户手动输入的自定义字段值", verbose_name="自定义填充值" ), ), ( "file_available", models.BooleanField( default=True, help_text="生成的文件是否仍然可访问", verbose_name="文件是否可用" ), ), ( "batch_task", models.ForeignKey( blank=True, help_text="所属的批量填充任务, 单次填充时为空", null=True, on_delete=django.db.models.deletion.CASCADE, related_name="records", to="documents.batchfilltask", verbose_name="批量任务", ), ), ( "case", models.ForeignKey( on_delete=django.db.models.deletion.CASCADE, to="cases.case", verbose_name="关联案件" ), ), ( "filled_by", models.ForeignKey( null=True, on_delete=django.db.models.deletion.SET_NULL, related_name="fill_records", to=settings.AUTH_USER_MODEL, verbose_name="操作者", ), ), ( "party", models.ForeignKey( blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to="cases.caseparty", verbose_name="关联当事人", ), ), ( "template", models.ForeignKey( on_delete=django.db.models.deletion.CASCADE, to="documents.externaltemplate", verbose_name="关联模板", ), ), ], options={ "verbose_name": "填充记录", "verbose_name_plural": "填充记录", "ordering": ["-filled_at"], }, ), migrations.CreateModel( name="FolderTemplate", fields=[ ("id", models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")), ("name", models.CharField(max_length=100, verbose_name="模板名称")), ( "template_type", models.CharField( choices=[("contract", "合同文件夹模板"), ("case", "案件文件夹模板")], help_text="选择此模板用于合同还是案件", max_length=20, verbose_name="模板类型", ), ), ( "case_types", models.JSONField( default=list, help_text="JSON 数组,如 ['civil', 'criminal'],支持多选", verbose_name="案件类型" ), ), ( "case_stages", models.JSONField( default=list, help_text="JSON 数组,如 ['first_trial', 'second_trial'],支持多选", verbose_name="案件阶段", ), ), ( "contract_types", models.JSONField( default=list, help_text="JSON 数组,如 ['civil', 'criminal'],支持多选", verbose_name="合同类型" ), ), ( "legal_statuses", models.JSONField( blank=True, default=list, help_text="可单选或多选;为空表示匹配任意诉讼地位", verbose_name="我方诉讼地位", ), ), ( "legal_status_match_mode", models.CharField( choices=[("any", "任意匹配"), ("all", "全部包含"), ("exact", "完全一致")], default="any", max_length=16, verbose_name="诉讼地位匹配模式", ), ), ( "structure", models.JSONField(default=dict, help_text="JSON 格式的文件夹层级结构", verbose_name="文件夹结构"), ), ("is_default", models.BooleanField(default=False, verbose_name="是否默认模板")), ("is_active", models.BooleanField(default=True, verbose_name="是否启用")), ("created_at", models.DateTimeField(auto_now_add=True, verbose_name="创建时间")), ("updated_at", models.DateTimeField(auto_now=True, verbose_name="更新时间")), ], options={ "verbose_name": "文件夹模板", "verbose_name_plural": "文件夹模板", "ordering": ["-updated_at"], "indexes": [ models.Index(fields=["is_active"], name="documents_f_is_acti_2adc8f_idx"), models.Index(fields=["is_default"], name="documents_f_is_defa_b3de03_idx"), ], }, ), migrations.CreateModel( name="DocumentTemplateFolderBinding", fields=[ ("id", models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")), ( "folder_node_id", models.CharField(help_text="文件夹结构JSON中的节点ID", max_length=100, verbose_name="文件夹节点ID"), ), ( "folder_node_path", models.CharField( blank=True, help_text="自动计算的文件夹路径,如:一审/1-立案材料/1-起诉状和反诉答辩状", max_length=500, verbose_name="文件夹路径", ), ), ("is_active", models.BooleanField(default=True, verbose_name="是否启用")), ("created_at", models.DateTimeField(auto_now_add=True, verbose_name="创建时间")), ("updated_at", models.DateTimeField(auto_now=True, verbose_name="更新时间")), ( "document_template", models.ForeignKey( on_delete=django.db.models.deletion.CASCADE, related_name="folder_bindings", to="documents.documenttemplate", verbose_name="文件模板", ), ), ( "folder_template", models.ForeignKey( on_delete=django.db.models.deletion.CASCADE, related_name="document_bindings", to="documents.foldertemplate", verbose_name="文件夹模板", ), ), ], options={ "verbose_name": "文件模板文件夹绑定", "verbose_name_plural": "文件模板文件夹绑定", "ordering": ["folder_template", "document_template"], }, ), migrations.CreateModel( name="GenerationConfig", fields=[ ("id", models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")), ("name", models.CharField(max_length=100, unique=True, verbose_name="配置名称")), ( "config_type", models.CharField( help_text="如:default_template、ai_model、generation_params", max_length=50, verbose_name="配置类型", ), ), ("value", models.JSONField(verbose_name="配置值")), ("description", models.TextField(blank=True, verbose_name="配置说明")), ("is_active", models.BooleanField(default=True, verbose_name="是否启用")), ("created_at", models.DateTimeField(auto_now_add=True, verbose_name="创建时间")), ("updated_at", models.DateTimeField(auto_now=True, verbose_name="更新时间")), ], options={ "verbose_name": "文书生成配置", "verbose_name_plural": "文书生成配置", "ordering": ["config_type", "name"], "indexes": [ models.Index(fields=["config_type"], name="documents_g_config__3367d5_idx"), models.Index(fields=["is_active"], name="documents_g_is_acti_f62582_idx"), ], }, ), migrations.CreateModel( name="GenerationTask", fields=[ ("id", models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")), ( "generation_method", models.CharField( choices=[("template", "模板生成"), ("ai", "AI生成")], default="template", max_length=20, verbose_name="生成方式", ), ), ( "document_type", models.CharField(help_text="如:起诉状、答辩状、合同等", max_length=100, verbose_name="文书类型"), ), ( "template_id", models.IntegerField( blank=True, help_text="使用的模板ID(模板生成时)", null=True, verbose_name="模板ID" ), ), ( "status", models.CharField( choices=[ ("pending", "等待中"), ("processing", "生成中"), ("completed", "已完成"), ("failed", "失败"), ], default="pending", max_length=20, verbose_name="生成状态", ), ), ( "result_file", models.FileField( blank=True, null=True, upload_to="generated_documents/%Y/%m/", verbose_name="生成文件" ), ), ("error_message", models.TextField(blank=True, verbose_name="错误信息")), ( "metadata", models.JSONField( default=dict, help_text="存储生成参数、token消耗等信息", verbose_name="任务元数据" ), ), ("created_at", models.DateTimeField(auto_now_add=True, verbose_name="创建时间")), ("completed_at", models.DateTimeField(blank=True, null=True, verbose_name="完成时间")), ( "case", models.ForeignKey( blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name="generation_tasks", to="cases.case", verbose_name="关联案件", ), ), ( "contract", models.ForeignKey( blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name="generation_tasks", to="contracts.contract", verbose_name="关联合同", ), ), ( "created_by", models.ForeignKey( blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name="created_generation_tasks", to=settings.AUTH_USER_MODEL, verbose_name="创建人", ), ), ], options={ "verbose_name": "文书生成任务", "verbose_name_plural": "文书生成任务", "ordering": ["-created_at"], }, ), ]
# Generated by Django 6.0.2 on 2026-02-28 06:41
import apps.documents.models.evidence_storage
import apps.documents.storage
import django.db.models.deletion
from django.conf import settings
from django.db import migrations, models
class Migration(migrations.Migration):
initial = True
dependencies = [
("cases", "0002_initial"),
("contracts", "0001_initial"),
("organization", "0001_initial"),
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
]
operations = [
migrations.CreateModel(
name="Placeholder",
fields=[
("id", models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")),
(
"key",
models.CharField(
help_text="模板中使用的占位符名称,如 case_name",
max_length=100,
unique=True,
verbose_name="占位符键",
),
),
(
"display_name",
models.CharField(help_text="用于界面显示的友好名称", max_length=200, verbose_name="显示名称"),
),
(
"example_value",
models.CharField(
blank=True, help_text="占位符的示例值,用于说明用途", max_length=200, verbose_name="示例值"
),
),
("description", models.TextField(blank=True, verbose_name="说明")),
("is_active", models.BooleanField(default=True, verbose_name="是否启用")),
],
options={
"verbose_name": "替换词",
"verbose_name_plural": "替换词",
"ordering": ["key"],
},
),
migrations.CreateModel(
name="PromptVersion",
fields=[
("id", models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")),
(
"name",
models.CharField(help_text="如:complaint, defense", max_length=100, verbose_name="Prompt 名称"),
),
("version", models.CharField(help_text="如:v1.0, v1.1", max_length=50, verbose_name="版本号")),
("template", models.TextField(help_text="LangChain Prompt 模板字符串", verbose_name="模板内容")),
(
"is_active",
models.BooleanField(default=False, help_text="同一名称只能有一个激活版本", verbose_name="是否激活"),
),
(
"description",
models.TextField(blank=True, help_text="描述此版本的变更内容", verbose_name="版本说明"),
),
("created_at", models.DateTimeField(auto_now_add=True, verbose_name="创建时间")),
("updated_at", models.DateTimeField(auto_now=True, verbose_name="更新时间")),
],
options={
"verbose_name": "Prompt 版本",
"verbose_name_plural": "Prompt 版本",
"ordering": ["-created_at"],
},
),
migrations.CreateModel(
name="ProxyMatterRule",
fields=[
("id", models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")),
(
"case_type",
models.CharField(
blank=True,
choices=[
("civil", "民事"),
("administrative", "行政"),
("criminal", "刑事"),
("execution", "申请执行"),
("bankruptcy", "破产"),
],
help_text="为空表示匹配任意案件类型",
max_length=32,
null=True,
verbose_name="案件类型",
),