Search code examples
pythonjirapython-jira

Possibility to read out search filters using jira-python


Is there another possibility to gather information about issue search contents as stated below?

My first attempt was:

for i in jira.search_issues('filter=filterID', startAt=0, maxResults=2500):
    print(i.fields.duedate)

The index i resembles the issue name (e.g. JIR-001). When counting i it returned exactly 1000. So I guess the plugin can't return more issues, but my JIRA has way more issues related to that filter ID (thats why I chose 2500). Is there a way to get more without adding another loop where the startAt and maxResults is shifted to the next 1000 results (startAt=1000, maxResults=1999)? Because this increases the runtime of the script dramatically, whereas a search.issue access eats up around 9 seconds.

Maybe there is a much easier way for that problem, but the documentation of the package is quite sparsely about that specific problem.


Solution

  • It may be interesting for you to check the source code of jira.search_issues() function.

    Here is a source code for version 1.0.3:

    def search_issues(self, jql_str, startAt=0, maxResults=50, validate_query=True, fields=None, expand=None,
                      json_result=None):
        """
        Get a ResultList of issue Resources matching a JQL search string.
    
        :param jql_str: the JQL search string to use
        :param startAt: index of the first issue to return
        :param maxResults: maximum number of issues to return. Total number of results
            is available in the ``total`` attribute of the returned ResultList.
            If maxResults evaluates as False, it will try to get all issues in batches of 50.
        :param fields: comma-separated string of issue fields to include in the results
        :param expand: extra information to fetch inside each resource
        """
        # TODO what to do about the expand, which isn't related to the issues?
        infinite = False
        maxi = 50
        idx = 0
        if fields is None:
            fields = []
    
        # If None is passed as parameter, this fetch all issues from the query
        if not maxResults:
            maxResults = maxi
            infinite = True
    
        search_params = {
            "jql": jql_str,
            "startAt": startAt,
            "maxResults": maxResults,
            "validateQuery": validate_query,
            "fields": fields,
            "expand": expand
        }
        if json_result:
            return self._get_json('search', params=search_params)
    
        resource = self._get_json('search', params=search_params)
        issues = [Issue(self._options, self._session, raw_issue_json)
                  for raw_issue_json in resource['issues']]
        cnt = len(issues)
        total = resource['total']
        if infinite:
            while cnt == maxi:
                idx += maxi
                search_params["startAt"] = idx
                resource = self._get_json('search', params=search_params)
                issue_batch = [Issue(self._options, self._session, raw_issue_json) for raw_issue_json in
                               resource['issues']]
                issues.extend(issue_batch)
                cnt = len(issue_batch)
        return ResultList(issues, total)
    

    It has an interesting comment:

    Total number of results is available in the total attribute of the returned ResultList.

    So you may want to check it.

    You may also want to set maxResults = False

    Documentation:

    If maxResults evaluates as False, it will try to get all issues in batches.