Source code for moic.plugins.jira.utils.base

"""
Module for base Moic cli utils function
"""
import json

import requests
from jira.client import ResultList

from moic.cli import settings
from moic.plugins.jira import Instance


[docs]class Board: """ Class representing a Jira Board """ def __init__(self, json_board: dict): """ Init a board Args: json_board (dict): Json representation of the board """ self.raw = json_board self.id = json_board["id"] self.name = json_board["name"] self.type = json_board["type"]
[docs]def sort_issue_per_status(issues: list, project: str = settings.get("default_project", None)) -> list: """ Sort an issue liste based on the project defined workflow Args: issues (list): The list of Jira issues to sort project (str): The Jira project key Returns: list: The sorted Jira issues list """ sorted_i = [] w = settings.get(f"projects.{project}.workflow") for step in ["new", "indeterminate", "done"]: for s in w[step]: sorted_i.extend([i for i in issues if i.status.id == s]) return sorted_i
[docs]def get_board_sprints(board_id: str, closed: bool = False) -> dict: """ Return le sprint list of a board Args: board_id (str): The Jira Board ID closed (bool): Indicate if we should returned only opened sprints Returns: dict: Dict {"board_id": id, "sprints": list} of sprints """ sprints = Instance().session.sprints(board_id) if not closed: sprints = [jira_sprint for jira_sprint in sprints if jira_sprint.state != "closed"] ret = {"board_id": board_id, "sprints": sprints} return ret
[docs]def get_sprint_story_points(sprint_id: str) -> dict: """ Return the detailled list of story points for a given sprint Id Splitted between done points and todo points Args: sprint_id (str): Jira Sprint ID Returns: dict: {"sprint_id": id, "points": {"todo": float, "done": float}} """ jira = Instance() issues = [ issue for issue in jira.session.search_issues(f"Sprint = {sprint_id}") if settings.get("custom_fields.story_points") in issue.raw["fields"].keys() ] done = [issue for issue in issues if issue.fields.status.statusCategory.key == "done"] todo = [issue for issue in issues if issue not in done] ret = { "sprint_id": sprint_id, "points": { "done": float( sum( [ float( 0 if issue.raw["fields"][settings.get("custom_fields.story_points")] is None else issue.raw["fields"][settings.get("custom_fields.story_points")] ) for issue in done ] ) ), "todo": float( sum( [ float( 0 if issue.raw["fields"][settings.get("custom_fields.story_points")] is None else issue.raw["fields"][settings.get("custom_fields.story_points")] ) for issue in todo ] ) ), }, } return ret
[docs]def get_sprint_issues(sprint_id: str) -> ResultList: """ Returns list of Jira Issues linked to a given Jira Sprint Args: sprint_id (str): Jira Sprint ID Returns ResultList: List Jira Issues contained into the sprint """ jira = Instance() return jira.session.search_issues(f"sprint = {sprint_id}")
[docs]def get_project_boards(project_key: str) -> list: """ Get the board list of a given project This function is used waiting the 3.0.0 release of Python Jira which include it built-in Args: project_Key (str): The Jira project Key used to filtered Returns: list: A list of boards dict """ r_boards = requests.get( f'{settings.get("instance")}/rest/agile/latest/board/?type=scrum&projectKeyOrId={project_key}', auth=(settings.get("login"), settings.get("password")), ) if r_boards.status_code == 200: boards = json.loads(r_boards.content)["values"] return [Board(board) for board in boards] else: return []