From 79c3cf29241f21009bec034b603437b8e893ab5c Mon Sep 17 00:00:00 2001 From: ishenwei Date: Wed, 29 Apr 2026 19:10:38 +0800 Subject: [PATCH] feat(models): add Chinese verbose_name to all 74 models (Phase 4.0) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 为所有 Django 模型添加 Meta.verbose_name 和 verbose_name_plural(中文表名), 覆盖 10 个 app 的全部 74 个业务模型。 Phase 4.0 范围: - 仅 Meta 类级别中文名(用于 Django Admin、drf-spectacular OpenAPI title、错误信息) - 字段级 verbose_name= 和 help_text= 留待 Phase 4.1(待 PM 补全 DATA_MODEL 后同步) 变更: - 20 个 models 文件改动(每个模型 +2 行) - 8 个 0002/0003 迁移文件(Meta options 变更) - apps/tenant/migrations/0001_initial.py(之前漏生成的 tenant 模型迁移) manage.py check: 0 issues。 --- ...003_alter_loginattempt_options_and_more.py | 29 +++++ apps/account/models/account.py | 8 ++ ...ns_alter_clientcontact_options_and_more.py | 57 ++++++++++ apps/client/models/contacts.py | 6 + apps/client/models/core.py | 2 + apps/client/models/folders.py | 4 + apps/client/models/follow.py | 4 + apps/client/models/viewing_match.py | 6 + ..._options_alter_complex_options_and_more.py | 53 +++++++++ apps/complex/models/complex.py | 20 ++++ ...it_options_alter_staff_options_and_more.py | 57 ++++++++++ apps/org/models/org_unit.py | 2 + apps/org/models/staff.py | 4 + apps/org/models/staff_logs.py | 16 +++ ...er_permissionchangelog_options_and_more.py | 41 +++++++ apps/permission/models/permission_def.py | 2 + apps/permission/models/role.py | 4 + apps/permission/models/staff_perm.py | 8 ++ .../0003_alter_commission_options_and_more.py | 105 ++++++++++++++++++ apps/property/models/core.py | 12 ++ apps/property/models/follow_keys.py | 10 ++ apps/property/models/listings.py | 10 ++ apps/property/models/media.py | 14 +++ ...options_alter_district_options_and_more.py | 33 ++++++ apps/region/models/region.py | 10 ++ ...r_fieldrequirementrule_options_and_more.py | 29 +++++ apps/setting/models/lookup.py | 4 + apps/setting/models/setting.py | 4 + apps/tenant/migrations/0001_initial.py | 40 +++++++ 29 files changed, 594 insertions(+) create mode 100644 apps/account/migrations/0003_alter_loginattempt_options_and_more.py create mode 100644 apps/client/migrations/0003_alter_client_options_alter_clientcontact_options_and_more.py create mode 100644 apps/complex/migrations/0003_alter_building_options_alter_complex_options_and_more.py create mode 100644 apps/org/migrations/0002_alter_orgunit_options_alter_staff_options_and_more.py create mode 100644 apps/permission/migrations/0002_alter_permissionchangelog_options_and_more.py create mode 100644 apps/property/migrations/0003_alter_commission_options_and_more.py create mode 100644 apps/region/migrations/0002_alter_businessarea_options_alter_district_options_and_more.py create mode 100644 apps/setting/migrations/0002_alter_fieldrequirementrule_options_and_more.py create mode 100644 apps/tenant/migrations/0001_initial.py diff --git a/apps/account/migrations/0003_alter_loginattempt_options_and_more.py b/apps/account/migrations/0003_alter_loginattempt_options_and_more.py new file mode 100644 index 0000000..ed8946d --- /dev/null +++ b/apps/account/migrations/0003_alter_loginattempt_options_and_more.py @@ -0,0 +1,29 @@ +# Generated by Django 4.2.16 on 2026-04-29 11:07 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('account', '0002_initial'), + ] + + operations = [ + migrations.AlterModelOptions( + name='loginattempt', + options={'verbose_name': '登录尝试记录', 'verbose_name_plural': '登录尝试记录'}, + ), + migrations.AlterModelOptions( + name='passwordhistory', + options={'ordering': ['-created_at'], 'verbose_name': '历史密码', 'verbose_name_plural': '历史密码'}, + ), + migrations.AlterModelOptions( + name='passwordresettoken', + options={'verbose_name': '密码重置令牌', 'verbose_name_plural': '密码重置令牌'}, + ), + migrations.AlterModelOptions( + name='useraccount', + options={'verbose_name': '用户账号', 'verbose_name_plural': '用户账号'}, + ), + ] diff --git a/apps/account/models/account.py b/apps/account/models/account.py index 7510d5b..bd73711 100644 --- a/apps/account/models/account.py +++ b/apps/account/models/account.py @@ -57,6 +57,8 @@ class UserAccount(AbstractBaseUser): class Meta: db_table = "user_accounts" + verbose_name = "用户账号" + verbose_name_plural = "用户账号" constraints = [ models.UniqueConstraint(fields=["username"], name="uq_user_accounts_username"), models.UniqueConstraint( @@ -102,6 +104,8 @@ class LoginAttempt(models.Model): class Meta: db_table = "login_attempts" + verbose_name = "登录尝试记录" + verbose_name_plural = "登录尝试记录" indexes = [ models.Index(fields=["username"], name="idx_login_attempts_username"), models.Index(fields=["ip_address"], name="idx_login_attempts_ip"), @@ -126,6 +130,8 @@ class PasswordResetToken(models.Model): class Meta: db_table = "password_reset_tokens" + verbose_name = "密码重置令牌" + verbose_name_plural = "密码重置令牌" indexes = [ models.Index(fields=["user"], name="idx_pw_reset_tokens_user"), ] @@ -145,6 +151,8 @@ class PasswordHistory(models.Model): class Meta: db_table = "password_histories" + verbose_name = "历史密码" + verbose_name_plural = "历史密码" ordering = ["-created_at"] indexes = [ models.Index(fields=["user", "-created_at"], name="idx_pw_histories_user"), diff --git a/apps/client/migrations/0003_alter_client_options_alter_clientcontact_options_and_more.py b/apps/client/migrations/0003_alter_client_options_alter_clientcontact_options_and_more.py new file mode 100644 index 0000000..ce8bfe8 --- /dev/null +++ b/apps/client/migrations/0003_alter_client_options_alter_clientcontact_options_and_more.py @@ -0,0 +1,57 @@ +# Generated by Django 4.2.16 on 2026-04-29 11:07 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('fonrey_client', '0002_partitions_and_triggers'), + ] + + operations = [ + migrations.AlterModelOptions( + name='client', + options={'verbose_name': '客源', 'verbose_name_plural': '客源'}, + ), + migrations.AlterModelOptions( + name='clientcontact', + options={'verbose_name': '客源联系人', 'verbose_name_plural': '客源联系人'}, + ), + migrations.AlterModelOptions( + name='clientfavoritefolder', + options={'verbose_name': '私客收藏夹', 'verbose_name_plural': '私客收藏夹'}, + ), + migrations.AlterModelOptions( + name='clientfolderitem', + options={'verbose_name': '收藏夹中的客源', 'verbose_name_plural': '收藏夹中的客源'}, + ), + migrations.AlterModelOptions( + name='clientfollowlog', + options={'managed': False, 'verbose_name': '客源跟进日志', 'verbose_name_plural': '客源跟进日志'}, + ), + migrations.AlterModelOptions( + name='clientfollowlogattachment', + options={'verbose_name': '客源跟进附件', 'verbose_name_plural': '客源跟进附件'}, + ), + migrations.AlterModelOptions( + name='clientpropertymatch', + options={'verbose_name': '智能配房', 'verbose_name_plural': '智能配房'}, + ), + migrations.AlterModelOptions( + name='clientrequirement', + options={'verbose_name': '客源需求', 'verbose_name_plural': '客源需求'}, + ), + migrations.AlterModelOptions( + name='clientschoolpreference', + options={'verbose_name': '意向学校', 'verbose_name_plural': '意向学校'}, + ), + migrations.AlterModelOptions( + name='clientstatuslog', + options={'verbose_name': '客源状态变更日志', 'verbose_name_plural': '客源状态变更日志'}, + ), + migrations.AlterModelOptions( + name='clientviewing', + options={'verbose_name': '带看记录', 'verbose_name_plural': '带看记录'}, + ), + ] diff --git a/apps/client/models/contacts.py b/apps/client/models/contacts.py index 4d319ee..f84630d 100644 --- a/apps/client/models/contacts.py +++ b/apps/client/models/contacts.py @@ -47,6 +47,8 @@ class ClientContact(UUIDPrimaryKeyModel): class Meta: db_table = "client_contacts" + verbose_name = "客源联系人" + verbose_name_plural = "客源联系人" indexes = [ models.Index(fields=["phone_hash"], name="idx_cc_phone_hash"), models.Index(fields=["phone2_hash"], name="idx_cc_phone2_hash"), @@ -118,6 +120,8 @@ class ClientRequirement(UUIDPrimaryKeyModel): class Meta: db_table = "client_requirements" + verbose_name = "客源需求" + verbose_name_plural = "客源需求" indexes = [ models.Index(fields=["client"], name="idx_creq_client"), models.Index(fields=["requirement_type", "client"], name="idx_creq_type"), @@ -138,6 +142,8 @@ class ClientSchoolPreference(UUIDPrimaryKeyModel): class Meta: db_table = "client_school_preferences" + verbose_name = "意向学校" + verbose_name_plural = "意向学校" indexes = [ models.Index(fields=["requirement"], name="idx_csp_requirement"), ] diff --git a/apps/client/models/core.py b/apps/client/models/core.py index cd40543..1278ac7 100644 --- a/apps/client/models/core.py +++ b/apps/client/models/core.py @@ -131,6 +131,8 @@ class Client(AuditedModel): class Meta: db_table = "clients" + verbose_name = "客源" + verbose_name_plural = "客源" indexes = [ models.Index(fields=["client_type", "status"], name="idx_clients_type_stat"), models.Index(fields=["owner"], name="idx_clients_owner"), diff --git a/apps/client/models/folders.py b/apps/client/models/folders.py index 3c3fde3..e8e5306 100644 --- a/apps/client/models/folders.py +++ b/apps/client/models/folders.py @@ -15,6 +15,8 @@ class ClientFavoriteFolder(UUIDPrimaryKeyModel): class Meta: db_table = "client_favorite_folders" + verbose_name = "私客收藏夹" + verbose_name_plural = "私客收藏夹" indexes = [ models.Index(fields=["staff"], name="idx_cff_staff"), ] @@ -38,6 +40,8 @@ class ClientFolderItem(models.Model): class Meta: db_table = "client_folder_items" + verbose_name = "收藏夹中的客源" + verbose_name_plural = "收藏夹中的客源" constraints = [ models.UniqueConstraint( fields=["folder", "client"], name="uq_cfi_folder_client" diff --git a/apps/client/models/follow.py b/apps/client/models/follow.py index 0fa3ea7..f214e94 100644 --- a/apps/client/models/follow.py +++ b/apps/client/models/follow.py @@ -36,6 +36,8 @@ class ClientFollowLog(models.Model): class Meta: db_table = "client_follow_logs" + verbose_name = "客源跟进日志" + verbose_name_plural = "客源跟进日志" managed = False unique_together = (("id", "created_at"),) @@ -52,4 +54,6 @@ class ClientFollowLogAttachment(UUIDPrimaryKeyModel): class Meta: db_table = "client_follow_log_attachments" + verbose_name = "客源跟进附件" + verbose_name_plural = "客源跟进附件" indexes = [models.Index(fields=["follow_log_id"], name="idx_cfla_log")] diff --git a/apps/client/models/viewing_match.py b/apps/client/models/viewing_match.py index 81a8be5..85e930a 100644 --- a/apps/client/models/viewing_match.py +++ b/apps/client/models/viewing_match.py @@ -57,6 +57,8 @@ class ClientViewing(UUIDPrimaryKeyModel): class Meta: db_table = "client_viewings" + verbose_name = "带看记录" + verbose_name_plural = "带看记录" indexes = [ models.Index( fields=["client", "-viewing_start_at"], name="idx_cv_client_time" @@ -107,6 +109,8 @@ class ClientPropertyMatch(UUIDPrimaryKeyModel): class Meta: db_table = "client_property_matches" + verbose_name = "智能配房" + verbose_name_plural = "智能配房" constraints = [ models.UniqueConstraint( fields=["client", "property"], name="uq_client_match_pair" @@ -141,6 +145,8 @@ class ClientStatusLog(models.Model): class Meta: db_table = "client_status_logs" + verbose_name = "客源状态变更日志" + verbose_name_plural = "客源状态变更日志" indexes = [ models.Index(fields=["client", "-operated_at"], name="idx_csl_client"), models.Index(fields=["change_type", "-operated_at"], name="idx_csl_type"), diff --git a/apps/complex/migrations/0003_alter_building_options_alter_complex_options_and_more.py b/apps/complex/migrations/0003_alter_building_options_alter_complex_options_and_more.py new file mode 100644 index 0000000..e19e875 --- /dev/null +++ b/apps/complex/migrations/0003_alter_building_options_alter_complex_options_and_more.py @@ -0,0 +1,53 @@ +# Generated by Django 4.2.16 on 2026-04-29 11:07 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('fonrey_complex', '0002_pg_trgm_and_search_vector'), + ] + + operations = [ + migrations.AlterModelOptions( + name='building', + options={'ordering': ['complex_id', 'name'], 'verbose_name': '楼栋', 'verbose_name_plural': '楼栋'}, + ), + migrations.AlterModelOptions( + name='complex', + options={'ordering': ['name'], 'verbose_name': '楼盘', 'verbose_name_plural': '楼盘'}, + ), + migrations.AlterModelOptions( + name='complexalias', + options={'ordering': ['complex_id', 'alias'], 'verbose_name': '楼盘别名', 'verbose_name_plural': '楼盘别名'}, + ), + migrations.AlterModelOptions( + name='complexattachment', + options={'ordering': ['complex_id', 'sort_order'], 'verbose_name': '楼盘附件', 'verbose_name_plural': '楼盘附件'}, + ), + migrations.AlterModelOptions( + name='complexbusinessarea', + options={'verbose_name': '楼盘商圈关联', 'verbose_name_plural': '楼盘商圈关联'}, + ), + migrations.AlterModelOptions( + name='complexmetrostation', + options={'verbose_name': '楼盘地铁站关联', 'verbose_name_plural': '楼盘地铁站关联'}, + ), + migrations.AlterModelOptions( + name='complexphoto', + options={'ordering': ['complex_id', 'sort_order'], 'verbose_name': '楼盘照片', 'verbose_name_plural': '楼盘照片'}, + ), + migrations.AlterModelOptions( + name='complexpricetrend', + options={'ordering': ['complex_id', '-record_month'], 'verbose_name': '楼盘价格走势', 'verbose_name_plural': '楼盘价格走势'}, + ), + migrations.AlterModelOptions( + name='complexschool', + options={'verbose_name': '楼盘学校关联', 'verbose_name_plural': '楼盘学校关联'}, + ), + migrations.AlterModelOptions( + name='roomunit', + options={'ordering': ['building_id', '-floor', 'room_no'], 'verbose_name': '房号单元', 'verbose_name_plural': '房号单元'}, + ), + ] diff --git a/apps/complex/models/complex.py b/apps/complex/models/complex.py index 58a9ea6..50a8e40 100644 --- a/apps/complex/models/complex.py +++ b/apps/complex/models/complex.py @@ -133,6 +133,8 @@ class Complex(SoftDeleteModel): class Meta: db_table = "complexes" + verbose_name = "楼盘" + verbose_name_plural = "楼盘" indexes = [ models.Index( fields=["district"], @@ -176,6 +178,8 @@ class ComplexAlias(UUIDPrimaryKeyModel): class Meta: db_table = "complex_aliases" + verbose_name = "楼盘别名" + verbose_name_plural = "楼盘别名" indexes = [ models.Index(fields=["complex"], name="idx_complex_aliases_complex"), ] @@ -200,6 +204,8 @@ class ComplexBusinessArea(models.Model): class Meta: db_table = "complex_business_areas" + verbose_name = "楼盘商圈关联" + verbose_name_plural = "楼盘商圈关联" constraints = [ models.UniqueConstraint( fields=["complex", "business_area"], @@ -233,6 +239,8 @@ class ComplexSchool(models.Model): class Meta: db_table = "complex_schools" + verbose_name = "楼盘学校关联" + verbose_name_plural = "楼盘学校关联" constraints = [ models.UniqueConstraint( fields=["complex", "school"], @@ -259,6 +267,8 @@ class ComplexMetroStation(models.Model): class Meta: db_table = "complex_metro_stations" + verbose_name = "楼盘地铁站关联" + verbose_name_plural = "楼盘地铁站关联" constraints = [ models.UniqueConstraint( fields=["complex", "station"], @@ -307,6 +317,8 @@ class Building(TimeStampedModel): class Meta: db_table = "buildings" + verbose_name = "楼栋" + verbose_name_plural = "楼栋" indexes = [ models.Index( fields=["complex"], @@ -342,6 +354,8 @@ class RoomUnit(TimeStampedModel): class Meta: db_table = "room_units" + verbose_name = "房号单元" + verbose_name_plural = "房号单元" indexes = [ models.Index( fields=["building"], @@ -388,6 +402,8 @@ class ComplexPhoto(UUIDPrimaryKeyModel): class Meta: db_table = "complex_photos" + verbose_name = "楼盘照片" + verbose_name_plural = "楼盘照片" indexes = [ models.Index(fields=["complex"], name="idx_complex_photos_complex"), models.Index(fields=["complex", "category"], name="idx_complex_photos_category"), @@ -424,6 +440,8 @@ class ComplexAttachment(UUIDPrimaryKeyModel): class Meta: db_table = "complex_attachments" + verbose_name = "楼盘附件" + verbose_name_plural = "楼盘附件" ordering = ["complex_id", "sort_order"] @@ -442,6 +460,8 @@ class ComplexPriceTrend(UUIDPrimaryKeyModel): class Meta: db_table = "complex_price_trends" + verbose_name = "楼盘价格走势" + verbose_name_plural = "楼盘价格走势" constraints = [ models.UniqueConstraint( fields=["complex", "record_month"], diff --git a/apps/org/migrations/0002_alter_orgunit_options_alter_staff_options_and_more.py b/apps/org/migrations/0002_alter_orgunit_options_alter_staff_options_and_more.py new file mode 100644 index 0000000..40133b2 --- /dev/null +++ b/apps/org/migrations/0002_alter_orgunit_options_alter_staff_options_and_more.py @@ -0,0 +1,57 @@ +# Generated by Django 4.2.16 on 2026-04-29 11:07 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('org', '0001_initial'), + ] + + operations = [ + migrations.AlterModelOptions( + name='orgunit', + options={'ordering': ['sort_order', 'name'], 'verbose_name': '组织节点', 'verbose_name_plural': '组织节点'}, + ), + migrations.AlterModelOptions( + name='staff', + options={'verbose_name': '员工', 'verbose_name_plural': '员工'}, + ), + migrations.AlterModelOptions( + name='staffaccount', + options={'verbose_name': '员工第三方账号', 'verbose_name_plural': '员工第三方账号'}, + ), + migrations.AlterModelOptions( + name='staffeducation', + options={'verbose_name': '教育经历', 'verbose_name_plural': '教育经历'}, + ), + migrations.AlterModelOptions( + name='stafffamilymember', + options={'verbose_name': '家庭成员', 'verbose_name_plural': '家庭成员'}, + ), + migrations.AlterModelOptions( + name='staffpersonalinfo', + options={'verbose_name': '员工个人信息', 'verbose_name_plural': '员工个人信息'}, + ), + migrations.AlterModelOptions( + name='staffremark', + options={'verbose_name': '员工备注', 'verbose_name_plural': '员工备注'}, + ), + migrations.AlterModelOptions( + name='staffrewardpunish', + options={'verbose_name': '奖惩记录', 'verbose_name_plural': '奖惩记录'}, + ), + migrations.AlterModelOptions( + name='stafftraining', + options={'verbose_name': '培训记录', 'verbose_name_plural': '培训记录'}, + ), + migrations.AlterModelOptions( + name='stafftransferlog', + options={'verbose_name': '人事异动记录', 'verbose_name_plural': '人事异动记录'}, + ), + migrations.AlterModelOptions( + name='staffworkexperience', + options={'verbose_name': '工作经历', 'verbose_name_plural': '工作经历'}, + ), + ] diff --git a/apps/org/models/org_unit.py b/apps/org/models/org_unit.py index 4df9bf1..f517ee7 100644 --- a/apps/org/models/org_unit.py +++ b/apps/org/models/org_unit.py @@ -46,6 +46,8 @@ class OrgUnit(SoftDeleteModel): class Meta: db_table = "org_units" + verbose_name = "组织节点" + verbose_name_plural = "组织节点" indexes = [ models.Index(fields=["parent"], name="idx_org_units_parent"), models.Index(fields=["type"], name="idx_org_units_type"), diff --git a/apps/org/models/staff.py b/apps/org/models/staff.py index 20335ae..cafa146 100644 --- a/apps/org/models/staff.py +++ b/apps/org/models/staff.py @@ -89,6 +89,8 @@ class Staff(SoftDeleteModel): class Meta: db_table = "staff" + verbose_name = "员工" + verbose_name_plural = "员工" indexes = [ models.Index(fields=["org_unit"], name="idx_staff_org_unit"), models.Index(fields=["supervisor"], name="idx_staff_supervisor"), @@ -136,3 +138,5 @@ class StaffPersonalInfo(models.Model): class Meta: db_table = "staff_personal_info" + verbose_name = "员工个人信息" + verbose_name_plural = "员工个人信息" diff --git a/apps/org/models/staff_logs.py b/apps/org/models/staff_logs.py index 13772cd..9e223b7 100644 --- a/apps/org/models/staff_logs.py +++ b/apps/org/models/staff_logs.py @@ -24,6 +24,8 @@ class StaffTransferLog(TimeStampedModel): class Meta: db_table = "staff_transfer_logs" + verbose_name = "人事异动记录" + verbose_name_plural = "人事异动记录" indexes = [ models.Index(fields=["staff", "-transfer_date"], name="idx_transfer_logs_staff"), models.Index(fields=["transfer_type", "-operated_at"], name="idx_transfer_logs_type"), @@ -54,6 +56,8 @@ class StaffRewardPunish(SoftDeleteModel): class Meta: db_table = "staff_reward_punish" + verbose_name = "奖惩记录" + verbose_name_plural = "奖惩记录" class StaffAccount(TimeStampedModel): @@ -70,6 +74,8 @@ class StaffAccount(TimeStampedModel): class Meta: db_table = "staff_accounts" + verbose_name = "员工第三方账号" + verbose_name_plural = "员工第三方账号" constraints = [ models.UniqueConstraint( fields=["staff", "platform"], @@ -94,6 +100,8 @@ class StaffWorkExperience(TimeStampedModel): class Meta: db_table = "staff_work_experiences" + verbose_name = "工作经历" + verbose_name_plural = "工作经历" class StaffEducation(TimeStampedModel): @@ -112,6 +120,8 @@ class StaffEducation(TimeStampedModel): class Meta: db_table = "staff_educations" + verbose_name = "教育经历" + verbose_name_plural = "教育经历" class StaffTraining(TimeStampedModel): @@ -126,6 +136,8 @@ class StaffTraining(TimeStampedModel): class Meta: db_table = "staff_trainings" + verbose_name = "培训记录" + verbose_name_plural = "培训记录" class StaffFamilyMember(TimeStampedModel): @@ -143,6 +155,8 @@ class StaffFamilyMember(TimeStampedModel): class Meta: db_table = "staff_family_members" + verbose_name = "家庭成员" + verbose_name_plural = "家庭成员" class StaffRemark(SoftDeleteModel): @@ -162,3 +176,5 @@ class StaffRemark(SoftDeleteModel): class Meta: db_table = "staff_remarks" + verbose_name = "员工备注" + verbose_name_plural = "员工备注" diff --git a/apps/permission/migrations/0002_alter_permissionchangelog_options_and_more.py b/apps/permission/migrations/0002_alter_permissionchangelog_options_and_more.py new file mode 100644 index 0000000..d7dd139 --- /dev/null +++ b/apps/permission/migrations/0002_alter_permissionchangelog_options_and_more.py @@ -0,0 +1,41 @@ +# Generated by Django 4.2.16 on 2026-04-29 11:07 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('fonrey_permission', '0001_initial'), + ] + + operations = [ + migrations.AlterModelOptions( + name='permissionchangelog', + options={'ordering': ['-operated_at'], 'verbose_name': '权限变更流水', 'verbose_name_plural': '权限变更流水'}, + ), + migrations.AlterModelOptions( + name='permissiondef', + options={'verbose_name': '权限定义', 'verbose_name_plural': '权限定义'}, + ), + migrations.AlterModelOptions( + name='role', + options={'verbose_name': '角色', 'verbose_name_plural': '角色'}, + ), + migrations.AlterModelOptions( + name='rolepermission', + options={'verbose_name': '角色权限', 'verbose_name_plural': '角色权限'}, + ), + migrations.AlterModelOptions( + name='staffdatascope', + options={'verbose_name': '员工数据范围', 'verbose_name_plural': '员工数据范围'}, + ), + migrations.AlterModelOptions( + name='staffpermissionoverride', + options={'verbose_name': '个人权限覆盖', 'verbose_name_plural': '个人权限覆盖'}, + ), + migrations.AlterModelOptions( + name='staffrole', + options={'verbose_name': '员工角色', 'verbose_name_plural': '员工角色'}, + ), + ] diff --git a/apps/permission/models/permission_def.py b/apps/permission/models/permission_def.py index 03b6844..280fa10 100644 --- a/apps/permission/models/permission_def.py +++ b/apps/permission/models/permission_def.py @@ -29,6 +29,8 @@ class PermissionDef(TimeStampedModel): class Meta: db_table = "permission_defs" + verbose_name = "权限定义" + verbose_name_plural = "权限定义" indexes = [ models.Index( fields=["module", "sub_module", "sort_order"], diff --git a/apps/permission/models/role.py b/apps/permission/models/role.py index 629c9fa..ac3dbd0 100644 --- a/apps/permission/models/role.py +++ b/apps/permission/models/role.py @@ -34,6 +34,8 @@ class Role(SoftDeleteModel): class Meta: db_table = "roles" + verbose_name = "角色" + verbose_name_plural = "角色" constraints = [ models.UniqueConstraint( fields=["name"], @@ -76,6 +78,8 @@ class RolePermission(TimeStampedModel): class Meta: db_table = "role_permissions" + verbose_name = "角色权限" + verbose_name_plural = "角色权限" constraints = [ models.UniqueConstraint( fields=["role", "permission_def"], diff --git a/apps/permission/models/staff_perm.py b/apps/permission/models/staff_perm.py index c81fd0e..c8e3a60 100644 --- a/apps/permission/models/staff_perm.py +++ b/apps/permission/models/staff_perm.py @@ -34,6 +34,8 @@ class StaffRole(UUIDPrimaryKeyModel): class Meta: db_table = "staff_roles" + verbose_name = "员工角色" + verbose_name_plural = "员工角色" constraints = [ models.UniqueConstraint( fields=["staff", "role"], @@ -83,6 +85,8 @@ class StaffPermissionOverride(UUIDPrimaryKeyModel): class Meta: db_table = "staff_permission_overrides" + verbose_name = "个人权限覆盖" + verbose_name_plural = "个人权限覆盖" constraints = [ models.UniqueConstraint( fields=["staff", "permission_def"], @@ -126,6 +130,8 @@ class StaffDataScope(UUIDPrimaryKeyModel): class Meta: db_table = "staff_data_scopes" + verbose_name = "员工数据范围" + verbose_name_plural = "员工数据范围" indexes = [ models.Index(fields=["staff"], name="idx_data_scopes_staff"), models.Index(fields=["org_unit"], name="idx_data_scopes_org"), @@ -173,6 +179,8 @@ class PermissionChangeLog(UUIDPrimaryKeyModel): class Meta: db_table = "permission_change_logs" + verbose_name = "权限变更流水" + verbose_name_plural = "权限变更流水" ordering = ["-operated_at"] indexes = [ models.Index( diff --git a/apps/property/migrations/0003_alter_commission_options_and_more.py b/apps/property/migrations/0003_alter_commission_options_and_more.py new file mode 100644 index 0000000..4ace973 --- /dev/null +++ b/apps/property/migrations/0003_alter_commission_options_and_more.py @@ -0,0 +1,105 @@ +# Generated by Django 4.2.16 on 2026-04-29 11:07 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('fonrey_property', '0002_partitions_and_triggers'), + ] + + operations = [ + migrations.AlterModelOptions( + name='commission', + options={'verbose_name': '委托管理', 'verbose_name_plural': '委托管理'}, + ), + migrations.AlterModelOptions( + name='commissionattachment', + options={'verbose_name': '委托附件', 'verbose_name_plural': '委托附件'}, + ), + migrations.AlterModelOptions( + name='fieldsurvey', + options={'verbose_name': '实勘记录', 'verbose_name_plural': '实勘记录'}, + ), + migrations.AlterModelOptions( + name='followlog', + options={'managed': False, 'verbose_name': '房源跟进日志', 'verbose_name_plural': '房源跟进日志'}, + ), + migrations.AlterModelOptions( + name='followlogattachment', + options={'verbose_name': '跟进附件', 'verbose_name_plural': '跟进附件'}, + ), + migrations.AlterModelOptions( + name='followlogrecording', + options={'verbose_name': '跟进录音', 'verbose_name_plural': '跟进录音'}, + ), + migrations.AlterModelOptions( + name='keyattachment', + options={'verbose_name': '钥匙附件', 'verbose_name_plural': '钥匙附件'}, + ), + migrations.AlterModelOptions( + name='listinghistory', + options={'verbose_name': '挂牌历史', 'verbose_name_plural': '挂牌历史'}, + ), + migrations.AlterModelOptions( + name='numberholderapproval', + options={'verbose_name': '号码方审批', 'verbose_name_plural': '号码方审批'}, + ), + migrations.AlterModelOptions( + name='pricechange', + options={'verbose_name': '调价记录', 'verbose_name_plural': '调价记录'}, + ), + migrations.AlterModelOptions( + name='property', + options={'verbose_name': '房源', 'verbose_name_plural': '房源'}, + ), + migrations.AlterModelOptions( + name='propertyattachment', + options={'verbose_name': '房源附件', 'verbose_name_plural': '房源附件'}, + ), + migrations.AlterModelOptions( + name='propertycertificate', + options={'verbose_name': '房源产证', 'verbose_name_plural': '房源产证'}, + ), + migrations.AlterModelOptions( + name='propertycompleteness', + options={'verbose_name': '房源完整度', 'verbose_name_plural': '房源完整度'}, + ), + migrations.AlterModelOptions( + name='propertycontact', + options={'verbose_name': '房源联系人', 'verbose_name_plural': '房源联系人'}, + ), + migrations.AlterModelOptions( + name='propertyfavorite', + options={'verbose_name': '房源收藏', 'verbose_name_plural': '房源收藏'}, + ), + migrations.AlterModelOptions( + name='propertykey', + options={'verbose_name': '房源钥匙', 'verbose_name_plural': '房源钥匙'}, + ), + migrations.AlterModelOptions( + name='propertymarketing', + options={'verbose_name': '房源营销信息', 'verbose_name_plural': '房源营销信息'}, + ), + migrations.AlterModelOptions( + name='propertyphoto', + options={'managed': False, 'verbose_name': '房源图片', 'verbose_name_plural': '房源图片'}, + ), + migrations.AlterModelOptions( + name='propertyprotection', + options={'verbose_name': '房源保护期', 'verbose_name_plural': '房源保护期'}, + ), + migrations.AlterModelOptions( + name='propertytag', + options={'verbose_name': '房源标签', 'verbose_name_plural': '房源标签'}, + ), + migrations.AlterModelOptions( + name='propertytagrelation', + options={'verbose_name': '房源标签关联', 'verbose_name_plural': '房源标签关联'}, + ), + migrations.AlterModelOptions( + name='surveyphoto', + options={'verbose_name': '实勘照片', 'verbose_name_plural': '实勘照片'}, + ), + ] diff --git a/apps/property/models/core.py b/apps/property/models/core.py index 51c6240..8ebdaf6 100644 --- a/apps/property/models/core.py +++ b/apps/property/models/core.py @@ -172,6 +172,8 @@ class Property(SoftDeleteModel): class Meta: db_table = "properties" + verbose_name = "房源" + verbose_name_plural = "房源" constraints = [ models.CheckConstraint( check=models.Q(floor__gt=0) & models.Q(floor__lte=models.F("total_floors")), @@ -246,6 +248,8 @@ class PropertyContact(SoftDeleteModel): class Meta: db_table = "property_contacts" + verbose_name = "房源联系人" + verbose_name_plural = "房源联系人" indexes = [ models.Index(fields=["property"], name="idx_pc_property"), models.Index(fields=["phone_hash"], name="idx_pc_phone_hash"), @@ -273,6 +277,8 @@ class PropertyMarketing(UUIDPrimaryKeyModel): class Meta: db_table = "property_marketing" + verbose_name = "房源营销信息" + verbose_name_plural = "房源营销信息" class PropertyCertificate(UUIDPrimaryKeyModel): @@ -297,6 +303,8 @@ class PropertyCertificate(UUIDPrimaryKeyModel): class Meta: db_table = "property_certificates" + verbose_name = "房源产证" + verbose_name_plural = "房源产证" class PropertyCompleteness(UUIDPrimaryKeyModel): @@ -319,6 +327,8 @@ class PropertyCompleteness(UUIDPrimaryKeyModel): class Meta: db_table = "property_completeness" + verbose_name = "房源完整度" + verbose_name_plural = "房源完整度" class PropertyProtection(UUIDPrimaryKeyModel): @@ -336,3 +346,5 @@ class PropertyProtection(UUIDPrimaryKeyModel): class Meta: db_table = "property_protections" + verbose_name = "房源保护期" + verbose_name_plural = "房源保护期" diff --git a/apps/property/models/follow_keys.py b/apps/property/models/follow_keys.py index a657c9b..541c61b 100644 --- a/apps/property/models/follow_keys.py +++ b/apps/property/models/follow_keys.py @@ -44,6 +44,8 @@ class FollowLog(models.Model): class Meta: db_table = "follow_logs" + verbose_name = "房源跟进日志" + verbose_name_plural = "房源跟进日志" managed = False unique_together = (("id", "created_at"),) @@ -61,6 +63,8 @@ class FollowLogAttachment(UUIDPrimaryKeyModel): class Meta: db_table = "follow_log_attachments" + verbose_name = "跟进附件" + verbose_name_plural = "跟进附件" indexes = [models.Index(fields=["follow_log_id"], name="idx_fla_log")] @@ -72,6 +76,8 @@ class FollowLogRecording(UUIDPrimaryKeyModel): class Meta: db_table = "follow_log_recordings" + verbose_name = "跟进录音" + verbose_name_plural = "跟进录音" indexes = [models.Index(fields=["follow_log_id"], name="idx_flr_log")] @@ -114,6 +120,8 @@ class PropertyKey(UUIDPrimaryKeyModel): class Meta: db_table = "property_keys" + verbose_name = "房源钥匙" + verbose_name_plural = "房源钥匙" indexes = [models.Index(fields=["property"], name="idx_pk_property")] @@ -127,4 +135,6 @@ class KeyAttachment(UUIDPrimaryKeyModel): class Meta: db_table = "key_attachments" + verbose_name = "钥匙附件" + verbose_name_plural = "钥匙附件" indexes = [models.Index(fields=["key"], name="idx_ka_key")] diff --git a/apps/property/models/listings.py b/apps/property/models/listings.py index aef06fd..d59593e 100644 --- a/apps/property/models/listings.py +++ b/apps/property/models/listings.py @@ -44,6 +44,8 @@ class ListingHistory(UUIDPrimaryKeyModel): class Meta: db_table = "listing_histories" + verbose_name = "挂牌历史" + verbose_name_plural = "挂牌历史" indexes = [ models.Index(fields=["property"], name="idx_lh_property"), models.Index(fields=["property", "status"], name="idx_lh_active"), @@ -69,6 +71,8 @@ class PriceChange(UUIDPrimaryKeyModel): class Meta: db_table = "price_changes" + verbose_name = "调价记录" + verbose_name_plural = "调价记录" indexes = [ models.Index(fields=["property"], name="idx_pchg_property"), models.Index(fields=["property", "-changed_at"], name="idx_pchg_time"), @@ -130,6 +134,8 @@ class Commission(TimeStampedModel): class Meta: db_table = "commissions" + verbose_name = "委托管理" + verbose_name_plural = "委托管理" indexes = [ models.Index(fields=["property"], name="idx_commissions_property"), models.Index(fields=["property", "status"], name="idx_commissions_active"), @@ -151,6 +157,8 @@ class CommissionAttachment(UUIDPrimaryKeyModel): class Meta: db_table = "commission_attachments" + verbose_name = "委托附件" + verbose_name_plural = "委托附件" indexes = [models.Index(fields=["commission"], name="idx_ca_commission")] @@ -188,6 +196,8 @@ class NumberHolderApproval(UUIDPrimaryKeyModel): class Meta: db_table = "number_holder_approvals" + verbose_name = "号码方审批" + verbose_name_plural = "号码方审批" indexes = [ models.Index(fields=["status"], name="idx_nha_status"), models.Index(fields=["property"], name="idx_nha_property"), diff --git a/apps/property/models/media.py b/apps/property/models/media.py index a57cf76..754aa5b 100644 --- a/apps/property/models/media.py +++ b/apps/property/models/media.py @@ -32,6 +32,8 @@ class FieldSurvey(UUIDPrimaryKeyModel): class Meta: db_table = "field_surveys" + verbose_name = "实勘记录" + verbose_name_plural = "实勘记录" indexes = [ models.Index(fields=["property"], name="idx_fs_property"), models.Index(fields=["property", "status"], name="idx_fs_submitted"), @@ -52,6 +54,8 @@ class SurveyPhoto(UUIDPrimaryKeyModel): class Meta: db_table = "survey_photos" + verbose_name = "实勘照片" + verbose_name_plural = "实勘照片" indexes = [ models.Index(fields=["survey"], name="idx_sp_survey"), models.Index(fields=["survey", "category"], name="idx_sp_category"), @@ -88,6 +92,8 @@ class PropertyPhoto(models.Model): class Meta: db_table = "property_photos" + verbose_name = "房源图片" + verbose_name_plural = "房源图片" managed = False unique_together = (("id", "created_at"),) @@ -113,6 +119,8 @@ class PropertyAttachment(UUIDPrimaryKeyModel): class Meta: db_table = "property_attachments" + verbose_name = "房源附件" + verbose_name_plural = "房源附件" indexes = [ models.Index(fields=["property"], name="idx_pa_property"), models.Index(fields=["property", "category"], name="idx_pa_category"), @@ -128,6 +136,8 @@ class PropertyTag(UUIDPrimaryKeyModel): class Meta: db_table = "property_tags" + verbose_name = "房源标签" + verbose_name_plural = "房源标签" class PropertyTagRelation(models.Model): @@ -140,6 +150,8 @@ class PropertyTagRelation(models.Model): class Meta: db_table = "property_tag_relations" + verbose_name = "房源标签关联" + verbose_name_plural = "房源标签关联" constraints = [ models.UniqueConstraint(fields=["property", "tag"], name="uq_ptr_property_tag"), ] @@ -160,6 +172,8 @@ class PropertyFavorite(models.Model): class Meta: db_table = "property_favorites" + verbose_name = "房源收藏" + verbose_name_plural = "房源收藏" constraints = [ models.UniqueConstraint(fields=["staff", "property"], name="uq_pfav_staff_property"), ] diff --git a/apps/region/migrations/0002_alter_businessarea_options_alter_district_options_and_more.py b/apps/region/migrations/0002_alter_businessarea_options_alter_district_options_and_more.py new file mode 100644 index 0000000..220c039 --- /dev/null +++ b/apps/region/migrations/0002_alter_businessarea_options_alter_district_options_and_more.py @@ -0,0 +1,33 @@ +# Generated by Django 4.2.16 on 2026-04-29 11:07 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('region', '0001_initial'), + ] + + operations = [ + migrations.AlterModelOptions( + name='businessarea', + options={'ordering': ['district_id', 'sort_order', 'name'], 'verbose_name': '商圈', 'verbose_name_plural': '商圈'}, + ), + migrations.AlterModelOptions( + name='district', + options={'ordering': ['city', 'sort_order', 'name'], 'verbose_name': '城区', 'verbose_name_plural': '城区'}, + ), + migrations.AlterModelOptions( + name='metroline', + options={'ordering': ['city', 'sort_order', 'name'], 'verbose_name': '地铁线路', 'verbose_name_plural': '地铁线路'}, + ), + migrations.AlterModelOptions( + name='metrostation', + options={'ordering': ['metro_line_id', 'sort_order'], 'verbose_name': '地铁站点', 'verbose_name_plural': '地铁站点'}, + ), + migrations.AlterModelOptions( + name='school', + options={'ordering': ['name'], 'verbose_name': '学校', 'verbose_name_plural': '学校'}, + ), + ] diff --git a/apps/region/models/region.py b/apps/region/models/region.py index 4085908..9b72454 100644 --- a/apps/region/models/region.py +++ b/apps/region/models/region.py @@ -13,6 +13,8 @@ class District(TimeStampedModel): class Meta: db_table = "districts" + verbose_name = "城区" + verbose_name_plural = "城区" constraints = [ models.UniqueConstraint( fields=["city", "name"], @@ -40,6 +42,8 @@ class BusinessArea(TimeStampedModel): class Meta: db_table = "business_areas" + verbose_name = "商圈" + verbose_name_plural = "商圈" constraints = [ models.UniqueConstraint( fields=["district", "name"], @@ -68,6 +72,8 @@ class MetroLine(TimeStampedModel): class Meta: db_table = "metro_lines" + verbose_name = "地铁线路" + verbose_name_plural = "地铁线路" ordering = ["city", "sort_order", "name"] def __str__(self) -> str: @@ -88,6 +94,8 @@ class MetroStation(TimeStampedModel): class Meta: db_table = "metro_stations" + verbose_name = "地铁站点" + verbose_name_plural = "地铁站点" indexes = [ models.Index( fields=["metro_line"], @@ -132,6 +140,8 @@ class School(TimeStampedModel): class Meta: db_table = "schools" + verbose_name = "学校" + verbose_name_plural = "学校" indexes = [ models.Index( fields=["district"], diff --git a/apps/setting/migrations/0002_alter_fieldrequirementrule_options_and_more.py b/apps/setting/migrations/0002_alter_fieldrequirementrule_options_and_more.py new file mode 100644 index 0000000..2fcf2f1 --- /dev/null +++ b/apps/setting/migrations/0002_alter_fieldrequirementrule_options_and_more.py @@ -0,0 +1,29 @@ +# Generated by Django 4.2.16 on 2026-04-29 11:07 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('setting', '0001_initial'), + ] + + operations = [ + migrations.AlterModelOptions( + name='fieldrequirementrule', + options={'verbose_name': '字段必填规则', 'verbose_name_plural': '字段必填规则'}, + ), + migrations.AlterModelOptions( + name='lookupgroup', + options={'verbose_name': '查找组', 'verbose_name_plural': '查找组'}, + ), + migrations.AlterModelOptions( + name='lookupitem', + options={'verbose_name': '查找项', 'verbose_name_plural': '查找项'}, + ), + migrations.AlterModelOptions( + name='tenantsetting', + options={'verbose_name': '租户设置', 'verbose_name_plural': '租户设置'}, + ), + ] diff --git a/apps/setting/models/lookup.py b/apps/setting/models/lookup.py index b94be8c..9840abd 100644 --- a/apps/setting/models/lookup.py +++ b/apps/setting/models/lookup.py @@ -14,6 +14,8 @@ class LookupGroup(UUIDPrimaryKeyModel): class Meta: db_table = "lookup_groups" + verbose_name = "查找组" + verbose_name_plural = "查找组" constraints = [ models.UniqueConstraint( fields=["module", "key"], name="uq_lookup_groups_module_key" @@ -42,6 +44,8 @@ class LookupItem(UUIDPrimaryKeyModel): class Meta: db_table = "lookup_items" + verbose_name = "查找项" + verbose_name_plural = "查找项" constraints = [ models.UniqueConstraint( fields=["group", "value"], name="uq_lookup_items_group_value" diff --git a/apps/setting/models/setting.py b/apps/setting/models/setting.py index 8b48741..7a68ef8 100644 --- a/apps/setting/models/setting.py +++ b/apps/setting/models/setting.py @@ -32,6 +32,8 @@ class TenantSetting(UUIDPrimaryKeyModel): class Meta: db_table = "tenant_settings" + verbose_name = "租户设置" + verbose_name_plural = "租户设置" constraints = [ models.UniqueConstraint( fields=["category", "key"], name="uq_tenant_settings_cat_key" @@ -61,6 +63,8 @@ class FieldRequirementRule(UUIDPrimaryKeyModel): class Meta: db_table = "field_requirement_rules" + verbose_name = "字段必填规则" + verbose_name_plural = "字段必填规则" constraints = [ models.UniqueConstraint( fields=["module", "entity_type", "trade_status", "field_key"], diff --git a/apps/tenant/migrations/0001_initial.py b/apps/tenant/migrations/0001_initial.py new file mode 100644 index 0000000..7828f0e --- /dev/null +++ b/apps/tenant/migrations/0001_initial.py @@ -0,0 +1,40 @@ +# Generated by Django 4.2.16 on 2026-04-29 11:07 + +from django.db import migrations, models +import django.db.models.deletion +import django_tenants.postgresql_backend.base + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ] + + operations = [ + migrations.CreateModel( + name='Tenant', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('schema_name', models.CharField(db_index=True, max_length=63, unique=True, validators=[django_tenants.postgresql_backend.base._check_schema_name])), + ('name', models.CharField(max_length=255)), + ('created_on', models.DateField(auto_now_add=True)), + ], + options={ + 'abstract': False, + }, + ), + migrations.CreateModel( + name='Domain', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('domain', models.CharField(db_index=True, max_length=253, unique=True)), + ('is_primary', models.BooleanField(db_index=True, default=True)), + ('tenant', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='domains', to='tenant.tenant')), + ], + options={ + 'abstract': False, + }, + ), + ]