pylib/Bugsy/bugsy/search.py (87 lines of code) (raw):
import copy
from bug import Bug
from errors import SearchException
class Search(object):
"""
This allows searching for bugs in Bugzilla
"""
def __init__(self, bugsy):
"""
Initialises the search object
:param bugsy: Bugsy instance to use to connect to Bugzilla.
"""
self._bugsy = bugsy
self._includefields = copy.copy(bugsy.DEFAULT_SEARCH)
self._keywords = []
self._assigned = []
self._summaries = []
self._whiteboard = []
self._bug_numbers = []
self._time_frame = {}
self._change_history = {"fields": []}
def include_fields(self, *args):
r"""
Include fields is the fields that you want to be returned when
searching. These are in addition to the fields that are always
included below.
:param args: items passed in will be turned into a list
:returns: :class:`Search`
>>> bugzilla.search_for.include_fields("flags")
The following fields are always included in search:
'version', 'id', 'summary', 'status', 'op_sys',
'resolution', 'product', 'component', 'platform'
"""
for arg in args:
self._includefields.append(arg)
return self
def keywords(self, *args):
r"""
When search() is called it will search for the keywords passed
in here
:param args: items passed in will be turned into a list
:returns: :class:`Search`
>>> bugzilla.search_for.keywords("checkin-needed")
"""
self._keywords = list(args)
return self
def assigned_to(self, *args):
r"""
When search() is called it will search for bugs assigned to these
users
:param args: items passed in will be turned into a list
:returns: :class:`Search`
>>> bugzilla.search_for.assigned_to("dburns@mozilla.com")
"""
self._assigned = list(args)
return self
def summary(self, *args):
r"""
When search is called it will search for bugs with the words
passed into the methods
:param args: items passed in will be turned into a list
:returns: :class:`Search`
>>> bugzilla.search_for.summary("663399")
"""
self._summaries = list(args)
return self
def whiteboard(self, *args):
r"""
When search is called it will search for bugs with the words
passed into the methods
:param args: items passed in will be turned into a list
:returns: :class:`Search`
>>> bugzilla.search_for.whiteboard("affects")
"""
self._whiteboard = list(args)
return self
def bug_number(self, bug_numbers):
r"""
When you want to search for a bugs and be able to change the fields
returned.
:param bug_numbers: A string for the bug number or a list of
strings
:returns: :class:`Search`
>>> bugzilla.search_for.bug_number(['123123', '123456'])
"""
self._bug_numbers = list(bug_numbers)
return self
def timeframe(self, start, end):
r"""
When you want to search bugs for a certain time frame.
:param start:
:param end:
:returns: :class:`Search`
"""
if start:
self._time_frame['chfieldfrom'] = start
if end:
self._time_frame['chfieldto'] = end
return self
def change_history_fields(self, fields, value=None):
r"""
"""
if not isinstance(fields, list):
raise Exception('fields should be a list')
self._change_history['fields'] = fields
if value:
self._change_history['value'] = value
return self
def search(self):
r"""
Call the Bugzilla endpoint that will do the search. It will take
the information used in other methods on the Search object and
build up the query string. If no bugs are found then an empty list
is returned.
>>> bugs = bugzilla.search_for\
... .keywords("checkin-needed")\
... .include_fields("flags")\
... .search()
"""
params = {}
params = dict(params.items() + self._time_frame.items())
if self._includefields:
params['include_fields'] = list(self._includefields)
if self._bug_numbers:
bugs = []
for bug in self._bug_numbers:
result = self._bugsy.request('bug/%s' % bug,
params=params)
bugs.append(Bug(self._bugsy, **result['bugs'][0]))
return bugs
else:
if self._keywords:
params['keywords'] = list(self._keywords)
if self._assigned:
params['assigned_to'] = list(self._assigned)
if self._summaries:
params['short_desc_type'] = 'allwordssubstr'
params['short_desc'] = list(self._summaries)
if self._whiteboard:
params['short_desc_type'] = 'allwordssubstr'
params['whiteboard'] = list(self._whiteboard)
if self._change_history['fields']:
params['chfield'] = self._change_history['fields']
if self._change_history.get('value', None):
params['chfieldvalue'] = self._change_history['value']
try:
results = self._bugsy.request('bug', params=params)
except Exception as e:
raise SearchException(e.msg, e.code)
return [Bug(self._bugsy, **bug) for bug in results['bugs']]