From 4888f3d48538e01fe32f52eac273fb904b31d59a Mon Sep 17 00:00:00 2001 From: bvn13 Date: Sat, 29 Jun 2024 00:08:56 +0300 Subject: [PATCH] added ability to setup multiple lists --- README.md | 20 +++++++++++------ docker-compose.yaml | 7 +++--- src/main.py | 52 +++++++++++++++++++++++++++++++++------------ version | 2 +- 4 files changed, 57 insertions(+), 24 deletions(-) diff --git a/README.md b/README.md index 63d9b8a..8b34273 100644 --- a/README.md +++ b/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` # Важная информация diff --git a/docker-compose.yaml b/docker-compose.yaml index 603cfb7..6c6c845 100644 --- a/docker-compose.yaml +++ b/docker-compose.yaml @@ -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 \ No newline at end of file diff --git a/src/main.py b/src/main.py index e6ec38b..c01b4ac 100644 --- a/src/main.py +++ b/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,24 +116,46 @@ 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): - task = req.context.doc['task'] - self.__create_task(task) - quote = { - 'title': 'Получена задача', - 'description': task - } - resp.media = quote - resp.status = falcon.HTTP_201 + 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, file_path) + quote = { + 'title': 'Получена задача', + 'description': task + } + 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'])) diff --git a/version b/version index b966e81..589268e 100644 --- a/version +++ b/version @@ -1 +1 @@ -1.2.4 \ No newline at end of file +1.3.0 \ No newline at end of file