feat(migrations): add Phase 4.0+4.1 verbose_name/help_text migrations
Generated by manage.py makemigrations after Phase 4.0 (model Meta verbose_name) and Phase 4.1 (field-level verbose_name/help_text) were committed across all 9 apps. Field-meta only (Alter field on Meta options); no schema changes.
This commit is contained in:
@@ -0,0 +1,667 @@
|
||||
# Generated by Django 4.2.16 on 2026-04-30 01:46
|
||||
|
||||
import django.contrib.postgres.fields
|
||||
from django.db import migrations, models
|
||||
import django.db.models.deletion
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('org', '0003_alter_orgunit_address_city_and_more'),
|
||||
('fonrey_property', '0004_alter_commission_agent_and_more'),
|
||||
('fonrey_client', '0003_alter_client_options_alter_clientcontact_options_and_more'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AlterField(
|
||||
model_name='client',
|
||||
name='activity_level',
|
||||
field=models.CharField(blank=True, choices=[('new_matched', '新配对'), ('active_7d', '7日活跃'), ('active_30d', '30日活跃'), ('active_90d', '90日活跃'), ('expiring', '即将过期'), ('frozen', '暂缓中'), ('invalid', '无效')], default='', help_text='new_matched=新配偶 / active_7d / active_30d / active_90d / expiring / frozen / invalid(异步计算)', max_length=20, verbose_name='活跃度'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='client',
|
||||
name='buying_purpose',
|
||||
field=django.contrib.postgres.fields.ArrayField(base_field=models.CharField(choices=[('rigid', '刚需'), ('investment', '投资'), ('school_district', '学区'), ('upgrade', '改善'), ('commercial', '商用'), ('other', '其他')], max_length=20), blank=True, default=list, help_text='多选:rigid=刚需 / investment=投资 / school_district=学区 / upgrade=改善 / commercial=商用 / other=其他', size=None, verbose_name='购房目的'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='client',
|
||||
name='client_no',
|
||||
field=models.CharField(help_text='系统生成的客源编号,格式由运营配置(如 KY20260424001)', max_length=30, unique=True, verbose_name='客源编号'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='client',
|
||||
name='client_type',
|
||||
field=models.CharField(choices=[('private', '私客'), ('public', '公客'), ('transacted', '成交客')], default='private', help_text='private=私客 / public=公客 / transacted=成交客', max_length=20, verbose_name='客源分类'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='client',
|
||||
name='commission_date',
|
||||
field=models.DateField(blank=True, null=True, verbose_name='委托日期'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='client',
|
||||
name='entrust_count',
|
||||
field=models.SmallIntegerField(default=1, help_text='成交后再委托则累加', verbose_name='委托次数'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='client',
|
||||
name='first_recorder',
|
||||
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='first_recorded_clients', to='org.staff', verbose_name='首录人'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='client',
|
||||
name='grade',
|
||||
field=models.CharField(choices=[('A', 'A(急迫)'), ('B', 'B(较强)'), ('C', 'C(一般)'), ('D', 'D(较弱)'), ('E', 'E(暂不关注)')], default='C', help_text='A=A急迫 / B=较强 / C=一般 / D=较弱 / E=暂不关注', max_length=5, verbose_name='客源等级'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='client',
|
||||
name='has_loan_record',
|
||||
field=models.BooleanField(blank=True, null=True, verbose_name='有无贷款记录'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='client',
|
||||
name='id_number_enc',
|
||||
field=models.BinaryField(blank=True, help_text='AES 加密存储', null=True, verbose_name='证件号码(加密)'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='client',
|
||||
name='id_type',
|
||||
field=models.CharField(blank=True, choices=[('id_card', '身份证'), ('passport', '护照'), ('hk_macao', '港澳通行证'), ('other', '其他')], default='', help_text='id_card=身份证 / passport=护照 / hk_macao=港澳台 / other=其他', max_length=20, verbose_name='证件类型'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='client',
|
||||
name='invalid_reason',
|
||||
field=models.CharField(blank=True, choices=[('invalid_phone', '号码无效'), ('peer_agent', '同行'), ('ad', '广告推销'), ('no_intent', '无意向'), ('other', '其他')], default='', help_text='invalid_phone=号码无效 / peer_agent=同行 / ad=广告推销 / no_intent=无意向 / other=其他', max_length=30, verbose_name='无效原因'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='client',
|
||||
name='invalidated_at',
|
||||
field=models.DateTimeField(blank=True, null=True, verbose_name='标记无效时间'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='client',
|
||||
name='is_big_value',
|
||||
field=models.BooleanField(default=False, help_text='影响筛选展示', verbose_name='是否大价值客户'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='client',
|
||||
name='is_pinned',
|
||||
field=models.BooleanField(default=False, help_text='列表顶部置顶', verbose_name='是否置顶'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='client',
|
||||
name='is_protected',
|
||||
field=models.BooleanField(default=False, help_text='影响转公逻辑', verbose_name='是否保护客'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='client',
|
||||
name='is_starred',
|
||||
field=models.BooleanField(default=False, help_text='快速标记,详细收藏夹用 client_folder_items', verbose_name='是否收藏'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='client',
|
||||
name='last_active_at',
|
||||
field=models.DateTimeField(blank=True, help_text='触发器维护', null=True, verbose_name='最后有效跟进时间'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='client',
|
||||
name='last_follow_at',
|
||||
field=models.DateTimeField(blank=True, help_text='冗余字段,列表排序用', null=True, verbose_name='最后跟进时间'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='client',
|
||||
name='org_unit',
|
||||
field=models.ForeignKey(blank=True, help_text='冗余字段,加速筛选', null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='clients', to='org.orgunit', verbose_name='归属部门'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='client',
|
||||
name='owner',
|
||||
field=models.ForeignKey(blank=True, help_text='私客独占跟进人', null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='owned_clients', to='org.staff', verbose_name='归属人'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='client',
|
||||
name='payment_method',
|
||||
field=models.CharField(blank=True, choices=[('full', '全额'), ('mortgage', '商业贷款'), ('mortgage_fund', '商贷+公积金'), ('fund', '公积金')], default='', help_text='full=全额 / mortgage=商业贷款 / mortgage_fund=商贷+公积金 / fund=公积金', max_length=30, verbose_name='付款方式'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='client',
|
||||
name='prefers_new_house',
|
||||
field=models.BooleanField(blank=True, help_text='用于筛选', null=True, verbose_name='偏好新房'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='client',
|
||||
name='properties_owned',
|
||||
field=models.CharField(blank=True, choices=[('none', '无'), ('local_none', '本地无/外地有'), ('local_has', '本地有')], default='', help_text='none=无 / local_none=本地无外地有 / local_has=本地有', max_length=20, verbose_name='名下房产'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='client',
|
||||
name='property_usage',
|
||||
field=models.CharField(choices=[('residential', '住宅'), ('villa', '别墅'), ('commercial_residential', '商住'), ('shop', '商铺'), ('office', '写字楼'), ('other', '其他')], default='residential', help_text='residential=住宅 / villa=别墅 / commercial_residential=商住 / shop=商铺 / office=写字楼 / other=其他', max_length=30, verbose_name='房屋用途'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='client',
|
||||
name='remarks',
|
||||
field=models.TextField(blank=True, default='', help_text='最多200字', verbose_name='备注'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='client',
|
||||
name='source',
|
||||
field=models.CharField(blank=True, default='', help_text='lookup_items 维护', max_length=50, verbose_name='客户来源'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='client',
|
||||
name='status',
|
||||
field=models.CharField(choices=[('buying', '求购'), ('renting', '求租'), ('buy_or_rent', '租购'), ('suspended', '暂缓'), ('bought', '已购'), ('rented_done', '已租'), ('public', '公客'), ('invalid', '无效')], default='buying', help_text='buying=求购 / renting=求租 / buy_or_rent=租购 / suspended=暂缓 / bought=已购 / rented_done=已租 / public=公客 / invalid=无效(详见 ENUMS)', max_length=20, verbose_name='客源状态'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='client',
|
||||
name='transacted_at',
|
||||
field=models.DateField(blank=True, null=True, verbose_name='成交日期'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='client',
|
||||
name='transacted_price',
|
||||
field=models.DecimalField(blank=True, decimal_places=2, help_text='单位:万元', max_digits=12, null=True, verbose_name='成交价格'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='client',
|
||||
name='transacted_property',
|
||||
field=models.ForeignKey(blank=True, help_text='成交关联的房源', null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='transacted_clients', to='fonrey_property.property', verbose_name='成交房源'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='client',
|
||||
name='transacted_property_type',
|
||||
field=models.CharField(blank=True, choices=[('second_hand', '二手'), ('new_house', '新房')], default='', help_text='second_hand=二手 / new_house=新房', max_length=20, verbose_name='成交房源类型'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='client',
|
||||
name='transacted_type',
|
||||
field=models.CharField(blank=True, choices=[('bought', '我购'), ('rented', '我租')], default='', help_text='bought=我购 / rented=我租', max_length=20, verbose_name='成交类型'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='client',
|
||||
name='transfer_to_public_type',
|
||||
field=models.CharField(blank=True, choices=[('manual', '手动转公'), ('auto', '自动转公'), ('marketing_jump', '营销客跳公'), ('resource_public', '资料客素公')], default='', help_text='manual=手动转公 / auto=自动转公(超时) / marketing_jump=营销客跳公 / resource_public=资料客素公', max_length=20, verbose_name='转公客方式'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='client',
|
||||
name='transferred_public_at',
|
||||
field=models.DateTimeField(blank=True, null=True, verbose_name='进入公客池时间'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='client',
|
||||
name='version',
|
||||
field=models.IntegerField(default=1, help_text='乐观锁;每次 UPDATE +1;应用层检测 0 行受影响时抛 ConflictError', verbose_name='版本号'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='clientcontact',
|
||||
name='client',
|
||||
field=models.ForeignKey(help_text='联系人随客源级联删除', on_delete=django.db.models.deletion.CASCADE, related_name='contacts', to='fonrey_client.client', verbose_name='所属客源'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='clientcontact',
|
||||
name='created_at',
|
||||
field=models.DateTimeField(auto_now_add=True, verbose_name='创建时间'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='clientcontact',
|
||||
name='created_by',
|
||||
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='created_client_contacts', to='org.staff', verbose_name='创建人'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='clientcontact',
|
||||
name='deleted_at',
|
||||
field=models.DateTimeField(blank=True, help_text='软删除时间戳;NULL=未删除(不影响客源本身)', null=True, verbose_name='删除时间'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='clientcontact',
|
||||
name='gender',
|
||||
field=models.CharField(choices=[('male', '先生'), ('female', '女士')], default='male', help_text='male=先生 / female=女士', max_length=10, verbose_name='性别'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='clientcontact',
|
||||
name='name',
|
||||
field=models.CharField(max_length=50, verbose_name='联系人姓名'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='clientcontact',
|
||||
name='phone2_enc',
|
||||
field=models.BinaryField(blank=True, null=True, verbose_name='备用电话2(加密)'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='clientcontact',
|
||||
name='phone2_hash',
|
||||
field=models.CharField(blank=True, default='', help_text='SHA-256,用于重复检测', max_length=64, verbose_name='备用电话2哈希'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='clientcontact',
|
||||
name='phone_country_code',
|
||||
field=models.CharField(default='+86', max_length=10, verbose_name='国际区号'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='clientcontact',
|
||||
name='phone_enc',
|
||||
field=models.BinaryField(help_text='AES-256-GCM 加密手机号(电话1)', verbose_name='手机号(加密)'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='clientcontact',
|
||||
name='phone_hash',
|
||||
field=models.CharField(help_text='SHA-256 哈希(重复检测)', max_length=64, verbose_name='手机号哈希'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='clientcontact',
|
||||
name='phone_is_invalid',
|
||||
field=models.BooleanField(default=False, help_text='标记无效后该号码不再参与重复检测', verbose_name='号码是否无效'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='clientcontact',
|
||||
name='qq',
|
||||
field=models.CharField(blank=True, default='', max_length=20, verbose_name='QQ号'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='clientcontact',
|
||||
name='remarks',
|
||||
field=models.CharField(blank=True, default='', help_text='最多200字', max_length=200, verbose_name='联系人备注'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='clientcontact',
|
||||
name='sort_order',
|
||||
field=models.SmallIntegerField(default=0, help_text='sort_order=0 为主联系人,姓名用于客源姓名显示', verbose_name='排序顺序'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='clientcontact',
|
||||
name='updated_at',
|
||||
field=models.DateTimeField(auto_now=True, verbose_name='最后更新时间'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='clientcontact',
|
||||
name='wechat',
|
||||
field=models.CharField(blank=True, default='', max_length=100, verbose_name='微信号'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='clientfavoritefolder',
|
||||
name='created_at',
|
||||
field=models.DateTimeField(auto_now_add=True, verbose_name='创建时间'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='clientfavoritefolder',
|
||||
name='deleted_at',
|
||||
field=models.DateTimeField(blank=True, help_text='软删除时间戳;NULL=未删除', null=True, verbose_name='删除时间'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='clientfavoritefolder',
|
||||
name='is_default',
|
||||
field=models.BooleanField(default=False, help_text='系统默认收藏夹,每个经纪人只能有一个', verbose_name='是否默认'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='clientfavoritefolder',
|
||||
name='name',
|
||||
field=models.CharField(help_text='最多10字', max_length=10, verbose_name='收藏夹名称'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='clientfavoritefolder',
|
||||
name='sort_order',
|
||||
field=models.IntegerField(default=0, help_text='升序排列', verbose_name='显示顺序'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='clientfavoritefolder',
|
||||
name='staff',
|
||||
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='favorite_folders', to='org.staff', verbose_name='所属经纪人'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='clientfolderitem',
|
||||
name='added_at',
|
||||
field=models.DateTimeField(auto_now_add=True, verbose_name='加入收藏夹时间'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='clientfolderitem',
|
||||
name='client',
|
||||
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='folder_items', to='fonrey_client.client', verbose_name='被收藏的客源'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='clientfolderitem',
|
||||
name='folder',
|
||||
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='items', to='fonrey_client.clientfavoritefolder', verbose_name='所属收藏夹'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='clientfollowlogattachment',
|
||||
name='created_at',
|
||||
field=models.DateTimeField(auto_now_add=True, verbose_name='创建时间'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='clientfollowlogattachment',
|
||||
name='file_key',
|
||||
field=models.TextField(help_text='R2/S3 存储路径', verbose_name='文件存储路径'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='clientfollowlogattachment',
|
||||
name='file_name',
|
||||
field=models.CharField(help_text='原始文件名(用于展示和下载)', max_length=255, verbose_name='文件名'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='clientfollowlogattachment',
|
||||
name='file_size',
|
||||
field=models.IntegerField(help_text='单位:bytes,最大 20MB', verbose_name='文件大小'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='clientfollowlogattachment',
|
||||
name='file_type',
|
||||
field=models.CharField(blank=True, default='', help_text='bmp / jpg / png / gif', max_length=10, verbose_name='文件类型'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='clientfollowlogattachment',
|
||||
name='follow_log_id',
|
||||
field=models.UUIDField(help_text='跨分区 FK;不通过 Django FK 强制约束', verbose_name='所属跟进日志ID'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='clientfollowlogattachment',
|
||||
name='has_location',
|
||||
field=models.BooleanField(default=False, help_text='是否含 GPS 位置信息', verbose_name='是否含位置信息'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='clientfollowlogattachment',
|
||||
name='sort_order',
|
||||
field=models.SmallIntegerField(default=0, verbose_name='排序顺序'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='clientpropertymatch',
|
||||
name='calculated_at',
|
||||
field=models.DateTimeField(auto_now_add=True, verbose_name='配房计算时间'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='clientpropertymatch',
|
||||
name='client',
|
||||
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='property_matches', to='fonrey_client.client', verbose_name='所属客源'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='clientpropertymatch',
|
||||
name='created_by',
|
||||
field=models.ForeignKey(blank=True, help_text='触发配房操作的员工(录客配房时记录,系统配房可为NULL)', null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='created_matches', to='org.staff', verbose_name='创建人'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='clientpropertymatch',
|
||||
name='feedback',
|
||||
field=models.CharField(blank=True, default='', help_text='lookup_items 维护', max_length=50, verbose_name='反馈原因'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='clientpropertymatch',
|
||||
name='match_group',
|
||||
field=models.CharField(blank=True, choices=[('quality_layout', '优质户型'), ('price_reduced', '降价'), ('hot', '热门'), ('newly_listed', '新上')], default='', help_text='quality_layout=优质户型 / price_reduced=降价 / hot=热门 / newly_listed=新上', max_length=30, verbose_name='匹配分组'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='clientpropertymatch',
|
||||
name='match_reasons',
|
||||
field=models.JSONField(blank=True, help_text='格式:[{"key": "budget", "match": true}, ...]', null=True, verbose_name='匹配原因详情'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='clientpropertymatch',
|
||||
name='match_score',
|
||||
field=models.DecimalField(blank=True, decimal_places=2, help_text='0-100', max_digits=5, null=True, verbose_name='匹配度评分'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='clientpropertymatch',
|
||||
name='match_source',
|
||||
field=models.CharField(choices=[('recorded', '录客配房'), ('system', '系统配房')], default='recorded', help_text='recorded=录客配房(基于录入需求) / system=系统配房(算法推荐)', max_length=20, verbose_name='匹配来源'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='clientpropertymatch',
|
||||
name='property',
|
||||
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='client_matches', to='fonrey_property.property', verbose_name='匹配房源'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='clientpropertymatch',
|
||||
name='shared_at',
|
||||
field=models.DateTimeField(blank=True, null=True, verbose_name='分享时间'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='clientpropertymatch',
|
||||
name='status',
|
||||
field=models.CharField(choices=[('suggested', '待推送'), ('shared', '已分享'), ('rejected', '已反馈不合适'), ('viewed', '客户已查看')], default='suggested', help_text='suggested=待推送 / shared=已分享 / rejected=已反馈不合适 / viewed=客户已查看', max_length=20, verbose_name='状态'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='clientrequirement',
|
||||
name='area_max',
|
||||
field=models.DecimalField(blank=True, decimal_places=2, help_text='单位:㎡', max_digits=8, null=True, verbose_name='最大面积'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='clientrequirement',
|
||||
name='area_min',
|
||||
field=models.DecimalField(blank=True, decimal_places=2, help_text='单位:㎡', max_digits=8, null=True, verbose_name='最小面积'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='clientrequirement',
|
||||
name='bedroom_counts',
|
||||
field=django.contrib.postgres.fields.ArrayField(base_field=models.SmallIntegerField(), blank=True, default=list, help_text='多选,如 [2,3]', size=None, verbose_name='可接受卧室数'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='clientrequirement',
|
||||
name='budget_max',
|
||||
field=models.DecimalField(blank=True, decimal_places=2, max_digits=12, null=True, verbose_name='最高预算'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='clientrequirement',
|
||||
name='budget_min',
|
||||
field=models.DecimalField(blank=True, decimal_places=2, help_text='单位:万元/元,依据需求类型', max_digits=12, null=True, verbose_name='最低预算'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='clientrequirement',
|
||||
name='building_age_ranges',
|
||||
field=django.contrib.postgres.fields.ArrayField(base_field=models.CharField(choices=[('within_5y', '5年内'), ('5_10y', '5-10年'), ('10_15y', '10-15年'), ('15_20y', '15-20年'), ('over_20y', '20年以上')], max_length=20), blank=True, default=list, help_text='多选:within_5y / 5_10y / 10_15y / 15_20y / over_20y', size=None, verbose_name='楼龄偏好'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='clientrequirement',
|
||||
name='client',
|
||||
field=models.ForeignKey(help_text='需求随客源级联删除', on_delete=django.db.models.deletion.CASCADE, related_name='requirements', to='fonrey_client.client', verbose_name='所属客源'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='clientrequirement',
|
||||
name='created_at',
|
||||
field=models.DateTimeField(auto_now_add=True, verbose_name='创建时间'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='clientrequirement',
|
||||
name='decorations',
|
||||
field=django.contrib.postgres.fields.ArrayField(base_field=models.CharField(choices=[('rough', '毛坯'), ('plain', '清水'), ('simple', '简装'), ('medium', '中装'), ('fine', '精装'), ('luxury', '豪装')], max_length=10), blank=True, default=list, help_text='多选(枚举同 properties.decoration)', size=None, verbose_name='装修偏好'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='clientrequirement',
|
||||
name='floor_preferences',
|
||||
field=django.contrib.postgres.fields.ArrayField(base_field=models.CharField(choices=[('no_first', '不要一楼'), ('low', '低楼层'), ('mid', '中楼层'), ('high', '高楼层'), ('no_top', '不要顶楼')], max_length=20), blank=True, default=list, help_text='多选:no_first=不要一层 / low=低楼层 / mid=中楼层 / high=高楼层 / no_top=不要顶层', size=None, verbose_name='楼层偏好'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='clientrequirement',
|
||||
name='intent_business_area_ids',
|
||||
field=django.contrib.postgres.fields.ArrayField(base_field=models.UUIDField(), blank=True, default=list, help_text='商圈 ID 数组', size=None, verbose_name='意向商圈'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='clientrequirement',
|
||||
name='intent_complex_names',
|
||||
field=models.TextField(blank=True, default='', help_text='文本,逗号分隔,最多500字', verbose_name='意向小区'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='clientrequirement',
|
||||
name='intent_district_ids',
|
||||
field=django.contrib.postgres.fields.ArrayField(base_field=models.UUIDField(), blank=True, default=list, help_text='行政区 ID 数组', size=None, verbose_name='意向行政区'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='clientrequirement',
|
||||
name='intent_school_names',
|
||||
field=models.TextField(blank=True, default='', help_text='文本,逗号分隔', verbose_name='意向学校'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='clientrequirement',
|
||||
name='is_primary',
|
||||
field=models.BooleanField(default=True, help_text='用于列表展示', verbose_name='是否主需求'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='clientrequirement',
|
||||
name='orientations',
|
||||
field=django.contrib.postgres.fields.ArrayField(base_field=models.CharField(choices=[('east', '东'), ('south', '南'), ('west', '西'), ('north', '北')], max_length=10), blank=True, default=list, help_text='多选:east=东 / south=南 / west=西 / north=北', size=None, verbose_name='朝向偏好'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='clientrequirement',
|
||||
name='requirement_notes',
|
||||
field=models.CharField(blank=True, default='', help_text='最多200字', max_length=200, verbose_name='需求备注'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='clientrequirement',
|
||||
name='requirement_type',
|
||||
field=models.CharField(choices=[('second_hand', '二手'), ('new_house', '新房'), ('rental', '租房')], help_text='second_hand=二手 / new_house=新房 / rental=租房', max_length=20, verbose_name='需求类型'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='clientrequirement',
|
||||
name='school_enrollment_date',
|
||||
field=models.DateField(blank=True, help_text='月份精度,取该月1日存储', null=True, verbose_name='入学时间'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='clientrequirement',
|
||||
name='traffic_preference',
|
||||
field=models.TextField(blank=True, default='', verbose_name='交通备注'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='clientrequirement',
|
||||
name='transportation',
|
||||
field=models.CharField(blank=True, default='', help_text='最多50字', max_length=50, verbose_name='交通要求'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='clientrequirement',
|
||||
name='updated_at',
|
||||
field=models.DateTimeField(auto_now=True, verbose_name='最后更新时间'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='clientschoolpreference',
|
||||
name='created_at',
|
||||
field=models.DateTimeField(auto_now_add=True, verbose_name='创建时间'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='clientschoolpreference',
|
||||
name='requirement',
|
||||
field=models.ForeignKey(help_text='意向学校随需求级联删除', on_delete=django.db.models.deletion.CASCADE, related_name='school_preferences', to='fonrey_client.clientrequirement', verbose_name='所属需求'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='clientschoolpreference',
|
||||
name='school_id',
|
||||
field=models.UUIDField(blank=True, help_text='从学校表选择,允许为 NULL(自由输入)', null=True, verbose_name='学校ID'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='clientschoolpreference',
|
||||
name='school_name',
|
||||
field=models.CharField(help_text='当 school_id 为 NULL 时为手动输入', max_length=100, verbose_name='学校名称'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='clientstatuslog',
|
||||
name='change_type',
|
||||
field=models.CharField(choices=[('status_change', '改状态'), ('grade_change', '改等级'), ('to_public', '转公客'), ('to_transacted', '转成交'), ('to_invalid', '转无效'), ('owner_change', '改归属人'), ('source_change', '改来源'), ('merge', '合并客源')], help_text='status_change=改状态 / grade_change=改等级 / to_public=转公客 / to_transacted=转成交 / to_invalid=转无效 / owner_change=改归属人 / source_change=改来源', max_length=30, verbose_name='变更类型'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='clientstatuslog',
|
||||
name='client',
|
||||
field=models.ForeignKey(help_text='状态日志永久保留,RESTRICT 防止删除客源', on_delete=django.db.models.deletion.RESTRICT, related_name='status_logs', to='fonrey_client.client', verbose_name='所属客源'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='clientstatuslog',
|
||||
name='id',
|
||||
field=models.UUIDField(primary_key=True, serialize=False, verbose_name='主键'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='clientstatuslog',
|
||||
name='new_value',
|
||||
field=models.JSONField(blank=True, null=True, verbose_name='变更后快照'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='clientstatuslog',
|
||||
name='old_value',
|
||||
field=models.JSONField(blank=True, help_text='格式:{"status": "buying", "label": "求购"}', null=True, verbose_name='变更前快照'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='clientstatuslog',
|
||||
name='operated_at',
|
||||
field=models.DateTimeField(auto_now_add=True, verbose_name='操作时间'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='clientstatuslog',
|
||||
name='operator',
|
||||
field=models.ForeignKey(help_text='必填,状态变更审计用', on_delete=django.db.models.deletion.RESTRICT, related_name='client_status_changes', to='org.staff', verbose_name='操作人'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='clientstatuslog',
|
||||
name='reason',
|
||||
field=models.TextField(blank=True, default='', help_text='改状态必填,最多200字', verbose_name='变更理由'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='clientviewing',
|
||||
name='agent',
|
||||
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='led_viewings', to='org.staff', verbose_name='主带看经纪人'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='clientviewing',
|
||||
name='client',
|
||||
field=models.ForeignKey(help_text='带看记录仅软删除,不随客源删除', on_delete=django.db.models.deletion.RESTRICT, related_name='viewings', to='fonrey_client.client', verbose_name='所属客源'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='clientviewing',
|
||||
name='client_intent',
|
||||
field=models.CharField(blank=True, choices=[('interested', '感兴趣'), ('not_interested', '不感兴趣'), ('negotiating', '谈判中'), ('cancelled', '取消')], default='', help_text='interested=感兴趣 / not_interested=不感兴趣 / negotiating=谈判中 / cancelled=取消', max_length=20, verbose_name='客户意向'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='clientviewing',
|
||||
name='companion_ids',
|
||||
field=django.contrib.postgres.fields.ArrayField(base_field=models.UUIDField(), blank=True, default=list, help_text='员工 ID 数组(最多5人)', size=None, verbose_name='陪看人员'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='clientviewing',
|
||||
name='cooperator_ids',
|
||||
field=django.contrib.postgres.fields.ArrayField(base_field=models.UUIDField(), blank=True, default=list, help_text='员工 ID 数组(最多5人)', size=None, verbose_name='合作带看人'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='clientviewing',
|
||||
name='created_at',
|
||||
field=models.DateTimeField(auto_now_add=True, verbose_name='创建时间'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='clientviewing',
|
||||
name='created_by',
|
||||
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='created_client_viewings', to='org.staff', verbose_name='创建人'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='clientviewing',
|
||||
name='deleted_at',
|
||||
field=models.DateTimeField(blank=True, help_text='软删除时间戳;带看记录可软删除', null=True, verbose_name='删除时间'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='clientviewing',
|
||||
name='property',
|
||||
field=models.ForeignKey(help_text='房源删除时保留带看记录', on_delete=django.db.models.deletion.RESTRICT, related_name='client_viewings', to='fonrey_property.property', verbose_name='带看房源'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='clientviewing',
|
||||
name='scheduled_at',
|
||||
field=models.DateTimeField(blank=True, null=True, verbose_name='预约时间'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='clientviewing',
|
||||
name='situation',
|
||||
field=models.TextField(blank=True, default='', help_text='必填,≥6字', verbose_name='带看情况'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='clientviewing',
|
||||
name='viewing_end_at',
|
||||
field=models.DateTimeField(blank=True, null=True, verbose_name='带看结束时间'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='clientviewing',
|
||||
name='viewing_progress',
|
||||
field=models.SmallIntegerField(blank=True, help_text='1=一看,2=二看…,冗余字段,触发器维护', null=True, verbose_name='带看进度'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='clientviewing',
|
||||
name='viewing_start_at',
|
||||
field=models.DateTimeField(blank=True, null=True, verbose_name='实际带看开始时间'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='clientviewing',
|
||||
name='viewing_type',
|
||||
field=models.CharField(choices=[('appointment', '预约'), ('viewing', '带看'), ('revisit', '复看'), ('empty', '空看')], default='viewing', help_text='appointment=预约 / viewing=带看 / revisit=复看 / empty=空看', max_length=20, verbose_name='带看类型'),
|
||||
),
|
||||
]
|
||||
Reference in New Issue
Block a user