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