Download apps/documents/migrations/0001_initial.py from jun2024/fc: direct link, hf CLI and curl.
- Browser
- Download file 47.1 kB
-
https://huggingface.co/spaces/jun2024/fc/resolve/main/apps/documents/migrations/0001_initial.py
- Command line
-
hf download hf://spaces/jun2024/fc/apps/documents/migrations/0001_initial.py
-
curl -L -o 0001_initial.py https://huggingface.co/spaces/jun2024/fc/resolve/main/apps/documents/migrations/0001_initial.py
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="案件类型",
),