Создать новую ветку в репозитории и подготовить пул-реквест, реализующий описанный ниже функционал.
На Python + FastAPI реализовать REST эндпоинты для работы с публикациями участников конференции:
GET /conferences/{conference_id}/publications
- получение списка публикаций, поданных пользователем;GET /conferences/{conference_id}/applications/{application_id}/publication
- получение подробной информации о конкретной публикации;POST /conferences/{conference_id}/applications/{application_id}/publication
- подача новой публикации от участника конференции;PUT /conferences/{conference_id}/applications/{application_id}/publication
- замена (редактирование) файла с текстом публикации;PATCH /conferences/{conference_id}/applications/{application_id}/publication
- внесение изменений в мета-данные публикации.
В качестве базы данных (хранилища) информации о публикациях используется та же таблица Google.Sheets, в которой уже хранятся заявки на участие в конференции (см. #1 ). В таблицу с заявками добавляются дополнительные столбцы и каждая публикация привязывается к одной из ранее созданных заявок.
Также имеется еще одна таблица, в которой содержится информация о списке конференций. Полученный в запросе параметр {conference_id}
используется для поиска в этой таблице нужной конференции. Если конференция найдена, из соответствующей записи извлекается идентификатор гугл-таблицы с информацией о заявках на участие и дальнейшая работа ведется с этой конференцией. Если конференция не найдена, все эндпоинты возвращают ошибку 404. Если конференция найдена, но срок приема заявок уже прошел, все эндпоинты возвращают ошибку 403. Подробнее см. #2 .
В запросе должен быть обязательно указан один из следующих параметров, но не два или три одновременно:
- email,
- telegram_id,
- discord_id.
Значение входного параметра используется для фильтрации (поиска) публикаций в гугл-таблице.
JSON-список [{"id": 1, ...}, {"id": 2, ...}, ...]
, содержащий найденные записи. Формат отдельной записи в списке имеет следующий вид:
{
"id": "application_id", // идентификатор публикации совпадает с идентификатором заявки, к которой данная публикация привязана
"publication_title": "Название публикации", // может отличаться от названия доклада в исходной заявке
"upload_date": "дата загрузки",
"review_status": "статус рецензирования" // одно из значений "in progress", "changes requested", "rejected", "accepted"
}
Если поле "upload_date"
в гугл-таблице не заполнено (пустая строка), соответствующая запись не включается в выходные данные. Если найденных записей нет или у всех найденных записей пустое поле "upload_date"
, возвращается ошибка 404.
/conferences/3/publications?telegram_id="1234"
/conferences/1/publications/?email="example@example.com"
В запросе должен быть обязательно указан один из следующих параметров, но не два или три одновременно:
- email,
- telegram_id,
- discord_id.
Значение входного параметра используется для проверки прав доступа к публикации в гугл-таблице.
Осуществляется поиск заявки с идентификатором {application_id}
в гугл-таблице. Если заявка не найдена, возвращается ошибка 404. Если заявка найдена, проверяется значение поля "email"
, "telegram_id"
или "discord_id"
, в зависимости от того, какое из них было указано во входных данных. Если проверка не пройдена, возвращается ошибка 403. Если проверка пройдена успешно, возвращается подробная информация о публикации.
JSON следующего вида:
{
"id": "application_id", // идентификатор публикации совпадает с идентификатором заявки, к которой данная публикация привязана
"publication_title": "Название публикации", // может отличаться от названия доклада в исходной заявке
"upload_date": "дата загрузки",
"review_status": "статус рецензирования", // одно из значений "in progress", "changes requested", "rejected", "accepted"
"download_url": "URL для скачивания",
"keywords": "список; ключевых; слов; через; точу с запятой",
"abstract": "аннотация к статье"
}
В теле запроса передаются:
- обязательное поле
"publication_title"
; - обязательно одно (и только одно) из полей
"email"
,"telegram_id"
,"discord_id"
; - необязательные поля
"keywords"
и"abstract"
; - бинарный документ (файл) с текстом публикации.
Можно, например, использовать формат
multipart/form-data
(multipart HTTP request) для передачи файла и метаданных в одном запросе.
Осуществляется поиск заявки с идентификатором {application_id}
в гугл-таблице. Если заявка не найдена, возвращается ошибка 404. Если заявка найдена, проверяется значение поля "email"
, "telegram_id"
или "discord_id"
, в зависимости от того, какое из них было указано во входных данных. Если проверка не пройдена, возвращается ошибка 403.
Если проверка пройдена успешно, файл с текстом публикации загружается в отдельную директорию на гугл-диск (см. официальную документацию или пример с использованием сторонней библиотеки pydrive
). В гугл-таблице обновляются значения полей "publication_title"
, "keywords"
, "abstract"
, если они были переданы во входных данных. В поле "upload_date"
записываются текущая дата и время в формате ISO 8601, в Python можно использовать код datetime.datetime.now().astimezone().isoformat()
. В поле "review_status"
записывается значение "in progress"
. В поле "download_url"
помещается URL для скачивания файла.
JSON, структура которого приведена в разделе "Выходные данные" эндпоинта "GET /conferences/{conference_id}/applications/{application_id}/publication", содержащий актуальную информацию о публикации.
Бинарный документ (файл) с текстом публикации
В запросе должен быть обязательно указан один из следующих параметров, но не два или три одновременно:
- email,
- telegram_id,
- discord_id.
Значение входного параметра используется для проверки прав доступа к публикации в гугл-таблице.
Осуществляются проверки, аналогичные описанным для эндпоинта POST /conferences/{conference_id}/applications/{application_id}/publication. Если они пройдены успешно, переданный в теле запроса файл загружается на гугл-диск, а в гугл-таблице обновляются поля "upload_date"
и "download_url"
. В поле "review_status"
записывается значение "in progress"
.
JSON, структура которого приведена в разделе "Выходные данные" эндпоинта "GET /conferences/{conference_id}/applications/{application_id}/publication", содержащий актуальную информацию о публикации.
JSON, в котором содержатся:
- обязательно одно (и только одно) из полей
"email"
,"telegram_id"
,"discord_id"
; - необязательные поля
"publication_title"
,"keywords"
и"abstract"
;
Осуществляются проверки, аналогичные описанным для эндпоинта POST /conferences/{conference_id}/applications/{application_id}/publication. Если они пройдены успешно, в гугл-таблице обновляются значения полей "publication_title"
, "keywords"
, "abstract"
, если они были переданы во входных данных.
JSON, структура которого приведена в разделе "Выходные данные" эндпоинта "GET /conferences/{conference_id}/applications/{application_id}/publication", содержащий актуальную информацию о публикации.
- Установить зависимости из requirements.txt
- Добавить credits от Google API в файл creds.json
- В dbs_access.py заполнить переменные confSpreadsheetId и gDriveFolder идентификатором таблицы с конференциями (Google Spreadsheets) и идентификатором папки на Google Drive соответственно
- В tables_settings.py описать структуры таблиц (table[вид объекта]['fields]) строго по порядку размещения в таблице и смещения (table[вид объекта]['rowOffset'] и table[вид объекта]['colOffset']) относительно крайней верхней левой ячейки листа. В случае изменения полей выборок, изменить selection[вид объекта]
- Запустить из папки расположения командой
uvicorn src.app:app --reload
- Идентификатор объекта, находящийся в поле 'id', должен совпадать с номером строки таблицы с учетом смещения. В противном случае объект считается недействительным, его нельзя прочитать.