bugbot/rules/workflow/no_severity_nag.py (144 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 numpy
from libmozdata import utils as lmdutils
from bugbot import utils
from bugbot.bzcleaner import BzCleaner
from bugbot.escalation import Escalation
from bugbot.nag_me import Nag
from bugbot.round_robin import RoundRobin
class NoSeverityNag(BzCleaner, Nag):
def __init__(self, inactivity_days: int = 4):
"""Constructor
Args:
inactivity_days: number of days that a bug should be inactive before
being considered.
"""
super(NoSeverityNag, self).__init__()
self.lookup = utils.get_config(self.name(), "weeks-lookup", 4)
self.escalation = Escalation(
self.people,
data=utils.get_config(self.name(), "escalation"),
skiplist=utils.get_config("workflow", "supervisor_skiplist", []),
)
self.round_robin = RoundRobin.get_instance()
self.components_skiplist = utils.get_config("workflow", "components_skiplist")
self.activity_date = str(
numpy.busday_offset(lmdutils.get_date("today"), -inactivity_days)
)
def description(self):
return "Bugs without a severity or statuses set"
def nag_template(self):
return self.template()
def nag_preamble(self):
return """<p>
<ul>
<li><a href="https://firefox-source-docs.mozilla.org/bug-mgmt/policies/triage-bugzilla.html#why-triage">Why triage?</a></li>
<li><a href="https://firefox-source-docs.mozilla.org/bug-mgmt/policies/triage-bugzilla.html#what-do-you-triage">What do you triage?</a></li>
<li><a href="https://firefox-source-docs.mozilla.org/bug-mgmt/guides/priority.html">Priority definitions</a></li>
<li><a href="https://firefox-source-docs.mozilla.org/bug-mgmt/guides/severity.html">Severity definitions</a></li>
</ul>
</p>"""
def get_extra_for_template(self):
return {"nweeks": self.lookup}
def get_extra_for_needinfo_template(self):
return self.get_extra_for_template()
def get_extra_for_nag_template(self):
return self.get_extra_for_template()
def has_product_component(self):
return True
def ignore_meta(self):
return True
def columns(self):
return ["product", "component", "id", "summary"]
def handle_bug(self, bug, data):
if (
# check if the product::component is in the list
utils.check_product_component(self.components_skiplist, bug)
or utils.get_last_no_bot_comment_date(bug) > self.activity_date
):
return None
return bug
def get_mail_to_auto_ni(self, bug):
return None
def set_people_to_nag(self, bug, buginfo):
priority = "default"
if not self.filter_bug(priority):
return None
owners = self.round_robin.get(bug, self.date, only_one=False, has_nick=False)
real_owner = bug["triage_owner"]
self.add_triage_owner(owners, real_owner=real_owner)
if not self.add(owners, buginfo, priority=priority):
self.add_no_manager(buginfo["id"])
return bug
def get_bz_params(self, date):
fields = [
"triage_owner",
"flags",
"comments.creator",
"comments.creation_time",
]
lookup = f"-{self.lookup * 7}d"
params = {
"include_fields": fields,
"keywords": "intermittent-failure",
"keywords_type": "nowords",
"email2": "wptsync@mozilla.bugs",
"emailreporter2": "1",
"emailtype2": "notequals",
"resolution": "---",
"f31": "bug_type",
"o31": "equals",
"v31": "defect",
"f32": "flagtypes.name",
"o32": "notsubstring",
"v32": "needinfo?",
"f33": "bug_severity",
"o33": "anyexact",
"v33": "--, n/a",
"j2": "OR",
"f2": "OP",
"j3": "AND",
"f3": "OP",
"f4": "product",
"o4": "changedbefore",
"v4": lookup,
"n5": 1,
"f5": "product",
"o5": "changedafter",
"v5": lookup,
"n6": 1,
"f6": "component",
"o6": "changedafter",
"v6": lookup,
"f7": "CP",
"j8": "AND",
"f8": "OP",
"f9": "component",
"o9": "changedbefore",
"v9": lookup,
"n10": 1,
"f10": "product",
"o10": "changedafter",
"v10": lookup,
"n11": 1,
"f11": "component",
"o11": "changedafter",
"v11": lookup,
"f12": "CP",
"j13": "AND",
"f13": "OP",
"f14": "creation_ts",
"o14": "lessthaneq",
"v14": lookup,
"n15": 1,
"f15": "product",
"o15": "everchanged",
"n16": 1,
"f16": "component",
"o16": "everchanged",
"f17": "CP",
"f18": "CP",
"n20": 1,
"j20": "OR",
"f20": "OP",
"f21": "bug_severity",
"o21": "changedfrom",
"v21": "critical",
"f22": "bug_severity",
"o22": "changedfrom",
"v22": "major",
"f23": "bug_severity",
"o23": "changedfrom",
"v23": "blocker",
"f30": "CP",
}
self.date = lmdutils.get_date_ymd(date)
return params
if __name__ == "__main__":
NoSeverityNag().run()