added ability to setup multiple lists
This commit is contained in:
parent
fe559edc97
commit
4888f3d485
20
README.md
20
README.md
@ -62,17 +62,14 @@
|
||||
## Настройка запуска
|
||||
|
||||
1. Настройка осуществляется установкой переменных окружения при старте
|
||||
- TODO_PATH - каталог (локальный), где хранится файл с заданиями
|
||||
- TODO_FILE - имя файла с заданиями
|
||||
- TODOS_PATH - каталог (локальный), где хранится файл с заданиями
|
||||
2. Формат файла с заданиями такой: это MarkDown с жесткой структурой
|
||||
|
||||
```
|
||||
|
||||
# ToDo
|
||||
|
||||
- [ ] task 1
|
||||
- [ ] task 2
|
||||
|
||||
```
|
||||
|
||||
сервис при добавлении новой задачи ищет строку `# ToDo`, после этого отступает одну пустую строку и добавляет задачу в формате MarkDown checked action. Советую ознакомиться с [форматом MarkDown](https://www.graef.io/basic-markdown-syntax/), потому что полезно.
|
||||
@ -80,15 +77,25 @@
|
||||
3. Третья важная переменная окружения
|
||||
- TOKEN - это тот авторизационный токен, который будет необходимо сообщить боту JeDoIst при добавлении себе списка задач.
|
||||
|
||||
4. Конфигурационный файл. Формат JSON, содержит список путей к TODO-файлам относительно TODOS_PATH, указанных в п.1.
|
||||
|
||||
```
|
||||
{
|
||||
"lists": {
|
||||
"personal": "./test/personal.md",
|
||||
"work": "./test/work.md"
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## Запуск
|
||||
|
||||
Запуск осуществляется стандартным путем, с помощью `docker-compose`:
|
||||
|
||||
```
|
||||
> TODO_PATH=/path/to/dir \
|
||||
TODO_FILE=file.md \
|
||||
> TODOS_PATH=/path/to/dir \
|
||||
TOKEN=my-secret-token \
|
||||
CONFIG_FILE=/path/to/config
|
||||
docker-compose up -d
|
||||
```
|
||||
|
||||
@ -107,6 +114,7 @@
|
||||
1. имя списка задач - необходимо для того, чтобы после введенной задачи (в диалоге бота в Телеграм) указать, в какой список добавить задачу
|
||||
2. `callback URL` - это внешний адрес вашего запущенного сервиса (по этой инструкции). Если вы арендовали VPS, то добавьте в ее FireWall порт 8080 для настоящего сервиса, и укажите в диалоге бота адрес `http://YOUR_VPS_IP:8080/create-task`
|
||||
3. токен авторизации - тот самый токен, который указан при запуске настоящего сервиса на вашем VPS
|
||||
4. Для списка важно задать ID - он указывается в `config.json` в качестве ключей объекта `$.['lists']`. Этот ID необходимо указать в callback URL в параметре `list`: `http://YOUR_VPS_IP:8080/create-task?list=personal`
|
||||
|
||||
# Важная информация
|
||||
|
||||
|
@ -11,10 +11,11 @@ services:
|
||||
image: localhost:5001/jedoist-client:${APP_VERSION}
|
||||
environment:
|
||||
- TOKEN=${TOKEN}
|
||||
- TODO_PATH=/mnt/todo
|
||||
- TODO_FILE=${TODO_FILE}
|
||||
- TODOS_PATH=/mnt/todos
|
||||
- CONFIG_FILE=/mnt/config.json
|
||||
volumes:
|
||||
- ${TODO_PATH}:/mnt/todo
|
||||
- ${TODOS_PATH}:/mnt/todos
|
||||
- ${CONFIG_FILE}:/mnt/config.json
|
||||
restart: on-failure
|
||||
networks:
|
||||
- jedoist
|
38
src/main.py
38
src/main.py
@ -1,6 +1,7 @@
|
||||
import falcon
|
||||
import json
|
||||
import os
|
||||
from typing import Optional
|
||||
|
||||
# https://falcon.readthedocs.io/en/stable/user/quickstart.html#learning-by-example
|
||||
|
||||
@ -115,12 +116,25 @@ class CreateTaskResource:
|
||||
|
||||
TODO_HEADER = '# ToDo'
|
||||
|
||||
def __init__(self) -> None:
|
||||
self.__todo_path = "{0}/{1}".format(os.environ['TODO_PATH'], os.environ['TODO_FILE'])
|
||||
def __init__(self, config_file: str, todos_path: str) -> None:
|
||||
self.__todos_path = todos_path
|
||||
self.__config = self.__read_config_file(config_file)
|
||||
|
||||
def on_post(self, req, resp):
|
||||
def on_post(self, req, resp, params):
|
||||
list_id = 'default'
|
||||
if 'lists' in params:
|
||||
list_id = params['lists']
|
||||
file_path = self.__detect_todo_file_path(list_id)
|
||||
if file_path == None:
|
||||
quote = {
|
||||
'title': 'Ошибка настройки',
|
||||
'description': 'В URL не указан параметр "list"'
|
||||
}
|
||||
resp.media = quote
|
||||
resp.status = falcon.HTTP_500
|
||||
else:
|
||||
task = req.context.doc['task']
|
||||
self.__create_task(task)
|
||||
self.__create_task(task, file_path)
|
||||
quote = {
|
||||
'title': 'Получена задача',
|
||||
'description': task
|
||||
@ -128,11 +142,20 @@ class CreateTaskResource:
|
||||
resp.media = quote
|
||||
resp.status = falcon.HTTP_201
|
||||
|
||||
def __create_task(self, text: str) -> None:
|
||||
def __read_config_file(self, config_file: str) -> None:
|
||||
with open(config_file, 'r') as f:
|
||||
return json.load(f)
|
||||
|
||||
def __detect_todo_file_path(self, todo_list_id) -> Optional[str]:
|
||||
if not 'lists' in self.__config or not todo_list_id in self.__config['lists']:
|
||||
return None
|
||||
return "{0}/{1}".format(self.__todos_path, self.__config['lists'][todo_list_id])
|
||||
|
||||
def __create_task(self, text: str, file_path: str) -> None:
|
||||
content = []
|
||||
section_found = False
|
||||
is_waiting_empty_line = False
|
||||
with open(self.__todo_path, 'r', encoding='UTF-8') as file:
|
||||
with open(file_path, 'r', encoding='UTF-8') as file:
|
||||
while line := file.readline():
|
||||
if section_found == False:
|
||||
if line.strip() == CreateTaskResource.TODO_HEADER:
|
||||
@ -154,4 +177,5 @@ app = falcon.App(
|
||||
JSONTranslator()
|
||||
]
|
||||
)
|
||||
app.add_route('/create-task', CreateTaskResource())
|
||||
app.add_route('/create-task', CreateTaskResource(config_file=os.environ['CONFIG_FILE'],
|
||||
todos_path=os.environ['TODOS_PATH']))
|
||||
|
Loading…
Reference in New Issue
Block a user