Initial commit

This commit is contained in:
Artem Kokos
2026-01-19 21:49:31 +07:00
commit a191ba3a8f

152
elt-report Normal file
View File

@@ -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', '<N/A>')))
# 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', '<N/A>')
# 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", "<N/A>")}'
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", "<N/A>")}'
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", "<N/A>")}'
# 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'))