diff --git a/zerver/lib/actions.py b/zerver/lib/actions.py index 9d670402d9..22e828cc94 100644 --- a/zerver/lib/actions.py +++ b/zerver/lib/actions.py @@ -422,9 +422,11 @@ def active_humans_in_realm(realm): def do_set_realm_property(realm, name, value): - # type: (Realm, Text, Union[Text, bool, int]) -> None + # type: (Realm, str, Union[Text, bool, int]) -> None """Takes in a realm object, the name of an attribute to update, and the value to update. """ + property_type = Realm.property_types[name] + assert isinstance(value, property_type) setattr(realm, name, value) realm.save(update_fields=[name]) event = dict( diff --git a/zerver/models.py b/zerver/models.py index 3d87701c63..bd11f943ba 100644 --- a/zerver/models.py +++ b/zerver/models.py @@ -144,6 +144,23 @@ class Realm(ModelReprMixin, models.Model): default=2**31 - 1) # type: BitHandler waiting_period_threshold = models.PositiveIntegerField(default=0) # type: int + # Define the types of the various automatically managed properties + property_types = dict( + add_emoji_by_admins_only=bool, + create_stream_by_admins_only=bool, + default_language=Text, + description=Text, + email_changes_disabled=bool, + invite_required=bool, + invite_by_admins_only=bool, + inline_image_preview=bool, + inline_url_embed_preview=bool, + name=Text, + name_changes_disabled=bool, + restricted_to_domain=bool, + waiting_period_threshold=int, + ) + ICON_FROM_GRAVATAR = u'G' ICON_UPLOADED = u'U' ICON_SOURCES = (