67 lines
2.4 KiB
Python
67 lines
2.4 KiB
Python
"""Сервис переноса трудочасов из Clockify в Redmine."""
|
|
|
|
import logging
|
|
|
|
from colorama import Fore
|
|
|
|
from utils import format_date
|
|
|
|
logger = logging.getLogger(__name__)
|
|
|
|
|
|
class TrackingService:
|
|
"""Координирует загрузку, сохранение и перенос активностей в Redmine."""
|
|
|
|
def __init__(self, clock, red, db, is_debug: bool):
|
|
self.clock = clock
|
|
self.red = red
|
|
self.db = db
|
|
self.is_debug = is_debug
|
|
|
|
def track_period(self, start, end, page_size: int | None):
|
|
"""Переносит активности за период и возвращает список найденных активностей."""
|
|
self._save_current_user()
|
|
activities = sorted(
|
|
self.clock.get_activities(
|
|
**{
|
|
"start": format_date(start),
|
|
"end": format_date(end),
|
|
"page-size": page_size,
|
|
},
|
|
),
|
|
key=lambda x: x.date_start,
|
|
)
|
|
if not activities:
|
|
logger.info(Fore.YELLOW + "Нет задач для занесения трудочасов" + Fore.RESET)
|
|
return []
|
|
|
|
self.db.insert_activities(activities)
|
|
self.red.track_activities(
|
|
activities,
|
|
on_success=None if self.is_debug else self._save_tracked_activity,
|
|
)
|
|
return activities
|
|
|
|
def _save_current_user(self):
|
|
"""Сохраняет связку текущих пользователей Clockify и Redmine."""
|
|
user = self.clock.get_user()
|
|
clock_user = {
|
|
"clockify_user_id": user["id"],
|
|
"clockify_email": user["email"],
|
|
"clockify_username": user["username"],
|
|
}
|
|
user = self.red.get_user()
|
|
red_user = {
|
|
"redmine_user_id": user["id"],
|
|
"redmine_email": user["email"],
|
|
"first_name": user["first_name"],
|
|
"last_name": user["last_name"],
|
|
"redmine_username": user["username"],
|
|
}
|
|
self.db.insert_user(**clock_user, **red_user)
|
|
|
|
def _save_tracked_activity(self, activity):
|
|
"""Сохраняет активность как успешно перенесенную в Redmine."""
|
|
self.db.insert_activities([activity])
|
|
self.db.insert_time_entries([activity])
|