mirror of
https://github.com/zulip/zulip.git
synced 2025-11-09 16:37:23 +00:00
emoji: Add migration to reupload all RealmEmoji and ensure .author.
Fixes #19732.
This commit is contained in:
committed by
Tim Abbott
parent
8e68e98e33
commit
30ac291eba
@@ -12,6 +12,7 @@ import urllib
|
||||
from datetime import timedelta
|
||||
from mimetypes import guess_extension, guess_type
|
||||
from typing import IO, Any, Callable, Optional, Tuple
|
||||
from urllib.parse import urljoin
|
||||
|
||||
import boto3
|
||||
import botocore
|
||||
@@ -32,6 +33,7 @@ from PIL.Image import DecompressionBombError
|
||||
|
||||
from zerver.lib.avatar_hash import user_avatar_path
|
||||
from zerver.lib.exceptions import ErrorCode, JsonableError
|
||||
from zerver.lib.outgoing_http import OutgoingSession
|
||||
from zerver.lib.utils import assert_is_not_none
|
||||
from zerver.models import (
|
||||
Attachment,
|
||||
@@ -1143,3 +1145,52 @@ def upload_export_tarball(
|
||||
|
||||
def delete_export_tarball(export_path: str) -> Optional[str]:
|
||||
return upload_backend.delete_export_tarball(export_path)
|
||||
|
||||
|
||||
def get_emoji_file_content(
|
||||
session: OutgoingSession, emoji_url: str, emoji_id: int, logger: logging.Logger
|
||||
) -> bytes:
|
||||
original_emoji_url = emoji_url + ".original"
|
||||
|
||||
logger.info("Downloading %s", original_emoji_url)
|
||||
response = session.get(original_emoji_url)
|
||||
if response.status_code == 200:
|
||||
assert type(response.content) == bytes
|
||||
return response.content
|
||||
|
||||
logger.info("Error fetching emoji from URL %s", original_emoji_url)
|
||||
logger.info("Trying %s instead", emoji_url)
|
||||
response = session.get(emoji_url)
|
||||
if response.status_code == 200:
|
||||
assert type(response.content) == bytes
|
||||
return response.content
|
||||
logger.info("Error fetching emoji from URL %s", emoji_url)
|
||||
logger.error("Could not fetch emoji %s", emoji_id)
|
||||
raise AssertionError(f"Could not fetch emoji {emoji_id}")
|
||||
|
||||
|
||||
def handle_reupload_emojis_event(realm: Realm, logger: logging.Logger) -> None:
|
||||
from zerver.lib.emoji import get_emoji_url
|
||||
|
||||
session = OutgoingSession(role="reupload_emoji", timeout=3, max_retries=3)
|
||||
|
||||
query = RealmEmoji.objects.filter(realm=realm).order_by("id")
|
||||
|
||||
for realm_emoji in query:
|
||||
logger.info("Processing emoji %s", realm_emoji.id)
|
||||
emoji_filename = realm_emoji.file_name
|
||||
emoji_url = get_emoji_url(emoji_filename, realm_emoji.realm_id)
|
||||
if emoji_url.startswith("/"):
|
||||
emoji_url = urljoin(realm_emoji.realm.uri, emoji_url)
|
||||
|
||||
emoji_file_content = get_emoji_file_content(session, emoji_url, realm_emoji.id, logger)
|
||||
|
||||
emoji_bytes_io = io.BytesIO(emoji_file_content)
|
||||
|
||||
user_profile = realm_emoji.author
|
||||
# When this runs, emojis have already been migrated to always have .author set.
|
||||
assert user_profile is not None
|
||||
|
||||
logger.info("Reuploading emoji %s", realm_emoji.id)
|
||||
realm_emoji.is_animated = upload_emoji_image(emoji_bytes_io, emoji_filename, user_profile)
|
||||
realm_emoji.save(update_fields=["is_animated"])
|
||||
|
||||
Reference in New Issue
Block a user