mirror of
				https://github.com/zulip/zulip.git
				synced 2025-11-04 05:53:43 +00:00 
			
		
		
		
	invites: Add backend for multiuse admin invites.
This commit is contained in:
		@@ -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:
 | 
			
		||||
 
 | 
			
		||||
@@ -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,))
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										20
									
								
								zerver/migrations/0207_multiuseinvite_invited_as.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										20
									
								
								zerver/migrations/0207_multiuseinvite_invited_as.py
									
									
									
									
									
										Normal 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),
 | 
			
		||||
        ),
 | 
			
		||||
    ]
 | 
			
		||||
@@ -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
 | 
			
		||||
 
 | 
			
		||||
@@ -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)
 | 
			
		||||
 
 | 
			
		||||
@@ -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})
 | 
			
		||||
 
 | 
			
		||||
@@ -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:
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user