Files
wagtailcms/apps/cases/migrations/0002_alter_casestudypage_body.py
T
Zhengen 3944e11330 feat(core): 补全剩余 6 个 StreamField Block (ProductCard/Pricing/Timeline/Team/TechStack/Video)
- apps/core/blocks.py 新增 ProductCardBlock/PricingBlock/TimelineBlock/TeamBlock/TechStackBlock/VideoBlock,COMMON_BLOCKS 扩充至 14 个内容 Block
- TeamBlock 新增 TeamMemberChooserBlock(SnippetChooserBlock),复用 FormBlock 已有的 get_api_representation 展开模式,展开 TeamMember 完整字段(含 serialize_image 复用)
- 为 blog/cases/home/products/solutions 五个 Page 模型生成并应用 alter field body 迁移(StreamField block 定义变更会写入迁移 state)
- apps/core/tests.py 新增 TeamMemberChooserBlock 空值/展开单元测试,pytest 33 个用例全部通过
- 设计文档 §2.6/§2.16 同步更新为已实现
2026-08-07 15:58:44 +08:00

20 lines
6.0 KiB
Python

# Generated by Django 6.0.5 on 2026-08-07 07:43
import wagtail.fields
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('cases', '0001_initial'),
]
operations = [
migrations.AlterField(
model_name='casestudypage',
name='body',
field=wagtail.fields.StreamField([('hero', 7), ('stats', 12), ('feature_grid', 19), ('faq', 24), ('cta', 27), ('logo_cloud', 31), ('case_study', 34), ('form', 36), ('product_card', 41), ('pricing', 50), ('timeline', 55), ('team', 58), ('tech_stack', 62), ('video', 65), ('richtext', 66)], blank=True, block_lookup={0: ('wagtail.blocks.CharBlock', (), {'label': '标题', 'max_length': 120}), 1: ('wagtail.blocks.TextBlock', (), {'label': '副标题', 'required': False}), 2: ('wagtail.images.blocks.ImageChooserBlock', (), {'label': '背景图', 'required': False}), 3: ('wagtail.blocks.CharBlock', (), {'label': '按钮文案', 'max_length': 50}), 4: ('wagtail.blocks.URLBlock', (), {'label': '按钮链接'}), 5: ('wagtail.blocks.StructBlock', [[('text', 3), ('link', 4)]], {}), 6: ('wagtail.blocks.ListBlock', (5,), {'label': '按钮组'}), 7: ('wagtail.blocks.StructBlock', [[('title', 0), ('subtitle', 1), ('background_image', 2), ('buttons', 6)]], {}), 8: ('wagtail.blocks.CharBlock', (), {'label': '数值', 'max_length': 20}), 9: ('wagtail.blocks.CharBlock', (), {'label': '说明文字', 'max_length': 50}), 10: ('wagtail.blocks.StructBlock', [[('value', 8), ('label', 9)]], {}), 11: ('wagtail.blocks.ListBlock', (10,), {'label': '数据项'}), 12: ('wagtail.blocks.StructBlock', [[('items', 11)]], {}), 13: ('wagtail.blocks.CharBlock', (), {'label': '模块标题', 'max_length': 100, 'required': False}), 14: ('wagtail.blocks.CharBlock', (), {'label': '图标', 'max_length': 50, 'required': False}), 15: ('wagtail.blocks.CharBlock', (), {'label': '标题', 'max_length': 100}), 16: ('wagtail.blocks.TextBlock', (), {'label': '描述'}), 17: ('wagtail.blocks.StructBlock', [[('icon', 14), ('title', 15), ('description', 16)]], {}), 18: ('wagtail.blocks.ListBlock', (17,), {'label': '能力列表'}), 19: ('wagtail.blocks.StructBlock', [[('heading', 13), ('items', 18)]], {}), 20: ('wagtail.blocks.CharBlock', (), {'label': '问题', 'max_length': 200}), 21: ('wagtail.blocks.RichTextBlock', (), {'label': '回答'}), 22: ('wagtail.blocks.StructBlock', [[('question', 20), ('answer', 21)]], {}), 23: ('wagtail.blocks.ListBlock', (22,), {'label': '问答列表'}), 24: ('wagtail.blocks.StructBlock', [[('items', 23)]], {}), 25: ('wagtail.blocks.TextBlock', (), {'label': '描述', 'required': False}), 26: ('wagtail.blocks.StructBlock', [[('text', 3), ('link', 4)]], {'label': '按钮'}), 27: ('wagtail.blocks.StructBlock', [[('heading', 0), ('description', 25), ('button', 26)]], {}), 28: ('wagtail.blocks.CharBlock', (), {'label': '标题', 'max_length': 100, 'required': False}), 29: ('wagtail.images.blocks.ImageChooserBlock', (), {}), 30: ('wagtail.blocks.ListBlock', (29,), {'label': 'Logo 列表'}), 31: ('wagtail.blocks.StructBlock', [[('heading', 28), ('logos', 30)]], {}), 32: ('wagtail.blocks.PageChooserBlock', (), {'label': '案例页面', 'page_type': ['cases.CaseStudyPage']}), 33: ('wagtail.blocks.CharBlock', (), {'label': '摘要覆盖', 'max_length': 250, 'required': False}), 34: ('wagtail.blocks.StructBlock', [[('case_page', 32), ('summary', 33)]], {}), 35: ('wagtail.snippets.blocks.SnippetChooserBlock', ('forms.FormDefinition',), {'label': '选择表单'}), 36: ('wagtail.blocks.StructBlock', [[('form', 35)]], {}), 37: ('wagtail.images.blocks.ImageChooserBlock', (), {'label': '图片', 'required': False}), 38: ('wagtail.blocks.URLBlock', (), {'label': '链接', 'required': False}), 39: ('wagtail.blocks.StructBlock', [[('title', 15), ('description', 25), ('image', 37), ('link', 38)]], {}), 40: ('wagtail.blocks.ListBlock', (39,), {'label': '产品列表'}), 41: ('wagtail.blocks.StructBlock', [[('heading', 13), ('items', 40)]], {}), 42: ('wagtail.blocks.CharBlock', (), {'label': '方案名称', 'max_length': 50}), 43: ('wagtail.blocks.CharBlock', (), {'label': '价格', 'max_length': 50}), 44: ('wagtail.blocks.CharBlock', (), {'max_length': 100}), 45: ('wagtail.blocks.ListBlock', (44,), {'label': '功能列表'}), 46: ('wagtail.blocks.BooleanBlock', (), {'default': False, 'label': '突出显示', 'required': False}), 47: ('wagtail.blocks.StructBlock', [[('text', 3), ('link', 4)]], {'label': '按钮', 'required': False}), 48: ('wagtail.blocks.StructBlock', [[('name', 42), ('price', 43), ('features', 45), ('highlighted', 46), ('button', 47)]], {}), 49: ('wagtail.blocks.ListBlock', (48,), {'label': '定价方案'}), 50: ('wagtail.blocks.StructBlock', [[('heading', 13), ('plans', 49)]], {}), 51: ('wagtail.blocks.CharBlock', (), {'label': '年份/时间', 'max_length': 20}), 52: ('wagtail.blocks.TextBlock', (), {'label': '事件描述'}), 53: ('wagtail.blocks.StructBlock', [[('year', 51), ('event', 52)]], {}), 54: ('wagtail.blocks.ListBlock', (53,), {'label': '时间线条目'}), 55: ('wagtail.blocks.StructBlock', [[('heading', 13), ('items', 54)]], {}), 56: ('apps.core.blocks.TeamMemberChooserBlock', (), {}), 57: ('wagtail.blocks.ListBlock', (56,), {'label': '团队成员'}), 58: ('wagtail.blocks.StructBlock', [[('heading', 13), ('members', 57)]], {}), 59: ('wagtail.blocks.CharBlock', (), {'label': '名称', 'max_length': 50}), 60: ('wagtail.blocks.StructBlock', [[('icon', 14), ('label', 59)]], {}), 61: ('wagtail.blocks.ListBlock', (60,), {'label': '技术项'}), 62: ('wagtail.blocks.StructBlock', [[('heading', 13), ('items', 61)]], {}), 63: ('wagtail.blocks.URLBlock', (), {'help_text': '建议使用自建 OSS/COS 存储的 mp4 直链,或腾讯视频/哔哩哔哩等国内平台的嵌入地址,避免使用 YouTube/Vimeo(详见 §2.15 国内可访问性要求)', 'label': '视频地址'}), 64: ('wagtail.images.blocks.ImageChooserBlock', (), {'label': '封面图', 'required': False}), 65: ('wagtail.blocks.StructBlock', [[('heading', 28), ('video_url', 63), ('poster', 64)]], {}), 66: ('wagtail.blocks.RichTextBlock', (), {'label': '富文本'})}),
),
]