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: