Автоматическая подгрузка переменных с сервера при их отсутствии
This commit is contained in:
1
.gitignore
vendored
1
.gitignore
vendored
@@ -123,6 +123,7 @@ celerybeat.pid
|
|||||||
*.sage.py
|
*.sage.py
|
||||||
|
|
||||||
# Environments
|
# Environments
|
||||||
|
.env.txt
|
||||||
.env
|
.env
|
||||||
.venv
|
.venv
|
||||||
env/
|
env/
|
||||||
|
|||||||
@@ -11,6 +11,7 @@
|
|||||||
|Описание задачи (Description)|Комментарий|Уточнение у аналитика|
|
|Описание задачи (Description)|Комментарий|Уточнение у аналитика|
|
||||||
|Теги (Tags)|<Задача> - <Название задачи>|28882 - Прочие активности по Ветро|
|
|Теги (Tags)|<Задача> - <Название задачи>|28882 - Прочие активности по Ветро|
|
||||||
|Трекать/Не трекать (Billable/Non-billable)|<Занесена в Redmine или нет>|Если выбрано, то активность будет перенесена
|
|Трекать/Не трекать (Billable/Non-billable)|<Занесена в Redmine или нет>|Если выбрано, то активность будет перенесена
|
||||||
|
<br>
|
||||||
Тег обязательно должен содержать номер задачи (5 цифр) в начале.<br>
|
Тег обязательно должен содержать номер задачи (5 цифр) в начале.<br>
|
||||||
28882 - Прочие активности<br>
|
28882 - Прочие активности<br>
|
||||||
28882<br>
|
28882<br>
|
||||||
@@ -54,11 +55,11 @@ touch .env
|
|||||||
```env
|
```env
|
||||||
*REDMINE_TOKEN=<api_ключ_redmine>
|
*REDMINE_TOKEN=<api_ключ_redmine>
|
||||||
*CLOCKIFY_TOKEN=<api_ключ_clockify>
|
*CLOCKIFY_TOKEN=<api_ключ_clockify>
|
||||||
*CLOCKIFY_USER_ID=<user_id_clockify>
|
?USER_ID=<user_id_clockify>
|
||||||
*CLOCKIFY_WORKSPACE_ID=<workspace_id_clockify>
|
?WORKSPACE_ID=<workspace_id_clockify>
|
||||||
```
|
```
|
||||||
\* - Обязательные<br>
|
\* - Обязательные.<br>
|
||||||
? - Опциональные
|
? - Опциональные. Могут быть пустыми, но не должны отсутствовать вовсе.
|
||||||
|
|
||||||
|
|
||||||
## Запуск.
|
## Запуск.
|
||||||
|
|||||||
@@ -123,3 +123,17 @@ class ClockifyAPI(ClockifyConfig):
|
|||||||
resp = resp.json()
|
resp = resp.json()
|
||||||
logger.debug({"id": resp["id"], "email": resp["email"], "name": resp["name"]})
|
logger.debug({"id": resp["id"], "email": resp["email"], "name": resp["name"]})
|
||||||
return token
|
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
|
||||||
@@ -12,8 +12,8 @@ from exceptions import InvalidToken
|
|||||||
logger = logging.getLogger(__name__)
|
logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
WORKSPACE_ID = config.CLOCKIFY_WORKSPACE_ID
|
WORKSPACE_ID = config.WORKSPACE_ID
|
||||||
USER_ID = config.CLOCKIFY_USER_ID
|
USER_ID = config.USER_ID
|
||||||
|
|
||||||
|
|
||||||
class RedmineAPI(RedmineConfig):
|
class RedmineAPI(RedmineConfig):
|
||||||
|
|||||||
@@ -13,9 +13,10 @@ load_dotenv()
|
|||||||
class Config(BaseSettings):
|
class Config(BaseSettings):
|
||||||
CLOCKIFY_TOKEN: str
|
CLOCKIFY_TOKEN: str
|
||||||
REDMINE_TOKEN: str
|
REDMINE_TOKEN: str
|
||||||
CLOCKIFY_USER_ID: str
|
USER_ID: str = None
|
||||||
CLOCKIFY_WORKSPACE_ID: str
|
WORKSPACE_ID: str = None
|
||||||
|
|
||||||
|
ENV_TXT: str = ".env.txt"
|
||||||
DB_NAME: str = "RedmineTracker.db"
|
DB_NAME: str = "RedmineTracker.db"
|
||||||
SQL_PATH: str = "config/RedmineTracker.sql"
|
SQL_PATH: str = "config/RedmineTracker.sql"
|
||||||
|
|
||||||
|
|||||||
4
env.example
Normal file
4
env.example
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
REDMINE_TOKEN=
|
||||||
|
CLOCKIFY_TOKEN=
|
||||||
|
USER_ID=
|
||||||
|
WORKSPACE_ID=
|
||||||
12
track.py
12
track.py
@@ -1,4 +1,5 @@
|
|||||||
import logging
|
import logging
|
||||||
|
import os.path
|
||||||
import sys
|
import sys
|
||||||
|
|
||||||
logging.basicConfig(
|
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
|
from utils import format_date, str_to_date, today_start, today_end # noqa: E402
|
||||||
|
|
||||||
|
|
||||||
WORKSPACE_ID = config.CLOCKIFY_WORKSPACE_ID
|
WORKSPACE_ID = config.WORKSPACE_ID
|
||||||
USER_ID = config.CLOCKIFY_USER_ID
|
USER_ID = config.USER_ID
|
||||||
|
|
||||||
|
|
||||||
def main():
|
def main():
|
||||||
@@ -47,6 +48,13 @@ def main():
|
|||||||
workspace_id=WORKSPACE_ID,
|
workspace_id=WORKSPACE_ID,
|
||||||
user_id=USER_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)
|
red = RedmineAPI(config.REDMINE_TOKEN)
|
||||||
|
|
||||||
if args.init_db:
|
if args.init_db:
|
||||||
|
|||||||
Reference in New Issue
Block a user