- 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
114 lines
5.6 KiB
Python
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)
|