From c35b479a0ba11826568d771ad477230dd7f30502 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:41:32 +0300 Subject: [PATCH] =?UTF-8?q?=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8=D0=BB=20?= =?UTF-8?q?=D1=87=D0=B5=D0=BB=D0=BE=D0=B2=D0=B5=D0=BA=D0=BE=D1=87=D0=B8?= =?UTF-8?q?=D1=82=D0=B0=D0=B5=D0=BC=D1=8B=D0=B9=20=D1=84=D0=BE=D1=80=D0=BC?= =?UTF-8?q?=D0=B0=D1=82=20=D0=B4=D0=BB=D0=B8=D1=82=D0=B5=D0=BB=D1=8C=D0=BD?= =?UTF-8?q?=D0=BE=D1=81=D1=82=D0=B8=20=D1=82=D1=80=D1=83=D0=B4=D0=BE=D0=B7?= =?UTF-8?q?=D0=B0=D1=82=D1=80=D0=B0=D1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- api/clockify.py | 4 ++-- services/tracking.py | 6 +++--- utils.py | 13 +++++++++++++ 3 files changed, 18 insertions(+), 5 deletions(-) diff --git a/api/clockify.py b/api/clockify.py index cc76452..1d35dd7 100644 --- a/api/clockify.py +++ b/api/clockify.py @@ -8,7 +8,7 @@ from tqdm import tqdm from config import ClockifyConfig, config from classes import Activity, Tag, VetroProject from exceptions import InvalidToken -from utils import parse_task_id, time_to_hour +from utils import format_hours, parse_task_id, time_to_hour from .constants import REQUEST_TIMEOUT @@ -112,7 +112,7 @@ class ClockifyAPI(ClockifyConfig): ) ) logger.info(f"Сохранено задач: {len(result)}") - logger.info(f"Отработано часов: {time_worked_out_total:.3f}") + logger.info(f"Отработано часов: {format_hours(time_worked_out_total)}") return result diff --git a/services/tracking.py b/services/tracking.py index 2ad6b21..1afa9d1 100644 --- a/services/tracking.py +++ b/services/tracking.py @@ -4,7 +4,7 @@ import logging from colorama import Fore -from utils import format_date +from utils import format_date, format_hours logger = logging.getLogger(__name__) @@ -80,9 +80,9 @@ class TrackingService: logger.info(f"{Fore.YELLOW}Предпросмотр переноса трудочасов{Fore.RESET}") logger.info(f"Найдено активностей: {len(activities)}") logger.info(f"Готово к переносу: {len(trackable_activities)}") - logger.info(f"Всего часов: {total_hours:.3f}") + logger.info(f"Всего часов: {format_hours(total_hours)}") for activity in trackable_activities: logger.info( f"{activity.date_start.date()} | #{activity.task_id} | " - f"{activity.time_spent:.3f} ч | {activity.description}" + f"{format_hours(activity.time_spent)} | {activity.description}" ) diff --git a/utils.py b/utils.py index 522f04c..3eada41 100644 --- a/utils.py +++ b/utils.py @@ -13,6 +13,19 @@ logger = logging.getLogger(__name__) def time_to_hour(time: timedelta) -> float: return round(time.total_seconds() / 3600, 3) +def format_hours(hours: float) -> str: + """Форматирует десятичные часы и длительность без нулевых старших единиц.""" + total_seconds = round(hours * 3600) + hours_part, remaining_seconds = divmod(total_seconds, 3600) + minutes_part, seconds_part = divmod(remaining_seconds, 60) + if hours_part: + duration = f"{hours_part}:{minutes_part:02}:{seconds_part:02}" + elif minutes_part: + duration = f"{minutes_part}:{seconds_part:02}" + else: + duration = str(seconds_part) + return f"{hours:.3f} ч ({duration})" + def today_start() -> datetime: td = datetime.today() year = td.year