From eca2f6aa51d2799bec8880859896becc518b8ab1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=AD=D0=B4=D1=83=D0=B0=D1=80=D0=B4?= Date: Mon, 6 Jul 2026 16:45:11 +0300 Subject: [PATCH] =?UTF-8?q?=D0=BE=D0=B1=D0=BD=D0=BE=D0=B2=D0=B8=D0=BB=20?= =?UTF-8?q?=D0=B2=D1=8B=D0=B2=D0=BE=D0=B4=20=D1=83=D1=81=D0=BF=D0=B5=D1=88?= =?UTF-8?q?=D0=BD=D0=BE=D0=B3=D0=BE=20=D0=BF=D0=B5=D1=80=D0=B5=D0=BD=D0=BE?= =?UTF-8?q?=D1=81=D0=B0=20=D0=B0=D0=BA=D1=82=D0=B8=D0=B2=D0=BD=D0=BE=D1=81?= =?UTF-8?q?=D1=82=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- api/redmine.py | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/api/redmine.py b/api/redmine.py index 30e0e16..8640ba4 100644 --- a/api/redmine.py +++ b/api/redmine.py @@ -7,6 +7,7 @@ from classes.classes import Task from config import RedmineConfig, config from classes import Activity, ActivityType from exceptions import InvalidToken +from utils import format_hours from .constants import ( ACTIVITY_TYPE_BY_VETRO_PROJECT, CLOCKIFY_ACTIVITY_COMMENT_PREFIX, @@ -48,7 +49,10 @@ class RedmineAPI(RedmineConfig): if on_success: on_success(activity) tracked.append(activity) - logger.info(f"{Fore.GREEN}{activity}: уже есть в Redmine {Fore.RESET}".ljust(100) + "✅") + logger.info( + f"{Fore.GREEN}{self.format_activity_result(activity, is_beginner)}" + f"{Fore.RESET}".ljust(100) + "✅" + ) continue if not config.is_debug: resp = requests.post( @@ -70,7 +74,10 @@ class RedmineAPI(RedmineConfig): if on_success: on_success(activity) tracked.append(activity) - logger.info(f"{Fore.GREEN}{activity}: успешно {Fore.RESET}".ljust(100) + "✅") + logger.info( + f"{Fore.GREEN}{self.format_activity_result(activity, is_beginner)}" + f"{Fore.RESET}".ljust(100) + "✅" + ) else: try: errors = resp.json()["errors"] @@ -93,6 +100,11 @@ class RedmineAPI(RedmineConfig): logger.info(f"{Fore.RED}{activity}{Fore.RESET}".ljust(60) + "❌") return tracked + def format_activity_result(self, activity: Activity, is_beginner: bool = False) -> str: + """Форматирует строку результата переноса активности.""" + hours = round(activity.time_spent / (2 if is_beginner else 1), 3) + return f"#{activity.task_id} | {format_hours(hours)} | {activity.description}" + def get_comment(self, activity: Activity) -> str: """Формирует комментарий Redmine с внешним id активности Clockify.""" return f"{activity.description}\n{CLOCKIFY_ACTIVITY_COMMENT_PREFIX} {activity.id}"