Skip to content

Commit

Permalink
Merge pull request #10 from Abramov0Alexandr/feature
Browse files Browse the repository at this point in the history
Feature
  • Loading branch information
Abramov0Alexandr committed Sep 27, 2023
2 parents bcbfa90 + 6982c7a commit 7139793
Show file tree
Hide file tree
Showing 5 changed files with 63 additions and 4 deletions.
2 changes: 1 addition & 1 deletion products/admin.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,5 +4,5 @@

@admin.register(Product)
class UserAdmin(admin.ModelAdmin):
list_display = ('id', 'shop_name', 'product_title', 'seller', 'price', )
list_display = ('id', 'shop_name', 'product_title', 'seller', 'price', 'is_active_sale', )
list_display_links = ('product_title', )
6 changes: 6 additions & 0 deletions products/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,9 +7,15 @@ class Product(models.Model):
Модель для хранения информации о товаре.
"""

SALE_STATUS = [
(True, 'В продаже'),
(False, 'Снят с продажи')
]

product_title = models.CharField(max_length=255, verbose_name='Наименование товара')
seller = models.ForeignKey(get_user_model(), on_delete=models.PROTECT, related_name='seller', verbose_name='Продавец')
price = models.DecimalField(max_digits=10, decimal_places=2, verbose_name='Цена товара')
is_active_sale = models.BooleanField(default=True, choices=SALE_STATUS, verbose_name='Статус товара')

objects = models.Manager

Expand Down
9 changes: 9 additions & 0 deletions products/serializers.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,3 +15,12 @@ class ProductSerializer(serializers.ModelSerializer):
class Meta:
model = Product
fields = '__all__'


class ProductSaleStatusSerializers(serializers.ModelSerializer):
"""
Сериализатор используется в контроллере ChangeProductSaleStatus.
"""
class Meta:
model = Product
fields = ('is_active_sale', )
3 changes: 2 additions & 1 deletion products/urls.py
Original file line number Diff line number Diff line change
@@ -1,13 +1,14 @@
from django.urls import path
from .apps import ProductsConfig
from .views import ProductCreateView, ProductDetailView, ProductListView, ProductDeleteView
from .views import ProductCreateView, ProductDetailView, ProductListView, ProductDeleteView, ChangeProductSaleStatus

app_name = ProductsConfig.name


urlpatterns = [
path('create/', ProductCreateView.as_view(), name='create-product'),
path('list/', ProductListView.as_view(), name='products-list'),
path('change_status/<int:pk>/', ChangeProductSaleStatus.as_view(), name='change-status'),
path('detail/<int:pk>/', ProductDetailView.as_view(), name='product-detail'),
path('delete/<int:pk>/', ProductDeleteView.as_view(), name='product-delete'),
]
47 changes: 45 additions & 2 deletions products/views.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
from rest_framework import generics
from rest_framework import generics, status
from rest_framework.response import Response
from products.models import Product
from products.permissions import IsSeller, IsSuperUser, IsShopOwner
from products.serializers import ProductSerializer
from products.serializers import ProductSerializer, ProductSaleStatusSerializers


class ProductCreateView(generics.CreateAPIView):
Expand Down Expand Up @@ -37,6 +38,48 @@ def get_queryset(self):
return Product.objects.filter(seller=self.request.user)


class ChangeProductSaleStatus(generics.UpdateAPIView):
"""
Контроллер, отвечающий за снятие товара с продажи.
"""

queryset = Product.objects.all()
serializer_class = ProductSaleStatusSerializers
permission_classes = [IsShopOwner | IsSuperUser]

def get_object(self):
product = super().get_object()

if product.is_active_sale:
product.is_active_sale = False

else:
product.is_active_sale = True

product.save()
return product

def update(self, request, *args, **kwargs):
instance = self.get_object()
serializer = self.get_serializer(instance, data=request.data, partial=True)
serializer.is_valid(raise_exception=True)
self.perform_update(serializer)

if instance.is_active_sale:
sale_status_message = 'выведен в продажу'
else:
sale_status_message = 'снят с продажи'

response_message = {
"Product info": {'sale status': f'{instance.is_active_sale}',
'message': f'{instance.product_title} {sale_status_message}',
'status': status.HTTP_200_OK
}
}

return Response(response_message)


class ProductDetailView(generics.RetrieveAPIView):
"""
Контроллер для просмотра детальной информации о товаре.
Expand Down

0 comments on commit 7139793

Please sign in to comment.