mirror of
https://github.com/zulip/zulip.git
synced 2025-11-03 21:43:21 +00:00
Edited by tabbott to remove state.py and streams.py, because of problems with the original PR's changes, and wrap some long lines.
86 lines
3.7 KiB
Python
86 lines
3.7 KiB
Python
|
|
from django.conf import settings
|
|
from django.core.exceptions import ValidationError
|
|
from django.http import HttpRequest, HttpResponse
|
|
from django.utils.translation import ugettext as _
|
|
from typing import List, Optional, Set, Text
|
|
|
|
from zerver.decorator import require_realm_admin, to_non_negative_int
|
|
from zerver.lib.actions import do_invite_users, do_revoke_user_invite, do_resend_user_invite_email, \
|
|
get_default_subs, do_get_user_invites
|
|
from zerver.lib.request import REQ, has_request_variables, JsonableError
|
|
from zerver.lib.response import json_success, json_error, json_response
|
|
from zerver.lib.streams import access_stream_by_name
|
|
from zerver.lib.validator import check_string, check_list, check_bool
|
|
from zerver.models import PreregistrationUser, Stream, UserProfile
|
|
|
|
import re
|
|
|
|
@has_request_variables
|
|
def invite_users_backend(request, user_profile,
|
|
invitee_emails_raw=REQ("invitee_emails"),
|
|
invite_as_admin=REQ(validator=check_bool, default=False),
|
|
body=REQ("custom_body", default=None)):
|
|
# type: (HttpRequest, UserProfile, str, Optional[bool], Optional[str]) -> HttpResponse
|
|
|
|
if user_profile.realm.invite_by_admins_only and not user_profile.is_realm_admin:
|
|
return json_error(_("Must be a realm administrator"))
|
|
if invite_as_admin and not user_profile.is_realm_admin:
|
|
return json_error(_("Must be a realm administrator"))
|
|
if not invitee_emails_raw:
|
|
return json_error(_("You must specify at least one email address."))
|
|
if body == '':
|
|
body = None
|
|
|
|
invitee_emails = get_invitee_emails_set(invitee_emails_raw)
|
|
|
|
stream_names = request.POST.getlist('stream')
|
|
if not stream_names:
|
|
return json_error(_("You must specify at least one stream for invitees to join."))
|
|
|
|
# We unconditionally sub you to the notifications stream if it
|
|
# exists and is public.
|
|
notifications_stream = user_profile.realm.notifications_stream # type: Optional[Stream]
|
|
if notifications_stream and not notifications_stream.invite_only:
|
|
stream_names.append(notifications_stream.name)
|
|
|
|
streams = [] # type: List[Stream]
|
|
for stream_name in stream_names:
|
|
try:
|
|
(stream, recipient, sub) = access_stream_by_name(user_profile, stream_name)
|
|
except JsonableError:
|
|
return json_error(_("Stream does not exist: %s. No invites were sent.") % (stream_name,))
|
|
streams.append(stream)
|
|
|
|
do_invite_users(user_profile, invitee_emails, streams, invite_as_admin, body)
|
|
return json_success()
|
|
|
|
def get_invitee_emails_set(invitee_emails_raw: str) -> Set[str]:
|
|
invitee_emails_list = set(re.split(r'[,\n]', invitee_emails_raw))
|
|
invitee_emails = set()
|
|
for email in invitee_emails_list:
|
|
is_email_with_name = re.search(r'<(?P<email>.*)>', email)
|
|
if is_email_with_name:
|
|
email = is_email_with_name.group('email')
|
|
invitee_emails.add(email.strip())
|
|
return invitee_emails
|
|
|
|
@require_realm_admin
|
|
def get_user_invites(request: HttpRequest, user_profile: UserProfile) -> HttpResponse:
|
|
all_users = do_get_user_invites(user_profile)
|
|
return json_success({'invites': all_users})
|
|
|
|
@require_realm_admin
|
|
@has_request_variables
|
|
def revoke_user_invite(request: HttpRequest, user_profile: UserProfile,
|
|
prereg_id: int) -> HttpResponse:
|
|
do_revoke_user_invite(prereg_id, user_profile.realm_id)
|
|
return json_success()
|
|
|
|
@require_realm_admin
|
|
@has_request_variables
|
|
def resend_user_invite_email(request: HttpRequest, user_profile: UserProfile,
|
|
prereg_id: int) -> HttpResponse:
|
|
timestamp = do_resend_user_invite_email(prereg_id, user_profile.realm_id)
|
|
return json_success({'timestamp': timestamp})
|