# find comments with estimations out of pre-planning # zisco 2021-09-30 19:50 # TODO: Excel export from types import ClassMethodDescriptorType from jira import JIRA, Issue, Comment, exceptions import re import csv import xlsxwriter import logging logging.basicConfig(filename='sprint efforts.log', filemode='a', format='%(asctime)s - %(levelname)s: %(message)s', level=logging.INFO, encoding='utf-8') host = "https://jira.wien.gv.at/" pat = "OTAyMTM3MjY0MjE0Ovz6bu0ti1TlEdSegmmiWiJ2wGeD" sprint = 1 project = 'WRWGR3' row = 0; col = 0 workbook = xlsxwriter.Workbook(f'efforts {project} sprint {sprint} (from comment).xlsx') worksheet = workbook.add_worksheet('efforts') cell_format = workbook.add_format() cell_format.set_bold() worksheet.write(row, col, 'Story' , cell_format) worksheet.write(row, col + 1, 'Sub-Task' , cell_format) worksheet.write(row, col + 2, 'Summary' , cell_format) worksheet.write(row, col + 3, 'timeoriginalestimate', cell_format) worksheet.write(row, col + 4, 'SP' , cell_format) worksheet.write(row, col + 5, 'PT' , cell_format) row += 1 headers = JIRA.DEFAULT_OPTIONS["headers"].copy() headers["Authorization"] = f"Bearer {pat}" jira_server = JIRA(server=host, options={"headers": headers}) # use filter or single issue #issues_Jql = jira_server.search_issues('filter=25827') #, expand='changelog') issues_Jql = jira_server.search_issues('key in (WRGWR-2838, WRGWR-2839)') #, expand='changelog') #issues_Jql = jira_server.search_issues('labels in (Refinement11012022) AND type not in (Bug) AND status not in (Done) and ("Story Points" is EMPTY or "Story Points" = 0)') #, expand='changelog') logging.info('Sum effort stored in issue-comments of pre-planning sprint {}'.format(sprint)) xsp = lambda s: s or 0 issue: Issue for issue in issues_Jql: #logging.info('Working on {}'.format(issue)) sp_sum = 0 # only Issues with empty (or 0) story-points sp = 0 if hasattr(issue.fields, 'customfield_10022'): sp = xsp(issue.fields.customfield_10022) single_issue = jira_server.issue(issue.key) comments = single_issue.fields.comment.comments # Find all comments made by me on this issue. for comment in comments: comment_lines = comment.body.splitlines() if len(comment_lines) == 5: if comment_lines[0][:5] == "Dev B": for comment_line in comment_lines: if comment_line != "": logging.info(f"{comment_line}") # pos = comment_lines[2].find('NN') comment_line_parts = comment_line.split(':') if len(comment_line_parts) == 2: if comment_line_parts[1] != u'\xa0': # empty string if (comment_line_parts[1][-2:] != 'NN') and (comment_line_parts[1][-1:] != '-'): # NN means NotNecessary comment_line_sub_parts = comment_line_parts[1].split(' (') if len(comment_line_sub_parts)>1: if comment_line_sub_parts[0].strip().isnumeric(): subtask_ph = float(comment_line_sub_parts[0]) * 0.5 estimation_remark = comment_line_sub_parts[1] else: subtask_ph = 0 else: if comment_line_sub_parts[0].strip().isnumeric(): subtask_ph = float(comment_line_sub_parts[0]) * 0.5 estimation_remark = "" else: subtask_ph = 0 worksheet.write(row, col, issue.key) worksheet.write(row, col + 1, 'na') worksheet.write(row, col + 2, comment_line_parts[0]) worksheet.write(row, col + 3, 'na') worksheet.write(row, col + 4, subtask_ph) worksheet.write(row, col + 5, f'=E{row + 1}/0.5') row += 1 sp_sum += subtask_ph / 0.5 try: if sp != sp_sum: logging.info(f"Estimated story-points changed to Sum(Sub-Tasks story-points): {sp_sum}") except exceptions.JIRAError: logging.error("Issue {} has no (visible) Story Points-attribute".format(issue.key)) worksheet.autofit() workbook.close()