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
This commit is contained in:
@@ -0,0 +1,3 @@
|
||||
from apps.setting.services.seed_default_lookups import seed_default_lookups
|
||||
|
||||
__all__ = ["seed_default_lookups"]
|
||||
|
||||
113
apps/setting/services/seed_default_lookups.py
Normal file
113
apps/setting/services/seed_default_lookups.py
Normal file
@@ -0,0 +1,113 @@
|
||||
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)
|
||||
Reference in New Issue
Block a user