mirror of
				https://github.com/zulip/zulip.git
				synced 2025-11-04 14:03:30 +00:00 
			
		
		
		
	zerver/lib: Remove u prefix from strings.
This commit is contained in:
		@@ -439,7 +439,7 @@ def create_users(realm: Realm, name_list: Iterable[Tuple[Text, Text]], bot_type:
 | 
				
			|||||||
def do_create_user(email: Text, password: Optional[Text], realm: Realm, full_name: Text,
 | 
					def do_create_user(email: Text, password: Optional[Text], realm: Realm, full_name: Text,
 | 
				
			||||||
                   short_name: Text, is_realm_admin: bool=False, bot_type: Optional[int]=None,
 | 
					                   short_name: Text, is_realm_admin: bool=False, bot_type: Optional[int]=None,
 | 
				
			||||||
                   bot_owner: Optional[UserProfile]=None, tos_version: Optional[Text]=None,
 | 
					                   bot_owner: Optional[UserProfile]=None, tos_version: Optional[Text]=None,
 | 
				
			||||||
                   timezone: Text=u"", avatar_source: Text=UserProfile.AVATAR_FROM_GRAVATAR,
 | 
					                   timezone: Text="", avatar_source: Text=UserProfile.AVATAR_FROM_GRAVATAR,
 | 
				
			||||||
                   default_sending_stream: Optional[Stream]=None,
 | 
					                   default_sending_stream: Optional[Stream]=None,
 | 
				
			||||||
                   default_events_register_stream: Optional[Stream]=None,
 | 
					                   default_events_register_stream: Optional[Stream]=None,
 | 
				
			||||||
                   default_all_public_streams: bool=None,
 | 
					                   default_all_public_streams: bool=None,
 | 
				
			||||||
@@ -1916,7 +1916,7 @@ def _internal_prep_message(realm: Realm,
 | 
				
			|||||||
        return check_message(sender, get_client("Internal"), addressee,
 | 
					        return check_message(sender, get_client("Internal"), addressee,
 | 
				
			||||||
                             content, realm=realm)
 | 
					                             content, realm=realm)
 | 
				
			||||||
    except JsonableError as e:
 | 
					    except JsonableError as e:
 | 
				
			||||||
        logging.exception(u"Error queueing internal message by %s: %s" % (sender.email, e))
 | 
					        logging.exception("Error queueing internal message by %s: %s" % (sender.email, e))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    return None
 | 
					    return None
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -3919,7 +3919,7 @@ def do_send_confirmation_email(invitee: PreregistrationUser,
 | 
				
			|||||||
    activation_url = create_confirmation_link(invitee, referrer.realm.host, Confirmation.INVITATION)
 | 
					    activation_url = create_confirmation_link(invitee, referrer.realm.host, Confirmation.INVITATION)
 | 
				
			||||||
    context = {'referrer': referrer, 'activate_url': activation_url,
 | 
					    context = {'referrer': referrer, 'activate_url': activation_url,
 | 
				
			||||||
               'referrer_realm_name': referrer.realm.name}
 | 
					               'referrer_realm_name': referrer.realm.name}
 | 
				
			||||||
    from_name = u"%s (via Zulip)" % (referrer.full_name,)
 | 
					    from_name = "%s (via Zulip)" % (referrer.full_name,)
 | 
				
			||||||
    send_email('zerver/emails/invitation', to_email=invitee.email, from_name=from_name,
 | 
					    send_email('zerver/emails/invitation', to_email=invitee.email, from_name=from_name,
 | 
				
			||||||
               from_address=FromAddress.NOREPLY, context=context)
 | 
					               from_address=FromAddress.NOREPLY, context=context)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -85,7 +85,7 @@ from zerver.lib.tex import render_tex
 | 
				
			|||||||
from typing import Any, Dict, Iterable, List, MutableSequence, Optional, Tuple, Union, Text
 | 
					from typing import Any, Dict, Iterable, List, MutableSequence, Optional, Tuple, Union, Text
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# Global vars
 | 
					# Global vars
 | 
				
			||||||
FENCE_RE = re.compile(u"""
 | 
					FENCE_RE = re.compile("""
 | 
				
			||||||
    # ~~~ or ```
 | 
					    # ~~~ or ```
 | 
				
			||||||
    (?P<fence>
 | 
					    (?P<fence>
 | 
				
			||||||
        ^(?:~{3,}|`{3,})
 | 
					        ^(?:~{3,}|`{3,})
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -289,7 +289,7 @@ def cache(func: Callable[..., ReturnT]) -> Callable[..., ReturnT]:
 | 
				
			|||||||
    return cache_with_key(keyfunc)(func)
 | 
					    return cache_with_key(keyfunc)(func)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def display_recipient_cache_key(recipient_id: int) -> Text:
 | 
					def display_recipient_cache_key(recipient_id: int) -> Text:
 | 
				
			||||||
    return u"display_recipient_dict:%d" % (recipient_id,)
 | 
					    return "display_recipient_dict:%d" % (recipient_id,)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def user_profile_by_email_cache_key(email: Text) -> Text:
 | 
					def user_profile_by_email_cache_key(email: Text) -> Text:
 | 
				
			||||||
    # See the comment in zerver/lib/avatar_hash.py:gravatar_hash for why we
 | 
					    # See the comment in zerver/lib/avatar_hash.py:gravatar_hash for why we
 | 
				
			||||||
@@ -306,13 +306,13 @@ def user_profile_cache_key(email, realm):
 | 
				
			|||||||
    return user_profile_cache_key_id(email, realm.id)
 | 
					    return user_profile_cache_key_id(email, realm.id)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def bot_profile_cache_key(email: Text) -> Text:
 | 
					def bot_profile_cache_key(email: Text) -> Text:
 | 
				
			||||||
    return u"bot_profile:%s" % (make_safe_digest(email.strip()))
 | 
					    return "bot_profile:%s" % (make_safe_digest(email.strip()))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def user_profile_by_id_cache_key(user_profile_id: int) -> Text:
 | 
					def user_profile_by_id_cache_key(user_profile_id: int) -> Text:
 | 
				
			||||||
    return u"user_profile_by_id:%s" % (user_profile_id,)
 | 
					    return "user_profile_by_id:%s" % (user_profile_id,)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def user_profile_by_api_key_cache_key(api_key: Text) -> Text:
 | 
					def user_profile_by_api_key_cache_key(api_key: Text) -> Text:
 | 
				
			||||||
    return u"user_profile_by_api_key:%s" % (api_key,)
 | 
					    return "user_profile_by_api_key:%s" % (api_key,)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# TODO: Refactor these cache helpers into another file that can import
 | 
					# TODO: Refactor these cache helpers into another file that can import
 | 
				
			||||||
# models.py so that python v3 style type annotations can also work.
 | 
					# models.py so that python v3 style type annotations can also work.
 | 
				
			||||||
@@ -323,10 +323,10 @@ realm_user_dict_fields = [
 | 
				
			|||||||
    'is_realm_admin', 'is_bot', 'realm_id', 'timezone']  # type: List[str]
 | 
					    'is_realm_admin', 'is_bot', 'realm_id', 'timezone']  # type: List[str]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def realm_user_dicts_cache_key(realm_id: int) -> Text:
 | 
					def realm_user_dicts_cache_key(realm_id: int) -> Text:
 | 
				
			||||||
    return u"realm_user_dicts:%s" % (realm_id,)
 | 
					    return "realm_user_dicts:%s" % (realm_id,)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def active_user_ids_cache_key(realm_id: int) -> Text:
 | 
					def active_user_ids_cache_key(realm_id: int) -> Text:
 | 
				
			||||||
    return u"active_user_ids:%s" % (realm_id,)
 | 
					    return "active_user_ids:%s" % (realm_id,)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
bot_dict_fields = ['id', 'full_name', 'short_name', 'bot_type', 'email',
 | 
					bot_dict_fields = ['id', 'full_name', 'short_name', 'bot_type', 'email',
 | 
				
			||||||
                   'is_active', 'default_sending_stream__name',
 | 
					                   'is_active', 'default_sending_stream__name',
 | 
				
			||||||
@@ -338,10 +338,10 @@ bot_dict_fields = ['id', 'full_name', 'short_name', 'bot_type', 'email',
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
def bot_dicts_in_realm_cache_key(realm):
 | 
					def bot_dicts_in_realm_cache_key(realm):
 | 
				
			||||||
    # type: (Realm) -> Text
 | 
					    # type: (Realm) -> Text
 | 
				
			||||||
    return u"bot_dicts_in_realm:%s" % (realm.id,)
 | 
					    return "bot_dicts_in_realm:%s" % (realm.id,)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def get_stream_cache_key(stream_name: Text, realm_id: int) -> Text:
 | 
					def get_stream_cache_key(stream_name: Text, realm_id: int) -> Text:
 | 
				
			||||||
    return u"stream_by_realm_and_name:%s:%s" % (
 | 
					    return "stream_by_realm_and_name:%s:%s" % (
 | 
				
			||||||
        realm_id, make_safe_digest(stream_name.strip().lower()))
 | 
					        realm_id, make_safe_digest(stream_name.strip().lower()))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def delete_user_profile_caches(user_profiles):
 | 
					def delete_user_profile_caches(user_profiles):
 | 
				
			||||||
@@ -423,7 +423,7 @@ def flush_realm(sender: Any, **kwargs: Any) -> None:
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
def realm_alert_words_cache_key(realm):
 | 
					def realm_alert_words_cache_key(realm):
 | 
				
			||||||
    # type: (Realm) -> Text
 | 
					    # type: (Realm) -> Text
 | 
				
			||||||
    return u"realm_alert_words:%s" % (realm.string_id,)
 | 
					    return "realm_alert_words:%s" % (realm.string_id,)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def realm_first_visible_message_id_cache_key(realm):
 | 
					def realm_first_visible_message_id_cache_key(realm):
 | 
				
			||||||
    # type: (Realm) -> Text
 | 
					    # type: (Realm) -> Text
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -164,14 +164,14 @@ def gather_new_streams(user_profile: UserProfile,
 | 
				
			|||||||
        new_streams = list(get_active_streams(user_profile.realm).filter(
 | 
					        new_streams = list(get_active_streams(user_profile.realm).filter(
 | 
				
			||||||
            invite_only=False, date_created__gt=threshold))
 | 
					            invite_only=False, date_created__gt=threshold))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    base_url = u"%s/#narrow/stream/" % (user_profile.realm.uri,)
 | 
					    base_url = "%s/#narrow/stream/" % (user_profile.realm.uri,)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    streams_html = []
 | 
					    streams_html = []
 | 
				
			||||||
    streams_plain = []
 | 
					    streams_plain = []
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    for stream in new_streams:
 | 
					    for stream in new_streams:
 | 
				
			||||||
        narrow_url = base_url + hash_util_encode(stream.name)
 | 
					        narrow_url = base_url + hash_util_encode(stream.name)
 | 
				
			||||||
        stream_link = u"<a href='%s'>%s</a>" % (narrow_url, stream.name)
 | 
					        stream_link = "<a href='%s'>%s</a>" % (narrow_url, stream.name)
 | 
				
			||||||
        streams_html.append(stream_link)
 | 
					        streams_html.append(stream_link)
 | 
				
			||||||
        streams_plain.append(stream.name)
 | 
					        streams_plain.append(stream.name)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -41,20 +41,20 @@ def report_to_zulip(error_message: Text) -> None:
 | 
				
			|||||||
        return
 | 
					        return
 | 
				
			||||||
    error_bot = get_system_bot(settings.ERROR_BOT)
 | 
					    error_bot = get_system_bot(settings.ERROR_BOT)
 | 
				
			||||||
    error_stream = Stream.objects.get(name="errors", realm=error_bot.realm)
 | 
					    error_stream = Stream.objects.get(name="errors", realm=error_bot.realm)
 | 
				
			||||||
    send_zulip(settings.ERROR_BOT, error_stream, u"email mirror error",
 | 
					    send_zulip(settings.ERROR_BOT, error_stream, "email mirror error",
 | 
				
			||||||
               u"""~~~\n%s\n~~~""" % (error_message,))
 | 
					               """~~~\n%s\n~~~""" % (error_message,))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def log_and_report(email_message: message.Message, error_message: Text, debug_info: Dict[str, Any]) -> None:
 | 
					def log_and_report(email_message: message.Message, error_message: Text, debug_info: Dict[str, Any]) -> None:
 | 
				
			||||||
    scrubbed_error = u"Sender: %s\n%s" % (email_message.get("From"),
 | 
					    scrubbed_error = u"Sender: %s\n%s" % (email_message.get("From"),
 | 
				
			||||||
                                          redact_stream(error_message))
 | 
					                                          redact_stream(error_message))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if "to" in debug_info:
 | 
					    if "to" in debug_info:
 | 
				
			||||||
        scrubbed_error = u"Stream: %s\n%s" % (redact_stream(debug_info["to"]),
 | 
					        scrubbed_error = "Stream: %s\n%s" % (redact_stream(debug_info["to"]),
 | 
				
			||||||
                                              scrubbed_error)
 | 
					                                             scrubbed_error)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if "stream" in debug_info:
 | 
					    if "stream" in debug_info:
 | 
				
			||||||
        scrubbed_error = u"Realm: %s\n%s" % (debug_info["stream"].realm.string_id,
 | 
					        scrubbed_error = "Realm: %s\n%s" % (debug_info["stream"].realm.string_id,
 | 
				
			||||||
                                             scrubbed_error)
 | 
					                                            scrubbed_error)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    logger.error(scrubbed_error)
 | 
					    logger.error(scrubbed_error)
 | 
				
			||||||
    report_to_zulip(scrubbed_error)
 | 
					    report_to_zulip(scrubbed_error)
 | 
				
			||||||
@@ -260,13 +260,13 @@ def extract_and_upload_attachments(message: message.Message, realm: Realm) -> Te
 | 
				
			|||||||
                                              attachment,
 | 
					                                              attachment,
 | 
				
			||||||
                                              user_profile,
 | 
					                                              user_profile,
 | 
				
			||||||
                                              target_realm=realm)
 | 
					                                              target_realm=realm)
 | 
				
			||||||
                formatted_link = u"[%s](%s)" % (filename, s3_url)
 | 
					                formatted_link = "[%s](%s)" % (filename, s3_url)
 | 
				
			||||||
                attachment_links.append(formatted_link)
 | 
					                attachment_links.append(formatted_link)
 | 
				
			||||||
            else:
 | 
					            else:
 | 
				
			||||||
                logger.warning("Payload is not bytes (invalid attachment %s in message from %s)." %
 | 
					                logger.warning("Payload is not bytes (invalid attachment %s in message from %s)." %
 | 
				
			||||||
                               (filename, message.get("From")))
 | 
					                               (filename, message.get("From")))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    return u"\n".join(attachment_links)
 | 
					    return "\n".join(attachment_links)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def extract_and_validate(email: Text) -> Stream:
 | 
					def extract_and_validate(email: Text) -> Stream:
 | 
				
			||||||
    temp = decode_email_address(email)
 | 
					    temp = decode_email_address(email)
 | 
				
			||||||
@@ -322,7 +322,7 @@ def process_message(message: message.Message, rcpt_to: Optional[Text]=None, pre_
 | 
				
			|||||||
        try:
 | 
					        try:
 | 
				
			||||||
            subject = encoded_subject.decode(encoding)
 | 
					            subject = encoded_subject.decode(encoding)
 | 
				
			||||||
        except (UnicodeDecodeError, LookupError):
 | 
					        except (UnicodeDecodeError, LookupError):
 | 
				
			||||||
            subject = u"(unreadable subject)"
 | 
					            subject = "(unreadable subject)"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    debug_info = {}
 | 
					    debug_info = {}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -50,17 +50,17 @@ def hash_util_encode(string: Text) -> Text:
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
def pm_narrow_url(realm: Realm, participants: List[Text]) -> Text:
 | 
					def pm_narrow_url(realm: Realm, participants: List[Text]) -> Text:
 | 
				
			||||||
    participants.sort()
 | 
					    participants.sort()
 | 
				
			||||||
    base_url = u"%s/#narrow/pm-with/" % (realm.uri,)
 | 
					    base_url = "%s/#narrow/pm-with/" % (realm.uri,)
 | 
				
			||||||
    return base_url + hash_util_encode(",".join(participants))
 | 
					    return base_url + hash_util_encode(",".join(participants))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def stream_narrow_url(realm: Realm, stream: Text) -> Text:
 | 
					def stream_narrow_url(realm: Realm, stream: Text) -> Text:
 | 
				
			||||||
    base_url = u"%s/#narrow/stream/" % (realm.uri,)
 | 
					    base_url = "%s/#narrow/stream/" % (realm.uri,)
 | 
				
			||||||
    return base_url + hash_util_encode(stream)
 | 
					    return base_url + hash_util_encode(stream)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def topic_narrow_url(realm: Realm, stream: Text, topic: Text) -> Text:
 | 
					def topic_narrow_url(realm: Realm, stream: Text, topic: Text) -> Text:
 | 
				
			||||||
    base_url = u"%s/#narrow/stream/" % (realm.uri,)
 | 
					    base_url = "%s/#narrow/stream/" % (realm.uri,)
 | 
				
			||||||
    return u"%s%s/topic/%s" % (base_url, hash_util_encode(stream),
 | 
					    return "%s%s/topic/%s" % (base_url, hash_util_encode(stream),
 | 
				
			||||||
                               hash_util_encode(topic))
 | 
					                              hash_util_encode(topic))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def relative_to_full_url(base_url: Text, content: Text) -> Text:
 | 
					def relative_to_full_url(base_url: Text, content: Text) -> Text:
 | 
				
			||||||
    # Convert relative URLs to absolute URLs.
 | 
					    # Convert relative URLs to absolute URLs.
 | 
				
			||||||
@@ -177,23 +177,23 @@ def build_message_list(user_profile: UserProfile, messages: List[Message]) -> Li
 | 
				
			|||||||
    def message_header(user_profile: UserProfile, message: Message) -> Dict[str, Any]:
 | 
					    def message_header(user_profile: UserProfile, message: Message) -> Dict[str, Any]:
 | 
				
			||||||
        disp_recipient = get_display_recipient(message.recipient)
 | 
					        disp_recipient = get_display_recipient(message.recipient)
 | 
				
			||||||
        if message.recipient.type == Recipient.PERSONAL:
 | 
					        if message.recipient.type == Recipient.PERSONAL:
 | 
				
			||||||
            header = u"You and %s" % (message.sender.full_name,)
 | 
					            header = "You and %s" % (message.sender.full_name,)
 | 
				
			||||||
            html_link = pm_narrow_url(user_profile.realm, [message.sender.email])
 | 
					            html_link = pm_narrow_url(user_profile.realm, [message.sender.email])
 | 
				
			||||||
            header_html = u"<a style='color: #ffffff;' href='%s'>%s</a>" % (html_link, header)
 | 
					            header_html = "<a style='color: #ffffff;' href='%s'>%s</a>" % (html_link, header)
 | 
				
			||||||
        elif message.recipient.type == Recipient.HUDDLE:
 | 
					        elif message.recipient.type == Recipient.HUDDLE:
 | 
				
			||||||
            assert not isinstance(disp_recipient, Text)
 | 
					            assert not isinstance(disp_recipient, Text)
 | 
				
			||||||
            other_recipients = [r['full_name'] for r in disp_recipient
 | 
					            other_recipients = [r['full_name'] for r in disp_recipient
 | 
				
			||||||
                                if r['email'] != user_profile.email]
 | 
					                                if r['email'] != user_profile.email]
 | 
				
			||||||
            header = u"You and %s" % (", ".join(other_recipients),)
 | 
					            header = "You and %s" % (", ".join(other_recipients),)
 | 
				
			||||||
            html_link = pm_narrow_url(user_profile.realm, [r["email"] for r in disp_recipient
 | 
					            html_link = pm_narrow_url(user_profile.realm, [r["email"] for r in disp_recipient
 | 
				
			||||||
                                      if r["email"] != user_profile.email])
 | 
					                                      if r["email"] != user_profile.email])
 | 
				
			||||||
            header_html = u"<a style='color: #ffffff;' href='%s'>%s</a>" % (html_link, header)
 | 
					            header_html = "<a style='color: #ffffff;' href='%s'>%s</a>" % (html_link, header)
 | 
				
			||||||
        else:
 | 
					        else:
 | 
				
			||||||
            assert isinstance(disp_recipient, Text)
 | 
					            assert isinstance(disp_recipient, Text)
 | 
				
			||||||
            header = u"%s > %s" % (disp_recipient, message.topic_name())
 | 
					            header = "%s > %s" % (disp_recipient, message.topic_name())
 | 
				
			||||||
            stream_link = stream_narrow_url(user_profile.realm, disp_recipient)
 | 
					            stream_link = stream_narrow_url(user_profile.realm, disp_recipient)
 | 
				
			||||||
            topic_link = topic_narrow_url(user_profile.realm, disp_recipient, message.subject)
 | 
					            topic_link = topic_narrow_url(user_profile.realm, disp_recipient, message.subject)
 | 
				
			||||||
            header_html = u"<a href='%s'>%s</a> > <a href='%s'>%s</a>" % (
 | 
					            header_html = "<a href='%s'>%s</a> > <a href='%s'>%s</a>" % (
 | 
				
			||||||
                stream_link, disp_recipient, topic_link, message.subject)
 | 
					                stream_link, disp_recipient, topic_link, message.subject)
 | 
				
			||||||
        return {"plain": header,
 | 
					        return {"plain": header,
 | 
				
			||||||
                "html": header_html,
 | 
					                "html": header_html,
 | 
				
			||||||
@@ -317,14 +317,14 @@ def do_send_missedmessage_events_reply_in_zulip(user_profile: UserProfile,
 | 
				
			|||||||
                            if r['id'] != user_profile.id]
 | 
					                            if r['id'] != user_profile.id]
 | 
				
			||||||
        context.update({'group_pm': True})
 | 
					        context.update({'group_pm': True})
 | 
				
			||||||
        if len(other_recipients) == 2:
 | 
					        if len(other_recipients) == 2:
 | 
				
			||||||
            huddle_display_name = u"%s" % (" and ".join(other_recipients))
 | 
					            huddle_display_name = "%s" % (" and ".join(other_recipients))
 | 
				
			||||||
            context.update({'huddle_display_name': huddle_display_name})
 | 
					            context.update({'huddle_display_name': huddle_display_name})
 | 
				
			||||||
        elif len(other_recipients) == 3:
 | 
					        elif len(other_recipients) == 3:
 | 
				
			||||||
            huddle_display_name = u"%s, %s, and %s" % (
 | 
					            huddle_display_name = "%s, %s, and %s" % (
 | 
				
			||||||
                other_recipients[0], other_recipients[1], other_recipients[2])
 | 
					                other_recipients[0], other_recipients[1], other_recipients[2])
 | 
				
			||||||
            context.update({'huddle_display_name': huddle_display_name})
 | 
					            context.update({'huddle_display_name': huddle_display_name})
 | 
				
			||||||
        else:
 | 
					        else:
 | 
				
			||||||
            huddle_display_name = u"%s, and %s others" % (
 | 
					            huddle_display_name = "%s, and %s others" % (
 | 
				
			||||||
                ', '.join(other_recipients[:2]), len(other_recipients) - 2)
 | 
					                ', '.join(other_recipients[:2]), len(other_recipients) - 2)
 | 
				
			||||||
            context.update({'huddle_display_name': huddle_display_name})
 | 
					            context.update({'huddle_display_name': huddle_display_name})
 | 
				
			||||||
    elif (missed_messages[0].recipient.type == Recipient.PERSONAL):
 | 
					    elif (missed_messages[0].recipient.type == Recipient.PERSONAL):
 | 
				
			||||||
@@ -481,5 +481,5 @@ def convert_html_to_markdown(html: Text) -> Text:
 | 
				
			|||||||
    # ugly. Run a regex over the resulting description, turning links of the
 | 
					    # ugly. Run a regex over the resulting description, turning links of the
 | 
				
			||||||
    # form `` into
 | 
					    # form `` into
 | 
				
			||||||
    # `[image.png](http://foo.com/image.png)`.
 | 
					    # `[image.png](http://foo.com/image.png)`.
 | 
				
			||||||
    return re.sub(u"!\\[\\]\\((\\S*)/(\\S*)\\?(\\S*)\\)",
 | 
					    return re.sub("!\\[\\]\\((\\S*)/(\\S*)\\?(\\S*)\\)",
 | 
				
			||||||
                  u"[\\2](\\1/\\2)", markdown)
 | 
					                  "[\\2](\\1/\\2)", markdown)
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -14,6 +14,6 @@ def get_realm_icon_url(realm: Realm) -> Text:
 | 
				
			|||||||
        return upload_backend.get_realm_icon_url(realm.id, realm.icon_version)
 | 
					        return upload_backend.get_realm_icon_url(realm.id, realm.icon_version)
 | 
				
			||||||
    elif settings.ENABLE_GRAVATAR:
 | 
					    elif settings.ENABLE_GRAVATAR:
 | 
				
			||||||
        hash_key = gravatar_hash(realm.string_id)
 | 
					        hash_key = gravatar_hash(realm.string_id)
 | 
				
			||||||
        return u"https://secure.gravatar.com/avatar/%s?d=identicon" % (hash_key,)
 | 
					        return "https://secure.gravatar.com/avatar/%s?d=identicon" % (hash_key,)
 | 
				
			||||||
    else:
 | 
					    else:
 | 
				
			||||||
        return settings.DEFAULT_AVATAR_URI+'?version=0'
 | 
					        return settings.DEFAULT_AVATAR_URI+'?version=0'
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -74,7 +74,7 @@ class ModelReprMixin:
 | 
				
			|||||||
    def __unicode__(self) -> Text:
 | 
					    def __unicode__(self) -> Text:
 | 
				
			||||||
        # Originally raised an exception, but Django (e.g. the ./manage.py shell)
 | 
					        # Originally raised an exception, but Django (e.g. the ./manage.py shell)
 | 
				
			||||||
        # was catching the exception and not displaying any sort of error
 | 
					        # was catching the exception and not displaying any sort of error
 | 
				
			||||||
        return u"Implement __unicode__ in your subclass of ModelReprMixin!"
 | 
					        return "Implement __unicode__ in your subclass of ModelReprMixin!"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def __str__(self) -> str:
 | 
					    def __str__(self) -> str:
 | 
				
			||||||
        return force_str(self.__unicode__())
 | 
					        return force_str(self.__unicode__())
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -312,7 +312,7 @@ class S3UploadBackend(ZulipUploadBackend):
 | 
				
			|||||||
        bucket = settings.S3_AVATAR_BUCKET
 | 
					        bucket = settings.S3_AVATAR_BUCKET
 | 
				
			||||||
        medium_suffix = "-medium.png" if medium else ""
 | 
					        medium_suffix = "-medium.png" if medium else ""
 | 
				
			||||||
        # ?x=x allows templates to append additional parameters with &s
 | 
					        # ?x=x allows templates to append additional parameters with &s
 | 
				
			||||||
        return u"https://%s.s3.amazonaws.com/%s%s?x=x" % (bucket, hash_key, medium_suffix)
 | 
					        return "https://%s.s3.amazonaws.com/%s%s?x=x" % (bucket, hash_key, medium_suffix)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def upload_realm_icon_image(self, icon_file: File, user_profile: UserProfile) -> None:
 | 
					    def upload_realm_icon_image(self, icon_file: File, user_profile: UserProfile) -> None:
 | 
				
			||||||
        content_type = guess_type(icon_file.name)[0]
 | 
					        content_type = guess_type(icon_file.name)[0]
 | 
				
			||||||
@@ -342,7 +342,7 @@ class S3UploadBackend(ZulipUploadBackend):
 | 
				
			|||||||
    def get_realm_icon_url(self, realm_id: int, version: int) -> Text:
 | 
					    def get_realm_icon_url(self, realm_id: int, version: int) -> Text:
 | 
				
			||||||
        bucket = settings.S3_AVATAR_BUCKET
 | 
					        bucket = settings.S3_AVATAR_BUCKET
 | 
				
			||||||
        # ?x=x allows templates to append additional parameters with &s
 | 
					        # ?x=x allows templates to append additional parameters with &s
 | 
				
			||||||
        return u"https://%s.s3.amazonaws.com/%s/realm/icon.png?version=%s" % (bucket, realm_id, version)
 | 
					        return "https://%s.s3.amazonaws.com/%s/realm/icon.png?version=%s" % (bucket, realm_id, version)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def ensure_medium_avatar_image(self, user_profile: UserProfile) -> None:
 | 
					    def ensure_medium_avatar_image(self, user_profile: UserProfile) -> None:
 | 
				
			||||||
        file_path = user_avatar_path(user_profile)
 | 
					        file_path = user_avatar_path(user_profile)
 | 
				
			||||||
@@ -393,7 +393,7 @@ class S3UploadBackend(ZulipUploadBackend):
 | 
				
			|||||||
        bucket = settings.S3_AVATAR_BUCKET
 | 
					        bucket = settings.S3_AVATAR_BUCKET
 | 
				
			||||||
        emoji_path = RealmEmoji.PATH_ID_TEMPLATE.format(realm_id=realm_id,
 | 
					        emoji_path = RealmEmoji.PATH_ID_TEMPLATE.format(realm_id=realm_id,
 | 
				
			||||||
                                                        emoji_file_name=emoji_file_name)
 | 
					                                                        emoji_file_name=emoji_file_name)
 | 
				
			||||||
        return u"https://%s.s3.amazonaws.com/%s" % (bucket, emoji_path)
 | 
					        return "https://%s.s3.amazonaws.com/%s" % (bucket, emoji_path)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
### Local
 | 
					### Local
 | 
				
			||||||
@@ -455,7 +455,7 @@ class LocalUploadBackend(ZulipUploadBackend):
 | 
				
			|||||||
    def get_avatar_url(self, hash_key: Text, medium: bool=False) -> Text:
 | 
					    def get_avatar_url(self, hash_key: Text, medium: bool=False) -> Text:
 | 
				
			||||||
        # ?x=x allows templates to append additional parameters with &s
 | 
					        # ?x=x allows templates to append additional parameters with &s
 | 
				
			||||||
        medium_suffix = "-medium" if medium else ""
 | 
					        medium_suffix = "-medium" if medium else ""
 | 
				
			||||||
        return u"/user_avatars/%s%s.png?x=x" % (hash_key, medium_suffix)
 | 
					        return "/user_avatars/%s%s.png?x=x" % (hash_key, medium_suffix)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def upload_realm_icon_image(self, icon_file: File, user_profile: UserProfile) -> None:
 | 
					    def upload_realm_icon_image(self, icon_file: File, user_profile: UserProfile) -> None:
 | 
				
			||||||
        upload_path = os.path.join('avatars', str(user_profile.realm.id), 'realm')
 | 
					        upload_path = os.path.join('avatars', str(user_profile.realm.id), 'realm')
 | 
				
			||||||
@@ -471,7 +471,7 @@ class LocalUploadBackend(ZulipUploadBackend):
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    def get_realm_icon_url(self, realm_id: int, version: int) -> Text:
 | 
					    def get_realm_icon_url(self, realm_id: int, version: int) -> Text:
 | 
				
			||||||
        # ?x=x allows templates to append additional parameters with &s
 | 
					        # ?x=x allows templates to append additional parameters with &s
 | 
				
			||||||
        return u"/user_avatars/%s/realm/icon.png?version=%s" % (realm_id, version)
 | 
					        return "/user_avatars/%s/realm/icon.png?version=%s" % (realm_id, version)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def ensure_medium_avatar_image(self, user_profile: UserProfile) -> None:
 | 
					    def ensure_medium_avatar_image(self, user_profile: UserProfile) -> None:
 | 
				
			||||||
        file_path = user_avatar_path(user_profile)
 | 
					        file_path = user_avatar_path(user_profile)
 | 
				
			||||||
@@ -505,7 +505,7 @@ class LocalUploadBackend(ZulipUploadBackend):
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    def get_emoji_url(self, emoji_file_name: Text, realm_id: int) -> Text:
 | 
					    def get_emoji_url(self, emoji_file_name: Text, realm_id: int) -> Text:
 | 
				
			||||||
        return os.path.join(
 | 
					        return os.path.join(
 | 
				
			||||||
            u"/user_avatars",
 | 
					            "/user_avatars",
 | 
				
			||||||
            RealmEmoji.PATH_ID_TEMPLATE.format(realm_id=realm_id, emoji_file_name=emoji_file_name))
 | 
					            RealmEmoji.PATH_ID_TEMPLATE.format(realm_id=realm_id, emoji_file_name=emoji_file_name))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# Common and wrappers
 | 
					# Common and wrappers
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -7,46 +7,46 @@ EMPTY_SHA = '0000000000000000000000000000000000000000'
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
COMMITS_LIMIT = 20
 | 
					COMMITS_LIMIT = 20
 | 
				
			||||||
COMMIT_ROW_TEMPLATE = '* {commit_msg} ([{commit_short_sha}]({commit_url}))\n'
 | 
					COMMIT_ROW_TEMPLATE = '* {commit_msg} ([{commit_short_sha}]({commit_url}))\n'
 | 
				
			||||||
COMMITS_MORE_THAN_LIMIT_TEMPLATE = u"[and {commits_number} more commit(s)]"
 | 
					COMMITS_MORE_THAN_LIMIT_TEMPLATE = "[and {commits_number} more commit(s)]"
 | 
				
			||||||
COMMIT_OR_COMMITS = u"commit{}"
 | 
					COMMIT_OR_COMMITS = "commit{}"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
PUSH_PUSHED_TEXT_WITH_URL = u"[pushed]({compare_url}) {number_of_commits} {commit_or_commits}"
 | 
					PUSH_PUSHED_TEXT_WITH_URL = "[pushed]({compare_url}) {number_of_commits} {commit_or_commits}"
 | 
				
			||||||
PUSH_PUSHED_TEXT_WITHOUT_URL = u"pushed {number_of_commits} {commit_or_commits}"
 | 
					PUSH_PUSHED_TEXT_WITHOUT_URL = "pushed {number_of_commits} {commit_or_commits}"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
PUSH_COMMITS_BASE = '{user_name} {pushed_text} to branch {branch_name}.'
 | 
					PUSH_COMMITS_BASE = '{user_name} {pushed_text} to branch {branch_name}.'
 | 
				
			||||||
PUSH_COMMITS_MESSAGE_TEMPLATE_WITH_COMMITTERS = PUSH_COMMITS_BASE + u""" {committers_details}.
 | 
					PUSH_COMMITS_MESSAGE_TEMPLATE_WITH_COMMITTERS = PUSH_COMMITS_BASE + """ {committers_details}.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
{commits_data}
 | 
					{commits_data}
 | 
				
			||||||
"""
 | 
					"""
 | 
				
			||||||
PUSH_COMMITS_MESSAGE_TEMPLATE_WITHOUT_COMMITTERS = PUSH_COMMITS_BASE + u"""
 | 
					PUSH_COMMITS_MESSAGE_TEMPLATE_WITHOUT_COMMITTERS = PUSH_COMMITS_BASE + """
 | 
				
			||||||
 | 
					
 | 
				
			||||||
{commits_data}
 | 
					{commits_data}
 | 
				
			||||||
"""
 | 
					"""
 | 
				
			||||||
PUSH_DELETE_BRANCH_MESSAGE_TEMPLATE = u"{user_name} [deleted]({compare_url}) the branch {branch_name}."
 | 
					PUSH_DELETE_BRANCH_MESSAGE_TEMPLATE = "{user_name} [deleted]({compare_url}) the branch {branch_name}."
 | 
				
			||||||
PUSH_LOCAL_BRANCH_WITHOUT_COMMITS_MESSAGE_TEMPLATE = (u"{user_name} [pushed]({compare_url}) "
 | 
					PUSH_LOCAL_BRANCH_WITHOUT_COMMITS_MESSAGE_TEMPLATE = ("{user_name} [pushed]({compare_url}) "
 | 
				
			||||||
                                                      "the branch {branch_name}.")
 | 
					                                                      "the branch {branch_name}.")
 | 
				
			||||||
PUSH_COMMITS_MESSAGE_EXTENSION = u"Commits by {}"
 | 
					PUSH_COMMITS_MESSAGE_EXTENSION = "Commits by {}"
 | 
				
			||||||
PUSH_COMMITTERS_LIMIT_INFO = 3
 | 
					PUSH_COMMITTERS_LIMIT_INFO = 3
 | 
				
			||||||
 | 
					
 | 
				
			||||||
FORCE_PUSH_COMMITS_MESSAGE_TEMPLATE = (u"{user_name} [force pushed]({url}) "
 | 
					FORCE_PUSH_COMMITS_MESSAGE_TEMPLATE = ("{user_name} [force pushed]({url}) "
 | 
				
			||||||
                                       "to branch {branch_name}. Head is now {head}")
 | 
					                                       "to branch {branch_name}. Head is now {head}")
 | 
				
			||||||
CREATE_BRANCH_MESSAGE_TEMPLATE = u"{user_name} created [{branch_name}]({url}) branch"
 | 
					CREATE_BRANCH_MESSAGE_TEMPLATE = "{user_name} created [{branch_name}]({url}) branch"
 | 
				
			||||||
REMOVE_BRANCH_MESSAGE_TEMPLATE = u"{user_name} deleted branch {branch_name}"
 | 
					REMOVE_BRANCH_MESSAGE_TEMPLATE = "{user_name} deleted branch {branch_name}"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
PULL_REQUEST_OR_ISSUE_MESSAGE_TEMPLATE = u"{user_name} {action} [{type}{id}]({url})"
 | 
					PULL_REQUEST_OR_ISSUE_MESSAGE_TEMPLATE = "{user_name} {action} [{type}{id}]({url})"
 | 
				
			||||||
PULL_REQUEST_OR_ISSUE_ASSIGNEE_INFO_TEMPLATE = u"(assigned to {assignee})"
 | 
					PULL_REQUEST_OR_ISSUE_ASSIGNEE_INFO_TEMPLATE = "(assigned to {assignee})"
 | 
				
			||||||
PULL_REQUEST_BRANCH_INFO_TEMPLATE = u"\nfrom `{target}` to `{base}`"
 | 
					PULL_REQUEST_BRANCH_INFO_TEMPLATE = "\nfrom `{target}` to `{base}`"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
SETUP_MESSAGE_TEMPLATE = u"{integration} webhook has been successfully configured"
 | 
					SETUP_MESSAGE_TEMPLATE = "{integration} webhook has been successfully configured"
 | 
				
			||||||
SETUP_MESSAGE_USER_PART = u" by {user_name}"
 | 
					SETUP_MESSAGE_USER_PART = " by {user_name}"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
CONTENT_MESSAGE_TEMPLATE = u"\n~~~ quote\n{message}\n~~~"
 | 
					CONTENT_MESSAGE_TEMPLATE = "\n~~~ quote\n{message}\n~~~"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
COMMITS_COMMENT_MESSAGE_TEMPLATE = u"{user_name} {action} on [{sha}]({url})"
 | 
					COMMITS_COMMENT_MESSAGE_TEMPLATE = "{user_name} {action} on [{sha}]({url})"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
PUSH_TAGS_MESSAGE_TEMPLATE = u"""{user_name} {action} tag {tag}"""
 | 
					PUSH_TAGS_MESSAGE_TEMPLATE = """{user_name} {action} tag {tag}"""
 | 
				
			||||||
TAG_WITH_URL_TEMPLATE = u"[{tag_name}]({tag_url})"
 | 
					TAG_WITH_URL_TEMPLATE = "[{tag_name}]({tag_url})"
 | 
				
			||||||
TAG_WITHOUT_URL_TEMPLATE = u"{tag_name}"
 | 
					TAG_WITHOUT_URL_TEMPLATE = "{tag_name}"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def get_push_commits_event_message(user_name: Text, compare_url: Optional[Text],
 | 
					def get_push_commits_event_message(user_name: Text, compare_url: Optional[Text],
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user