zerver: Extract function to parse Enum from string value.

This commit extracts a function from `zerver/views/realm.py` used
for `message_edit_history_visibility_policy` so it can be reused
for other settings.
This commit is contained in:
Saubhagya Patel
2025-04-18 15:05:43 +05:30
committed by Tim Abbott
parent 6b26b828b3
commit 934042d47e
2 changed files with 30 additions and 13 deletions

View File

@@ -1,6 +1,8 @@
import re import re
import zoneinfo import zoneinfo
from collections.abc import Collection from collections.abc import Collection
from enum import Enum
from typing import TypeVar
from django.core.exceptions import ValidationError from django.core.exceptions import ValidationError
from django.core.validators import URLValidator from django.core.validators import URLValidator
@@ -8,6 +10,7 @@ from django.utils.translation import gettext as _
from pydantic import AfterValidator, BeforeValidator, NonNegativeInt from pydantic import AfterValidator, BeforeValidator, NonNegativeInt
from pydantic_core import PydanticCustomError from pydantic_core import PydanticCustomError
from zerver.lib.exceptions import JsonableError
from zerver.lib.timezone import canonicalize_timezone from zerver.lib.timezone import canonicalize_timezone
# The Pydantic.StringConstraints does not have validation for the string to be # The Pydantic.StringConstraints does not have validation for the string to be
@@ -105,3 +108,17 @@ def check_color(var_name: str, val: object) -> str:
if not matched_results: if not matched_results:
raise ValueError(_("{var_name} is not a valid hex color code").format(var_name=var_name)) raise ValueError(_("{var_name} is not a valid hex color code").format(var_name=var_name))
return s return s
EnumT = TypeVar("EnumT", bound=Enum)
def parse_enum_from_string_value(
val: str,
setting_name: str,
enum: type[EnumT],
) -> EnumT:
try:
return enum[val]
except KeyError:
raise JsonableError(_("Invalid {setting_name}").format(setting_name=setting_name))

View File

@@ -36,7 +36,11 @@ from zerver.lib.response import json_success
from zerver.lib.retention import parse_message_retention_days from zerver.lib.retention import parse_message_retention_days
from zerver.lib.streams import access_stream_by_id from zerver.lib.streams import access_stream_by_id
from zerver.lib.typed_endpoint import ApiParamConfig, typed_endpoint from zerver.lib.typed_endpoint import ApiParamConfig, typed_endpoint
from zerver.lib.typed_endpoint_validators import check_int_in_validator, check_string_in_validator from zerver.lib.typed_endpoint_validators import (
check_int_in_validator,
check_string_in_validator,
parse_enum_from_string_value,
)
from zerver.lib.user_groups import ( from zerver.lib.user_groups import (
GroupSettingChangeRequest, GroupSettingChangeRequest,
access_user_group_for_setting, access_user_group_for_setting,
@@ -80,17 +84,6 @@ def check_jitsi_url(value: str) -> str:
raise JsonableError(_("{var_name} is not an allowed_type").format(var_name=var_name)) raise JsonableError(_("{var_name} is not an allowed_type").format(var_name=var_name))
def parse_message_edit_history_visibility_policy(
policy_name: str,
) -> MessageEditHistoryVisibilityPolicyEnum:
try:
return MessageEditHistoryVisibilityPolicyEnum[policy_name]
except KeyError:
raise JsonableError(
_("Invalid {var_name}").format(var_name="message_edit_history_visibility_policy")
)
@require_realm_admin @require_realm_admin
@typed_endpoint @typed_endpoint
def update_realm( def update_realm(
@@ -125,7 +118,14 @@ def update_realm(
Json[int | str] | None, ApiParamConfig("message_content_edit_limit_seconds") Json[int | str] | None, ApiParamConfig("message_content_edit_limit_seconds")
] = None, ] = None,
message_edit_history_visibility_policy: Annotated[ message_edit_history_visibility_policy: Annotated[
str | None, AfterValidator(lambda val: parse_message_edit_history_visibility_policy(val)) str | None,
AfterValidator(
lambda val: parse_enum_from_string_value(
val,
"message_edit_history_visibility_policy",
MessageEditHistoryVisibilityPolicyEnum,
)
),
] = None, ] = None,
default_language: str | None = None, default_language: str | None = None,
waiting_period_threshold: Json[NonNegativeInt] | None = None, waiting_period_threshold: Json[NonNegativeInt] | None = None,