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. Настройка осуществляется установкой переменных окружения при старте
|
1. Настройка осуществляется установкой переменных окружения при старте
|
||||||
- TODO_PATH - каталог (локальный), где хранится файл с заданиями
|
- TODOS_PATH - каталог (локальный), где хранится файл с заданиями
|
||||||
- TODO_FILE - имя файла с заданиями
|
|
||||||
2. Формат файла с заданиями такой: это MarkDown с жесткой структурой
|
2. Формат файла с заданиями такой: это MarkDown с жесткой структурой
|
||||||
|
|
||||||
```
|
```
|
||||||
|
|
||||||
# ToDo
|
# ToDo
|
||||||
|
|
||||||
- [ ] task 1
|
- [ ] task 1
|
||||||
- [ ] task 2
|
- [ ] task 2
|
||||||
|
|
||||||
```
|
```
|
||||||
|
|
||||||
сервис при добавлении новой задачи ищет строку `# ToDo`, после этого отступает одну пустую строку и добавляет задачу в формате MarkDown checked action. Советую ознакомиться с [форматом MarkDown](https://www.graef.io/basic-markdown-syntax/), потому что полезно.
|
сервис при добавлении новой задачи ищет строку `# ToDo`, после этого отступает одну пустую строку и добавляет задачу в формате MarkDown checked action. Советую ознакомиться с [форматом MarkDown](https://www.graef.io/basic-markdown-syntax/), потому что полезно.
|
||||||
@ -80,15 +77,25 @@
|
|||||||
3. Третья важная переменная окружения
|
3. Третья важная переменная окружения
|
||||||
- TOKEN - это тот авторизационный токен, который будет необходимо сообщить боту JeDoIst при добавлении себе списка задач.
|
- TOKEN - это тот авторизационный токен, который будет необходимо сообщить боту JeDoIst при добавлении себе списка задач.
|
||||||
|
|
||||||
|
4. Конфигурационный файл. Формат JSON, содержит список путей к TODO-файлам относительно TODOS_PATH, указанных в п.1.
|
||||||
|
|
||||||
|
```
|
||||||
|
{
|
||||||
|
"lists": {
|
||||||
|
"personal": "./test/personal.md",
|
||||||
|
"work": "./test/work.md"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
## Запуск
|
## Запуск
|
||||||
|
|
||||||
Запуск осуществляется стандартным путем, с помощью `docker-compose`:
|
Запуск осуществляется стандартным путем, с помощью `docker-compose`:
|
||||||
|
|
||||||
```
|
```
|
||||||
> TODO_PATH=/path/to/dir \
|
> TODOS_PATH=/path/to/dir \
|
||||||
TODO_FILE=file.md \
|
|
||||||
TOKEN=my-secret-token \
|
TOKEN=my-secret-token \
|
||||||
|
CONFIG_FILE=/path/to/config
|
||||||
docker-compose up -d
|
docker-compose up -d
|
||||||
```
|
```
|
||||||
|
|
||||||
@ -107,6 +114,7 @@
|
|||||||
1. имя списка задач - необходимо для того, чтобы после введенной задачи (в диалоге бота в Телеграм) указать, в какой список добавить задачу
|
1. имя списка задач - необходимо для того, чтобы после введенной задачи (в диалоге бота в Телеграм) указать, в какой список добавить задачу
|
||||||
2. `callback URL` - это внешний адрес вашего запущенного сервиса (по этой инструкции). Если вы арендовали VPS, то добавьте в ее FireWall порт 8080 для настоящего сервиса, и укажите в диалоге бота адрес `http://YOUR_VPS_IP:8080/create-task`
|
2. `callback URL` - это внешний адрес вашего запущенного сервиса (по этой инструкции). Если вы арендовали VPS, то добавьте в ее FireWall порт 8080 для настоящего сервиса, и укажите в диалоге бота адрес `http://YOUR_VPS_IP:8080/create-task`
|
||||||
3. токен авторизации - тот самый токен, который указан при запуске настоящего сервиса на вашем VPS
|
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}
|
image: localhost:5001/jedoist-client:${APP_VERSION}
|
||||||
environment:
|
environment:
|
||||||
- TOKEN=${TOKEN}
|
- TOKEN=${TOKEN}
|
||||||
- TODO_PATH=/mnt/todo
|
- TODOS_PATH=/mnt/todos
|
||||||
- TODO_FILE=${TODO_FILE}
|
- CONFIG_FILE=/mnt/config.json
|
||||||
volumes:
|
volumes:
|
||||||
- ${TODO_PATH}:/mnt/todo
|
- ${TODOS_PATH}:/mnt/todos
|
||||||
|
- ${CONFIG_FILE}:/mnt/config.json
|
||||||
restart: on-failure
|
restart: on-failure
|
||||||
networks:
|
networks:
|
||||||
- jedoist
|
- jedoist
|
38
src/main.py
38
src/main.py
@ -1,6 +1,7 @@
|
|||||||
import falcon
|
import falcon
|
||||||
import json
|
import json
|
||||||
import os
|
import os
|
||||||
|
from typing import Optional
|
||||||
|
|
||||||
# https://falcon.readthedocs.io/en/stable/user/quickstart.html#learning-by-example
|
# https://falcon.readthedocs.io/en/stable/user/quickstart.html#learning-by-example
|
||||||
|
|
||||||
@ -115,12 +116,25 @@ class CreateTaskResource:
|
|||||||
|
|
||||||
TODO_HEADER = '# ToDo'
|
TODO_HEADER = '# ToDo'
|
||||||
|
|
||||||
def __init__(self) -> None:
|
def __init__(self, config_file: str, todos_path: str) -> None:
|
||||||
self.__todo_path = "{0}/{1}".format(os.environ['TODO_PATH'], os.environ['TODO_FILE'])
|
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']
|
task = req.context.doc['task']
|
||||||
self.__create_task(task)
|
self.__create_task(task, file_path)
|
||||||
quote = {
|
quote = {
|
||||||
'title': 'Получена задача',
|
'title': 'Получена задача',
|
||||||
'description': task
|
'description': task
|
||||||
@ -128,11 +142,20 @@ class CreateTaskResource:
|
|||||||
resp.media = quote
|
resp.media = quote
|
||||||
resp.status = falcon.HTTP_201
|
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 = []
|
content = []
|
||||||
section_found = False
|
section_found = False
|
||||||
is_waiting_empty_line = 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():
|
while line := file.readline():
|
||||||
if section_found == False:
|
if section_found == False:
|
||||||
if line.strip() == CreateTaskResource.TODO_HEADER:
|
if line.strip() == CreateTaskResource.TODO_HEADER:
|
||||||
@ -154,4 +177,5 @@ app = falcon.App(
|
|||||||
JSONTranslator()
|
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