invites: Send user_id of the referrer instead of email in invites dict.

We send user_id of the referrer instead of email in the invites dict.
Sending user_ids is more robust, as those are an immutable reference
to a user, rather than something that can change with time.

Updates to the webapp UI to display the inviters for more convenient
inspection will come in a future commit.
This commit is contained in:
sahil839 2020-06-27 00:56:57 +05:30 committed by Tim Abbott
parent dc05b5c317
commit 6eb8442a59
6 changed files with 23 additions and 14 deletions

View File

@ -48,12 +48,14 @@ function populate_invites(invites_data) {
item.is_admin = page_params.is_admin; item.is_admin = page_params.is_admin;
item.disable_buttons = item.invited_as === settings_config.user_role_values.owner.code item.disable_buttons = item.invited_as === settings_config.user_role_values.owner.code
&& !page_params.is_owner; && !page_params.is_owner;
item.referrer_email = people.get_by_user_id(item.invited_by_user_id).email;
return render_admin_invites_list({ invite: item }); return render_admin_invites_list({ invite: item });
}, },
filter: { filter: {
element: invites_table.closest(".settings-section").find(".search"), element: invites_table.closest(".settings-section").find(".search"),
predicate: function (item, value) { predicate: function (item, value) {
const referrer_email_matched = item.ref.toLowerCase().includes(value); const referrer_email = people.get_by_user_id(item.invited_by_user_id).email;
const referrer_email_matched = referrer_email.toLowerCase().includes(value);
if (item.is_multiuse) { if (item.is_multiuse) {
return referrer_email_matched; return referrer_email_matched;
} }

View File

@ -13,7 +13,7 @@
</td> </td>
{{#if is_admin}} {{#if is_admin}}
<td> <td>
<span class="referred_by">{{ref}}</span> <span class="referred_by">{{referrer_email}}</span>
</td> </td>
{{/if}} {{/if}}
<td> <td>

View File

@ -12,9 +12,15 @@ below features are supported.
**Feature level 22** **Feature level 22**
* 'GET /attachments': Rename `name` to `date_sent` for clearer meaning * `GET /attachments`: The date when a message using the attachment was
and change the data types of the new `date_sent` and `create_time` sent is now correctly encoded as `date_sent`, replacing the
to integer (previously the implementation could send floats). confusingly named `name` field. The `date_sent` and `create_time`
fields of attachment objects are now encoded as integers;
(previously the implementation could send floats incorrectly
suggesting that microsecond precision is relevant).
* `GET /invites`: Now encodes the user ID of the person who created
the invitation as `invited_by_user_id`, replacing the previous
`ref` field (which had that user's Zulip display email address).
**Feature level 21** **Feature level 21**

View File

@ -29,7 +29,7 @@ DESKTOP_WARNING_VERSION = "5.2.0"
# #
# Changes should be accompanied by documentation explaining what the # Changes should be accompanied by documentation explaining what the
# new level means in templates/zerver/api/changelog.md. # new level means in templates/zerver/api/changelog.md.
API_FEATURE_LEVEL = 21 API_FEATURE_LEVEL = 22
# Bump the minor PROVISION_VERSION to indicate that folks should provision # 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 # only when going from an old version of the code to a newer version. Bump

View File

@ -5282,7 +5282,7 @@ def do_get_user_invites(user_profile: UserProfile) -> List[Dict[str, Any]]:
for invitee in prereg_users: for invitee in prereg_users:
invites.append(dict(email=invitee.email, invites.append(dict(email=invitee.email,
ref=invitee.referred_by.email, invited_by_user_id=invitee.referred_by.id,
invited=datetime_to_timestamp(invitee.invited_at), invited=datetime_to_timestamp(invitee.invited_at),
id=invitee.id, id=invitee.id,
invited_as=invitee.invited_as, invited_as=invitee.invited_as,
@ -5298,7 +5298,7 @@ def do_get_user_invites(user_profile: UserProfile) -> List[Dict[str, Any]]:
date_sent__gte=lowest_datetime) date_sent__gte=lowest_datetime)
for confirmation_obj in multiuse_confirmation_objs: for confirmation_obj in multiuse_confirmation_objs:
invite = confirmation_obj.content_object invite = confirmation_obj.content_object
invites.append(dict(ref=invite.referred_by.email, invites.append(dict(invited_by_user_id=invite.referred_by.id,
invited=datetime_to_timestamp(confirmation_obj.date_sent), invited=datetime_to_timestamp(confirmation_obj.date_sent),
id=invite.id, id=invite.id,
link_url=confirmation_url(confirmation_obj.confirmation_key, link_url=confirmation_url(confirmation_obj.confirmation_key,

View File

@ -1664,12 +1664,13 @@ class InvitationsTestCase(InviteUserBase):
result = self.client_get("/json/invites") result = self.client_get("/json/invites")
self.assertEqual(result.status_code, 200) self.assertEqual(result.status_code, 200)
self.assert_in_success_response( invites = ujson.loads(result.content)["invites"]
["TestOne@zulip.com", hamlet.email], self.assertEqual(len(invites), 2)
result)
self.assert_not_in_success_response( self.assertFalse(invites[0]["is_multiuse"])
["TestTwo@zulip.com", "TestThree@zulip.com", "othello@zulip.com", othello.email], self.assertEqual(invites[0]["email"], "TestOne@zulip.com")
result) self.assertTrue(invites[1]["is_multiuse"])
self.assertEqual(invites[1]["invited_by_user_id"], hamlet.id)
def test_successful_delete_invitation(self) -> None: def test_successful_delete_invitation(self) -> None:
""" """