diff --git a/static/js/settings_org.js b/static/js/settings_org.js
index 52a6e34444..e7f34a4b1a 100644
--- a/static/js/settings_org.js
+++ b/static/js/settings_org.js
@@ -810,7 +810,7 @@ export function build_page() {
"#id_realm_message_retention_setting",
).val();
if (message_retention_setting_value === "retain_forever") {
- data.message_retention_days = JSON.stringify("forever");
+ data.message_retention_days = JSON.stringify("unlimited");
} else {
data.message_retention_days = JSON.stringify(
get_input_element_value($("#id_realm_message_retention_days")),
diff --git a/static/js/stream_edit.js b/static/js/stream_edit.js
index 7e114a5c3f..6e1cdefe83 100644
--- a/static/js/stream_edit.js
+++ b/static/js/stream_edit.js
@@ -151,7 +151,7 @@ function set_stream_message_retention_setting_dropdown(stream) {
if (stream.message_retention_days === null) {
value = "realm_default";
} else if (stream.message_retention_days === settings_config.retain_message_forever) {
- value = "forever";
+ value = "unlimited";
}
$(".stream_message_retention_setting").val(value);
@@ -637,7 +637,7 @@ function get_message_retention_days_from_sub(sub) {
return "realm_default";
}
if (sub.message_retention_days === -1) {
- return "forever";
+ return "unlimited";
}
return sub.message_retention_days;
}
diff --git a/static/templates/stream_settings/stream_types.hbs b/static/templates/stream_settings/stream_types.hbs
index 94d0b62fe8..3664b84c2d 100644
--- a/static/templates/stream_settings/stream_types.hbs
+++ b/static/templates/stream_settings/stream_types.hbs
@@ -44,7 +44,7 @@
class="stream_message_retention_setting" class="prop-element"
{{#if disable_message_retention_setting}}disabled{{/if}}>
-
+
diff --git a/templates/zerver/api/changelog.md b/templates/zerver/api/changelog.md
index 6fe7d506f2..6b5d7aaafb 100644
--- a/templates/zerver/api/changelog.md
+++ b/templates/zerver/api/changelog.md
@@ -11,6 +11,13 @@ below features are supported.
## Changes in Zulip 5.0
+**Feature level 91**
+
+* `PATCH /realm`, [`PATCH /streams/{stream_id}`](/api/update-stream):
+ These endpoints now accept `"unlimited"` for `message_retention_days`,
+ replacing `"forever"` as the way to encode a retention policy where
+ messages are not automatically deleted.
+
**Feature level 90**
* [`POST /register`](/api/register-queue): The `unread_msgs` section
diff --git a/version.py b/version.py
index 7ba4ab498c..bbec5cda0c 100644
--- a/version.py
+++ b/version.py
@@ -33,7 +33,7 @@ DESKTOP_WARNING_VERSION = "5.4.3"
# Changes should be accompanied by documentation explaining what the
# new level means in templates/zerver/api/changelog.md, as well as
# "**Changes**" entries in the endpoint's documentation in `zulip.yaml`.
-API_FEATURE_LEVEL = 90
+API_FEATURE_LEVEL = 91
# Bump the minor PROVISION_VERSION to indicate that folks should provision
# only when going from an old version of the code to a newer version. Bump
diff --git a/zerver/models.py b/zerver/models.py
index 93d22c97ac..2aa7d95a77 100644
--- a/zerver/models.py
+++ b/zerver/models.py
@@ -404,7 +404,7 @@ class Realm(models.Model):
)
MESSAGE_RETENTION_SPECIAL_VALUES_MAP = {
- "forever": -1,
+ "unlimited": -1,
}
# For old messages being automatically deleted
message_retention_days: int = models.IntegerField(null=False, default=-1)
@@ -2063,7 +2063,7 @@ class Stream(models.Model):
# Value -1 means "disable retention policy for this stream unconditionally".
# Non-negative values have the natural meaning of "archive messages older than days".
MESSAGE_RETENTION_SPECIAL_VALUES_MAP = {
- "forever": -1,
+ "unlimited": -1,
"realm_default": None,
}
message_retention_days: Optional[int] = models.IntegerField(null=True, default=None)
diff --git a/zerver/openapi/zulip.yaml b/zerver/openapi/zulip.yaml
index 7d3f73b48b..3000ecf6b5 100644
--- a/zerver/openapi/zulip.yaml
+++ b/zerver/openapi/zulip.yaml
@@ -10051,8 +10051,11 @@ paths:
Present if `realm` is present in `fetch_event_types`.
The default [message retention policy](/help/message-retention-policy)
- for this organization. Pass `"forever"` to request that messages
+ for this organization. Pass `"unlimited"` to request that messages
by retained forever (the default).
+
+ **Changes**: Prior to Zulip 5.0 (feature level 91), no limit was encoded
+ by passing `"forever"`.
realm_name:
type: string
description: |
@@ -14548,9 +14551,13 @@ components:
values are supported:
* "realm_default" => Return to the organization-level setting.
- * "forever" => Retain messages forever.
+ * "unlimited" => Retain messages forever.
- **Changes**: New in Zulip 3.0 (feature level 17).
+ **Changes**: Prior to Zulip 5.0 (feature level 91), retaining
+ messages forever was encoded using `"forever"` instead of
+ `"unlimited"`.
+
+ New in Zulip 3.0 (feature level 17).
schema:
oneOf:
- type: string
diff --git a/zerver/tests/test_realm.py b/zerver/tests/test_realm.py
index 4bda7f1927..e9cda57185 100644
--- a/zerver/tests/test_realm.py
+++ b/zerver/tests/test_realm.py
@@ -644,7 +644,7 @@ class RealmTest(ZulipTestCase):
result = self.client_patch("/json/realm", req)
self.assert_json_error(result, "Bad value for 'message_retention_days': -1")
- req = dict(message_retention_days=orjson.dumps("forever").decode())
+ req = dict(message_retention_days=orjson.dumps("unlimited").decode())
result = self.client_patch("/json/realm", req)
self.assert_json_success(result)
diff --git a/zerver/tests/test_subs.py b/zerver/tests/test_subs.py
index af6ea540b9..7d104008a2 100644
--- a/zerver/tests/test_subs.py
+++ b/zerver/tests/test_subs.py
@@ -1204,7 +1204,7 @@ class StreamAdminTest(ZulipTestCase):
with self.tornado_redirected_to_list(events, expected_num_events=1):
result = self.client_patch(
f"/json/streams/{stream.id}",
- {"message_retention_days": orjson.dumps("forever").decode()},
+ {"message_retention_days": orjson.dumps("unlimited").decode()},
)
self.assert_json_success(result)
event = events[0]["event"]