Add UserProfile flag to control whether we have a left side userlist.

Previously this was hardcoded for a single customer.

(imported from commit a6b7095050aa10cef976541505d9b09a35453f48)
This commit is contained in:
David Roe
2015-08-20 14:59:44 -07:00
committed by Tim Abbott
parent a59e41b5ee
commit 3ac95ddc1a
12 changed files with 103 additions and 10 deletions

View File

@@ -18,8 +18,6 @@ exports.local_echo = true;
exports.disable_message_editing = _.contains(['mit.edu'], page_params.domain); exports.disable_message_editing = _.contains(['mit.edu'], page_params.domain);
exports.is_og_zulip_user = _.contains(og_zuliper_emails, page_params.email); exports.is_og_zulip_user = _.contains(og_zuliper_emails, page_params.email);
exports.left_side_userlist = _.contains(['customer7.invalid'], page_params.domain);
// Experimental modification to support much wider message views. // Experimental modification to support much wider message views.
exports.full_width = false; exports.full_width = false;

View File

@@ -188,7 +188,7 @@ exports.resize_page_components = function () {
var h; var h;
var sidebar; var sidebar;
if (feature_flags.left_side_userlist) { if (page_params.left_side_userlist) {
var css_narrow_mode = viewport.is_narrow(); var css_narrow_mode = viewport.is_narrow();
$("#top_navbar").removeClass("rightside-userlist"); $("#top_navbar").removeClass("rightside-userlist");

View File

@@ -185,6 +185,11 @@ function get_events_success(events) {
page_params.twenty_four_hour_time = event.twenty_four_hour_time; page_params.twenty_four_hour_time = event.twenty_four_hour_time;
// TODO: Make this rerender the existing elements to not require a reload. // TODO: Make this rerender the existing elements to not require a reload.
} }
if (event.setting_name === 'left_side_userlist') {
// TODO: Make this change the view immediately rather
// than requiring a reload or page resize.
page_params.left_side_userlist = event.left_side_userlist;
}
break; break;
} }
}; };

View File

@@ -362,6 +362,24 @@ exports.setup_page = function () {
update_audible_notification_setting); update_audible_notification_setting);
}); });
$("#left_side_userlist").change(function () {
var left_side_userlist = this.checked;
var data = {};
data.left_side_userlist = JSON.stringify(left_side_userlist);
channel.patch({
url: '/json/left_side_userlist',
data: data,
success: function (resp, statusText, xhr, form) {
ui.report_success("Updated display settings! You will need to reload the window for your changes to take effect.",
$('#display-settings-status').expectOne());
},
error: function (xhr, error_type, xhn) {
ui.report_error("Error updating display settings", xhr, $('#display-settings-status').expectOne());
}
});
});
$("#twenty_four_hour_time").change(function () { $("#twenty_four_hour_time").change(function () {
var data = {}; var data = {};
var setting_value = $("#twenty_four_hour_time").is(":checked"); var setting_value = $("#twenty_four_hour_time").is(":checked");

View File

@@ -363,7 +363,7 @@ $(function () {
// box, but, close enough for now. // box, but, close enough for now.
resize.handler(); resize.handler();
if (!feature_flags.left_side_userlist) { if (!page_params.left_side_userlist) {
$("#navbar-buttons").addClass("right-userlist"); $("#navbar-buttons").addClass("right-userlist");
} }

View File

@@ -92,13 +92,23 @@
Display Settings</div> Display Settings</div>
<div class="alert" id="display-settings-status"></div> <div class="alert" id="display-settings-status"></div>
<div class="display-settings-form"> <div class="display-settings-form">
<div class="control-group"> <div class="control-group">
<div class="controls"> <div class="controls">
<input type="checkbox" name="twenty_four_hour_time" <input type="checkbox" name="left_side_userlist" id="left_side_userlist"
id="twenty_four_hour_time" {{#if page_params.left_side_userlist}}
{{#if page_params.twenty_four_hour_time}} checked="yes"
checked="yes" {{/if}} />
{{/if}} /> </div>
<label for="left_side_userlist" class="control-label">Display user list on left side in narrow windows.</label>
</div>
<div class="control-group">
<div class="controls">
<input type="checkbox" name="twenty_four_hour_time" id="twenty_four_hour_time"
{{#if page_params.twenty_four_hour_time}}
checked="yes"
{{/if}} />
</div> </div>
<label for="twenty_four_hour_time" class="control-label"> <label for="twenty_four_hour_time" class="control-label">
Display time in 24-hour format (17:00 instead of 5:00 PM) Display time in 24-hour format (17:00 instead of 5:00 PM)

View File

@@ -1729,6 +1729,17 @@ def do_change_twenty_four_hour_time(user_profile, setting_value, log=True):
log_event(event) log_event(event)
send_event(event, [user_profile.id]) send_event(event, [user_profile.id])
def do_change_left_side_userlist(user_profile, setting_value, log=True):
user_profile.left_side_userlist = setting_value
user_profile.save(update_fields=["left_side_userlist"])
event = {'type': 'update_display_settings',
'user': user_profile.email,
'setting_name':'left_side_userlist',
'setting': setting_value}
if log:
log_event(event)
send_event(event, [user_profile.id])
def set_default_streams(realm, stream_names): def set_default_streams(realm, stream_names):
DefaultStream.objects.filter(realm=realm).delete() DefaultStream.objects.filter(realm=realm).delete()
for stream_name in stream_names: for stream_name in stream_names:
@@ -2373,6 +2384,7 @@ def fetch_initial_state_data(user_profile, event_types, queue_id):
if want('update_display_settings'): if want('update_display_settings'):
state['twenty_four_hour_time'] = user_profile.twenty_four_hour_time state['twenty_four_hour_time'] = user_profile.twenty_four_hour_time
state['left_side_userlist'] = user_profile.left_side_userlist
return state return state
@@ -2507,6 +2519,8 @@ def apply_events(state, events, user_profile):
elif event['type'] == "update_display_settings": elif event['type'] == "update_display_settings":
if event['setting_name'] == "twenty_four_hour_time": if event['setting_name'] == "twenty_four_hour_time":
state['twenty_four_hour_time'] = event["setting"] state['twenty_four_hour_time'] = event["setting"]
if event['setting_name'] == 'left_side_userlist':
state['left_side_userlist'] = event["setting"]
else: else:
raise ValueError("Unexpected event type %s" % (event['type'],)) raise ValueError("Unexpected event type %s" % (event['type'],))

View File

@@ -0,0 +1,19 @@
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.db import models, migrations
class Migration(migrations.Migration):
dependencies = [
('zerver', '0003_custom_indexes'),
]
operations = [
migrations.AddField(
model_name='userprofile',
name='left_side_userlist',
field=models.BooleanField(default=False),
),
]

View File

@@ -327,6 +327,7 @@ class UserProfile(AbstractBaseUser, PermissionsMixin):
# UI vars # UI vars
enter_sends = models.NullBooleanField(default=True) enter_sends = models.NullBooleanField(default=True)
autoscroll_forever = models.BooleanField(default=False) autoscroll_forever = models.BooleanField(default=False)
left_side_userlist = models.BooleanField(default=False)
# display settings # display settings
twenty_four_hour_time = models.BooleanField(default=False) twenty_four_hour_time = models.BooleanField(default=False)

View File

@@ -35,6 +35,7 @@ from zerver.lib.actions import (
do_update_message, do_update_message,
do_update_pointer, do_update_pointer,
do_change_twenty_four_hour_time, do_change_twenty_four_hour_time,
do_change_left_side_userlist,
fetch_initial_state_data, fetch_initial_state_data,
) )
@@ -448,6 +449,19 @@ class EventsRegisterTest(AuthedTestCase):
error = schema_checker('events[0]', events[0]) error = schema_checker('events[0]', events[0])
self.assert_on_error(error) self.assert_on_error(error)
def test_change_left_side_userlist(self):
schema_checker = check_dict([
('type', equals('update_display_settings')),
('setting_name', equals('left_side_userlist')),
('user', check_string),
('setting', check_bool),
])
# The first False is probably a noop, then we get transitions in both directions.
for setting_value in [False, True, False]:
events = self.do_test(lambda: do_change_left_side_userlist(self.user_profile, setting_value))
error = schema_checker('events[0]', events[0])
self.assert_on_error(error)
def test_realm_emoji_events(self): def test_realm_emoji_events(self):
schema_checker = check_dict([ schema_checker = check_dict([
('type', equals('realm_emoji')), ('type', equals('realm_emoji')),

View File

@@ -46,7 +46,7 @@ from zerver.lib.actions import bulk_remove_subscriptions, do_change_password, \
do_change_enable_stream_desktop_notifications, do_change_enable_stream_sounds, \ do_change_enable_stream_desktop_notifications, do_change_enable_stream_sounds, \
do_change_stream_description, do_get_streams, do_make_stream_private, \ do_change_stream_description, do_get_streams, do_make_stream_private, \
do_regenerate_api_key, do_remove_default_stream, do_update_pointer, \ do_regenerate_api_key, do_remove_default_stream, do_update_pointer, \
do_change_avatar_source, do_change_twenty_four_hour_time do_change_avatar_source, do_change_twenty_four_hour_time, do_change_left_side_userlist
from zerver.lib.create_user import random_api_key from zerver.lib.create_user import random_api_key
from zerver.lib.push_notifications import num_push_devices_for_user from zerver.lib.push_notifications import num_push_devices_for_user
@@ -983,6 +983,7 @@ def home(request):
realm_invite_by_admins_only = register_ret['realm_invite_by_admins_only'], realm_invite_by_admins_only = register_ret['realm_invite_by_admins_only'],
realm_restricted_to_domain = register_ret['realm_restricted_to_domain'], realm_restricted_to_domain = register_ret['realm_restricted_to_domain'],
enter_sends = user_profile.enter_sends, enter_sends = user_profile.enter_sends,
left_side_userlist = register_ret['left_side_userlist'],
referrals = register_ret['referrals'], referrals = register_ret['referrals'],
realm_emoji = register_ret['realm_emoji'], realm_emoji = register_ret['realm_emoji'],
needs_tutorial = needs_tutorial, needs_tutorial = needs_tutorial,
@@ -1642,6 +1643,18 @@ def json_time_setting(request, user_profile, twenty_four_hour_time=REQ(validator
return json_success(result) return json_success(result)
@authenticated_json_post_view
@has_request_variables
def json_left_side_userlist(request, user_profile, left_side_userlist=REQ(validator=check_bool,default=None)):
result = {}
if left_side_userlist is not None and \
user_profile.left_side_userlist != left_side_userlist:
do_change_left_side_userlist(user_profile, left_side_userlist)
result['left_side_userlist'] = left_side_userlist
return json_success(result)
@authenticated_json_post_view @authenticated_json_post_view
@has_request_variables @has_request_variables
def json_change_notify_settings(request, user_profile, def json_change_notify_settings(request, user_profile,

View File

@@ -143,6 +143,7 @@ urlpatterns += patterns('zerver.views',
url(r'^json/set_muted_topics$', 'json_set_muted_topics'), url(r'^json/set_muted_topics$', 'json_set_muted_topics'),
url(r'^json/set_avatar$', 'json_set_avatar'), url(r'^json/set_avatar$', 'json_set_avatar'),
url(r'^json/time_setting$', 'json_time_setting'), url(r'^json/time_setting$', 'json_time_setting'),
url(r'^json/left_side_userlist$', 'json_left_side_userlist'),
# This json format view is used by the LEGACY pre-REST API. It # This json format view is used by the LEGACY pre-REST API. It
# requires an API key. # requires an API key.