def avatar_as_html(user: User) -> str: if not user: return '<img class="avatar" src="{}" width="20px" height="20px" />'.format( escape(get_sentry_avatar_url())) avatar_type = user.get_avatar_type() if avatar_type == "upload": return f'<img class="avatar" src="{escape(get_user_avatar_url(user))}" />' elif avatar_type == "letter_avatar": return get_email_avatar(user.get_display_name(), user.get_label(), 20, False) else: return get_email_avatar(user.get_display_name(), user.get_label(), 20, True)
def get_codeowners_request_builder_args( project: Project, recipient: User, requester_name: str) -> Mapping[str, Any]: return { "subject": _("A team member is asking to set up Sentry's Code Owners"), "type": "organization.codeowners-request", "context": { "requester_name": requester_name, "recipient_name": recipient.get_display_name(), "organization_name": project.organization.name, "project_name": project.name, "codeowners_url": absolute_uri( f"/settings/{project.organization.slug}/projects/{project.slug}/ownership/?referrer=codeowners-email" ), }, "template": "sentry/emails/requests/codeowners.txt", "html_template": "sentry/emails/requests/codeowners.html", }
def serialize( self, obj: User, attrs: MutableMapping[User, Any], user: User ) -> Union[UserSerializerResponse, UserSerializerResponseSelf]: experiment_assignments = experiments.all(user=user) d: UserSerializerResponse = { "id": str(obj.id), "name": obj.get_display_name(), "username": obj.username, "email": obj.email, "avatarUrl": get_gravatar_url(obj.email, size=32), "isActive": obj.is_active, "hasPasswordAuth": obj.password not in ("!", ""), "isManaged": obj.is_managed, "dateJoined": obj.date_joined, "lastLogin": obj.last_login, "has2fa": attrs["has2fa"], "lastActive": obj.last_active, "isSuperuser": obj.is_superuser, "isStaff": obj.is_staff, "experiments": experiment_assignments, "emails": [{ "id": str(e.id), "email": e.email, "is_verified": e.is_verified } for e in attrs["emails"]], } if obj == user: d = cast(UserSerializerResponseSelf, d) options = { o.key: o.value for o in UserOption.objects.filter(user=user, project__isnull=True) } stacktrace_order = int(options.get("stacktrace_order", -1) or -1) d["options"] = { "theme": options.get("theme") or "light", "language": options.get("language") or "en", "stacktraceOrder": stacktrace_order, "timezone": options.get("timezone") or settings.SENTRY_DEFAULT_TIME_ZONE, "clock24Hours": options.get("clock_24_hours") or False, } d["flags"] = { "newsletter_consent_prompt": bool(obj.flags.newsletter_consent_prompt) } if attrs.get("avatar"): avatar: SerializedAvatarFields = { "avatarType": attrs["avatar"].get_avatar_type_display(), "avatarUuid": attrs["avatar"].ident if attrs["avatar"].file_id else None, } else: avatar = {"avatarType": "letter_avatar", "avatarUuid": None} d["avatar"] = avatar # TODO(dcramer): move this to DetailedUserSerializer if attrs["identities"] is not None: d["identities"] = [{ "id": str(i.id), "name": i.ident, "organization": { "slug": i.auth_provider.organization.slug, "name": i.auth_provider.organization.name, }, "provider": { "id": i.auth_provider.provider, "name": i.auth_provider.get_provider().name, }, "dateSynced": i.last_synced, "dateVerified": i.last_verified, } for i in attrs["identities"]] return d