Сохранять трудочасы в БД сразу после успешного Redmine

- убрать tqdm из занесения трудочасов в Redmine
- логировать успех и ошибку по каждой активности
- обновлять is_tracked и time_entry сразу после успешного занесения
- выводить в итоговом логе список незанесённых задач
This commit is contained in:
2026-06-19 16:45:24 +03:00
parent e7cbffcd70
commit 4e2aea78fe
3 changed files with 34 additions and 15 deletions

View File

@@ -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]: