invites: Add backend for multiuse admin invites.

This commit is contained in:
Vishnu Ks
2019-02-07 03:27:14 +05:30
committed by Tim Abbott
parent 0e65e74566
commit 28769e040f
7 changed files with 47 additions and 10 deletions

View File

@@ -4867,12 +4867,14 @@ def do_get_user_invites(user_profile: UserProfile) -> List[Dict[str, Any]]:
return invites
def do_create_multiuse_invite_link(referred_by: UserProfile, streams: Optional[List[Stream]]=[]) -> str:
def do_create_multiuse_invite_link(referred_by: UserProfile, invited_as: int,
streams: Optional[List[Stream]]=[]) -> str:
realm = referred_by.realm
invite = MultiuseInvite.objects.create(realm=realm, referred_by=referred_by)
if streams:
invite.streams.set(streams)
invite.invited_as = invited_as
invite.save()
return create_confirmation_link(invite, realm.host, Confirmation.MULTIUSE_INVITE)
def do_revoke_user_invite(prereg_user: PreregistrationUser) -> None:

View File

@@ -4,7 +4,7 @@ from typing import Any, List
from zerver.lib.actions import ensure_stream, do_create_multiuse_invite_link
from zerver.lib.management import ZulipBaseCommand
from zerver.models import Stream
from zerver.models import Stream, PreregistrationUser
class Command(ZulipBaseCommand):
help = "Generates invite link that can be used for inviting multiple users"
@@ -38,5 +38,6 @@ class Command(ZulipBaseCommand):
streams.append(stream)
referred_by = self.get_user(options['referred_by'], realm)
invite_link = do_create_multiuse_invite_link(referred_by, streams)
invite_as = PreregistrationUser.INVITE_AS['MEMBER']
invite_link = do_create_multiuse_invite_link(referred_by, invite_as, streams)
print("You can use %s to invite as many number of people to the organization." % (invite_link,))

View File

@@ -0,0 +1,20 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.11.18 on 2019-02-06 21:49
from __future__ import unicode_literals
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('zerver', '0206_stream_rendered_description'),
]
operations = [
migrations.AddField(
model_name='multiuseinvite',
name='invited_as',
field=models.PositiveSmallIntegerField(default=1),
),
]

View File

@@ -1060,6 +1060,7 @@ class MultiuseInvite(models.Model):
referred_by = models.ForeignKey(UserProfile, on_delete=CASCADE) # Optional[UserProfile]
streams = models.ManyToManyField('Stream') # type: Manager
realm = models.ForeignKey(Realm, on_delete=CASCADE) # type: Realm
invited_as = models.PositiveSmallIntegerField(default=PreregistrationUser.INVITE_AS['MEMBER']) # type: int
class EmailChangeStatus(models.Model):
new_email = models.EmailField() # type: str

View File

@@ -75,11 +75,13 @@ def maybe_send_to_registration(request: HttpRequest, email: str, full_name: str=
multiuse_obj = None
streams_to_subscribe = None
multiuse_object_key = request.session.get("multiuse_object_key", None)
invited_as = PreregistrationUser.INVITE_AS['MEMBER']
if multiuse_object_key is not None:
from_multiuse_invite = True
multiuse_obj = Confirmation.objects.get(confirmation_key=multiuse_object_key).content_object
realm = multiuse_obj.realm
streams_to_subscribe = multiuse_obj.streams.all()
invited_as = multiuse_obj.invited_as
form = HomepageForm({'email': email}, realm=realm, from_multiuse_invite=from_multiuse_invite)
if form.is_valid():
@@ -102,6 +104,8 @@ def maybe_send_to_registration(request: HttpRequest, email: str, full_name: str=
request.session.modified = True
if streams_to_subscribe is not None:
prereg_user.streams.set(streams_to_subscribe)
prereg_user.invited_as = invited_as
prereg_user.save()
confirmation_link = create_confirmation_link(prereg_user, request.get_host(),
Confirmation.USER_REGISTRATION)

View File

@@ -102,9 +102,10 @@ def resend_user_invite_email(request: HttpRequest, user_profile: UserProfile,
@require_realm_admin
@has_request_variables
def generate_multiuse_invite_backend(request: HttpRequest, user_profile: UserProfile,
stream_ids: List[int]=REQ(validator=check_list(check_int),
default=[])) -> HttpResponse:
def generate_multiuse_invite_backend(
request: HttpRequest, user_profile: UserProfile,
invite_as: int=REQ(validator=check_int, default=PreregistrationUser.INVITE_AS['MEMBER']),
stream_ids: List[int]=REQ(validator=check_list(check_int), default=[])) -> HttpResponse:
streams = []
for stream_id in stream_ids:
try:
@@ -113,5 +114,5 @@ def generate_multiuse_invite_backend(request: HttpRequest, user_profile: UserPro
return json_error(_("Invalid stream id {}. No invites were sent.".format(stream_id)))
streams.append(stream)
invite_link = do_create_multiuse_invite_link(user_profile, streams)
invite_link = do_create_multiuse_invite_link(user_profile, invite_as, streams)
return json_success({'invite_link': invite_link})

View File

@@ -339,7 +339,8 @@ def login_and_go_to_home(request: HttpRequest, user_profile: UserProfile) -> Htt
def prepare_activation_url(email: str, request: HttpRequest,
realm_creation: bool=False,
streams: Optional[List[Stream]]=None) -> str:
streams: Optional[List[Stream]]=None,
invited_as: Optional[int]=None) -> str:
"""
Send an email with a confirmation link to the provided e-mail so the user
can complete their registration.
@@ -349,6 +350,10 @@ def prepare_activation_url(email: str, request: HttpRequest,
if streams is not None:
prereg_user.streams.set(streams)
if invited_as is not None:
prereg_user.invited_as = invited_as
prereg_user.save()
confirmation_type = Confirmation.USER_REGISTRATION
if realm_creation:
confirmation_type = Confirmation.REALM_CREATION
@@ -422,17 +427,20 @@ def accounts_home(request: HttpRequest, multiuse_object: Optional[MultiuseInvite
from_multiuse_invite = False
streams_to_subscribe = None
invited_as = None
if multiuse_object:
realm = multiuse_object.realm
streams_to_subscribe = multiuse_object.streams.all()
from_multiuse_invite = True
invited_as = multiuse_object.invited_as
if request.method == 'POST':
form = HomepageForm(request.POST, realm=realm, from_multiuse_invite=from_multiuse_invite)
if form.is_valid():
email = form.cleaned_data['email']
activation_url = prepare_activation_url(email, request, streams=streams_to_subscribe)
activation_url = prepare_activation_url(email, request, streams=streams_to_subscribe,
invited_as=invited_as)
try:
send_confirm_registration_email(email, activation_url, request.LANGUAGE_CODE)
except smtplib.SMTPException as e: