bot/code_review_bot/report/mail.py (53 lines of code) (raw):
# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
import structlog
from code_review_bot import taskcluster
from code_review_bot.config import settings
from code_review_bot.report.base import Reporter
logger = structlog.get_logger(__name__)
EMAIL_STATS_LINE = "* **{analyzer}**: {publishable} publishable ({total} total)"
EMAIL_HEADER = """
# Found {publishable} publishable issues ({total} total)
{stats}
Review Url: {review_url}
"""
EMAIL_HEADER_PATCH = "* Improvement patch from {}"
class MailReporter(Reporter):
"""
Send an email to admins through Taskcluster service
"""
def __init__(self, configuration):
(self.emails,) = self.requires(configuration, "emails")
assert len(self.emails) > 0, "Missing emails data"
# Load TC services & secrets
self.notify = taskcluster.get_service("notify")
logger.info("Mail report enabled", emails=self.emails)
def publish(self, issues, revision, task_failures, links, reviewers):
"""
Send an email to administrators
"""
# For no issues do not publish anything
if len(issues) == 0:
return
# Build stats display for all issues
# One line per issues class
stats = "\n".join(
[
EMAIL_STATS_LINE.format(
analyzer=stat["analyzer"],
total=stat["total"],
publishable=stat["publishable"],
)
for stat in self.calc_stats(issues)
]
)
content = EMAIL_HEADER.format(
total=len(issues),
publishable=sum([i.is_publishable() for i in issues]),
stats=stats,
review_url=revision.url,
)
if revision.improvement_patches:
content += "## Improvement patches:\n\n{}\n\n".format(
"\n".join(
EMAIL_HEADER_PATCH.format(patch)
for patch in revision.improvement_patches
)
)
content += "\n\n".join([i.as_markdown() for i in issues])
if len(content) > 102400:
# Content is 102400 chars max
content = content[:102000] + "\n\n... Content max limit reached!"
subject = f"[{settings.app_channel}] New Static Analysis {revision}"
for email in self.emails:
self.notify.email(
{
"address": email,
"subject": subject,
"content": content,
"template": "fullscreen",
}
)