From a191ba3a8f201f43a3d0e539339df2cf09428db8 Mon Sep 17 00:00:00 2001 From: Artem Kokos Date: Mon, 19 Jan 2026 21:49:31 +0700 Subject: [PATCH] Initial commit --- elt-report | 152 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 152 insertions(+) create mode 100644 elt-report diff --git a/elt-report b/elt-report new file mode 100644 index 0000000..9b03ed9 --- /dev/null +++ b/elt-report @@ -0,0 +1,152 @@ +#!/usr/bin/env python3 + +from redminelib import Redmine + + +TABULATE = True +REDMINE_URL = 'https://red.eltex.loc/' +USER = '' +PASSWORD = '' +DATE = '2025-12-19--2026-01-31' + +def get_issue_list(username, password, from_date, to_date): + redmine = Redmine(REDMINE_URL, username=username, password=password) + + current_user_id = redmine.user.get('current') + time_entries = redmine.time_entry.filter(user_id=current_user_id, from_date=from_date, to_date=to_date) + + issues = [] + + for e in time_entries: + issues.append(f"{e['issue']}") + + if 0 == len(issues): + return None + + # One issue may contain many time entries, filtering needed + issues = set(issues) + issue_list = ','.join(issues) + + return redmine.issue.filter(issue_id=issue_list, status_id='*', sort='project:asc') + +issue_objs = get_issue_list(USER, PASSWORD, DATE.split('--')[0], DATE.split('--')[1]) +if issue_objs is None: + exit(-1) + +print(f"Total issues: {len(issue_objs)} [{DATE}]") + +# Sort by project +sorted_by_project = sorted(issue_objs, key=lambda x: str(x.project)) +dict_by_project = {} +for i in sorted_by_project: + try: + # Add into existing list + dict_by_project[f'{i.project}'].append(i) + except: + # No list, create new one + dict_by_project[f'{i.project}'] = [i] + +# Sort by version +for project in dict_by_project: + dict_by_project[project] = sorted(dict_by_project[project], key=lambda x: str(getattr(x, 'version', ''))) + +# Rebuild list sorted by project and version +issues_l = [] +for project in dict_by_project: + for item in dict_by_project[project]: + issues_l.append(item) + +status_map = { + 'Closed': 'Закрыто', + 'Re-opened': 'В работе', + 'New': 'В работе', + 'Resolved': 'Решена', + 'Pending': 'Ожидание', + 'Feedback': 'В работе', + 'In Progress': 'В работе', + 'Rejected': 'Закрыто', + 'Confirming': 'Ожидание', +} + +# Show list +# if not TABULATE: +# for i in issues_l: +# data = f'{i.project} | {i.version} | {i.id}. {i.subject} | {i.status}' +# print(data) +# else: +# from tabulate import tabulate + +# rows = [['Проект', 'Версия', 'Задача', 'Статус', 'Затрачено']] + +# for i in issues_l: +# status = f'{i.status}' +# try: +# status = status_map[status] +# except: +# pass + +# version = getattr(i, 'version', '') +# row = [ +# f'{i.project}', +# f'{version}', +# f'{i.id}. {i.subject}', +# f'{status}', +# '' +# ] + +# rows.append(row) + +# print(tabulate(rows, headers='firstrow', tablefmt='fancy_grid')) + # print(tabulate(rows, headers='firstrow', tablefmt='html')) + +# Show list +if not TABULATE: + prev_project = None + prev_version = None + for i in issues_l: + project = f'{i.project}' + version = f'{getattr(i, "version", "")}' + if project == prev_project: + project = "" + if version == prev_version: + version = "" + print(f'{project} | {version} | {i.id}. {i.subject} | {i.status}') + prev_project = f'{i.project}' + prev_version = f'{getattr(i, "version", "")}' +else: + from tabulate import tabulate + + rows = [['Проект', 'Версия', 'Задача', 'Статус', 'Затрачено']] + + prev_project = None + prev_version = None + + for i in issues_l: + status = f'{i.status}' + try: + status = status_map[status] + except KeyError: + pass + + project = f'{i.project}' + version = f'{getattr(i, "version", "")}' + + # Suppress repeating project and version + display_project = project if project != prev_project else "" + display_version = version if (project != prev_project or version != prev_version) else "" + + row = [ + display_project, + display_version, + f'{i.id}. {i.subject}', + status, + '' + ] + + rows.append(row) + + # Update previous values + prev_project = project + prev_version = version + + print(tabulate(rows, headers='firstrow', tablefmt='fancy_grid'))