Compare commits

...

2 Commits

3 changed files with 42 additions and 13 deletions

View File

@@ -23,7 +23,7 @@ class ClockifyAPI(ClockifyConfig):
super().__init__(*args, **kwargs) super().__init__(*args, **kwargs)
self.token = self._check_token(token) self.token = self._check_token(token)
def get_activities(self, **kwargs) -> list[Activity]: def get_activities(self, is_updating=False, **kwargs) -> list[Activity]:
""" """
Получает с сервера Clockify активности за определнный период Получает с сервера Clockify активности за определнный период
start: datetime - Начальная дата (обязательно) start: datetime - Начальная дата (обязательно)
@@ -36,7 +36,10 @@ class ClockifyAPI(ClockifyConfig):
logger.info(f"Получено задач: {len(activities)}") logger.info(f"Получено задач: {len(activities)}")
time_worked_out_total = 0 time_worked_out_total = 0
tags = self.get_tags(**{"page-size": self.tags_count}) tags = self.get_tags(is_updating=is_updating)
if not tags:
logging.info(f"{Fore.YELLOW}В базе данных нет тегов! Обновите БД при помощи флага -i [--init-db]{Fore.RESET}")
return []
result = [] result = []
for activity in tqdm(activities, desc="Парсинг задач"): for activity in tqdm(activities, desc="Парсинг задач"):
@@ -48,8 +51,13 @@ class ClockifyAPI(ClockifyConfig):
end = datetime.strptime(activity["timeInterval"]["end"], config.DATETIME_FORMAT) if activity["timeInterval"]["end"] else None end = datetime.strptime(activity["timeInterval"]["end"], config.DATETIME_FORMAT) if activity["timeInterval"]["end"] else None
time_worked_out_total += time_to_hour((end if end else datetime.utcnow()) - start) time_worked_out_total += time_to_hour((end if end else datetime.utcnow()) - start)
tag = [tag for tag in tags if tag.id == tag_id] tag = [tag for tag in tags if tag.id == tag_id]
if not tag:
logging.info(f"{Fore.YELLOW}В базе данных нет нужного тега {Fore.GREEN}{tag_id}{Fore.YELLOW}! Обновите БД при помощи флага -i [--init-db]{Fore.RESET}")
break
else:
tag = tag[0]
try: try:
task_id = parse_task_id(tag[0].title) task_id = parse_task_id(tag.title)
except ValueError: except ValueError:
logger.info(f'{activity["timeInterval"]["start"]}: {activity["description"]} - Неправильный формат тега {tag}') logger.info(f'{activity["timeInterval"]["start"]}: {activity["description"]} - Неправильный формат тега {tag}')
continue continue
@@ -76,18 +84,21 @@ class ClockifyAPI(ClockifyConfig):
return result return result
def get_tags(self, **kwargs) -> list[Tag]: def get_tags(self, is_updating=False, **kwargs) -> list[Tag]:
""" """
Получает с сервера Clockify теги Получает с сервера Clockify теги
name: str - optional name: str - optional
archived: bool - optional archived: bool - optional
page-size: int - optional page-size: int - optional
""" """
tags = requests.get(self.base_url + self.tags_url, params=kwargs, headers={"X-API-KEY": self.token}).json() if is_updating:
tags = requests.get(self.base_url + self.tags_url, params={"sort-column": "name", "sort-order": "descending", **kwargs}, headers={"X-API-KEY": self.token}).json()
logging.debug(f"{Fore.YELLOW}Получено тегов: {len(tags)}.{Fore.RESET}")
return [Tag( return [Tag(
id=tag["id"], id=tag["id"],
title=tag["name"] title=tag["name"]
) for tag in tags] ) for tag in tags]
return db.get_tags()
def get_vetro_projects(self) -> list[VetroProject]: def get_vetro_projects(self) -> list[VetroProject]:
""" """

View File

@@ -35,9 +35,12 @@ class Database:
for act in activities: for act in activities:
if is_updated: if is_updated:
tags = self.cursor.execute("SELECT * FROM tag WHERE id = ?", (act.tag_id, )).fetchall() tags = self.cursor.execute("SELECT * FROM tag WHERE id = ?", (act.tag_id, )).fetchall()
vetro_projects = self.cursor.execute("SELECT * FROM vetro_project WHERE id = ?", (act.vetro_project_id, )).fetchall() vetro_project_id = act.vetro_project_id
if not tags or not vetro_projects: if vetro_project_id:
is_updated = False vetro_projects = self.cursor.execute("SELECT * FROM vetro_project WHERE id = ?", (vetro_project_id, )).fetchall()
is_updated = tags or vetro_projects
else:
is_updated = bool(tags)
try: try:
self.cursor.execute( self.cursor.execute(
"INSERT INTO activity VALUES(?,?,?,?,?,?,?,?,?,?)", "INSERT INTO activity VALUES(?,?,?,?,?,?,?,?,?,?)",
@@ -193,3 +196,18 @@ class Database:
} }
except Exception as e: except Exception as e:
logging.error(e) logging.error(e)
def get_tags(self) -> list[Tag]:
"""Получает теги из бд"""
try:
tags = self.cursor.execute("SELECT * FROM tag").fetchall()
return [
Tag(
id=tag[0],
title=tag[1]
)
for tag in tags
]
except Exception as e:
logging.error(e)

View File

@@ -80,7 +80,7 @@ def main():
if args.init_db: if args.init_db:
logger.info(Fore.YELLOW + "Обновление базы данных..." + Fore.RESET) logger.info(Fore.YELLOW + "Обновление базы данных..." + Fore.RESET)
try: try:
db.insert_tags(clock.get_tags()) db.insert_tags(clock.get_tags(is_updating=True, **{"page-size": clock.tags_count}))
db.insert_vetro_projects(clock.get_vetro_projects()) db.insert_vetro_projects(clock.get_vetro_projects())
db.insert_activity_types(red.get_time_entry_activities()) db.insert_activity_types(red.get_time_entry_activities())
except Exception as e: except Exception as e: