Ecosyste.ms: Awesome

An open API service indexing awesome lists of open source software.

Awesome Lists | Featured Topics | Projects

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

Django + DRF + celery + summernote + импорт/экспорт Excel + PyOWM (сторонняя API) + tresuremap (работа с картами) + constance + docker
https://github.com/andmerk93/django-test

celery constance django django-rest-framework docker docker-compose excel pyowm python summernote treasuremap

Last synced: about 1 month ago
JSON representation

Django + DRF + celery + summernote + импорт/экспорт Excel + PyOWM (сторонняя API) + tresuremap (работа с картами) + constance + docker

Awesome Lists containing this project

README

        

# 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