From bb461aefaf88759a1171aa78a06f9b4ac9943c89 Mon Sep 17 00:00:00 2001 From: Marc Michalsky Date: Thu, 4 Nov 2021 17:14:14 +0100 Subject: [PATCH] =?UTF-8?q?=E2=9C=A8=20find=20'issue=5Fclosed=5Fstatus=5Fi?= =?UTF-8?q?d'=20by=20its=20name?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- example_config.yaml | 1 + exceptions.py | 6 ++++++ main.py | 18 +++++++++++++++++- 3 files changed, 24 insertions(+), 1 deletion(-) create mode 100644 exceptions.py diff --git a/example_config.yaml b/example_config.yaml index 1d0d73c..72633f2 100644 --- a/example_config.yaml +++ b/example_config.yaml @@ -5,6 +5,7 @@ redmine: version: ${REDMINE_VERSION} api_key: ${REDMINE_API_KEY} time_zone: "Europe/Berlin" + issue_closed_status: "Abgeschlossen" # Name of the "closed" status no_bot_tag: "#nobot" # a tag that signals bot not to handle an issue actions: diff --git a/exceptions.py b/exceptions.py new file mode 100644 index 0000000..0b516e9 --- /dev/null +++ b/exceptions.py @@ -0,0 +1,6 @@ +class IssueStatusNotFoundException(Exception): + def __init__(self, status_name: str): + self.status_name = status_name + + def __str__(self): + return f"No issue status with the name \"{self.status_name}\" could be found. Please check your config.yaml." diff --git a/main.py b/main.py index d962b44..9ac41a8 100644 --- a/main.py +++ b/main.py @@ -7,6 +7,7 @@ import logging from redminelib import Redmine from envyaml import EnvYAML from jinja2 import Template +from exceptions import IssueStatusNotFoundException def treat_issues(): @@ -26,6 +27,7 @@ def treat_issues(): version = config['redmine']['version'] api_key = config['redmine']['api_key'] time_zone = pytz.timezone(config['redmine']['time_zone']) + issue_closed_status = config['redmine']['issue_closed_status'] no_bot_tag = config['redmine']['no_bot_tag'] actions = config['actions'] logging.getLogger().setLevel(config['logging']['level'].upper()) @@ -40,6 +42,20 @@ def treat_issues(): logging.error('Could not instantiate Redmine object', exc_info=True) sys.exit(1) + # Get status id for closed issues + try: + all_status = redmine.issue_status.all() + issue_closed_statuses = all_status.filter(name=issue_closed_status) + if len(issue_closed_statuses) < 1: + raise IssueStatusNotFoundException(issue_closed_status) + elif len(issue_closed_statuses) > 1: + logging.warning(f'Expected one issue status with the name {issue_closed_status} but found ' + f'{len(issue_closed_statuses)}') + issue_closed_status_id = issue_closed_statuses[0].id + except IssueStatusNotFoundException as e: + logging.error(e, exc_info=True) + sys.exit(1) + # Loop through all actions defined in config.yaml for action in actions.values(): @@ -72,7 +88,7 @@ def treat_issues(): # Update issue if action.get('close_ticket') is True: - redmine.issue.update(issue.id, notes=notes, status_id=config['redmine']['issue_closed_id']) + redmine.issue.update(issue.id, notes=notes, status_id=issue_closed_status_id) logging.info(f"Ticket ID: {issue.id}, ticket closed") elif action.get('change_status_to') is not None and isinstance(action.get('change_status_to'), int): redmine.issue.update(issue.id, notes=notes, status_id=action['change_status_to'])