Сохранять трудочасы в БД сразу после успешного Redmine
- убрать tqdm из занесения трудочасов в Redmine - логировать успех и ошибку по каждой активности - обновлять is_tracked и time_entry сразу после успешного занесения - выводить в итоговом логе список незанесённых задач
This commit is contained in:
@@ -2,7 +2,6 @@ import logging
|
|||||||
|
|
||||||
from colorama import Fore
|
from colorama import Fore
|
||||||
import requests
|
import requests
|
||||||
from tqdm import tqdm
|
|
||||||
|
|
||||||
from classes.classes import Task
|
from classes.classes import Task
|
||||||
from config import RedmineConfig, config
|
from config import RedmineConfig, config
|
||||||
@@ -27,15 +26,19 @@ class RedmineAPI(RedmineConfig):
|
|||||||
self.token = token
|
self.token = token
|
||||||
self._check_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"""
|
"""Заносит трудочасы на сервер Redmine"""
|
||||||
is_beginner = config.is_beginner
|
is_beginner = config.is_beginner
|
||||||
if is_beginner:
|
if is_beginner:
|
||||||
logger.info(f"{Fore.YELLOW}Делим трудочасы пополам{Fore.RESET}")
|
logger.info(f"{Fore.YELLOW}Делим трудочасы пополам{Fore.RESET}")
|
||||||
tracked = []
|
tracked = []
|
||||||
for activity in tqdm(activities, desc="Занесение трудочасов"):
|
failed_activities = []
|
||||||
if not(not activity.is_tracked and activity.date_end):
|
activities_to_track = [
|
||||||
continue
|
activity
|
||||||
|
for activity in activities
|
||||||
|
if not activity.is_tracked and activity.date_end
|
||||||
|
]
|
||||||
|
for activity in activities_to_track:
|
||||||
try:
|
try:
|
||||||
if not config.is_debug:
|
if not config.is_debug:
|
||||||
resp = requests.post(
|
resp = requests.post(
|
||||||
@@ -53,18 +56,30 @@ class RedmineAPI(RedmineConfig):
|
|||||||
)
|
)
|
||||||
if config.is_debug or resp.ok:
|
if config.is_debug or resp.ok:
|
||||||
activity.is_tracked = True
|
activity.is_tracked = True
|
||||||
|
if on_success:
|
||||||
|
on_success(activity)
|
||||||
tracked.append(activity)
|
tracked.append(activity)
|
||||||
logger.debug(activity)
|
logger.info(f"{Fore.GREEN}{activity} успешно занесена в Redmine{Fore.RESET}".ljust(60) + "✅")
|
||||||
else:
|
else:
|
||||||
logger.error(Fore.RED + f"{activity} Не была затрекана" + Fore.RED)
|
try:
|
||||||
logger.error(f"{resp.json()['errors']} {resp.status_code}")
|
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:
|
except Exception as e:
|
||||||
logger.error(e)
|
logger.error(e)
|
||||||
|
failed_activities.append(activity)
|
||||||
continue
|
continue
|
||||||
if len(activities) == len(tracked):
|
if len(activities_to_track) == len(tracked):
|
||||||
logger.info(Fore.GREEN + "Все задачи были успешно занесены в Redmine" + Fore.RESET)
|
logger.info(Fore.GREEN + "Все задачи были успешно занесены в Redmine" + Fore.RESET)
|
||||||
else:
|
else:
|
||||||
logger.info(f"{Fore.YELLOW}Не все задачи были занесены в Redmine. Занесено {len(tracked)}{Fore.RESET}")
|
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
|
return tracked
|
||||||
|
|
||||||
def get_time_entry_activities(self) -> list[ActivityTypes]:
|
def get_time_entry_activities(self) -> list[ActivityTypes]:
|
||||||
|
|||||||
@@ -19,7 +19,7 @@ class Activity:
|
|||||||
is_tracked: bool = False
|
is_tracked: bool = False
|
||||||
|
|
||||||
def __str__(self):
|
def __str__(self):
|
||||||
return f'({self.task_id}) - {self.description}'[:60]
|
return f'({self.task_id}) - "{self.description}"'[:60]
|
||||||
|
|
||||||
|
|
||||||
@dataclass
|
@dataclass
|
||||||
|
|||||||
14
track.py
14
track.py
@@ -60,12 +60,16 @@ def main():
|
|||||||
logger.info(Fore.YELLOW + "Нет задач для занесения трудочасов" + Fore.RESET)
|
logger.info(Fore.YELLOW + "Нет задач для занесения трудочасов" + Fore.RESET)
|
||||||
return
|
return
|
||||||
db.insert_activities(activities)
|
db.insert_activities(activities)
|
||||||
|
|
||||||
|
def save_tracked_activity(activity):
|
||||||
|
db.insert_activities([activity])
|
||||||
|
db.insert_time_entries([activity])
|
||||||
|
|
||||||
try:
|
try:
|
||||||
tracked_activities = red.track_activities(activities)
|
red.track_activities(
|
||||||
# clock.mark_tracked(tracked_activities)
|
activities,
|
||||||
if not is_debug:
|
on_success=None if is_debug else save_tracked_activity,
|
||||||
db.insert_time_entries(tracked_activities)
|
)
|
||||||
db.insert_activities(tracked_activities)
|
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
logger.error(e)
|
logger.error(e)
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user