Skip to content

Серверная часть сервиса отправки заданий на печать и получения файлов для печати с терминала

License

Notifications You must be signed in to change notification settings

profcomff/print-api

Repository files navigation

Сервис печати

Серверная часть сервиса для работы с документами, отправляемыми на печать

Функционал

  1. Управление файлами, отправляемыми пользователями на печать

    • Создание/удаление файлов
    • Редактирование параметров печати
  2. Получение файлов со стороны клиента-терминала печати

  3. Управление пользователями, которым разрешена печать на принтере

  4. Прямое подключение клиентом-терминалом печати

    • Генерация QR кодов для быстрой печати
    • Отправка команд на мгновенное обновление/перезагрузку терминала

Запуск

  1. Перейдите в папку проекта

  2. Создайте виртуальное окружение командой и активируйте его:

    foo@bar:~$ python3 -m venv venv
    foo@bar:~$ source ./venv/bin/activate  # На MacOS и Linux
    foo@bar:~$ venv\Scripts\activate  # На Windows
  3. Установите библиотеки

    (venv) foo@bar:~$ pip install -r requirements.txt
    (venv) foo@bar:~$ pip install -r requirements.dev.txt
  4. Поднимите базу данных

    (venv) foo@bar:~$ docker run -d -p 5432:5432 -e POSTGRES_HOST_AUTH_METHOD=trust --name db-print_service postgres:15
    (venv) foo@bar:~$ alembic upgrade head  # Произвести миграции БД
  5. Запускайте приложение!

    (venv) foo@bar:~$ python -m print_service

ENV-variables description

  • DB_DSN=postgresql://postgres@localhost:5432/postgres – Данные для подключения к БД
  • STATIC_PATH - путь до папки, в которой лежит статика.
  • REDIS_DSN - Данные для подключения к Redis
  • CONTENT_TYPES - типы принимаемого контента для печати
  • MAX_SIZE - Максимальный размер файла в байтах
  • MAX_PAGE_COUNT - Максимальное количество страниц для печати
  • STORAGE_TIME - Время хранения файла в часах
  • ALLOW_STUDENT_NUMBER - разрешить ли номер студенческого для печати
  • PIN_SYMBOLS - символы из которых состоит ПИН-код
  • PIN_LENGTH - длина пин-кода
  • QR_TOKEN_PREFIX - префикс QR кода
  • QR_TOKEN_SYMBOLS - символы из которых состоит QR-код
  • QR_TOKEN_LENGTH - Длина QR-кода
  • QR_TOKEN_TTL - время жизни QR-кода (время показа)
  • QR_TOKEN_DELAY - как долго QR-код будет валидным после того, как прошел TTL (исчез с экрана)
  • Остальные общие для всех АПИ параметры описаны тут

Основные абстракции

  • Пользователь - сущность, у которой есть номер студенческого и профсоюзного билета, а также фамилию
  • Файл - сущность, отвечающая за загруженный пользователем файл. Имеет пин-код для скачивания, ссылку на реальный файл (который лежит в static хранилище), а также опции печати и ссылку на пользователья, который его загрузил
  • Факт печати - сущность для статистики печати. Каждый раз, когда кто-то печатает файл, создается эта сущность со ссылкой на файл и его владельца, а также количеством использованных страниц

Сценарий использования

  1. Обновить список пользователей.

    Дернуть ручку POST /print/is_union_member, передать json со списком новых пользователей:

    {
    "users": [
        {
        "username": "string",
        "union_number": "string",
        "student_number": "string"
        }
    ]
    }

    Если пользователь с таким студенческим или профсоюзным уже существует, то вся остальная информация будет заменена. Иначе, создается новый пользователь.

  2. Проверить, что пользователь существует в системе Дернуть ручку GET /print/is_union_member?surname=...&number=..., передать в query параметрах фамилию и номер профсоюзного билета. Вернет ответ, найден ли пользователь.

  3. Загрузить файл

    Дернуть ручку POST /print/file, передать туда json:

    {
    "surname": "Иванов",
    "number": "1015000",
    "filename": "filename.pdf",
    "source": "string",
    "options": {
        "pages": "", // "" если распечатать надо все страницы, иначе формат такой: "10-13,16,18,20,21,24,25,27,28,30", можно не сортировать
        "copies": 1,
        "two_sided": false
    }
    }

    Передается пользователь с его проф. билетом. Ручка вернет pin в таком формате:

    {
    "pin": "OF72I1",
    "options": {
        "pages": "",
        "copies": 1,
        "two_sided": false
    }
    }

    Его надо сохранить и отправить еще один запрос на загрузку самого файла: Дернуть ручку POST /print/file/{pin}, передать файл в бинарном виде Ручка вернет тот же json, что и предыдущая в случае успеха

    После этого файл готов к печати

  4. Получить файл Дернуть ручку GET /print/file/{pin} Вернет json:

    {
    "filename": "2021-11-02-ZMNF5V...9.pdf",
    "options": {
        "pages": "",
        "copies": 1,
        "two_sided": false
    }
    }

    По ссылке можно скачать файл из static хранилища, options помогают распечтать файл, если запрос идет от принтера

  5. Как работает QR Пользователь приходит к терминалу, считывает QR-код, после этого с его устройства идет запрос на POST /qr, в котором передается отсканированный QR-код и пин для печати

    Терминал подключен к бэкенду через вебсокет. Бэкенд после получения запроса от пользователя в течение некоторого времени отправляет хапрос на печать файла.

  6. Ручное обновление и перезагрузка Делается с админским токеном Ручки, соответственно: POST /admin/update и POST /admin/reboot Спецификация доступна в Swagger UI

Contributing

  • Основная информация по разработке наших приложений

  • Ссылка на страницу с информацией по разработке print-api

About

Серверная часть сервиса отправки заданий на печать и получения файлов для печати с терминала

Topics

Resources

License

Stars

Watchers

Forks

Packages

 
 
 

Languages