-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #16 from Abramov0Alexandr/develop
Develop
- Loading branch information
Showing
39 changed files
with
1,236 additions
and
6 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,10 @@ | ||
[flake8] | ||
|
||
max-line-length = 120 | ||
|
||
exclude = | ||
# The autogenerated migrations data, ignore it | ||
migrations | ||
|
||
# Excluding virtual env folders | ||
.venv |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1 +1,140 @@ | ||
# marketplace-API-template | ||
# marketplace-API-template | ||
|
||
Данное проект предназначен для реализации HTTP запросов и направлен на использование в маркетплейсах. | ||
|
||
## Стек технологий: | ||
- python | ||
- django | ||
- djangorestframework | ||
- python-dotenv | ||
- psycopg2-binary | ||
- djangorestframework-simplejwt | ||
- drf-yasg | ||
- coverage | ||
- flake8 | ||
- django-extensions | ||
- ipython | ||
- django-filter | ||
- pillow | ||
- pyparsing | ||
- pydot | ||
- django-cors-headers | ||
|
||
|
||
## Установка | ||
Прежде чем начать использовать Marketplace API, убедитесь, что у вас установлен | ||
интерпретатор Python c версией не ниже 3.9: | ||
|
||
Клонируйте репозиторий с помощью следующей команды: | ||
```bash | ||
git clone git@github.com:Abramov0Alexandr/marketplace-API-template.git | ||
``` | ||
|
||
Перейдите в директорию проекта: | ||
```bash | ||
cd marketplace-API-template | ||
``` | ||
|
||
Активируйте виртуальное окружение Poetry и установите зависимости: | ||
|
||
```bash | ||
poetry init | ||
``` | ||
|
||
```bash | ||
poetry shell | ||
``` | ||
|
||
```bash | ||
poetry install | ||
``` | ||
|
||
Создайте и примените миграции для базы данных: | ||
|
||
```bash | ||
python manage.py migrate | ||
``` | ||
|
||
|
||
Запустите сервер: | ||
```bash | ||
python manage.py runserver | ||
``` | ||
|
||
Теперь приложение доступно по адресу http://localhost:8000/. | ||
|
||
|
||
## Регистрация | ||
Для регистрации в сервисе необходимо отправить POST-запрос на эндпоинт users/create/. | ||
В зависимости от выбора регистрации пользователя необходимо передать следующие данные: | ||
|
||
1. Регистрация как обычный пользователь: | ||
- first_name: Ваше имя. | ||
- last_name: Ваша фамилия. | ||
- patronymic (необязательно): Ваше отчество (если есть). | ||
- email: Ваша почта. | ||
- password: Пароль для входа. | ||
- password_confirmation: Подтверждение пароля. | ||
- is_seller: Оставьте поле пустым или укажите false, чтобы зарегистрироваться как обычный пользователь. | ||
- phone (необязательно): Номер телефона пользователя. | ||
|
||
|
||
2. Регистрация в качестве продавца: | ||
- email: Ваша почта. | ||
- shop_name: Название магазина. | ||
- shop_preview (необязательно): Лого или превью магазина. | ||
- password: Пароль для входа. | ||
- password_confirmation: Подтверждение пароля. | ||
- is_seller: Укажите true, чтобы зарегистрироваться как продавец. | ||
|
||
|
||
## Возможности API | ||
Наш проект предоставляет следующие возможности через API: | ||
|
||
1. Идентификация и авторизация: | ||
- Регистрация новых пользователей (как обычных, так и продавцов). | ||
- Авторизация пользователей. | ||
- Получение JWT-токенов для аутентификации. | ||
|
||
|
||
2. Создание и управление товарами: | ||
- Создание нового товара. | ||
- Просмотр списка товаров. | ||
- Просмотр детальной информации о товаре. | ||
- Редактирование и удаление товаров (доступно только продавцам). | ||
- Снятие или вывод товара в продажу (доступно только продавцам). | ||
|
||
|
||
## Схемы моделей и их взаимосвязи | ||
Полная схема моделей | ||
|
||
![Полная схема моделей](models_schemes/full_scheme.png) | ||
|
||
Схема кастомных моделей | ||
|
||
![Схема кастомных моделей](models_schemes/my_project_subsystem.png) | ||
|
||
## Документация | ||
Документацию к API вы можете найти перейдя по следующим ссылкам:<br> | ||
http://127.0.0.1:8000/swagger/ <br> | ||
http://127.0.0.1:8000/redoc/ | ||
|
||
## Тестирование | ||
Для запуска тестов используйте следующую команду: | ||
|
||
```bash | ||
python manage.py test | ||
``` | ||
|
||
## Лицензия | ||
Marketplace API распространяется по [MIT License](https://opensource.org/licenses/MIT). | ||
|
||
## Контакты | ||
|
||
Спасибо за использование Marketplace API! Если у вас есть какие-либо вопросы или предложения, не стесняйтесь обращаться к нам. | ||
|
||
Автор: [Alexandr Abramov <https://github.com/Abramov0Alexandr>] | ||
|
||
Связь: [alexandr.abramovv@gmail.com <https://github.com/Abramov0Alexandr>] | ||
|
||
GitHub: [https://github.com/Abramov0Alexandr] |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Empty file.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,9 @@ | ||
from django.contrib import admin | ||
from custom_user.models import CustomUser | ||
|
||
|
||
@admin.register(CustomUser) | ||
class UserAdmin(admin.ModelAdmin): | ||
list_display = ('id', 'email', 'first_name', 'last_name', 'shop_name', 'is_seller', ) | ||
list_display_links = ('email', ) | ||
list_filter = ('is_seller', ) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,7 @@ | ||
from django.apps import AppConfig | ||
|
||
|
||
class CustomUserConfig(AppConfig): | ||
default_auto_field = 'django.db.models.BigAutoField' | ||
name = 'custom_user' | ||
verbose_name = 'Зарегистрированные пользователи' |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,48 @@ | ||
# Generated by Django 4.2.5 on 2023-09-28 22:09 | ||
|
||
import custom_user.services | ||
import custom_user.user_manager | ||
from django.db import migrations, models | ||
import django.utils.timezone | ||
|
||
|
||
class Migration(migrations.Migration): | ||
|
||
initial = True | ||
|
||
dependencies = [ | ||
('auth', '0012_alter_user_first_name_max_length'), | ||
] | ||
|
||
operations = [ | ||
migrations.CreateModel( | ||
name='CustomUser', | ||
fields=[ | ||
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), | ||
('password', models.CharField(max_length=128, verbose_name='password')), | ||
('last_login', models.DateTimeField(blank=True, null=True, verbose_name='last login')), | ||
('is_superuser', models.BooleanField(default=False, help_text='Designates that this user has all permissions without explicitly assigning them.', verbose_name='superuser status')), | ||
('is_staff', models.BooleanField(default=False, help_text='Designates whether the user can log into this admin site.', verbose_name='staff status')), | ||
('date_joined', models.DateTimeField(default=django.utils.timezone.now, verbose_name='date joined')), | ||
('first_name', models.CharField(blank=True, max_length=150, null=True, verbose_name='Имя')), | ||
('last_name', models.CharField(blank=True, max_length=150, null=True, verbose_name='Фамилия')), | ||
('patronymic', models.CharField(blank=True, max_length=150, null=True, verbose_name='Отчество')), | ||
('phone', models.CharField(blank=True, max_length=20, null=True, verbose_name='Телефон')), | ||
('shop_name', models.CharField(blank=True, max_length=200, null=True, verbose_name='Название магазина')), | ||
('shop_preview', models.ImageField(blank=True, null=True, upload_to=custom_user.services.shop_preview_upload_path, verbose_name='Превью магазина')), | ||
('email', models.EmailField(max_length=254, unique=True, verbose_name='Email')), | ||
('is_active', models.BooleanField(default=True, verbose_name='Статус активации')), | ||
('is_seller', models.BooleanField(choices=[(0, 'Посетитель'), (1, 'Продавец')], default=0, verbose_name='Статус клиента')), | ||
('groups', models.ManyToManyField(blank=True, help_text='The groups this user belongs to. A user will get all permissions granted to each of their groups.', related_name='user_set', related_query_name='user', to='auth.group', verbose_name='groups')), | ||
('user_permissions', models.ManyToManyField(blank=True, help_text='Specific permissions for this user.', related_name='user_set', related_query_name='user', to='auth.permission', verbose_name='user permissions')), | ||
], | ||
options={ | ||
'verbose_name': 'user', | ||
'verbose_name_plural': 'users', | ||
'abstract': False, | ||
}, | ||
managers=[ | ||
('objects', custom_user.user_manager.CustomUserManager()), | ||
], | ||
), | ||
] |
Empty file.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,45 @@ | ||
from django.contrib.auth.models import AbstractUser | ||
from django.db import models | ||
from custom_user.services import shop_preview_upload_path | ||
from custom_user.user_manager import CustomUserManager | ||
|
||
|
||
NULLABLE = {'blank': True, 'null': True} | ||
|
||
|
||
class CustomUser(AbstractUser): | ||
""" | ||
Расширение стандартной модели пользователя в соответствии с требованиями текущего проекта. | ||
""" | ||
|
||
class UserStatus(models.IntegerChoices): | ||
""" | ||
Вспомогательный класс для определения статуса посетителя магазина. | ||
По умолчанию, каждый новый пользователь имеет статус 'Посетитель'. | ||
""" | ||
|
||
COMMON_USER = 0, "Посетитель" | ||
SELLER = 1, "Продавец" | ||
|
||
username = None | ||
|
||
# Поля, используемые для регистрации посетителя сайта | ||
first_name = models.CharField(max_length=150, verbose_name='Имя', **NULLABLE) | ||
last_name = models.CharField(max_length=150, verbose_name='Фамилия', **NULLABLE) | ||
patronymic = models.CharField(max_length=150, verbose_name='Отчество', **NULLABLE) | ||
phone = models.CharField(max_length=20, verbose_name='Телефон', **NULLABLE) | ||
|
||
# Поля, используемые для регистрации продавца | ||
shop_name = models.CharField(max_length=200, verbose_name='Название магазина', **NULLABLE) | ||
shop_preview = models.ImageField(upload_to=shop_preview_upload_path, verbose_name='Превью магазина', **NULLABLE) | ||
|
||
# Общие поля для каждого вида пользователя | ||
email = models.EmailField(unique=True, verbose_name='Email') | ||
is_active = models.BooleanField(default=True, verbose_name='Статус активации') | ||
is_seller = models.BooleanField(choices=UserStatus.choices, default=UserStatus.COMMON_USER, | ||
verbose_name='Статус клиента') | ||
|
||
objects = CustomUserManager() | ||
|
||
USERNAME_FIELD = "email" | ||
REQUIRED_FIELDS = [] |
Oops, something went wrong.