From 77f35bc75744f2a028391aeda17858dfdff6b939 Mon Sep 17 00:00:00 2001 From: Eduard Date: Thu, 19 Jun 2025 11:19:48 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9F=D0=BE=D0=BB=D1=83=D1=87=D0=B5=D0=BD?= =?UTF-8?q?=D0=B8=D0=B5=20=D1=82=D0=B5=D0=B3=D0=BE=D0=B2=20=D1=81=20=D1=81?= =?UTF-8?q?=D0=B5=D1=80=D0=B2=D0=B5=D1=80=D0=B0=20=D1=82=D0=BE=D0=BB=D1=8C?= =?UTF-8?q?=D0=BA=D0=BE=20=D0=BF=D1=80=D0=B8=20=D0=BE=D0=B1=D0=BD=D0=BE?= =?UTF-8?q?=D0=B2=D0=BB=D0=B5=D0=BD=D0=B8=D0=B8=20=D0=91=D0=94.=20=D0=98?= =?UTF-8?q?=D1=81=D0=BF=D1=80=D0=B0=D0=B2=D0=B8=D0=BB=20=D0=B1=D0=B0=D0=B3?= =?UTF-8?q?=20=D1=81=20=D0=BF=D1=80=D0=B5=D0=B4=D1=83=D0=BF=D1=80=D0=B5?= =?UTF-8?q?=D0=B6=D0=B4=D0=B5=D0=BD=D0=B8=D0=B5=D0=BC=20=D0=BE=D0=B1=20?= =?UTF-8?q?=D1=83=D1=81=D1=82=D0=B0=D1=80=D0=B5=D0=B2=D1=88=D0=B5=D0=B9=20?= =?UTF-8?q?=D0=91=D0=94,=20=D0=BA=D0=BE=D0=B3=D0=B4=D0=B0=20=D0=BD=D0=B5?= =?UTF-8?q?=20=D1=83=D0=BA=D0=B0=D0=B7=D0=B0=D0=BD=20vetro=5Fproject?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- api/clockify.py | 29 ++++++++++++++++++++--------- db/db.py | 24 +++++++++++++++++++++--- track.py | 2 +- 3 files changed, 42 insertions(+), 13 deletions(-) diff --git a/api/clockify.py b/api/clockify.py index a7b4884..e332d7a 100644 --- a/api/clockify.py +++ b/api/clockify.py @@ -23,7 +23,7 @@ class ClockifyAPI(ClockifyConfig): super().__init__(*args, **kwargs) self.token = self._check_token(token) - def get_activities(self, **kwargs) -> list[Activity]: + def get_activities(self, is_updating=False, **kwargs) -> list[Activity]: """ Получает с сервера Clockify активности за определнный период start: datetime - Начальная дата (обязательно) @@ -36,7 +36,10 @@ class ClockifyAPI(ClockifyConfig): logger.info(f"Получено задач: {len(activities)}") 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 = [] 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 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] + 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: - task_id = parse_task_id(tag[0].title) + task_id = parse_task_id(tag.title) except ValueError: logger.info(f'{activity["timeInterval"]["start"]}: {activity["description"]} - Неправильный формат тега {tag}') continue @@ -76,18 +84,21 @@ class ClockifyAPI(ClockifyConfig): return result - def get_tags(self, **kwargs) -> list[Tag]: + def get_tags(self, is_updating=False, **kwargs) -> list[Tag]: """ Получает с сервера Clockify теги name: str - optional archived: bool - optional page-size: int - optional """ - tags = requests.get(self.base_url + self.tags_url, params=kwargs, headers={"X-API-KEY": self.token}).json() - return [Tag( - id=tag["id"], - title=tag["name"] - ) for tag in tags] + 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( + id=tag["id"], + title=tag["name"] + ) for tag in tags] + return db.get_tags() def get_vetro_projects(self) -> list[VetroProject]: """ diff --git a/db/db.py b/db/db.py index 0464dad..5ae8c81 100644 --- a/db/db.py +++ b/db/db.py @@ -35,9 +35,12 @@ class Database: for act in activities: if is_updated: 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() - if not tags or not vetro_projects: - is_updated = False + vetro_project_id = act.vetro_project_id + if vetro_project_id: + 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: self.cursor.execute( "INSERT INTO activity VALUES(?,?,?,?,?,?,?,?,?,?)", @@ -193,3 +196,18 @@ class Database: } except Exception as 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) diff --git a/track.py b/track.py index dd5164b..a4a2f52 100644 --- a/track.py +++ b/track.py @@ -80,7 +80,7 @@ def main(): if args.init_db: logger.info(Fore.YELLOW + "Обновление базы данных..." + Fore.RESET) 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_activity_types(red.get_time_entry_activities()) except Exception as e: -- 2.49.1