From 5ea040815e6a639dba0247b70bec733706f50617 Mon Sep 17 00:00:00 2001 From: QuickLike Date: Sat, 24 May 2025 16:09:57 +0300 Subject: [PATCH] =?UTF-8?q?=D0=90=D0=B2=D1=82=D0=BE=D0=BC=D0=B0=D1=82?= =?UTF-8?q?=D0=B8=D1=87=D0=B5=D1=81=D0=BA=D0=B0=D1=8F=20=D0=BF=D0=BE=D0=B4?= =?UTF-8?q?=D0=B3=D1=80=D1=83=D0=B7=D0=BA=D0=B0=20=D0=BF=D0=B5=D1=80=D0=B5?= =?UTF-8?q?=D0=BC=D0=B5=D0=BD=D0=BD=D1=8B=D1=85=20=D1=81=20=D1=81=D0=B5?= =?UTF-8?q?=D1=80=D0=B2=D0=B5=D1=80=D0=B0=20=D0=BF=D1=80=D0=B8=20=D0=B8?= =?UTF-8?q?=D1=85=20=D0=BE=D1=82=D1=81=D1=83=D1=82=D1=81=D1=82=D0=B2=D0=B8?= =?UTF-8?q?=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 1 + README.MD | 9 +++++---- api/clockify.py | 14 ++++++++++++++ api/redmine.py | 4 ++-- config/__init__.py | 5 +++-- env.example | 4 ++++ track.py | 12 ++++++++++-- 7 files changed, 39 insertions(+), 10 deletions(-) create mode 100644 env.example diff --git a/.gitignore b/.gitignore index afafcd3..4c693dd 100644 --- a/.gitignore +++ b/.gitignore @@ -123,6 +123,7 @@ celerybeat.pid *.sage.py # Environments +.env.txt .env .venv env/ diff --git a/README.MD b/README.MD index 5a5e66e..18508e1 100644 --- a/README.MD +++ b/README.MD @@ -11,6 +11,7 @@ |Описание задачи (Description)|Комментарий|Уточнение у аналитика| |Теги (Tags)|<Задача> - <Название задачи>|28882 - Прочие активности по Ветро| |Трекать/Не трекать (Billable/Non-billable)|<Занесена в Redmine или нет>|Если выбрано, то активность будет перенесена +
Тег обязательно должен содержать номер задачи (5 цифр) в начале.
28882 - Прочие активности
28882
@@ -54,11 +55,11 @@ touch .env ```env *REDMINE_TOKEN= *CLOCKIFY_TOKEN= -*CLOCKIFY_USER_ID= -*CLOCKIFY_WORKSPACE_ID= +?USER_ID= +?WORKSPACE_ID= ``` -\* - Обязательные
-? - Опциональные +\* - Обязательные.
+? - Опциональные. Могут быть пустыми, но не должны отсутствовать вовсе. ## Запуск. diff --git a/api/clockify.py b/api/clockify.py index e6d8e5c..6326cc8 100644 --- a/api/clockify.py +++ b/api/clockify.py @@ -123,3 +123,17 @@ class ClockifyAPI(ClockifyConfig): resp = resp.json() logger.debug({"id": resp["id"], "email": resp["email"], "name": resp["name"]}) return token + + def getenvs(self): + resp = requests.get(self.base_url + self.user_url, headers={"X-API-KEY": self.token}) + filename = ".env.txt" + if not resp.ok: + logger.error(resp.json()) + raise requests.exceptions.RequestException(Fore.RED + "Ошибка запроса.") + with open(filename, "w") as file: + try: + file.write(f"USER_ID={resp.json()['id']}\nWORKSPACE_ID={resp.json()['activeWorkspace']}") + logger.info(f"{Fore.GREEN}Необходимые переменные были сохранены в файл {filename}{Fore.RESET}") + except Exception as e: + logger.error(f"{Fore.RED}Не удалось сохранить необходимые переменные.{Fore.RESET}") + raise e \ No newline at end of file diff --git a/api/redmine.py b/api/redmine.py index fee8a21..d1a4c13 100644 --- a/api/redmine.py +++ b/api/redmine.py @@ -12,8 +12,8 @@ from exceptions import InvalidToken logger = logging.getLogger(__name__) -WORKSPACE_ID = config.CLOCKIFY_WORKSPACE_ID -USER_ID = config.CLOCKIFY_USER_ID +WORKSPACE_ID = config.WORKSPACE_ID +USER_ID = config.USER_ID class RedmineAPI(RedmineConfig): diff --git a/config/__init__.py b/config/__init__.py index a078ec0..50d62ef 100644 --- a/config/__init__.py +++ b/config/__init__.py @@ -13,9 +13,10 @@ load_dotenv() class Config(BaseSettings): CLOCKIFY_TOKEN: str REDMINE_TOKEN: str - CLOCKIFY_USER_ID: str - CLOCKIFY_WORKSPACE_ID: str + USER_ID: str = None + WORKSPACE_ID: str = None + ENV_TXT: str = ".env.txt" DB_NAME: str = "RedmineTracker.db" SQL_PATH: str = "config/RedmineTracker.sql" diff --git a/env.example b/env.example new file mode 100644 index 0000000..295928b --- /dev/null +++ b/env.example @@ -0,0 +1,4 @@ +REDMINE_TOKEN= +CLOCKIFY_TOKEN= +USER_ID= +WORKSPACE_ID= \ No newline at end of file diff --git a/track.py b/track.py index 854e13c..ff63693 100644 --- a/track.py +++ b/track.py @@ -1,4 +1,5 @@ import logging +import os.path import sys logging.basicConfig( @@ -18,8 +19,8 @@ from config import arg_parser, config, db # noqa: E402 from utils import format_date, str_to_date, today_start, today_end # noqa: E402 -WORKSPACE_ID = config.CLOCKIFY_WORKSPACE_ID -USER_ID = config.CLOCKIFY_USER_ID +WORKSPACE_ID = config.WORKSPACE_ID +USER_ID = config.USER_ID def main(): @@ -47,6 +48,13 @@ def main(): workspace_id=WORKSPACE_ID, user_id=USER_ID ) + if not WORKSPACE_ID or not USER_ID: + if not os.path.exists(config.ENV_TXT): + logging.info(f"{Fore.YELLOW}Необходимые переменные не были обнаружены. Попытка получения...{Fore.RESET}") + clock.getenvs() + else: + logger.info(f'{Fore.YELLOW}Проверьте файл "{config.ENV_TXT}". Если необходимых переменных в нём нет, то просто удалите его.{Fore.RESET}') + return red = RedmineAPI(config.REDMINE_TOKEN) if args.init_db: