Files
fonrey/apps/setting/services/seed_default_lookups.py
ishenwei aaf398196a feat(permission): seed 154 PermissionDefs + 7 builtin roles + matrix + lookups + tenant auto-seed
- data migration apps/permission_def/0002_seed_permission_defs: 154 PermissionDef rows in public schema
- service apps.permission.services.seed_default_roles: 7 builtin roles + 154x7 RolePermission matrix
- service apps.setting.services.seed_default_lookups: LookupGroup/LookupItem defaults per DATA_MODEL_SETTING.md sec 2.3
- apps.tenant.signals: post_save Tenant handler auto-seeds new tenants inside schema_context, errors logged not raised
- apps.tenant.apps.ready() registers the signal
2026-04-30 12:58:34 +08:00

114 lines
5.6 KiB
Python

import logging
logger = logging.getLogger(__name__)
_GROUPS = [
{"module": "client", "key": "source", "label_zh": "客源来源", "description": "客源从何处获取,用于来源渠道分析", "sort_order": 1},
{"module": "client", "key": "follow_purpose", "label_zh": "跟进目的", "description": "客源跟进时选择的目的分类", "sort_order": 2},
{"module": "property", "key": "source", "label_zh": "房源来源", "description": "房源从何处获取", "sort_order": 3},
]
_ITEMS = {
("client", "source"): [
{"value": "store_reception", "label_zh": "门店接待", "sort_order": 1},
{"value": "old_client_referral", "label_zh": "老客户转介绍", "sort_order": 2},
{"value": "stationed_dispatch", "label_zh": "驻守派单", "sort_order": 3},
{"value": "walk_in", "label_zh": "上门", "sort_order": 4},
{"value": "online_58", "label_zh": "网络-58同城", "sort_order": 5},
{"value": "online_anjuke", "label_zh": "网络-安居客", "sort_order": 6},
{"value": "wechat", "label_zh": "微信", "sort_order": 7},
{"value": "friend_referral", "label_zh": "朋友介绍", "sort_order": 8},
],
("client", "follow_purpose"): [
{"value": "callback", "label_zh": "回拨", "sort_order": 1},
{"value": "push_property", "label_zh": "推房", "sort_order": 2},
{"value": "showing", "label_zh": "带看", "sort_order": 3},
{"value": "maintain", "label_zh": "维护", "sort_order": 4},
{"value": "other", "label_zh": "其他", "sort_order": 5},
],
("property", "source"): [
{"value": "proactive_development", "label_zh": "主动开发", "sort_order": 1},
{"value": "owner_walk_in", "label_zh": "业主上门", "sort_order": 2},
{"value": "old_client_referral", "label_zh": "老客户转介绍", "sort_order": 3},
{"value": "online_inquiry", "label_zh": "网络来电", "sort_order": 4},
],
}
_TENANT_SETTINGS = [
{"category": "client", "key": "duplicate_check_scope", "value": {"v": "self"}, "value_type": "enum"},
]
_FIELD_RULES = [
{"module": "property", "entity_type": "residential", "trade_status": "sale", "field_key": "orientation", "requirement": "optional"},
{"module": "property", "entity_type": "residential", "trade_status": "sale", "field_key": "decoration", "requirement": "optional"},
{"module": "property", "entity_type": "residential", "trade_status": "sale", "field_key": "floor", "requirement": "optional"},
{"module": "property", "entity_type": "residential", "trade_status": "sale", "field_key": "building_area", "requirement": "required"},
{"module": "property", "entity_type": "residential", "trade_status": "sale", "field_key": "inner_area", "requirement": "optional"},
{"module": "property", "entity_type": "residential", "trade_status": "sale", "field_key": "room_layout", "requirement": "required"},
{"module": "property", "entity_type": "residential", "trade_status": "rent", "field_key": "decoration", "requirement": "optional"},
{"module": "property", "entity_type": "residential", "trade_status": "rent", "field_key": "floor", "requirement": "optional"},
{"module": "property", "entity_type": "residential", "trade_status": "rent", "field_key": "building_area", "requirement": "required"},
{"module": "property", "entity_type": "residential", "trade_status": "rent", "field_key": "room_layout", "requirement": "required"},
]
def seed_default_lookups(schema_name: str) -> None:
from django.apps import apps
LookupGroup = apps.get_model("fonrey_setting", "LookupGroup")
LookupItem = apps.get_model("fonrey_setting", "LookupItem")
TenantSetting = apps.get_model("fonrey_setting", "TenantSetting")
FieldRequirementRule = apps.get_model("fonrey_setting", "FieldRequirementRule")
group_map = {}
for gd in _GROUPS:
group, _ = LookupGroup.objects.get_or_create(
module=gd["module"],
key=gd["key"],
defaults={
"label_zh": gd["label_zh"],
"description": gd["description"],
"sort_order": gd["sort_order"],
},
)
group_map[(gd["module"], gd["key"])] = group
item_objects = []
for (module, key), items in _ITEMS.items():
group = group_map[(module, key)]
for item in items:
item_objects.append(
LookupItem(
group=group,
value=item["value"],
label_zh=item["label_zh"],
is_system=True,
is_active=True,
sort_order=item["sort_order"],
)
)
LookupItem.objects.bulk_create(item_objects, ignore_conflicts=True)
ts_objects = [
TenantSetting(
category=ts["category"],
key=ts["key"],
value=ts["value"],
value_type=ts["value_type"],
)
for ts in _TENANT_SETTINGS
]
TenantSetting.objects.bulk_create(ts_objects, ignore_conflicts=True)
rule_objects = [
FieldRequirementRule(
module=r["module"],
entity_type=r["entity_type"],
trade_status=r["trade_status"],
field_key=r["field_key"],
requirement=r["requirement"],
)
for r in _FIELD_RULES
]
FieldRequirementRule.objects.bulk_create(rule_objects, ignore_conflicts=True)