user_info: Add `bot_owner_id` to user info dataset.

Modifies the dict with the user info to include the key `bot_owner_id`
so it can be displayed in the user info popover.

Tests concerned with changing bot owner have been modified to have
number of events=2 because while updating the bot info, two events
are fired -- updating the `realm_bot` and `realm_user` since the
key `bot_owner_id` is a part of realm user info.
This commit is contained in:
Vaibhav 2019-05-21 22:17:30 +05:30 committed by Tim Abbott
parent 802d3dbbf4
commit 61371cbe9a
5 changed files with 57 additions and 21 deletions

View File

@ -91,6 +91,10 @@ exports.update_person = function update(person) {
if (_.has(person, 'timezone')) { if (_.has(person, 'timezone')) {
person_obj.timezone = person.timezone; person_obj.timezone = person.timezone;
} }
if (_.has(person, 'bot_owner_id')) {
person_obj.bot_owner_id = person.bot_owner_id;
}
}; };
return exports; return exports;

View File

@ -407,16 +407,18 @@ def process_new_human_user(user_profile: UserProfile,
lambda event: None) lambda event: None)
def notify_created_user(user_profile: UserProfile) -> None: def notify_created_user(user_profile: UserProfile) -> None:
event = dict(type="realm_user", op="add", person = dict(email=user_profile.email,
person=dict(email=user_profile.email, user_id=user_profile.id,
user_id=user_profile.id, is_admin=user_profile.is_realm_admin,
is_admin=user_profile.is_realm_admin, full_name=user_profile.full_name,
full_name=user_profile.full_name, avatar_url=avatar_url(user_profile),
avatar_url=avatar_url(user_profile), timezone=user_profile.timezone,
timezone=user_profile.timezone, date_joined=user_profile.date_joined.isoformat(),
date_joined=user_profile.date_joined.isoformat(), is_guest=user_profile.is_guest,
is_guest=user_profile.is_guest, is_bot=user_profile.is_bot) # type: Dict[str, Any]
is_bot=user_profile.is_bot)) # type: Dict[str, Any] if user_profile.is_bot and user_profile.bot_owner_id is not None:
person["bot_owner_id"] = user_profile.bot_owner_id
event = dict(type="realm_user", op="add", person=person) # type: Dict[str, Any]
if not user_profile.is_bot: if not user_profile.is_bot:
event["person"]["profile_data"] = {} event["person"]["profile_data"] = {}
send_event(user_profile.realm, event, active_user_ids(user_profile.realm_id)) send_event(user_profile.realm, event, active_user_ids(user_profile.realm_id))
@ -3229,6 +3231,18 @@ def do_change_bot_owner(user_profile: UserProfile, bot_owner: UserProfile,
)), )),
update_users) update_users)
# Since `bot_owner_id` is included in the user profile dict we need
# to update the users dict with the new bot owner id
event = dict(
type="realm_user",
op="update",
person=dict(
user_id=user_profile.id,
bot_owner_id=user_profile.bot_owner.id,
),
) # type: Dict[str, Any]
send_event(user_profile.realm, event, active_user_ids(user_profile.realm_id))
def do_change_tos_version(user_profile: UserProfile, tos_version: str) -> None: def do_change_tos_version(user_profile: UserProfile, tos_version: str) -> None:
user_profile.tos_version = tos_version user_profile.tos_version = tos_version
user_profile.save(update_fields=["tos_version"]) user_profile.save(update_fields=["tos_version"])

View File

@ -325,7 +325,7 @@ realm_user_dict_fields = [
'id', 'full_name', 'short_name', 'email', 'id', 'full_name', 'short_name', 'email',
'avatar_source', 'avatar_version', 'is_active', 'avatar_source', 'avatar_version', 'is_active',
'is_realm_admin', 'is_bot', 'realm_id', 'timezone', 'is_realm_admin', 'is_bot', 'realm_id', 'timezone',
'date_joined', 'is_guest' 'date_joined', 'is_guest', 'bot_owner_id'
] # type: List[str] ] # type: List[str]
def realm_user_dicts_cache_key(realm_id: int) -> str: def realm_user_dicts_cache_key(realm_id: int) -> str:

View File

@ -101,7 +101,10 @@ def get_raw_user_data(realm: Realm, client_gravatar: bool) -> Dict[int, Dict[str
is_active = row['is_active'], is_active = row['is_active'],
date_joined = row['date_joined'].isoformat(), date_joined = row['date_joined'].isoformat(),
) )
if not is_bot: if is_bot:
if row['bot_owner_id'] is not None:
result['bot_owner_id'] = row['bot_owner_id']
else:
result['profile_data'] = profiles_by_user_id.get(row['id'], {}) result['profile_data'] = profiles_by_user_id.get(row['id'], {})
return result return result

View File

@ -2138,7 +2138,16 @@ class EventsRegisterTest(ZulipTestCase):
self.assert_on_error(error) self.assert_on_error(error)
def test_change_bot_owner(self) -> None: def test_change_bot_owner(self) -> None:
change_bot_owner_checker = self.check_events_dict([ change_bot_owner_checker_user = self.check_events_dict([
('type', equals('realm_user')),
('op', equals('update')),
('person', check_dict_only([
('user_id', check_int),
('bot_owner_id', check_int),
])),
])
change_bot_owner_checker_bot = self.check_events_dict([
('type', equals('realm_bot')), ('type', equals('realm_bot')),
('op', equals('update')), ('op', equals('update')),
('bot', check_dict_only([ ('bot', check_dict_only([
@ -2151,11 +2160,13 @@ class EventsRegisterTest(ZulipTestCase):
owner = self.example_user('hamlet') owner = self.example_user('hamlet')
bot = self.create_bot('test') bot = self.create_bot('test')
action = lambda: do_change_bot_owner(bot, owner, self.user_profile) action = lambda: do_change_bot_owner(bot, owner, self.user_profile)
events = self.do_test(action) events = self.do_test(action, num_events=2)
error = change_bot_owner_checker('events[0]', events[0]) error = change_bot_owner_checker_bot('events[0]', events[0])
self.assert_on_error(error)
error = change_bot_owner_checker_user('events[1]', events[1])
self.assert_on_error(error) self.assert_on_error(error)
change_bot_owner_checker = self.check_events_dict([ change_bot_owner_checker_bot = self.check_events_dict([
('type', equals('realm_bot')), ('type', equals('realm_bot')),
('op', equals('delete')), ('op', equals('delete')),
('bot', check_dict_only([ ('bot', check_dict_only([
@ -2167,12 +2178,14 @@ class EventsRegisterTest(ZulipTestCase):
owner = self.example_user('hamlet') owner = self.example_user('hamlet')
bot = self.create_bot('test1', full_name='Test1 Testerson') bot = self.create_bot('test1', full_name='Test1 Testerson')
action = lambda: do_change_bot_owner(bot, owner, self.user_profile) action = lambda: do_change_bot_owner(bot, owner, self.user_profile)
events = self.do_test(action) events = self.do_test(action, num_events=2)
error = change_bot_owner_checker('events[0]', events[0]) error = change_bot_owner_checker_bot('events[0]', events[0])
self.assert_on_error(error)
error = change_bot_owner_checker_user('events[1]', events[1])
self.assert_on_error(error) self.assert_on_error(error)
check_services = check_list(sub_validator=None, length=0) check_services = check_list(sub_validator=None, length=0)
change_bot_owner_checker = self.check_events_dict([ change_bot_owner_checker_bot = self.check_events_dict([
('type', equals('realm_bot')), ('type', equals('realm_bot')),
('op', equals('add')), ('op', equals('add')),
('bot', check_dict_only([ ('bot', check_dict_only([
@ -2194,8 +2207,10 @@ class EventsRegisterTest(ZulipTestCase):
self.user_profile = self.example_user('hamlet') self.user_profile = self.example_user('hamlet')
bot = self.create_test_bot('test2', previous_owner, full_name='Test2 Testerson') bot = self.create_test_bot('test2', previous_owner, full_name='Test2 Testerson')
action = lambda: do_change_bot_owner(bot, self.user_profile, previous_owner) action = lambda: do_change_bot_owner(bot, self.user_profile, previous_owner)
events = self.do_test(action) events = self.do_test(action, num_events=2)
error = change_bot_owner_checker('events[0]', events[0]) error = change_bot_owner_checker_bot('events[0]', events[0])
self.assert_on_error(error)
error = change_bot_owner_checker_user('events[1]', events[1])
self.assert_on_error(error) self.assert_on_error(error)
def test_do_update_outgoing_webhook_service(self): def test_do_update_outgoing_webhook_service(self):