From bb57e3828b1693d3fc869f15cf7c00bb41072393 Mon Sep 17 00:00:00 2001 From: Eduard Date: Mon, 26 May 2025 13:16:24 +0300 Subject: [PATCH] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8=D0=BB=20?= =?UTF-8?q?=D1=81=D1=82=D1=80=D0=BE=D0=BA=D0=B8=20=D0=B4=D0=BE=D0=BA=D1=83?= =?UTF-8?q?=D0=BC=D0=B5=D0=BD=D1=82=D0=B0=D1=86=D0=B8=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- api/clockify.py | 22 ++++++++++++++++------ api/redmine.py | 3 +++ db/db.py | 5 +++++ 3 files changed, 24 insertions(+), 6 deletions(-) diff --git a/api/clockify.py b/api/clockify.py index 3676721..199084a 100644 --- a/api/clockify.py +++ b/api/clockify.py @@ -21,10 +21,11 @@ class ClockifyAPI(ClockifyConfig): def get_activities(self, **kwargs) -> list[Activity]: """ - start: datetime - Начальная дата (обязательно) - end: datetime - Конечная дата (обязательно) - page: int - Номер страницы - page-size: int - Размер страницы (по умолчанию 50) + Получает с сервера Clockify активности за определнный период + start: datetime - Начальная дата (обязательно) + end: datetime - Конечная дата (обязательно) + page: int - Номер страницы + page-size: int - Размер страницы (по умолчанию 50) """ time_entries_url = self.time_entries_url activities = requests.get(self.base_url + time_entries_url, params=kwargs, headers={"X-API-KEY": self.token}).json() @@ -67,8 +68,9 @@ class ClockifyAPI(ClockifyConfig): def get_tags(self, **kwargs) -> list[Tag]: """ - name: str - optional - archived: bool - optional + Получает с сервера Clockify теги + name: str - optional + archived: bool - optional """ tags = requests.get(self.base_url + self.tags_url, params=kwargs, headers={"X-API-KEY": self.token}).json() return [Tag( @@ -77,6 +79,9 @@ class ClockifyAPI(ClockifyConfig): ) for tag in tags] def get_vetro_projects(self) -> list[VetroProject]: + """ + Получает с сервера Clockify Проекты (ДО) Ветро + """ projects = requests.get(self.base_url + self.projects_url, headers={"X-API-KEY": self.token}).json() for project in projects: if not project.get("archived"): @@ -87,6 +92,9 @@ class ClockifyAPI(ClockifyConfig): ) for vetro_project in vetro_projects] def mark_tracked(self, activities: list[Activity]): + """ + Помечает активности затреканными (Billable) на сервере Clockify + """ for activity in activities: try: resp = requests.put( @@ -115,6 +123,7 @@ class ClockifyAPI(ClockifyConfig): return def _check_token(self, token: str) -> str: + """Проверяет токен""" resp = requests.get(self.base_url + self.user_url, headers={"X-API-KEY": token}) if not resp.ok: logger.error(resp.json()) @@ -124,6 +133,7 @@ class ClockifyAPI(ClockifyConfig): return token def getenvs(self): + """Получает нужные USER_ID и WORKSPACE_ID с сервера Clockify""" resp = requests.get(self.base_url + self.user_url, headers={"X-API-KEY": self.token}) if not resp.ok: logger.error(resp.json()) diff --git a/api/redmine.py b/api/redmine.py index fea98c4..98346d7 100644 --- a/api/redmine.py +++ b/api/redmine.py @@ -22,6 +22,7 @@ class RedmineAPI(RedmineConfig): self.token = self._check_token(token) def track_activities(self, activities: list[Activity]) -> list[Activity]: + """Заносит трудочасы на сервер Redmine""" if len(activities) == 0: logger.info(Fore.YELLOW + "Нет задач для занесения трудочасов" + Fore.RESET) return @@ -60,6 +61,7 @@ class RedmineAPI(RedmineConfig): return tracked def get_time_entry_activities(self) -> list[ActivityTypes]: + """Получает виды Деятельности с сервера Redmine""" resp = requests.get(self.base_url + self.time_entry_activities, headers={"X-Redmine-API-KEY": self.token}) logging.debug(resp.json()) if resp.ok: @@ -70,6 +72,7 @@ class RedmineAPI(RedmineConfig): ] def _check_token(self, token): + """Проверяет токен""" resp = requests.get(self.base_url + self.my_account_url, headers={"X-Redmine-Api-Key": token}) if not resp.ok: logger.error("Invalid Token for RedmineAPI") diff --git a/db/db.py b/db/db.py index abc870d..603d875 100644 --- a/db/db.py +++ b/db/db.py @@ -26,6 +26,7 @@ class Database: self.con.rollback() def insert_activities(self, activities: list[Activity]): + """Сохраняет в базу данных активности Clockify""" is_updated = True for act in activities: if is_updated: @@ -71,6 +72,7 @@ class Database: logging.info(Fore.YELLOW + "База данных устарела. Рекомендуем обновить с помощью флага -i [--init-db]" + Fore.RESET) def insert_time_entries(self, activities: list[Activity]): + """Сохраняет в базу данных трудочасы Redmine""" for act in activities: try: self.cursor.execute( @@ -92,6 +94,7 @@ class Database: def insert_tags(self, tags: list[Tag]): + """Сохраняет в базу данных теги Clockify""" for tag in tags: try: self.cursor.execute("INSERT INTO tags VALUES(?, ?)",(tag.id,tag.title)) @@ -107,6 +110,7 @@ class Database: def insert_vetro_projects(self, vetro_projects: list[VetroProject]): + """Сохраняет в базу данных Проекты (ДО) Ветро Clockify""" for vetro_project in vetro_projects: try: self.cursor.execute("INSERT INTO vetro_projects VALUES(?, ?)", (vetro_project.id, vetro_project.title)) @@ -121,6 +125,7 @@ class Database: self.con.commit() def insert_activity_types(self, activity_types: list[ActivityType]): + """Сохраняет в базу данных Деятельности Redmine""" for activity_type in activity_types: try: self.cursor.execute("INSERT INTO activity_types VALUES(?, ?)", (activity_type.id, activity_type.title))