Skip to content

Repository files navigation

Python Diploma Project

Django REST API для сервиса закупок: пользователи регистрируются, подтверждают email, просматривают товары поставщиков, управляют корзиной, оформляют заказы, а поставщики обновляют прайс-листы и управляют приемом заказов.

Стек

  • Python 3.13
  • Django
  • Django REST Framework
  • Celery
  • Redis
  • SQLite
  • PyYAML
  • pytest
  • Docker Compose

Быстрый запуск через Docker

Создайте .env в корне проекта по примеру .env.example:

DEBUG=True
SECRET_KEY=change-me
ALLOWED_HOSTS=localhost,127.0.0.1,0.0.0.0

DJANGO_SETTINGS_MODULE=config.settings

CELERY_BROKER_URL=redis://redis:6379/0
CELERY_RESULT_BACKEND=redis://redis:6379/0

EMAIL_BACKEND=orders.email_backends.ReadableConsoleEmailBackend
DEFAULT_FROM_EMAIL=noreply@example.com
ADMIN_EMAIL=admin@example.com

Соберите и запустите контейнеры:

docker compose build
docker compose up

При старте web контейнер применяет миграции и запускает сервер:

http://localhost:8000

Локальный запуск без Docker

Создайте и активируйте виртуальное окружение, затем установите зависимости:

python -m venv .venv
.\.venv\Scripts\activate
pip install -r requirements.txt

Примените миграции и запустите сервер:

python manage.py migrate
python manage.py runserver

Для Celery локально должен быть доступен Redis:

celery -A config worker -l info

API

Базовый URL:

http://localhost:8000/api/v1

Основные endpoint:

POST   /user/register
POST   /user/register/confirm
POST   /user/login
GET    /user/details
POST   /user/details
POST   /user/password_reset
POST   /user/password_reset/confirm

GET    /user/contact
POST   /user/contact
PUT    /user/contact
DELETE /user/contact

GET    /shops
GET    /categories
GET    /products
GET    /products/<id>

GET    /basket
POST   /basket
PUT    /basket
DELETE /basket

GET    /order
POST   /order
GET    /order/<id>
POST   /order/<id>/status

POST   /partner/update
GET    /partner/export
GET    /partner/state
POST   /partner/state
GET    /partner/orders

Защищенные endpoint используют DRF token auth:

Authorization: Token <token>

Токен возвращается после успешного входа:

POST /api/v1/user/login

Email

По умолчанию для локальной разработки используется читаемый консольный backend:

EMAIL_BACKEND=orders.email_backends.ReadableConsoleEmailBackend

Письма подтверждения регистрации и сброса пароля выводятся в логах контейнера celery:

docker compose logs -f celery

Импорт и экспорт прайса поставщика

Поставщик отправляет ссылку на YAML-файл:

POST /api/v1/partner/update

Пример form-data:

url=https://raw.githubusercontent.com/netology-code/python-final-diplom/master/data/shop1.yaml

Импорт запускается через Celery. Статус выполнения смотрите в логах celery.

Экспорт текущего прайса поставщика доступен через endpoint:

GET /api/v1/partner/export

Ответ возвращается как YAML-файл.

Также импорт YAML доступен через Django Admin на странице товарных позиций. Для этого используются кастомные admin-шаблоны: orders/templates/admin/orders/productinfo/change_list.html и orders/templates/admin/orders/productinfo/import_yaml.html.

Тесты

Запуск тестов:

.\.venv\Scripts\python.exe -m pytest

Если нужно отключить pytest cache:

.\.venv\Scripts\python.exe -m pytest -p no:cacheprovider

Что проверяют тесты

Тесты находятся в каталоге orders/tests/ и покрывают основные сценарии API и бизнес-логики:

  • test_api_auth.py проверяет регистрацию, подтверждение email, вход, просмотр и обновление профиля, сброс пароля.
  • test_api_contacts.py проверяет создание, получение, обновление и удаление контактов пользователя.
  • test_api_products.py проверяет публичные endpoint для списка и деталей товаров, магазинов и категорий.
  • test_api_basket.py проверяет полный цикл работы с корзиной: добавление, просмотр, изменение количества и удаление товаров.
  • test_api_orders.py проверяет оформление корзины в заказ, получение списка заказов и детали заказа.
  • test_api_partner.py проверяет endpoint поставщика: обновление и экспорт прайса, изменение статуса приема заказов, просмотр заказов магазина и изменение статуса заказа.
  • test_import.py проверяет импорт товаров из YAML-файла на уровне сервисного слоя.
  • test_tasks.py проверяет Celery-задачи отправки email и импорта товаров.
  • test_models.py проверяет строковые представления основных моделей.

Во время тестов Celery работает в eager-режиме, а письма сохраняются в памяти через Django locmem email backend. Это позволяет проверять фоновые задачи и email-сценарии без Redis и реальной почты.

Структура проекта

config/              настройки Django, URL проекта, Celery
orders/              основное приложение
orders/models.py     модели пользователей, магазинов, товаров и заказов
orders/serializers.py serializers для API
orders/views.py      API views
orders/services.py   импорт товаров из YAML
orders/tasks.py      Celery-задачи
orders/templates/    кастомные шаблоны Django Admin для импорта YAML
orders/tests/        тесты
import_data/         пример YAML-файла

Важные замечания

  • Redis внутри Docker доступен сервисам по адресу redis:6379.

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages