добавил предпросмотр и защиту от повторной отправки трудочасов

This commit is contained in:
2026-07-06 16:28:00 +03:00
parent 0778cc23ae
commit ba9eafbb46
6 changed files with 87 additions and 5 deletions

View File

@@ -12,11 +12,12 @@ logger = logging.getLogger(__name__)
class TrackingService:
"""Координирует загрузку, сохранение и перенос активностей в Redmine."""
def __init__(self, clock, red, db, is_debug: bool):
def __init__(self, clock, red, db, is_debug: bool, is_dry_run: bool = False):
self.clock = clock
self.red = red
self.db = db
self.is_debug = is_debug
self.is_dry_run = is_dry_run
def track_period(self, start, end, page_size: int | None):
"""Переносит активности за период и возвращает список найденных активностей."""
@@ -34,6 +35,9 @@ class TrackingService:
if not activities:
logger.info(Fore.YELLOW + "Нет задач для занесения трудочасов" + Fore.RESET)
return []
if self.is_dry_run:
self._log_preview(activities)
return activities
self.db.insert_activities(activities)
self.red.track_activities(
@@ -64,3 +68,21 @@ class TrackingService:
"""Сохраняет активность как успешно перенесенную в Redmine."""
self.db.insert_activities([activity])
self.db.insert_time_entries([activity])
def _log_preview(self, activities):
"""Выводит план переноса активностей без сохранения и отправки."""
total_hours = sum(activity.time_spent for activity in activities if activity.date_end)
trackable_activities = [
activity
for activity in activities
if not activity.is_tracked and activity.date_end
]
logger.info(f"{Fore.YELLOW}Предпросмотр переноса трудочасов{Fore.RESET}")
logger.info(f"Найдено активностей: {len(activities)}")
logger.info(f"Готово к переносу: {len(trackable_activities)}")
logger.info(f"Всего часов: {total_hours}")
for activity in trackable_activities:
logger.info(
f"{activity.date_start.date()} | #{activity.task_id} | "
f"{activity.time_spent} ч | {activity.description}"
)