|
@@ -11,7 +11,8 @@ from django.conf import settings
|
|
|
from django.core.exceptions import ValidationError
|
|
|
from django.core.validators import validate_email
|
|
|
from django.utils.encoding import force_str
|
|
|
-from django.utils.html import escape
|
|
|
+from django.utils.html import escape, format_html
|
|
|
+from django.utils.safestring import SafeString
|
|
|
from PIL import Image
|
|
|
|
|
|
from sentry.http import safe_urlopen
|
|
@@ -74,7 +75,7 @@ def get_letter_avatar(
|
|
|
use_svg: Optional[bool] = True,
|
|
|
initials: Optional[str] = None,
|
|
|
rounded: Optional[bool] = False,
|
|
|
-) -> str:
|
|
|
+) -> SafeString:
|
|
|
display_name = (display_name or "").strip() or "?"
|
|
|
names = display_name.split(" ")
|
|
|
initials = initials or "{}{}".format(names[0][0], names[-1][0] if len(names) > 1 else "")
|
|
@@ -82,24 +83,26 @@ def get_letter_avatar(
|
|
|
color = get_letter_avatar_color(identifier)
|
|
|
if use_svg:
|
|
|
size_attrs = f'height="{size}" width="{size}"' if size else ""
|
|
|
- return (
|
|
|
+ return format_html(
|
|
|
'<svg viewBox="0 0 120 120" xmlns="http://www.w3.org/2000/svg" {size_attrs}>'
|
|
|
'<rect x="0" y="0" width="120" height="120" rx="15" ry="15" fill={color}></rect>'
|
|
|
'<text x="50%" y="50%" font-size="65" dominant-baseline="central" text-anchor="middle" fill="#FFFFFF">'
|
|
|
"{initials}"
|
|
|
"</text>"
|
|
|
- "</svg>"
|
|
|
- ).format(color=color, initials=initials, size_attrs=size_attrs)
|
|
|
+ "</svg>",
|
|
|
+ color=color,
|
|
|
+ initials=initials,
|
|
|
+ size_attrs=size_attrs,
|
|
|
+ )
|
|
|
else:
|
|
|
size_attrs = f"height:{size}px;width:{size}px;" if size else ""
|
|
|
font_size = "font-size:%spx;" % (size / 2) if size else ""
|
|
|
line_height = "line-height:%spx;" % size if size else ""
|
|
|
span_class = " rounded" if rounded else ""
|
|
|
- return (
|
|
|
+ return format_html(
|
|
|
'<span class="html-avatar{span_class}" '
|
|
|
'style="background-color:{color};{size_attrs}{font_size}{line_height}">'
|
|
|
- "{initials}</span>"
|
|
|
- ).format(
|
|
|
+ "{initials}</span>",
|
|
|
color=color,
|
|
|
initials=initials,
|
|
|
size_attrs=size_attrs,
|
|
@@ -114,7 +117,7 @@ def get_email_avatar(
|
|
|
identifier: str,
|
|
|
size: Optional[int] = None,
|
|
|
try_gravatar: Optional[bool] = True,
|
|
|
-) -> str:
|
|
|
+) -> SafeString:
|
|
|
if try_gravatar:
|
|
|
try:
|
|
|
validate_email(identifier)
|
|
@@ -129,16 +132,20 @@ def get_email_avatar(
|
|
|
if resp.status_code == 200:
|
|
|
# default to mm if including in emails
|
|
|
gravatar_url = get_gravatar_url(identifier, size=size)
|
|
|
- return f'<img class="avatar" src="{gravatar_url}">'
|
|
|
+ return format_html('<img class="avatar" src="{}">', gravatar_url)
|
|
|
return get_letter_avatar(display_name, identifier, size, use_svg=False)
|
|
|
|
|
|
|
|
|
def get_platform_avatar(
|
|
|
display_name: Optional[str],
|
|
|
size: Optional[int] = None,
|
|
|
-) -> str:
|
|
|
+) -> SafeString:
|
|
|
# TODO: @taylangocmen add platformicons from package when available
|
|
|
- return f'<img class="avatar" src="https://raw.githubusercontent.com/getsentry/platformicons/master/svg/{display_name}.svg" height={size}>'
|
|
|
+ return format_html(
|
|
|
+ '<img class="avatar" src="https://raw.githubusercontent.com/getsentry/platformicons/master/svg/{display_name}.svg" height={size}>',
|
|
|
+ display_name=display_name,
|
|
|
+ size=size,
|
|
|
+ )
|
|
|
|
|
|
|
|
|
def is_black_alpha_only(data: IO[bytes]) -> bool:
|