mirror of
https://github.com/zulip/zulip.git
synced 2025-11-09 08:26:11 +00:00
invite: Extend invite api for handling expiration duration.
This extends the invite api endpoints to handle an extra argument, expiration duration, which states the number of days before the invitation link expires. For prereg users, expiration info is attached to event object to pass it to invite queue processor in order to create and send confirmation link. In case of multiuse invites, confirmation links are created directly inside do_create_multiuse_invite_link(), For filtering valid user invites, expiration info stored in Confirmation object is used, which is accessed by a prereg user using reverse generic relations. Fixes #16359.
This commit is contained in:
@@ -6865,12 +6865,17 @@ def filter_presence_idle_user_ids(user_ids: Set[int]) -> List[int]:
|
||||
|
||||
|
||||
def do_send_confirmation_email(
|
||||
invitee: PreregistrationUser, referrer: UserProfile, email_language: str
|
||||
invitee: PreregistrationUser,
|
||||
referrer: UserProfile,
|
||||
email_language: str,
|
||||
invite_expires_in_days: int,
|
||||
) -> str:
|
||||
"""
|
||||
Send the confirmation/welcome e-mail to an invited user.
|
||||
"""
|
||||
activation_url = create_confirmation_link(invitee, Confirmation.INVITATION)
|
||||
activation_url = create_confirmation_link(
|
||||
invitee, Confirmation.INVITATION, validity_in_days=invite_expires_in_days
|
||||
)
|
||||
context = {
|
||||
"referrer_full_name": referrer.full_name,
|
||||
"referrer_email": referrer.delivery_email,
|
||||
@@ -6953,6 +6958,7 @@ def do_invite_users(
|
||||
user_profile: UserProfile,
|
||||
invitee_emails: Collection[str],
|
||||
streams: Collection[Stream],
|
||||
invite_expires_in_days: int,
|
||||
invite_as: int = PreregistrationUser.INVITE_AS["MEMBER"],
|
||||
) -> None:
|
||||
num_invites = len(invitee_emails)
|
||||
@@ -7047,6 +7053,7 @@ def do_invite_users(
|
||||
"prereg_id": prereg_user.id,
|
||||
"referrer_id": user_profile.id,
|
||||
"email_language": user_profile.realm.default_language,
|
||||
"invite_expires_in_days": invite_expires_in_days,
|
||||
}
|
||||
queue_json_publish("invites", event)
|
||||
|
||||
@@ -7076,11 +7083,13 @@ def do_get_user_invites(user_profile: UserProfile) -> List[Dict[str, Any]]:
|
||||
invites = []
|
||||
|
||||
for invitee in prereg_users:
|
||||
expiry_date = invitee.confirmation.get().expiry_date
|
||||
invites.append(
|
||||
dict(
|
||||
email=invitee.email,
|
||||
invited_by_user_id=invitee.referred_by.id,
|
||||
invited=datetime_to_timestamp(invitee.invited_at),
|
||||
expiry_date=datetime_to_timestamp(expiry_date),
|
||||
id=invitee.id,
|
||||
invited_as=invitee.invited_as,
|
||||
is_multiuse=False,
|
||||
@@ -7091,11 +7100,8 @@ def do_get_user_invites(user_profile: UserProfile) -> List[Dict[str, Any]]:
|
||||
# We do not return multiuse invites to non-admin users.
|
||||
return invites
|
||||
|
||||
lowest_datetime = timezone_now() - datetime.timedelta(
|
||||
days=settings.INVITATION_LINK_VALIDITY_DAYS
|
||||
)
|
||||
multiuse_confirmation_objs = Confirmation.objects.filter(
|
||||
realm=user_profile.realm, type=Confirmation.MULTIUSE_INVITE, date_sent__gte=lowest_datetime
|
||||
realm=user_profile.realm, type=Confirmation.MULTIUSE_INVITE, expiry_date__gte=timezone_now()
|
||||
)
|
||||
for confirmation_obj in multiuse_confirmation_objs:
|
||||
invite = confirmation_obj.content_object
|
||||
@@ -7104,6 +7110,7 @@ def do_get_user_invites(user_profile: UserProfile) -> List[Dict[str, Any]]:
|
||||
dict(
|
||||
invited_by_user_id=invite.referred_by.id,
|
||||
invited=datetime_to_timestamp(confirmation_obj.date_sent),
|
||||
expiry_date=datetime_to_timestamp(confirmation_obj.expiry_date),
|
||||
id=invite.id,
|
||||
link_url=confirmation_url(
|
||||
confirmation_obj.confirmation_key,
|
||||
@@ -7118,7 +7125,10 @@ def do_get_user_invites(user_profile: UserProfile) -> List[Dict[str, Any]]:
|
||||
|
||||
|
||||
def do_create_multiuse_invite_link(
|
||||
referred_by: UserProfile, invited_as: int, streams: Sequence[Stream] = []
|
||||
referred_by: UserProfile,
|
||||
invited_as: int,
|
||||
invite_expires_in_days: int,
|
||||
streams: Sequence[Stream] = [],
|
||||
) -> str:
|
||||
realm = referred_by.realm
|
||||
invite = MultiuseInvite.objects.create(realm=realm, referred_by=referred_by)
|
||||
@@ -7127,7 +7137,9 @@ def do_create_multiuse_invite_link(
|
||||
invite.invited_as = invited_as
|
||||
invite.save()
|
||||
notify_invites_changed(referred_by)
|
||||
return create_confirmation_link(invite, Confirmation.MULTIUSE_INVITE)
|
||||
return create_confirmation_link(
|
||||
invite, Confirmation.MULTIUSE_INVITE, validity_in_days=invite_expires_in_days
|
||||
)
|
||||
|
||||
|
||||
def do_revoke_user_invite(prereg_user: PreregistrationUser) -> None:
|
||||
@@ -7160,6 +7172,10 @@ def do_resend_user_invite_email(prereg_user: PreregistrationUser) -> int:
|
||||
|
||||
prereg_user.invited_at = timezone_now()
|
||||
prereg_user.save()
|
||||
invite_expires_in_days = (
|
||||
prereg_user.confirmation.get().expiry_date - prereg_user.invited_at
|
||||
).days
|
||||
prereg_user.confirmation.clear()
|
||||
|
||||
do_increment_logging_stat(
|
||||
prereg_user.realm, COUNT_STATS["invites_sent::day"], None, prereg_user.invited_at
|
||||
@@ -7171,6 +7187,7 @@ def do_resend_user_invite_email(prereg_user: PreregistrationUser) -> int:
|
||||
"prereg_id": prereg_user.id,
|
||||
"referrer_id": prereg_user.referred_by.id,
|
||||
"email_language": prereg_user.referred_by.realm.default_language,
|
||||
"invite_expires_in_days": invite_expires_in_days,
|
||||
}
|
||||
queue_json_publish("invites", event)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user