from typing import List from redminelib.resources import Issue STATUS_TRANSLATION = { 'Closed': 'Закрыто', 'Re-opened': 'В работе', 'New': 'В работе', 'Resolved': 'Решена', 'Pending': 'Ожидание', 'Feedback': 'В работе', 'In Progress': 'В работе', 'Rejected': 'Закрыто', 'Confirming': 'Ожидание', } def get_version(issue: Issue) -> str: return str(getattr(issue, 'fixed_version', '')) def format_compact(issues: List[Issue]) -> str: lines = [] prev_project = None prev_version = None for issue in issues: project = str(issue.project) version = get_version(issue) status = str(issue.status) display_project = project if project != prev_project else "" display_version = version if (project != prev_project or version != prev_version) else "" lines.append(f"{display_project} | {display_version} | {issue.id}. {issue.subject} | {status}") prev_project = project prev_version = version return "\n".join(lines) def format_table(issues: List[Issue]) -> str: from tabulate import tabulate rows = [['Проект', 'Версия', 'Задача', 'Статус', 'Затрачено']] prev_project = None prev_version = None for issue in issues: project = str(issue.project) version = get_version(issue) status_en = str(issue.status) status_ru = STATUS_TRANSLATION.get(status_en, status_en) display_project = project if project != prev_project else "" display_version = version if (project != prev_project or version != prev_version) else "" rows.append([ display_project, display_version, f"{issue.id}. {issue.subject}", status_ru, "" # placeholder for spent time (future extension) ]) prev_project = project prev_version = version return tabulate(rows, headers="firstrow", tablefmt="fancy_grid")