From 4e2aea78fe913cb5eab52ebc4e790d6932796352 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=AD=D0=B4=D1=83=D0=B0=D1=80=D0=B4?= Date: Fri, 19 Jun 2026 16:45:24 +0300 Subject: [PATCH] =?UTF-8?q?=D0=A1=D0=BE=D1=85=D1=80=D0=B0=D0=BD=D1=8F?= =?UTF-8?q?=D1=82=D1=8C=20=D1=82=D1=80=D1=83=D0=B4=D0=BE=D1=87=D0=B0=D1=81?= =?UTF-8?q?=D1=8B=20=D0=B2=20=D0=91=D0=94=20=D1=81=D1=80=D0=B0=D0=B7=D1=83?= =?UTF-8?q?=20=D0=BF=D0=BE=D1=81=D0=BB=D0=B5=20=D1=83=D1=81=D0=BF=D0=B5?= =?UTF-8?q?=D1=88=D0=BD=D0=BE=D0=B3=D0=BE=20Redmine?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - убрать tqdm из занесения трудочасов в Redmine - логировать успех и ошибку по каждой активности - обновлять is_tracked и time_entry сразу после успешного занесения - выводить в итоговом логе список незанесённых задач --- api/redmine.py | 33 ++++++++++++++++++++++++--------- classes/classes.py | 2 +- track.py | 14 +++++++++----- 3 files changed, 34 insertions(+), 15 deletions(-) diff --git a/api/redmine.py b/api/redmine.py index 85d5af1..5fe32de 100644 --- a/api/redmine.py +++ b/api/redmine.py @@ -2,7 +2,6 @@ import logging from colorama import Fore import requests -from tqdm import tqdm from classes.classes import Task from config import RedmineConfig, config @@ -27,15 +26,19 @@ class RedmineAPI(RedmineConfig): self.token = token self._check_token() - def track_activities(self, activities: list[Activity]) -> list[Activity]: + def track_activities(self, activities: list[Activity], on_success=None) -> list[Activity]: """Заносит трудочасы на сервер Redmine""" is_beginner = config.is_beginner if is_beginner: logger.info(f"{Fore.YELLOW}Делим трудочасы пополам{Fore.RESET}") tracked = [] - for activity in tqdm(activities, desc="Занесение трудочасов"): - if not(not activity.is_tracked and activity.date_end): - continue + failed_activities = [] + activities_to_track = [ + activity + for activity in activities + if not activity.is_tracked and activity.date_end + ] + for activity in activities_to_track: try: if not config.is_debug: resp = requests.post( @@ -53,18 +56,30 @@ class RedmineAPI(RedmineConfig): ) if config.is_debug or resp.ok: activity.is_tracked = True + if on_success: + on_success(activity) tracked.append(activity) - logger.debug(activity) + logger.info(f"{Fore.GREEN}{activity} успешно занесена в Redmine{Fore.RESET}".ljust(60) + "✅") else: - logger.error(Fore.RED + f"{activity} Не была затрекана" + Fore.RED) - logger.error(f"{resp.json()['errors']} {resp.status_code}") + try: + errors = resp.json()["errors"] + except Exception: + errors = resp.text + logger.debug(errors) + logger.error(f"{Fore.RED}{activity} не была занесена в Redmine{Fore.RESET}".ljust(60) + "❌") + logger.error(f"{errors} {resp.status_code}") + failed_activities.append(activity) except Exception as e: logger.error(e) + failed_activities.append(activity) continue - if len(activities) == len(tracked): + if len(activities_to_track) == len(tracked): logger.info(Fore.GREEN + "Все задачи были успешно занесены в Redmine" + Fore.RESET) else: logger.info(f"{Fore.YELLOW}Не все задачи были занесены в Redmine. Занесено {len(tracked)}{Fore.RESET}") + logger.info(f"{Fore.YELLOW}Не занесены задачи:{Fore.RESET}") + for activity in failed_activities: + logger.info(f"{Fore.RED}{activity}{Fore.RESET}".ljust(60) + "❌") return tracked def get_time_entry_activities(self) -> list[ActivityTypes]: diff --git a/classes/classes.py b/classes/classes.py index 5c4b5fc..0e14052 100644 --- a/classes/classes.py +++ b/classes/classes.py @@ -19,7 +19,7 @@ class Activity: is_tracked: bool = False def __str__(self): - return f'({self.task_id}) - {self.description}'[:60] + return f'({self.task_id}) - "{self.description}"'[:60] @dataclass diff --git a/track.py b/track.py index 0ff9f62..b043dff 100644 --- a/track.py +++ b/track.py @@ -60,12 +60,16 @@ def main(): logger.info(Fore.YELLOW + "Нет задач для занесения трудочасов" + Fore.RESET) return db.insert_activities(activities) + + def save_tracked_activity(activity): + db.insert_activities([activity]) + db.insert_time_entries([activity]) + try: - tracked_activities = red.track_activities(activities) - # clock.mark_tracked(tracked_activities) - if not is_debug: - db.insert_time_entries(tracked_activities) - db.insert_activities(tracked_activities) + red.track_activities( + activities, + on_success=None if is_debug else save_tracked_activity, + ) except Exception as e: logger.error(e)