Skip to content

Commit

Permalink
Merge pull request #42 from BittWizards/fixes/orders_fixes
Browse files Browse the repository at this point in the history
Изменения абстракта и моделей, изменения в сериалайзерах, openapi
  • Loading branch information
KlavaD authored Mar 5, 2024
2 parents 6b2b79d + fea2b1c commit 1e8ccac
Show file tree
Hide file tree
Showing 9 changed files with 157 additions and 81 deletions.
29 changes: 14 additions & 15 deletions backend/ambassadors/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,20 +14,9 @@
User = get_user_model()


class AbstractAmbassador(AbstractUser):
"""Абстрактная модель амбассадора с полями Имя, Фамилия, Отечство,
Почта, Телефон, Телеграм."""

tg_acc = models.CharField(
verbose_name="Телеграмм аккаунт", max_length=150, unique=True
)

class Meta:
abstract = True


class AbstractAmbassadorAddress(models.Model):
"""Абстрактный класс для адреса амбассадора."""
"""Абстрактный класс для адреса амбассадора.
Поля: country, city, street_home, post_index"""

country = models.CharField(verbose_name="Страна", max_length=100)
city = models.CharField(verbose_name="Город", max_length=100)
Expand Down Expand Up @@ -57,11 +46,18 @@ def __str__(self) -> str:
return str(self.title)


class Ambassador(AbstractAmbassador):
class Ambassador(AbstractUser):
"""
Модель амбассадора.
Поля абстракта: first_name, last_name, middle_name, phone
"""

email = models.CharField(
verbose_name="Электронная почта",
max_length=200,
blank=False,
unique=True,
)
gender = models.CharField(
verbose_name="Пол", max_length=20, choices=Gender.choices
)
Expand All @@ -79,6 +75,9 @@ class Ambassador(AbstractAmbassador):
created = models.DateTimeField(
verbose_name="Дата и время создания", default=timezone.now
)
tg_acc = models.CharField(
verbose_name="Телеграмм аккаунт", max_length=150, unique=True
)
tg_id = models.IntegerField(
verbose_name="Телеграмм id", blank=True, null=True
)
Expand Down Expand Up @@ -162,7 +161,7 @@ class Meta:

def __str__(self) -> str:
return (
f"{self.country} {self.city} {self.street_home} {self.post_index}"
f"{self.country} {self. city} {self.street_home} {self.post_index}"
)


Expand Down
22 changes: 22 additions & 0 deletions backend/ambassadors/serializers.py
Original file line number Diff line number Diff line change
Expand Up @@ -178,6 +178,28 @@ def update(self, instance, validated_data):
return instance


class ShortAmbassadorSerializer(serializers.ModelSerializer):
"""Сериалайзер для отображения короткого списка полей амбассадора
Поля: id, image, first_name, last_name, status, tg_acc, ya_programm"""

ya_programm = serializers.SerializerMethodField()

class Meta:
model = Ambassador
fields = (
"id",
"image",
"first_name",
"last_name",
"status",
"tg_acc",
"ya_programm",
)

def get_ya_programm(self, obj):
return obj.ya_programm.title


class AmbassadorContentPromoSerializer(serializers.ModelSerializer):
"""Родительский сериализатор для контента промокодов."""

Expand Down
17 changes: 1 addition & 16 deletions backend/content/serializers.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
from rest_framework.exceptions import ValidationError

from ambassadors.models import Ambassador, AmbassadorAddress
from ambassadors.serializers import ShortAmbassadorSerializer
from ambassadors.validators import tg_acc_validator
from ambassadors_project.constants import (
ERROR_MESSAGE_PROMOCODE,
Expand All @@ -14,22 +15,6 @@
from content.models import Content, Documents, Promocode


class ShortAmbassadorSerializer(serializers.ModelSerializer):
"""Сериализатор для амбассадора в новой заявке на контент."""

class Meta:
model = Ambassador
fields = (
"id",
"image",
"last_name",
"first_name",
"ya_programm",
"tg_acc",
"status",
)


class NewContentSerializer(serializers.ModelSerializer):
"""Сериализатор для отображения заявок на контент."""

Expand Down
51 changes: 40 additions & 11 deletions backend/openapi/orders_schema.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,13 +6,14 @@

from orders.serializers import (
AllMerchToAmbassadorSerializer,
AllOrdersListSerialiazer,
AmbassadorOrderListSerializer,
MerchSerializer,
OrderSerializer,
)

merch_example = {"name": "string", "size": "XS"}
order_request_example = {
order_one_request_example = {
"first_name": "string",
"last_name": "string",
"middle_name": "string",
Expand All @@ -21,15 +22,38 @@
"city": "string",
"street_home": "string",
"post_index": 2147483647,
"merch": [merch_example],
"comment": "string",
}
order_two_request_example = {
**order_one_request_example,
"delivered_date": "2024-02-29",
"track_number": "string",
"comment": "string",
}
order_response_example = {
"id": 0,
"ambassador": 0,
"created_date": "2024-02-29",
"status": "string",
"total_cost": 2147483647,
"email": "string",
"tg_acc": "string",
"merch": [merch_example],
**order_two_request_example,
}
orders_response_list_example = {
"id": 0,
"ambassador": {
"id": 0,
"image": "string",
"first_name": "string",
"last_name": "string",
"middle_name": "string",
"status": "string",
"tg_acc": "string",
"ya_programm": "string",
},
"track_number": 2147483647,
"created_date": "2024-03-01",
"status": "string",
}
order_response_example = {"id": 0, "ambassador_id": 0, **order_request_example}
all_merch_to_ambassador_example = {
"id": 0,
"first_name": "string",
Expand All @@ -46,7 +70,9 @@
summary="Создание новой заявки",
description="Создает новый заказ в базе",
examples=[
OpenApiExample("post", order_request_example, request_only=True),
OpenApiExample(
"post", order_one_request_example, request_only=True
),
OpenApiExample("201", order_response_example, response_only=True),
],
responses={
Expand Down Expand Up @@ -88,14 +114,17 @@
),
"list": extend_schema(
summary="Получение всех существующих заявок",
description="Возращает список всех существующих заявок",
description="Возращает список всех существующих заявок,\
доступна фильтрации по status и ambassador__id (2 нижних)",
examples=[
OpenApiExample("200", order_response_example, response_only=True),
OpenApiExample(
"200", orders_response_list_example, response_only=True
),
],
responses={
200: OpenApiResponse(
description="Список всех существующих заявок",
response=OrderSerializer,
response=AllOrdersListSerialiazer,
)
},
tags=["Заявки"],
Expand All @@ -106,7 +135,7 @@
examples=[
OpenApiExample(
"patch",
order_request_example,
order_two_request_example,
request_only=True,
description="Можно изменить одно или несколько полей из списка",
),
Expand Down
14 changes: 7 additions & 7 deletions backend/orders/admin.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,30 +17,30 @@ class OrderAdmin(admin.ModelAdmin):
"first_name",
"last_name",
"middle_name",
"email",
"phone",
"tg_acc",
"country",
"city",
"street_home",
"post_index",
"full_address",
"order_status",
"status",
"created_date",
"delivered_date",
"track_number",
"comment",
"total_cost",
"ambassador",
"get_merch",
)
search_fields = ("ambassador_id", "merch", "order_status", "city")
list_filter = ("ambassador_id", "merch", "order_status", "city")
search_fields = ("ambassador", "merch", "status", "city")
list_filter = ("ambassador", "merch", "status", "city")
empty_value_display = "-пусто-"

def get_merch(self, obj: Order) -> str:
return ", ".join([merch.name for merch in obj.merch.all()])

def get_ambassador_id(self, obj: Order) -> str:
return Ambassador.objects.get(pk=obj.ambassador_id)
def get_ambassador(self, obj: Order) -> str:
return Ambassador.objects.get(pk=obj.ambassador)


admin.site.register(Merch, MerchAdmin)
Expand Down
28 changes: 13 additions & 15 deletions backend/orders/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,19 +2,16 @@
from django.db import models

from ambassadors.choices import AmbassadorsClothesSizes, AmbassadorsFootsSizes
from ambassadors.models import (
AbstractAmbassador,
AbstractAmbassadorAddress,
Ambassador,
)
from ambassadors.models import AbstractAmbassadorAddress, Ambassador
from users.models import AbstractUser


class OrderStatus(models.TextChoices):
"""Список статусов заказа"""

CREATED = "создано", "created"
DELIVERED = "доставлено", "delivered"
SHIPPED = "отправлено", "shipped"
CREATED = "created", "Создано"
DELIVERED = "delivered", "Доставлено"
SHIPPED = "shipped", "Отправлено"


class Merch(models.Model):
Expand Down Expand Up @@ -48,21 +45,21 @@ def __str__(self):
return f"{self.name} ({self.size})"


class Order(AbstractAmbassador, AbstractAmbassadorAddress):
class Order(AbstractUser, AbstractAmbassadorAddress):
"""Модель для заявки на мерч"""

ambassador_id = models.ForeignKey(
ambassador = models.ForeignKey(
Ambassador,
related_name="orders",
verbose_name="ID амбассадора",
verbose_name="Амбассадор в заказе",
on_delete=models.CASCADE,
)
merch = models.ManyToManyField(
Merch,
related_name="order",
verbose_name="Мерч в заявке",
)
order_status = models.CharField(
status = models.CharField(
verbose_name="Статус заявки",
choices=OrderStatus.choices,
default=OrderStatus.CREATED,
Expand All @@ -73,6 +70,9 @@ class Order(AbstractAmbassador, AbstractAmbassadorAddress):
delivered_date = models.DateField(
verbose_name="Дата получения заказа", null=True, blank=True
)
post_index = models.IntegerField(
verbose_name="Индекс", blank=True, null=True
)
track_number = models.CharField(
verbose_name="Трек-номер",
max_length=20,
Expand All @@ -89,10 +89,8 @@ class Order(AbstractAmbassador, AbstractAmbassadorAddress):
MinValueValidator(0, "Стоимость не может быть отрицательной")
],
null=True,
blank=True,
default=0,
)
email = models.CharField(verbose_name="Электронная почта", max_length=200)
tg_acc = models.CharField(verbose_name="Телеграмм аккаунт", max_length=150)

class Meta:
verbose_name = "Заявка на отправку мерча"
Expand Down
Loading

0 comments on commit 1e8ccac

Please sign in to comment.