Skip to content

Latest commit

 

History

History
241 lines (198 loc) · 9.91 KB

README.md

File metadata and controls

241 lines (198 loc) · 9.91 KB

django-test

Описание

Проект на Django с множеством различных улучшений. Сделан в качестве тестового задания в сентябре 2023.

Возможности

  • Аутентификация пользователей по токену
  • Разделение прав доступа пользователей к разным действиям (permissions)
  • Каждый пользователь может редактировать и удалять свои записи (свой пермишен)
  • Наделение пользователей правами модерирования и администрирования
  • Удобная панель администрирования, на русском (требует создание пользователя с правами администратора, средствами движка Django)
  • Получение, создание, обновление и удаление записей
  • Используется пагинация записей
  • Просмотр и редактирование записей с rich-текстом в админке (summernote)
  • Импорт Примечательных мест из xlsx-файла с данными (путём отправки на эндпоинт, openpyxl)
  • Просмотр и редактирование Примечательных мест в админке (tresuremap)
  • Получение Сводки погоды в Примечательном месте (GET-запрос на эндпоинт, pyowm, нужен API-токен)
  • Просмотр Сводки погоды в админке с фильтром по дате снятия показаний
  • Экспорт Сводки погоды в xlsx-файл с фильтром по Примечательному месту и дате снятия показаний (GET-запрос + query-параметры на эндпоинт, xlsxWriter)
  • Возможность выполнения периодических задач (celery)
  • Работает в Docker-контейнерах и в venv

Технические подробности

Для просмотра списка эндпоинтов просто перейдите на главную страницу проекта.

Структура записи:

"id": 3,
"thumbnail": "url",
"title": "Title",
"image": "url",
"text": "Text",
"date": "2023-09-04, 06:08:20",
"author": "admin"

Структура примечательного места:

"id": 1,
"title": "Birmingem",
"rating": 10,
"author": "admin",
"latitude": 52.484227,
"longitude": -1.691047

Структура сводки погоды:

"id": 31,
"temper": 15.2,         # Температура по шкале Цельсия
"humidity": 87.0,       # Влажность воздуха, в %
"pressure": 768,        # Атмосферное давление, в мм ртутного столба
"wind_direction": 123,  # Направление ветра, градусы
"wind_speed": 1.53,     # Скорость ветра, в м/с
"place": "Birmingem",   # Название места
"author": "admin"       # Пользователь, автор запроса

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

title latitude longitude rating
Berlin 52.518368 13.374546 12
Paris 48.856664 2.350803 14
Madrid 40.418711 -3.713149 16
Vienna 48.206335 16.362918 20
Rome 41.902653 12.495441 20

Структура таблицы экспорта сводок погоды за определенную дату в xlsx:

id temper humidity pressure wind_direction wind_speed place author
17 19,78 68 759 110 2,57 Birmingem admin
18 19,78 68 759 110 2,57 Birmingem admin
19 17,91 78 760 60 2,06 Birmingem admin
20 16,79 83 760 30 2,06 Birmingem admin
21 16,65 83 760 30 2,06 Birmingem admin

Для авторизации нужно послать post-запрос на эндпоинт token с json-параметрами вида

{
  "username": "admin",
  "password": "admin"
}

Для последующей аутентификации нужно добавлять в запросы HTTP-заголовок вида:

Authorization: Token 72c5c4148399532c95b8e45c73280e007e9438c2

Чтобы получить погоду в примечательном месте в данный момент, нужно отправить GET-запрос на эндпоинт вида /api/weather/current/{place_name}/

Чтобы получить xlsx-файл со сводками погоды в примечательном месте за определённую дату, нужно отправить GET-запрос на эндпоинт вида /api/weather/current/{place_name}/?date=YYYY-MM-DD

Чтобы импортировать список примечательных мест из xlsx-файла, нужно отправить POST-запрос на эндпоинт /api/place/import/ с добавлением HTTP-заголовка вида

Content-Disposition: attachment; filename=import.xlsx

Требования:

  • Python 3
  • Django 4.2.4
  • djangorestframework 3.14.0
  • sorl-thumbnail 12.9.0
  • sorl-thumbnail-serializer-field 0.2.1
  • django-treasuremap 0.3.4
  • django-summernote 0.8.20.0
  • django-constance 3.1.0
  • XlsxWriter 3.1.2
  • openpyxl 3.1.2
  • pyowm 3.3.0
  • python-dotenv 1.0.0
  • celery 5.3.4
  • psycopg2-binary 2.9.9
  • и их зависимости (описано в requirements.txt)

Запуск в Docker Compose

В корневой директории нужно создать файл .env с переменными окружения для работы по примеру файла .env.sample

Затем, запустить приложение в Docker-контейнерах:

docker compose up -d

Выполнить миграции в приложении Django

docker compose exec web python manage.py migrate

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

docker exec web python manage.py createsuperuser

Username (leave blank to use 'user'): # Придумайте логин (например, admin)
Email address:                        # укажите почту, опционально
Password:                             # придумайте пароль
Password (again):                     # повторите пароль
Superuser created successfully.

Сохранить статичные файлы

docker compose exec web python manage.py collectstatic

Админка будет доступна по http://localhost/admin/

Flower будет доступен по http://localhost/flower/

Установка и запуск в виртуальном окружении

На машине должен быть установлен Python актуальной версии (тестировалось на 3.11).

Клонировать репозиторий на машину, с которой будет будет запускаться сервис

git clone https://github.com/andmerk93/django-test.git

Развернуть виртуальное окружение python в папке с проектом (django-test)

python3 -m venv venv

Активировать виртуальное окружение для linux/unix

source ./venv/bin/activate 

Для Windows, должно быть разрешено выполнение скриптов Powershell

venv\Scripts\activate

С запущенным виртуальным окружением нужно выполнить установку требуемых компонентов

pip install -r ./django_test/requirements.txt

Для запуска нужно создать в корневой директории файл .env с переменными окружения для работы по примеру файла .env.sample

SECRET_KEY="django-insecure-secret-key"
OWM_API_KEY=API10005000500205
DJANGO_DEBUG=True
DB_ENGINE=движок БД, если DJANGO_DEBUG не указан
DB_NAME=имя инстанса БД
DB_USER=юзер БД
DB_PASSWORD=пароль
DB_HOST=адрес хоста
DB_PORT=порт

Затем, перейти в директорию django_test, дальнейшие действия выполнять отсюда

cd .\django_test\

Выполнить миграции (из виртуального окружения)

python .\manage.py migrate

И запустить проект

python .\manage.py runserver 80

Тестовый сервер поднимется и будет доступен по http://localhost/

Для создания суперюзера нужно выполнить команду (из вирт. окружения) и следовать инструкциям

python .\manage.py createsuperuser

Для работы celery нужно запустить базу данных Redis в контйенере:

docker run -d -p 6379:6379 redis

Подключить обрабочик задач:

celery -A django_test worker --loglevel=info

Подключить планировщик периодических задач:

celery -A django_test beat --loglevel=info

TODO:

  • django-celery-beat
  • auto swagger
  • proxy для flower