Сохранять трудочасы в БД сразу после успешного Redmine
- убрать tqdm из занесения трудочасов в Redmine - логировать успех и ошибку по каждой активности - обновлять is_tracked и time_entry сразу после успешного занесения - выводить в итоговом логе список незанесённых задач
This commit is contained in:
@@ -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]:
|
||||
|
||||
@@ -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
|
||||
|
||||
14
track.py
14
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)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user