integrations: Add script to create bot avatars for integrations.

These avatars can be directly used by bots used for documenting these
integrations. In future, these could be used by bots created from a web UI.
This commit is contained in:
Puneeth Chaganti 2020-04-20 23:36:52 +05:30 committed by Tim Abbott
parent 679f092a75
commit 87648596ee
2 changed files with 56 additions and 2 deletions

57
tools/setup/generate_integration_bots_avatars.py Normal file → Executable file
View File

@ -2,8 +2,6 @@
import os
import sys
import tempfile
from typing import Optional
ZULIP_PATH = os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
if ZULIP_PATH not in sys.path:
@ -11,7 +9,21 @@ if ZULIP_PATH not in sys.path:
from scripts.lib.setup_path import setup_path
setup_path()
os.environ["DJANGO_SETTINGS_MODULE"] = "zproject.settings"
import django
django.setup()
import tempfile
from typing import Optional
import io
import cairosvg
from PIL import Image
from zerver.lib.upload import resize_avatar, DEFAULT_AVATAR_SIZE
from zerver.lib.integrations import Integration, WEBHOOK_INTEGRATIONS
from zerver.lib.storage import static_path
def create_png_from_svg(svg_path: str, destination_dir: Optional[str]=None) -> str:
png_name = os.path.splitext(os.path.basename(svg_path))[0] + '.png'
@ -20,3 +32,44 @@ def create_png_from_svg(svg_path: str, destination_dir: Optional[str]=None) -> s
png_path = os.path.join(destination_dir, png_name)
cairosvg.svg2png(url=svg_path, write_to=png_path)
return png_path
def create_square_image(png: bytes) -> bytes:
img = Image.open(io.BytesIO(png))
if img.height == img.width:
return png
size = max(img.height, img.width)
new_img = Image.new("RGBA", (size, size), color=None)
padding = int(abs(img.height - img.width) / 2)
position = (0, padding) if img.height < img.width else (padding, 0)
new_img.paste(img, position)
out = io.BytesIO()
new_img.save(out, format='png')
return out.getvalue()
def create_integration_bot_avatar(logo_path: str) -> None:
if logo_path.endswith('.svg'):
avatar = cairosvg.svg2png(
url=logo_path, output_width=DEFAULT_AVATAR_SIZE, output_height=DEFAULT_AVATAR_SIZE)
else:
with open(logo_path, 'rb') as f:
image = f.read()
square_image = create_square_image(image)
avatar = resize_avatar(square_image)
name = os.path.splitext(os.path.basename(logo_path))[0]
bot_avatar_path = os.path.join(
ZULIP_PATH, 'static', Integration.DEFAULT_BOT_AVATAR_PATH.format(name=name))
os.makedirs(os.path.dirname(bot_avatar_path), exist_ok=True)
with open(bot_avatar_path, 'wb') as f:
f.write(avatar)
def generate_integration_bots_avatars() -> None:
for webhook in WEBHOOK_INTEGRATIONS:
logo_path = webhook.get_logo_path()
if not logo_path:
continue
create_integration_bot_avatar(static_path(logo_path))
if __name__ == '__main__':
generate_integration_bots_avatars()

View File

@ -49,6 +49,7 @@ CATEGORIES: Dict[str, str] = {
class Integration:
DEFAULT_LOGO_STATIC_PATH_PNG = 'images/integrations/logos/{name}.png'
DEFAULT_LOGO_STATIC_PATH_SVG = 'images/integrations/logos/{name}.svg'
DEFAULT_BOT_AVATAR_PATH = 'images/integrations/bot_avatars/{name}.png'
def __init__(self, name: str, client_name: str, categories: List[str],
logo: Optional[str]=None, secondary_line_text: Optional[str]=None,