# Generated by Django 5.2.9 on 2026-01-29 02:58 import common.encoder.encoder import django.db.models.deletion import uuid_utils.compat from django.db import migrations, models old = [ "https://apps-assets.fit2cloud.com/stable/maxkb/md2docx/logo.png", "https://apps-assets.fit2cloud.com/stable/maxkb/mcp_output/logo.png", "https://apps-assets.fit2cloud.com/stable/maxkb/feishubot/logo.png", "https://apps-assets.fit2cloud.com/stable/maxkb/mongo/logo.png", "https://apps-assets.fit2cloud.com/stable/maxkb/OFD_Parse/logo.png", "https://apps-assets.fit2cloud.com/stable/maxkb/html_to_pdf/logo.png", "https://apps-assets.fit2cloud.com/stable/maxkb/feishu_datasource/logo.png", "https://apps-assets.fit2cloud.com/stable/maxkb/quotation_generation_agent/logo.png", "https://apps-assets.fit2cloud.com/stable/maxkb/html2pdf/logo.png", "https://apps-assets.fit2cloud.com/stable/maxkb/sqlbot_ai/logo.png", "https://apps-assets.fit2cloud.com/stable/maxkb/metaso/logo.png", "https://apps-assets.fit2cloud.com/stable/maxkb/registry/logo.png", "https://apps-assets.fit2cloud.com/stable/maxkb/smtp_email/logo.png", "https://apps-assets.fit2cloud.com/stable/maxkb/wecomrobot/logo.png", "https://apps-assets.fit2cloud.com/stable/maxkb/paperx/logo.png", "https://apps-assets.fit2cloud.com/stable/maxkb/case_inquire/logo.png", "https://apps-assets.fit2cloud.com/stable/maxkb/data_analysis_assistant/logo.png", "https://apps-assets.fit2cloud.com/stable/maxkb/crm_intelligent_search/logo.png", "https://apps-assets.fit2cloud.com/stable/maxkb/case_collection/logo.png", "https://apps-assets.fit2cloud.com/stable/maxkb/knowledge_self_assessment/logo.png", "https://apps-assets.fit2cloud.com/stable/maxkb/minerU_util/logo.png", "https://apps-assets.fit2cloud.com/stable/maxkb/invoice_recognition/logo.png", "https://apps-assets.fit2cloud.com/stable/maxkb/fragment/logo.png", "https://apps-assets.fit2cloud.com/stable/maxkb/contract_review/logo.png", "https://apps-assets.fit2cloud.com/stable/maxkb/echart_to_svg/logo.png", "https://apps-assets.fit2cloud.com/stable/maxkb/extract/logo.png", "https://apps-assets.fit2cloud.com/stable/maxkb/big_order/logo.png", "https://apps-assets.fit2cloud.com/stable/maxkb/crm_intelligent_recording/logo.png", "https://apps-assets.fit2cloud.com/stable/maxkb/dingrobot/logo.png", "https://apps-assets.fit2cloud.com/stable/maxkb/timestamp/logo.png", "https://apps-assets.fit2cloud.com/stable/maxkb/knowledge_workflow/logo.png", "https://apps-assets.fit2cloud.com/stable/maxkb/household_registration_policy_qa_assistant/logo.png", "https://apps-assets.fit2cloud.com/stable/maxkb/httputils/logo.png", "https://apps-assets.fit2cloud.com/stable/maxkb/html_compression/logo.png", "https://apps-assets.fit2cloud.com/stable/maxkb/crm_customer_entry_ai_agent/logo.png", "https://apps-assets.fit2cloud.com/stable/maxkb/anspire/logo.png", "https://apps-assets.fit2cloud.com/stable/maxkb/application_template/logo.png", "https://apps-assets.fit2cloud.com/stable/maxkb/baidu-translate/logo.png", "https://apps-assets.fit2cloud.com/stable/maxkb/website_translation/logo.png", ] new = [ "https://apps-assets.fit2cloud.com/stable/maxkb/tool_md2docx/logo.png", "https://apps-assets.fit2cloud.com/stable/maxkb/tool_mcp_output/logo.png", "https://apps-assets.fit2cloud.com/stable/maxkb/tool_feishubot/logo.png", "https://apps-assets.fit2cloud.com/stable/maxkb/tool_mongo/logo.png", "https://apps-assets.fit2cloud.com/stable/maxkb/tool_OFD_Parse/logo.png", "https://apps-assets.fit2cloud.com/stable/maxkb/tool_html_to_pdf/logo.png", "https://apps-assets.fit2cloud.com/stable/maxkb/db_feishu_datasource/logo.png", "https://apps-assets.fit2cloud.com/stable/maxkb/app_quotation_generation_agent/logo.png", "https://apps-assets.fit2cloud.com/stable/maxkb/tool_html2pdf/logo.png", "https://apps-assets.fit2cloud.com/stable/maxkb/app_sqlbot_ai/logo.png", "https://apps-assets.fit2cloud.com/stable/maxkb/tool_metaso/logo.png", "https://apps-assets.fit2cloud.com/stable/maxkb/tool_registry/logo.png", "https://apps-assets.fit2cloud.com/stable/maxkb/tool_smtp_email/logo.png", "https://apps-assets.fit2cloud.com/stable/maxkb/tool_wecomrobot/logo.png", "https://apps-assets.fit2cloud.com/stable/maxkb/tool_paperx/logo.png", "https://apps-assets.fit2cloud.com/stable/maxkb/app_case_inquire/logo.png", "https://apps-assets.fit2cloud.com/stable/maxkb/app_data_analysis_assistant/logo.png", "https://apps-assets.fit2cloud.com/stable/maxkb/app_crm_intelligent_search/logo.png", "https://apps-assets.fit2cloud.com/stable/maxkb/app_case_collection/logo.png", "https://apps-assets.fit2cloud.com/stable/maxkb/app_knowledge_self_assessment/logo.png", "https://apps-assets.fit2cloud.com/stable/maxkb/tool_minerU_util/logo.png", "https://apps-assets.fit2cloud.com/stable/maxkb/app_invoice_recognition/logo.png", "https://apps-assets.fit2cloud.com/stable/maxkb/tool_fragment/logo.png", "https://apps-assets.fit2cloud.com/stable/maxkb/app_contract_review/logo.png", "https://apps-assets.fit2cloud.com/stable/maxkb/tool_echart_to_svg/logo.png", "https://apps-assets.fit2cloud.com/stable/maxkb/tool_extract/logo.png", "https://apps-assets.fit2cloud.com/stable/maxkb/tool_big_order/logo.png", "https://apps-assets.fit2cloud.com/stable/maxkb/app_crm_intelligent_recording/logo.png", "https://apps-assets.fit2cloud.com/stable/maxkb/tool_dingrobot/logo.png", "https://apps-assets.fit2cloud.com/stable/maxkb/tool_timestamp/logo.png", "https://apps-assets.fit2cloud.com/stable/maxkb/kbwf_knowledge_workflow/logo.png", "https://apps-assets.fit2cloud.com/stable/maxkb/app_household_registration_policy_qa_assistant/logo.png", "https://apps-assets.fit2cloud.com/stable/maxkb/tool_httputils/logo.png", "https://apps-assets.fit2cloud.com/stable/maxkb/tool_html_compression/logo.png", "https://apps-assets.fit2cloud.com/stable/maxkb/app_crm_customer_entry_ai_agent/logo.png", "https://apps-assets.fit2cloud.com/stable/maxkb/tool_anspire/logo.png", "https://apps-assets.fit2cloud.com/stable/maxkb/app_application_template/logo.png", "https://apps-assets.fit2cloud.com/stable/maxkb/tool_baidu-translate/logo.png", "https://apps-assets.fit2cloud.com/stable/maxkb/app_website_translation/logo.png", ] def _replace_tool_icons(apps, schema_editor): if len(old) != len(new): raise ValueError("`old` 与 `new` 长度不一致,无法一一替换") Tool = apps.get_model("tools", "Tool") mapping = dict(zip(old, new)) # 逐个 update,避免依赖数据库对 CASE/WHEN 的兼容差异 for old_icon, new_icon in mapping.items(): Tool.objects.filter(icon=old_icon).update(icon=new_icon) class Migration(migrations.Migration): dependencies = [ ('tools', '0004_alter_tool_tool_type'), ] operations = [ migrations.CreateModel( name='ToolRecord', fields=[ ('create_time', models.DateTimeField(auto_now_add=True, db_index=True, verbose_name='创建时间')), ('update_time', models.DateTimeField(auto_now=True, db_index=True, verbose_name='修改时间')), ('id', models.UUIDField(default=uuid_utils.compat.uuid7, editable=False, primary_key=True, serialize=False, verbose_name='主键id')), ('source_type', models.CharField(choices=[('APPLICATION', 'Application'), ('KNOWLEDGE', 'Knowledge'), ('TRIGGER', 'Trigger')], default='APPLICATION', max_length=256, verbose_name='触发器任务类型')), ('source_id', models.UUIDField(verbose_name='资源id')), ('meta', models.JSONField(default=dict, encoder=common.encoder.encoder.SystemEncoder)), ('state', models.CharField(choices=[('PENDING', 'Pending'), ('STARTED', 'Started'), ('SUCCESS', 'Success'), ('FAILURE', 'Failure'), ('REVOKE', 'Revoke'), ('REVOKED', 'Revoked')], default='STARTED', max_length=20, verbose_name='状态')), ('run_time', models.FloatField(default=0, verbose_name='运行时长')), ('tool', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, to='tools.tool')), ('workspace_id', models.CharField(db_index=True, default='default', max_length=64, verbose_name='工作空间id')), ], options={ 'db_table': 'tool_record', }, ), migrations.RunPython(_replace_tool_icons, reverse_code=migrations.RunPython.noop), ]