Initial commit
This commit is contained in:
152
elt-report
Normal file
152
elt-report
Normal 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'))
|
||||||
Reference in New Issue
Block a user