From 7fe40564fb9c809ea395682c218087ab6026e963 Mon Sep 17 00:00:00 2001 From: wxg0103 <727495428@qq.com> Date: Tue, 27 Oct 2026 15:06:14 +0800 Subject: [PATCH] fix: allow duplicate user group names in different workspaces and enforce uniqueness within the same workspace MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --bug=1078094@tapd-45245355 --user=王孝刚 【系统管理】在不同工作空间下创建同名用户组提示500错误,违反空间隔离需求 https://www.tapd.cn/45245355/s/2122677 --- apps/users/migrations/0002_v3_upgrade.py | 2 +- apps/users/models/user_group.py | 15 +++++---------- apps/users/tests/test_user_group.py | 19 +++++++++++++++++++ 3 files changed, 25 insertions(+), 11 deletions(-) create mode 100644 apps/users/tests/test_user_group.py diff --git a/apps/users/migrations/0002_v3_upgrade.py b/apps/users/migrations/0002_v3_upgrade.py index 86c9ac23593..3a564bbcac1 100644 --- a/apps/users/migrations/0002_v3_upgrade.py +++ b/apps/users/migrations/0002_v3_upgrade.py @@ -30,7 +30,7 @@ class Migration(migrations.Migration): verbose_name="主键id", ), ), - ("name", models.CharField(db_index=True, max_length=150, unique=True, verbose_name="名称")), + ("name", models.CharField(db_index=True, max_length=150, verbose_name="名称")), ( "workspace_id", models.CharField(db_index=True, default="default", max_length=64, verbose_name="工作空间id"), diff --git a/apps/users/models/user_group.py b/apps/users/models/user_group.py index 138f0e4a91d..f41faf45cb3 100644 --- a/apps/users/models/user_group.py +++ b/apps/users/models/user_group.py @@ -8,7 +8,7 @@ class SystemUserGroup(models.Model): id = models.CharField(primary_key=True, max_length=128, default=uuid.uuid7, editable=False, verbose_name="主键id") - name = models.CharField(max_length=150, verbose_name="名称", unique=True, db_index=True) + name = models.CharField(max_length=150, verbose_name="名称", db_index=True) workspace_id = models.CharField(max_length=64, verbose_name="工作空间id", default="default", db_index=True) create_time = models.DateTimeField(verbose_name="创建时间", auto_now_add=True, null=True, db_index=True) update_time = models.DateTimeField(verbose_name="修改时间", auto_now=True, null=True, db_index=True) @@ -21,15 +21,10 @@ class Meta: class SystemUserGroupRelation(models.Model): id = models.UUIDField(primary_key=True, max_length=128, default=uuid.uuid7, editable=False, verbose_name="主键id") user = models.ForeignKey(User, on_delete=models.CASCADE, verbose_name="用户") - group = models.ForeignKey(SystemUserGroup, on_delete=models.CASCADE, verbose_name="用户组", - related_name="user_relations") + group = models.ForeignKey( + SystemUserGroup, on_delete=models.CASCADE, verbose_name="用户组", related_name="user_relations" + ) class Meta: db_table = "system_user_group_relation" - constraints = [ - models.UniqueConstraint( - fields=["user", "group"], - name="uniq_user_group_relation" - ) - ] - + constraints = [models.UniqueConstraint(fields=["user", "group"], name="uniq_user_group_relation")] diff --git a/apps/users/tests/test_user_group.py b/apps/users/tests/test_user_group.py new file mode 100644 index 00000000000..102610a3275 --- /dev/null +++ b/apps/users/tests/test_user_group.py @@ -0,0 +1,19 @@ +# coding=utf-8 +import uuid_utils.compat as uuid + +from django.test import TestCase + +from users.models.user_group import SystemUserGroup + + +class SystemUserGroupWorkspaceIsolationTests(TestCase): + def test_same_group_name_allowed_in_different_workspaces(self): + SystemUserGroup.objects.create(id=uuid.uuid7(), name="test", workspace_id="default") + group = SystemUserGroup.objects.create(id=uuid.uuid7(), name="test", workspace_id="jin-feixue") + self.assertEqual(SystemUserGroup.objects.filter(name="test").count(), 2) + self.assertEqual(group.workspace_id, "jin-feixue") + + def test_same_group_name_rejected_in_same_workspace(self): + SystemUserGroup.objects.create(id=uuid.uuid7(), name="test", workspace_id="default") + with self.assertRaises(Exception): + SystemUserGroup.objects.create(id=uuid.uuid7(), name="test", workspace_id="default")