compose: Display error for non-admin trying to post to announce_only stream.

Partially fixes #4708.
Implements a first version (v1) for the feature. The next step would be
to allow admins to toggle `is_announcement_only` in the UI.
This commit is contained in:
Shubham Padia
2018-05-14 15:36:56 +05:30
committed by Tim Abbott
parent 9ad292cf2a
commit 10a65a62db
4 changed files with 53 additions and 0 deletions

View File

@@ -296,6 +296,33 @@ run_test('validate_stream_message', () => {
assert($("#compose-all-everyone").visible());
});
run_test('test_validate_stream_message_announcement_only', () => {
// This test is in continuation with test_validate but it has been seperated out
// for better readabilty. Their relative position of execution should not be changed.
// Although the position with respect to test_validate_stream_message does not matter
// as `get_announcement_only` is reset at the end.
global.page_params.is_admin = false;
var sub = {
stream_id: 102,
name: 'stream102',
subscribed: true,
announcement_only: true,
};
stream_data.get_announcement_only = function () {
return true;
};
compose_state.subject('subject102');
stream_data.add_sub('stream102', sub);
assert(!compose.validate());
assert.equal($('#compose-error-msg').html(), i18n.t("Only organization admins are allowed to post to this stream."));
// reset `get_announcement_only` so that any tests occurung after this
// do not reproduce this error.
stream_data.get_announcement_only = function () {
return false;
};
});
run_test('markdown_shortcuts', () => {
var queryCommandEnabled = true;
var event = {

View File

@@ -32,6 +32,7 @@ run_test('basics', () => {
stream_id: 2,
in_home_view: true,
invite_only: true,
is_announcement_only: true,
};
var test = {
subscribed: true,
@@ -61,6 +62,9 @@ run_test('basics', () => {
assert(stream_data.get_invite_only('social'));
assert(!stream_data.get_invite_only('unknown'));
assert(stream_data.get_announcement_only('social'));
assert(!stream_data.get_announcement_only('unknown'));
assert.equal(stream_data.get_color('social'), 'red');
assert.equal(stream_data.get_color('unknown'), global.stream_color.default_color);

View File

@@ -511,6 +511,16 @@ function validate_stream_message_announce(stream_name) {
return true;
}
function validate_stream_message_announcement_only(stream_name) {
// Only allow realm admins to post to announcement_only streams.
var is_announcement_only = stream_data.get_announcement_only(stream_name);
if (is_announcement_only && !page_params.is_admin) {
compose_error(i18n.t("Only organization admins are allowed to post to this stream."));
return false;
}
return true;
}
exports.validation_error = function (error_type, stream_name) {
var response;
@@ -557,6 +567,10 @@ function validate_stream_message() {
}
}
if (!validate_stream_message_announcement_only(stream_name)) {
return false;
}
// If both `@all` is mentioned and it's in `#announce`, just validate
// for `@all`. Users shouldn't have to hit "yes" more than once.
if (util.is_all_or_everyone_mentioned(compose_state.message_content()) &&

View File

@@ -276,6 +276,14 @@ exports.get_invite_only = function (stream_name) {
return sub.invite_only;
};
exports.get_announcement_only = function (stream_name) {
var sub = exports.get_sub(stream_name);
if (sub === undefined) {
return false;
}
return sub.is_announcement_only;
};
var default_stream_ids = new Dict();
exports.set_realm_default_streams = function (realm_default_streams) {