2019-04-21 05:51:20 +02:00
|
|
|
import os
|
|
|
|
|
2020-07-16 11:25:45 +02:00
|
|
|
ZULIP_VERSION = "4.0-dev+git"
|
2019-04-21 05:51:20 +02:00
|
|
|
# Add information on number of commits and commit hash to version, if available
|
|
|
|
zulip_git_version_file = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'zulip-git-version')
|
|
|
|
if os.path.exists(zulip_git_version_file):
|
|
|
|
with open(zulip_git_version_file) as f:
|
|
|
|
version = f.read().strip()
|
|
|
|
if version:
|
|
|
|
ZULIP_VERSION = version
|
|
|
|
|
2020-07-16 11:13:43 +02:00
|
|
|
LATEST_MAJOR_VERSION = "3.0"
|
|
|
|
LATEST_RELEASE_VERSION = "3.0"
|
|
|
|
LATEST_RELEASE_ANNOUNCEMENT = "https://blog.zulip.org/2020/07/16/zulip-3-0-released/"
|
2017-11-16 21:40:36 +01:00
|
|
|
|
2020-04-01 22:11:26 +02:00
|
|
|
# Versions of the desktop app below DESKTOP_MINIMUM_VERSION will be
|
|
|
|
# prevented from connecting to the Zulip server. Versions above
|
|
|
|
# DESKTOP_MINIMUM_VERSION but below DESKTOP_WARNING_VERSION will have
|
|
|
|
# a banner at the top of the page asking the user to upgrade.
|
|
|
|
DESKTOP_MINIMUM_VERSION = "5.0.0"
|
2020-05-07 01:30:07 +02:00
|
|
|
DESKTOP_WARNING_VERSION = "5.2.0"
|
2020-04-01 22:11:26 +02:00
|
|
|
|
2020-04-20 00:57:28 +02:00
|
|
|
# Bump the API_FEATURE_LEVEL whenever an API change is made
|
|
|
|
# that clients might want to condition on. If we forget at
|
|
|
|
# the time we make the change, then bump it later as soon
|
|
|
|
# as we notice; clients using API_FEATURE_LEVEL will just not
|
|
|
|
# use the new feature/API until the bump.
|
|
|
|
#
|
2020-04-29 05:55:42 +02:00
|
|
|
# Changes should be accompanied by documentation explaining what the
|
|
|
|
# new level means in templates/zerver/api/changelog.md.
|
refactor: Eliminate checks in build_stream_dict_for_sub.
We eliminate some redundant checks.
We also consistently provide a `subscribers` field
in our stream data with `[]`, even if our users
can't access subscribers. We therefore bump
the API version and tweak the docs. (See further
down for a detailed justification of the change.)
Even though it is sometimes fine to have redundant code
that is defensive in nature, some upcoming changes are gonna
move subscriber-related logic out of build_stream_dict_for_sub
for certain codepaths as part of our effort to streamline
the payload for subscribers within page_params.
So we can't rely on the code that I removed here
inside of build_stream_dict_for_sub.
Anyway, it makes more sense to do these checks explicitly
in the validate function.
The code in build_stream_dict_for_sub was almost effectively
a noop, since the validation function was already preventing
us from getting subscriber info. The only difference it
made was sometimes converting `[]` to `None`, and then
subsequently omitting the subscribers field.
Neither ZT nor the webapp make any distinction between
`[]` or <missing key> for the `subscribers` data in
`page_params`.
The webapp has had this code for a long time (and now
equivalent code elsewhere in this PR):
if (!Object.prototype.hasOwnProperty.call(sub, "subscribers")) {
sub.subscribers = new LazySet([]);
}
The webapp calculates access based on booleans, anyway:
sub.can_access_subscribers =
page_params.is_admin || sub.subscribed ||
(!page_params.is_guest && !sub.invite_only);
And ZT would choke if `subscribers` were missing, except that
it never gets to the relevant code due to other checks:
def get_other_subscribers_in_stream(<snip>):
assert stream_id is not None or stream_name is not None
if stream_id:
assert self.is_user_subscribed_to_stream(stream_id)
return [sub
for sub in self.stream_dict[stream_id]['subscribers']
if sub != self.user_id]
else:
return [sub
for _, stream in self.stream_dict.items()
for sub in stream['subscribers']
if stream['name'] == stream_name
if sub != self.user_id]
You could make a semantic argument that we should prefer
<missing key> to `[]` when subscribers aren't even available, but
we have precedent from the way that `bulk_get_subscriber_user_ids`
has traditionally populated its result:
result: Dict[int, List[int]] =
{stream["id"]: [] for stream in stream_dicts}
If we changed `stream_dicts` to `target_stream_dicts` we
would faciliate a move toward `None`, but it would just cause
headaches for other server code as well as the frontends
(which, to reiterate, already prefer the empty array
for convenience).
2021-01-14 16:18:42 +01:00
|
|
|
API_FEATURE_LEVEL = 37
|
2020-04-20 00:57:28 +02:00
|
|
|
|
2017-12-26 07:57:39 +01:00
|
|
|
# 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
|
|
|
|
# the major version to indicate that folks should provision in both
|
|
|
|
# directions.
|
|
|
|
|
2019-07-22 04:00:19 +02:00
|
|
|
# Typically,
|
|
|
|
# * adding a dependency only requires a minor version bump;
|
|
|
|
# * removing a dependency requires a major version bump;
|
|
|
|
# * upgrading a dependency requires a major version bump, unless the
|
|
|
|
# upgraded dependency is backwards compatible with all of our
|
|
|
|
# historical commits sharing the same major version, in which case a
|
|
|
|
# minor version bump suffices.
|
2017-12-26 07:57:39 +01:00
|
|
|
|
2021-01-26 23:14:53 +01:00
|
|
|
PROVISION_VERSION = '124.0'
|