mirror of
https://github.com/zulip/zulip.git
synced 2025-10-31 20:13:46 +00:00
groups: Move constants inside NamedUserGroup.
This commit is contained in:
@@ -1056,7 +1056,7 @@ def do_import_realm(import_dir: Path, subdomain: str, processes: int = 1) -> Rea
|
||||
|
||||
if "zerver_usergroup" in data:
|
||||
re_map_foreign_keys(data, "zerver_usergroup", "realm", related_table="realm")
|
||||
for setting_name in UserGroup.GROUP_PERMISSION_SETTINGS:
|
||||
for setting_name in NamedUserGroup.GROUP_PERMISSION_SETTINGS:
|
||||
re_map_foreign_keys(
|
||||
data, "zerver_usergroup", setting_name, related_table="usergroup"
|
||||
)
|
||||
@@ -1069,7 +1069,7 @@ def do_import_realm(import_dir: Path, subdomain: str, processes: int = 1) -> Rea
|
||||
re_map_foreign_keys(
|
||||
data, "zerver_namedusergroup", "realm_for_sharding", related_table="realm"
|
||||
)
|
||||
for setting_name in UserGroup.GROUP_PERMISSION_SETTINGS:
|
||||
for setting_name in NamedUserGroup.GROUP_PERMISSION_SETTINGS:
|
||||
named_group_setting_name = "named_group_" + setting_name
|
||||
re_map_foreign_keys(
|
||||
data,
|
||||
|
||||
@@ -234,14 +234,14 @@ def check_user_group_name(group_name: str) -> str:
|
||||
if group_name.strip() == "":
|
||||
raise JsonableError(_("User group name can't be empty!"))
|
||||
|
||||
if len(group_name) > UserGroup.MAX_NAME_LENGTH:
|
||||
if len(group_name) > NamedUserGroup.MAX_NAME_LENGTH:
|
||||
raise JsonableError(
|
||||
_("User group name cannot exceed {max_length} characters.").format(
|
||||
max_length=UserGroup.MAX_NAME_LENGTH
|
||||
max_length=NamedUserGroup.MAX_NAME_LENGTH
|
||||
)
|
||||
)
|
||||
|
||||
for invalid_prefix in UserGroup.INVALID_NAME_PREFIXES:
|
||||
for invalid_prefix in NamedUserGroup.INVALID_NAME_PREFIXES:
|
||||
if group_name.startswith(invalid_prefix):
|
||||
raise JsonableError(
|
||||
_("User group name cannot start with '{prefix}'.").format(prefix=invalid_prefix)
|
||||
@@ -416,7 +416,7 @@ def set_defaults_for_group_settings(
|
||||
group_settings_map: Mapping[str, UserGroup],
|
||||
system_groups_name_dict: Dict[str, NamedUserGroup],
|
||||
) -> NamedUserGroup:
|
||||
for setting_name, permission_config in UserGroup.GROUP_PERMISSION_SETTINGS.items():
|
||||
for setting_name, permission_config in NamedUserGroup.GROUP_PERMISSION_SETTINGS.items():
|
||||
if setting_name in group_settings_map:
|
||||
# We skip the settings for which a value is passed
|
||||
# in user group creation API request.
|
||||
@@ -511,20 +511,20 @@ def create_system_user_groups_for_realm(realm: Realm) -> Dict[int, NamedUserGrou
|
||||
|
||||
system_groups_info_list = [
|
||||
nobody_group_info,
|
||||
UserGroup.SYSTEM_USER_GROUP_ROLE_MAP[UserProfile.ROLE_REALM_OWNER],
|
||||
UserGroup.SYSTEM_USER_GROUP_ROLE_MAP[UserProfile.ROLE_REALM_ADMINISTRATOR],
|
||||
UserGroup.SYSTEM_USER_GROUP_ROLE_MAP[UserProfile.ROLE_MODERATOR],
|
||||
NamedUserGroup.SYSTEM_USER_GROUP_ROLE_MAP[UserProfile.ROLE_REALM_OWNER],
|
||||
NamedUserGroup.SYSTEM_USER_GROUP_ROLE_MAP[UserProfile.ROLE_REALM_ADMINISTRATOR],
|
||||
NamedUserGroup.SYSTEM_USER_GROUP_ROLE_MAP[UserProfile.ROLE_MODERATOR],
|
||||
full_members_group_info,
|
||||
UserGroup.SYSTEM_USER_GROUP_ROLE_MAP[UserProfile.ROLE_MEMBER],
|
||||
UserGroup.SYSTEM_USER_GROUP_ROLE_MAP[UserProfile.ROLE_GUEST],
|
||||
NamedUserGroup.SYSTEM_USER_GROUP_ROLE_MAP[UserProfile.ROLE_MEMBER],
|
||||
NamedUserGroup.SYSTEM_USER_GROUP_ROLE_MAP[UserProfile.ROLE_GUEST],
|
||||
everyone_on_internet_group_info,
|
||||
]
|
||||
|
||||
bulk_create_system_user_groups(system_groups_info_list, realm)
|
||||
|
||||
system_groups_name_dict: Dict[str, NamedUserGroup] = get_role_based_system_groups_dict(realm)
|
||||
for role in UserGroup.SYSTEM_USER_GROUP_ROLE_MAP:
|
||||
group_name = UserGroup.SYSTEM_USER_GROUP_ROLE_MAP[role]["name"]
|
||||
for role in NamedUserGroup.SYSTEM_USER_GROUP_ROLE_MAP:
|
||||
group_name = NamedUserGroup.SYSTEM_USER_GROUP_ROLE_MAP[role]["name"]
|
||||
role_system_groups_dict[role] = system_groups_name_dict[group_name]
|
||||
|
||||
# Order of this list here is important to create correct GroupGroupMembership objects
|
||||
@@ -596,7 +596,7 @@ def create_system_user_groups_for_realm(realm: Realm) -> Dict[int, NamedUserGrou
|
||||
|
||||
|
||||
def get_system_user_group_for_user(user_profile: UserProfile) -> NamedUserGroup:
|
||||
system_user_group_name = UserGroup.SYSTEM_USER_GROUP_ROLE_MAP[user_profile.role]["name"]
|
||||
system_user_group_name = NamedUserGroup.SYSTEM_USER_GROUP_ROLE_MAP[user_profile.role]["name"]
|
||||
|
||||
system_user_group = NamedUserGroup.objects.get(
|
||||
name=system_user_group_name, realm=user_profile.realm, is_system_group=True
|
||||
@@ -608,5 +608,5 @@ def get_server_supported_permission_settings() -> ServerSupportedPermissionSetti
|
||||
return ServerSupportedPermissionSettings(
|
||||
realm=Realm.REALM_PERMISSION_GROUP_SETTINGS,
|
||||
stream=Stream.stream_permission_group_settings,
|
||||
group=UserGroup.GROUP_PERMISSION_SETTINGS,
|
||||
group=NamedUserGroup.GROUP_PERMISSION_SETTINGS,
|
||||
)
|
||||
|
||||
@@ -18,11 +18,8 @@ class SystemGroups:
|
||||
|
||||
|
||||
class UserGroup(models.Model): # type: ignore[django-manager-missing] # django-stubs cannot resolve the custom CTEManager yet https://github.com/typeddjango/django-stubs/issues/1023
|
||||
MAX_NAME_LENGTH = 100
|
||||
INVALID_NAME_PREFIXES = ["@", "role:", "user:", "stream:", "channel:"]
|
||||
|
||||
objects: CTEManager = CTEManager()
|
||||
name = models.CharField(max_length=MAX_NAME_LENGTH)
|
||||
name = models.CharField(max_length=100)
|
||||
direct_members = models.ManyToManyField(
|
||||
UserProfile, through="zerver.UserGroupMembership", related_name="direct_groups"
|
||||
)
|
||||
@@ -39,6 +36,38 @@ class UserGroup(models.Model): # type: ignore[django-manager-missing] # django-
|
||||
|
||||
can_mention_group = models.ForeignKey("self", on_delete=models.RESTRICT)
|
||||
|
||||
class Meta:
|
||||
unique_together = (("realm", "name"),)
|
||||
|
||||
|
||||
class NamedUserGroup(UserGroup): # type: ignore[django-manager-missing] # django-stubs cannot resolve the custom CTEManager yet https://github.com/typeddjango/django-stubs/issues/1023
|
||||
MAX_NAME_LENGTH = 100
|
||||
INVALID_NAME_PREFIXES = ["@", "role:", "user:", "stream:", "channel:"]
|
||||
|
||||
# This field is automatically created by django, but we still need
|
||||
# to add this here to keep mypy happy when accessing usergroup_ptr.
|
||||
usergroup_ptr = models.OneToOneField(
|
||||
auto_created=True,
|
||||
on_delete=CASCADE,
|
||||
parent_link=True,
|
||||
primary_key=True,
|
||||
serialize=False,
|
||||
to=UserGroup,
|
||||
# We are not using the auto-generated name here to avoid
|
||||
# duplicate backward relation name because "can_mention_group"
|
||||
# setting also points to a UserGroup object.
|
||||
related_name="named_user_group",
|
||||
)
|
||||
named_group_name = models.CharField(max_length=MAX_NAME_LENGTH, db_column="name")
|
||||
named_group_description = models.TextField(default="", db_column="description")
|
||||
named_group_is_system_group = models.BooleanField(default=False, db_column="is_system_group")
|
||||
|
||||
named_group_can_mention_group = models.ForeignKey(
|
||||
UserGroup, on_delete=models.RESTRICT, db_column="can_mention_group_id"
|
||||
)
|
||||
|
||||
realm_for_sharding = models.ForeignKey("zerver.Realm", on_delete=CASCADE, db_column="realm_id")
|
||||
|
||||
# We do not have "Full members" and "Everyone on the internet"
|
||||
# group here since there isn't a separate role value for full
|
||||
# members and spectators.
|
||||
@@ -78,37 +107,6 @@ class UserGroup(models.Model): # type: ignore[django-manager-missing] # django-
|
||||
),
|
||||
}
|
||||
|
||||
class Meta:
|
||||
unique_together = (("realm", "name"),)
|
||||
|
||||
|
||||
class NamedUserGroup(UserGroup): # type: ignore[django-manager-missing] # django-stubs cannot resolve the custom CTEManager yet https://github.com/typeddjango/django-stubs/issues/1023
|
||||
MAX_NAME_LENGTH = 100
|
||||
|
||||
# This field is automatically created by django, but we still need
|
||||
# to add this here to keep mypy happy when accessing usergroup_ptr.
|
||||
usergroup_ptr = models.OneToOneField(
|
||||
auto_created=True,
|
||||
on_delete=CASCADE,
|
||||
parent_link=True,
|
||||
primary_key=True,
|
||||
serialize=False,
|
||||
to=UserGroup,
|
||||
# We are not using the auto-generated name here to avoid
|
||||
# duplicate backward relation name because "can_mention_group"
|
||||
# setting also points to a UserGroup object.
|
||||
related_name="named_user_group",
|
||||
)
|
||||
named_group_name = models.CharField(max_length=MAX_NAME_LENGTH, db_column="name")
|
||||
named_group_description = models.TextField(default="", db_column="description")
|
||||
named_group_is_system_group = models.BooleanField(default=False, db_column="is_system_group")
|
||||
|
||||
named_group_can_mention_group = models.ForeignKey(
|
||||
UserGroup, on_delete=models.RESTRICT, db_column="can_mention_group_id"
|
||||
)
|
||||
|
||||
realm_for_sharding = models.ForeignKey("zerver.Realm", on_delete=CASCADE, db_column="realm_id")
|
||||
|
||||
class Meta:
|
||||
unique_together = (("realm_for_sharding", "named_group_name"),)
|
||||
|
||||
|
||||
@@ -75,6 +75,7 @@ from zerver.lib.types import LinkifierDict, RealmPlaygroundDict
|
||||
from zerver.lib.utils import assert_is_not_none
|
||||
from zerver.models import (
|
||||
Message,
|
||||
NamedUserGroup,
|
||||
Realm,
|
||||
RealmAuditLog,
|
||||
RealmPlayground,
|
||||
@@ -1085,10 +1086,10 @@ class TestRealmAuditLog(ZulipTestCase):
|
||||
realm = do_create_realm(string_id="test", name="foo")
|
||||
|
||||
# The expected number of system user group is the total number of roles
|
||||
# from UserGroup.SYSTEM_USER_GROUP_ROLE_MAP in addition to
|
||||
# from NamedUserGroup.SYSTEM_USER_GROUP_ROLE_MAP in addition to
|
||||
# full_members_system_group, everyone_on_internet_system_group and
|
||||
# nobody_system_group.
|
||||
expected_system_user_group_count = len(UserGroup.SYSTEM_USER_GROUP_ROLE_MAP) + 3
|
||||
expected_system_user_group_count = len(NamedUserGroup.SYSTEM_USER_GROUP_ROLE_MAP) + 3
|
||||
|
||||
system_user_group_ids = sorted(
|
||||
UserGroup.objects.filter(
|
||||
|
||||
@@ -1707,7 +1707,7 @@ class RealmImportExportTest(ExportFile):
|
||||
# Make sure that all users get logged as a member in their
|
||||
# corresponding system groups.
|
||||
for user in UserProfile.objects.filter(realm=imported_realm):
|
||||
expected_group_names = {UserGroup.SYSTEM_USER_GROUP_ROLE_MAP[user.role]["name"]}
|
||||
expected_group_names = {NamedUserGroup.SYSTEM_USER_GROUP_ROLE_MAP[user.role]["name"]}
|
||||
if SystemGroups.MEMBERS in expected_group_names:
|
||||
expected_group_names.add(SystemGroups.FULL_MEMBERS)
|
||||
self.assertSetEqual(logged_membership_by_user_id[user.id], expected_group_names)
|
||||
|
||||
@@ -305,7 +305,7 @@ class UserGroupAPITestCase(UserGroupTestCase):
|
||||
|
||||
# Test we cannot create group with same name again
|
||||
params = {
|
||||
"name": "a" * (UserGroup.MAX_NAME_LENGTH + 1),
|
||||
"name": "a" * (NamedUserGroup.MAX_NAME_LENGTH + 1),
|
||||
"members": orjson.dumps([hamlet.id]).decode(),
|
||||
"description": "Test group",
|
||||
}
|
||||
@@ -496,7 +496,7 @@ class UserGroupAPITestCase(UserGroupTestCase):
|
||||
result = self.client_patch(f"/json/user_groups/{lear_test_group.id}", info=params)
|
||||
self.assert_json_error(result, "Invalid user group")
|
||||
|
||||
params = {"name": "a" * (UserGroup.MAX_NAME_LENGTH + 1)}
|
||||
params = {"name": "a" * (NamedUserGroup.MAX_NAME_LENGTH + 1)}
|
||||
result = self.client_patch(f"/json/user_groups/{user_group.id}", info=params)
|
||||
self.assert_json_error(result, "User group name cannot exceed 100 characters.")
|
||||
|
||||
|
||||
@@ -37,7 +37,7 @@ from zerver.lib.user_groups import (
|
||||
)
|
||||
from zerver.lib.users import access_user_by_id, user_ids_to_users
|
||||
from zerver.lib.validator import check_bool, check_int, check_list
|
||||
from zerver.models import NamedUserGroup, UserGroup, UserProfile
|
||||
from zerver.models import NamedUserGroup, UserProfile
|
||||
from zerver.models.users import get_system_bot
|
||||
from zerver.views.streams import compose_views
|
||||
|
||||
@@ -59,7 +59,7 @@ def add_user_group(
|
||||
|
||||
group_settings_map = {}
|
||||
request_settings_dict = locals()
|
||||
for setting_name, permission_config in UserGroup.GROUP_PERMISSION_SETTINGS.items():
|
||||
for setting_name, permission_config in NamedUserGroup.GROUP_PERMISSION_SETTINGS.items():
|
||||
setting_group_id_name = permission_config.id_field_name
|
||||
|
||||
if setting_group_id_name not in request_settings_dict: # nocoverage
|
||||
@@ -119,7 +119,7 @@ def edit_user_group(
|
||||
do_update_user_group_description(user_group, description, acting_user=user_profile)
|
||||
|
||||
request_settings_dict = locals()
|
||||
for setting_name, permission_config in UserGroup.GROUP_PERMISSION_SETTINGS.items():
|
||||
for setting_name, permission_config in NamedUserGroup.GROUP_PERMISSION_SETTINGS.items():
|
||||
setting_group_id_name = permission_config.id_field_name
|
||||
|
||||
if setting_group_id_name not in request_settings_dict: # nocoverage
|
||||
|
||||
Reference in New Issue
Block a user