mirror of https://github.com/zulip/zulip.git
events: Migrate plan_type & upload_quota to update_dict event format.
'realm_upload_quota_mib` is updated when `plan_type` changes. Earlier, we were including 'upload_quota' to update `realm_upload_quota_mib` in extra_data field of 'realm op: update' event format when property='plan_type'. This commit migrate those two parameters to `realm op: update_dict` event format. * None of the clients processes these fields, so no compatibility code required. * Renamed `upload_quota` to `upload_quota_mib` as it better aligns with our goal to encode units in the client-facing API names. Also, it helps to avoid extra code to update 'realm_upload_quota_mib` in web client, web client simply aligns with 'realm["realm_" + key] = value'.
This commit is contained in:
parent
417d74e032
commit
808acc9e47
|
@ -20,6 +20,15 @@ format used by the Zulip server that they are interacting with.
|
||||||
|
|
||||||
## Changes in Zulip 10.0
|
## Changes in Zulip 10.0
|
||||||
|
|
||||||
|
**Feature level 306**
|
||||||
|
|
||||||
|
* [`GET /events`](/api/get-events): Removed the `extra_data` optional
|
||||||
|
field from the `realm/update` event format, which was only used for
|
||||||
|
`plan_type` events, with a single `upload_quota` field. Now, we use
|
||||||
|
a standard `realm/update_dict` event to notify clients about changes
|
||||||
|
in `plan_type` and other fields that atomically change with a given
|
||||||
|
change in plan.
|
||||||
|
|
||||||
**Feature level 305**
|
**Feature level 305**
|
||||||
|
|
||||||
* [`POST /register`](/api/register-queue), [`GET /events`](/api/get-events),
|
* [`POST /register`](/api/register-queue), [`GET /events`](/api/get-events),
|
||||||
|
|
|
@ -317,6 +317,10 @@ export function dispatch_normal_event(event) {
|
||||||
if (key === "edit_topic_policy") {
|
if (key === "edit_topic_policy") {
|
||||||
message_live_update.rerender_messages_view();
|
message_live_update.rerender_messages_view();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (key === "plan_type") {
|
||||||
|
gear_menu.rerender();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if (event.data.authentication_methods !== undefined) {
|
if (event.data.authentication_methods !== undefined) {
|
||||||
settings_org.populate_auth_methods(
|
settings_org.populate_auth_methods(
|
||||||
|
|
|
@ -584,6 +584,8 @@ run_test("realm settings", ({override}) => {
|
||||||
override(realm, "realm_authentication_methods", {Google: {enabled: false, available: true}});
|
override(realm, "realm_authentication_methods", {Google: {enabled: false, available: true}});
|
||||||
override(realm, "realm_can_create_public_channel_group", 1);
|
override(realm, "realm_can_create_public_channel_group", 1);
|
||||||
override(realm, "realm_direct_message_permission_group", 1);
|
override(realm, "realm_direct_message_permission_group", 1);
|
||||||
|
override(realm, "realm_plan_type", 2);
|
||||||
|
override(realm, "realm_upload_quota_mib", 5000);
|
||||||
override(settings_org, "populate_auth_methods", noop);
|
override(settings_org, "populate_auth_methods", noop);
|
||||||
dispatch(event);
|
dispatch(event);
|
||||||
assert_same(realm.realm_create_multiuse_invite_group, 3);
|
assert_same(realm.realm_create_multiuse_invite_group, 3);
|
||||||
|
@ -595,6 +597,8 @@ run_test("realm settings", ({override}) => {
|
||||||
});
|
});
|
||||||
assert_same(realm.realm_can_create_public_channel_group, 3);
|
assert_same(realm.realm_can_create_public_channel_group, 3);
|
||||||
assert_same(realm.realm_direct_message_permission_group, 3);
|
assert_same(realm.realm_direct_message_permission_group, 3);
|
||||||
|
assert_same(realm.realm_plan_type, 3);
|
||||||
|
assert_same(realm.realm_upload_quota_mib, 50000);
|
||||||
assert_same(update_stream_privacy_choices_called, true);
|
assert_same(update_stream_privacy_choices_called, true);
|
||||||
|
|
||||||
event = event_fixtures.realm__update_dict__icon;
|
event = event_fixtures.realm__update_dict__icon;
|
||||||
|
|
|
@ -370,6 +370,8 @@ exports.fixtures = {
|
||||||
},
|
},
|
||||||
can_create_public_channel_group: 3,
|
can_create_public_channel_group: 3,
|
||||||
direct_message_permission_group: 3,
|
direct_message_permission_group: 3,
|
||||||
|
plan_type: 3,
|
||||||
|
upload_quota_mib: 50000,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
|
||||||
|
|
|
@ -28,6 +28,7 @@ from zerver.lib.user_groups import (
|
||||||
get_group_setting_value_for_api,
|
get_group_setting_value_for_api,
|
||||||
get_group_setting_value_for_audit_log_data,
|
get_group_setting_value_for_audit_log_data,
|
||||||
)
|
)
|
||||||
|
from zerver.lib.utils import optional_bytes_to_mib
|
||||||
from zerver.models import (
|
from zerver.models import (
|
||||||
ArchivedAttachment,
|
ArchivedAttachment,
|
||||||
Attachment,
|
Attachment,
|
||||||
|
@ -786,13 +787,15 @@ def do_change_realm_plan_type(
|
||||||
|
|
||||||
realm.save(update_fields=["_max_invites", "message_visibility_limit"])
|
realm.save(update_fields=["_max_invites", "message_visibility_limit"])
|
||||||
|
|
||||||
event = {
|
event = dict(
|
||||||
"type": "realm",
|
type="realm",
|
||||||
"op": "update",
|
op="update_dict",
|
||||||
"property": "plan_type",
|
property="default",
|
||||||
"value": plan_type,
|
data={
|
||||||
"extra_data": {"upload_quota": realm.upload_quota_bytes()},
|
"plan_type": plan_type,
|
||||||
}
|
"upload_quota_mib": optional_bytes_to_mib(realm.upload_quota_bytes()),
|
||||||
|
},
|
||||||
|
)
|
||||||
send_event_on_commit(realm, event, active_user_ids(realm.id))
|
send_event_on_commit(realm, event, active_user_ids(realm.id))
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -889,12 +889,6 @@ realm_linkifiers_event = event_dict_type(
|
||||||
check_realm_linkifiers = make_checker(realm_linkifiers_event)
|
check_realm_linkifiers = make_checker(realm_linkifiers_event)
|
||||||
|
|
||||||
|
|
||||||
plan_type_extra_data_type = DictType(
|
|
||||||
required_keys=[
|
|
||||||
("upload_quota", int),
|
|
||||||
]
|
|
||||||
)
|
|
||||||
|
|
||||||
"""
|
"""
|
||||||
realm/update events are flexible for values;
|
realm/update events are flexible for values;
|
||||||
we will use a more strict checker to check
|
we will use a more strict checker to check
|
||||||
|
@ -906,10 +900,7 @@ realm_update_event = event_dict_type(
|
||||||
("op", Equals("update")),
|
("op", Equals("update")),
|
||||||
("property", str),
|
("property", str),
|
||||||
("value", value_type),
|
("value", value_type),
|
||||||
],
|
]
|
||||||
optional_keys=[
|
|
||||||
("extra_data", plan_type_extra_data_type),
|
|
||||||
],
|
|
||||||
)
|
)
|
||||||
_check_realm_update = make_checker(realm_update_event)
|
_check_realm_update = make_checker(realm_update_event)
|
||||||
|
|
||||||
|
@ -935,13 +926,6 @@ def check_realm_update(
|
||||||
assert prop == event["property"]
|
assert prop == event["property"]
|
||||||
value = event["value"]
|
value = event["value"]
|
||||||
|
|
||||||
if prop == "plan_type":
|
|
||||||
assert isinstance(value, int)
|
|
||||||
assert "extra_data" in event
|
|
||||||
return
|
|
||||||
|
|
||||||
assert "extra_data" not in event
|
|
||||||
|
|
||||||
if prop in [
|
if prop in [
|
||||||
"new_stream_announcements_stream_id",
|
"new_stream_announcements_stream_id",
|
||||||
"signup_announcements_stream_id",
|
"signup_announcements_stream_id",
|
||||||
|
@ -1087,6 +1071,13 @@ group_setting_update_data_type = DictType(
|
||||||
],
|
],
|
||||||
)
|
)
|
||||||
|
|
||||||
|
plan_type_data = DictType(
|
||||||
|
required_keys=[
|
||||||
|
("plan_type", int),
|
||||||
|
("upload_quota_mib", OptionalType(int)),
|
||||||
|
],
|
||||||
|
)
|
||||||
|
|
||||||
update_dict_data = UnionType(
|
update_dict_data = UnionType(
|
||||||
[
|
[
|
||||||
allow_message_editing_data,
|
allow_message_editing_data,
|
||||||
|
@ -1097,6 +1088,7 @@ update_dict_data = UnionType(
|
||||||
message_content_edit_limit_seconds_data,
|
message_content_edit_limit_seconds_data,
|
||||||
night_logo_data,
|
night_logo_data,
|
||||||
group_setting_update_data_type,
|
group_setting_update_data_type,
|
||||||
|
plan_type_data,
|
||||||
]
|
]
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -1133,6 +1125,8 @@ def check_realm_update_dict(
|
||||||
setting_name in event["data"] for setting_name in Realm.REALM_PERMISSION_GROUP_SETTINGS
|
setting_name in event["data"] for setting_name in Realm.REALM_PERMISSION_GROUP_SETTINGS
|
||||||
):
|
):
|
||||||
sub_type = group_setting_update_data_type
|
sub_type = group_setting_update_data_type
|
||||||
|
elif "plan_type" in event["data"]:
|
||||||
|
sub_type = plan_type_data
|
||||||
else:
|
else:
|
||||||
raise AssertionError("unhandled fields in data")
|
raise AssertionError("unhandled fields in data")
|
||||||
|
|
||||||
|
|
|
@ -1279,13 +1279,6 @@ def apply_event(
|
||||||
field = "realm_" + event["property"]
|
field = "realm_" + event["property"]
|
||||||
state[field] = event["value"]
|
state[field] = event["value"]
|
||||||
|
|
||||||
if event["property"] == "plan_type":
|
|
||||||
# Then there are some extra fields that also need to be set.
|
|
||||||
state["zulip_plan_is_not_limited"] = event["value"] != Realm.PLAN_TYPE_LIMITED
|
|
||||||
# upload_quota is in bytes, so we need to convert it to MiB.
|
|
||||||
upload_quota_bytes = event["extra_data"]["upload_quota"]
|
|
||||||
state["realm_upload_quota_mib"] = optional_bytes_to_mib(upload_quota_bytes)
|
|
||||||
|
|
||||||
if field == "realm_jitsi_server_url":
|
if field == "realm_jitsi_server_url":
|
||||||
state["jitsi_server_url"] = (
|
state["jitsi_server_url"] = (
|
||||||
state["realm_jitsi_server_url"]
|
state["realm_jitsi_server_url"]
|
||||||
|
@ -1363,6 +1356,10 @@ def apply_event(
|
||||||
or state["can_create_public_streams"]
|
or state["can_create_public_streams"]
|
||||||
or state["can_create_web_public_streams"]
|
or state["can_create_web_public_streams"]
|
||||||
)
|
)
|
||||||
|
|
||||||
|
if key == "plan_type":
|
||||||
|
# Then there are some extra fields that also need to be set.
|
||||||
|
state["zulip_plan_is_not_limited"] = value != Realm.PLAN_TYPE_LIMITED
|
||||||
elif event["op"] == "deactivated":
|
elif event["op"] == "deactivated":
|
||||||
# The realm has just been deactivated. If our request had
|
# The realm has just been deactivated. If our request had
|
||||||
# arrived a moment later, we'd have rendered the
|
# arrived a moment later, we'd have rendered the
|
||||||
|
|
|
@ -4064,6 +4064,12 @@ paths:
|
||||||
A correct client implementation should convert these
|
A correct client implementation should convert these
|
||||||
events into the corresponding [realm/update_dict](#realm-update_dict)
|
events into the corresponding [realm/update_dict](#realm-update_dict)
|
||||||
event and then process that.
|
event and then process that.
|
||||||
|
|
||||||
|
**Changes**: Removed `extra_data` optional property in Zulip 10.0
|
||||||
|
(feature level 306). The `extra_data` used to include an
|
||||||
|
`upload_quota` field when changed property was `plan_type`. The
|
||||||
|
server now sends a standard `realm/update_dict` event for plan
|
||||||
|
changes.
|
||||||
properties:
|
properties:
|
||||||
id:
|
id:
|
||||||
$ref: "#/components/schemas/EventIdSchema"
|
$ref: "#/components/schemas/EventIdSchema"
|
||||||
|
@ -4088,19 +4094,6 @@ paths:
|
||||||
- type: string
|
- type: string
|
||||||
- type: boolean
|
- type: boolean
|
||||||
- type: integer
|
- type: integer
|
||||||
extra_data:
|
|
||||||
description: |
|
|
||||||
Object containing extra data related to the changed
|
|
||||||
property.
|
|
||||||
type: object
|
|
||||||
additionalProperties: false
|
|
||||||
properties:
|
|
||||||
upload_quota:
|
|
||||||
type: integer
|
|
||||||
description: |
|
|
||||||
Note: Only present if changed property is `plan_type`.
|
|
||||||
|
|
||||||
The new upload quota for the Zulip organization.
|
|
||||||
example:
|
example:
|
||||||
{
|
{
|
||||||
"type": "realm",
|
"type": "realm",
|
||||||
|
@ -4907,6 +4900,17 @@ paths:
|
||||||
|
|
||||||
**Changes**: In Zulip 9.0 (feature level 241), renamed
|
**Changes**: In Zulip 9.0 (feature level 241), renamed
|
||||||
`signup_notifications_stream_id` to `signup_announcements_stream_id`.
|
`signup_notifications_stream_id` to `signup_announcements_stream_id`.
|
||||||
|
upload_quota_mib:
|
||||||
|
type: integer
|
||||||
|
nullable: true
|
||||||
|
description: |
|
||||||
|
The new upload quota for the Zulip organization.
|
||||||
|
|
||||||
|
If `null`, there is no limit.
|
||||||
|
|
||||||
|
**Changes**: New in Zulip 10.0 (feature level 306). Previously,
|
||||||
|
this was present changed via an `upload_quota` field in `extra_data` property
|
||||||
|
of [realm/update](#realm-update) event format for `plan_type` events.
|
||||||
video_chat_provider:
|
video_chat_provider:
|
||||||
type: integer
|
type: integer
|
||||||
description: |
|
description: |
|
||||||
|
|
|
@ -2772,7 +2772,7 @@ class NormalActionsTest(BaseAction):
|
||||||
do_change_realm_plan_type(realm, Realm.PLAN_TYPE_LIMITED, acting_user=self.user_profile)
|
do_change_realm_plan_type(realm, Realm.PLAN_TYPE_LIMITED, acting_user=self.user_profile)
|
||||||
check_realm_update("events[0]", events[0], "enable_spectator_access")
|
check_realm_update("events[0]", events[0], "enable_spectator_access")
|
||||||
check_realm_update_dict("events[1]", events[1])
|
check_realm_update_dict("events[1]", events[1])
|
||||||
check_realm_update("events[2]", events[2], "plan_type")
|
check_realm_update_dict("events[2]", events[2])
|
||||||
|
|
||||||
state_data = fetch_initial_state_data(self.user_profile, realm=realm)
|
state_data = fetch_initial_state_data(self.user_profile, realm=realm)
|
||||||
self.assertEqual(state_data["realm_plan_type"], Realm.PLAN_TYPE_LIMITED)
|
self.assertEqual(state_data["realm_plan_type"], Realm.PLAN_TYPE_LIMITED)
|
||||||
|
|
Loading…
Reference in New Issue