From a63232697190cb75680b39025015a0745a097adb Mon Sep 17 00:00:00 2001 From: Ian Andwati Date: Wed, 6 Mar 2024 01:15:28 +0300 Subject: [PATCH] completed products views --- authentication/urls.py | 8 ++++ products/models.py | 2 + products/serializers.py | 2 +- products/urls.py | 21 ++++++--- products/views.py | 102 +++++++++++++++++++++++++--------------- store/urls.py | 9 ++-- 6 files changed, 94 insertions(+), 50 deletions(-) diff --git a/authentication/urls.py b/authentication/urls.py index e69de29..ec626a2 100644 --- a/authentication/urls.py +++ b/authentication/urls.py @@ -0,0 +1,8 @@ +from django.urls import path + +from .views import LoginView, RegisterView + +urlpatterns = [ + path("register", RegisterView.as_view(), name="register"), + path("login", LoginView.as_view(), name="login"), +] diff --git a/products/models.py b/products/models.py index 0532880..5cc74ee 100644 --- a/products/models.py +++ b/products/models.py @@ -1,3 +1,4 @@ +from django.contrib.auth.models import User from django.db import models @@ -8,6 +9,7 @@ class Product(models.Model): price = models.DecimalField(max_digits=10, decimal_places=2) quantity = models.IntegerField(default=0) barcode = models.CharField(max_length=100, blank=True, null=True) + owner = models.ForeignKey(User, on_delete=models.CASCADE) def __str__(self): return f"{self.name}" diff --git a/products/serializers.py b/products/serializers.py index fe87668..d62a2bc 100644 --- a/products/serializers.py +++ b/products/serializers.py @@ -6,4 +6,4 @@ from .models import Product class ProductSerializer(serializers.ModelSerializer): class Meta: model = Product - fields = "__all__" + fields = ["id", "name", "description", "sku", "price", "quantity", "barcode"] diff --git a/products/urls.py b/products/urls.py index 0541d78..d43bc78 100644 --- a/products/urls.py +++ b/products/urls.py @@ -1,8 +1,17 @@ -from django.urls import include, path -from rest_framework.routers import DefaultRouter +# from django.urls import include, path +# from rest_framework.routers import DefaultRouter -from .views import ProductViewSet +# from .views import ProductViewSet -router = DefaultRouter() -router.register(r"Products", ProductViewSet) -urlpatterns = router.urls +# router = DefaultRouter() +# router.register(r"Products", ProductViewSet) +# urlpatterns = router.urls + +from django.urls import path + +from .views import ProductDetailView, ProductList + +urlpatterns = [ + path("", ProductList.as_view(), name="products"), + path("", ProductDetailView.as_view(), name="product-detail"), +] diff --git a/products/views.py b/products/views.py index 64f1f26..b1df128 100644 --- a/products/views.py +++ b/products/views.py @@ -1,49 +1,75 @@ -from rest_framework import status, viewsets -from rest_framework.response import Response +# from rest_framework import status, viewsets +# from rest_framework.response import Response + +# from .models import Product +# from .serializers import ProductSerializer + + +# class ProductViewSet(viewsets.ModelViewSet): +# queryset = Product.objects.all() +# serializer_class = ProductSerializer + +# def list(self, request, *args, **kwargs): +# data = list(Product.objects.all().values()) +# return Response(data, status=status.HTTP_200_OK) + +# def retrieve(self, request, *args, **kwargs): +# data = list(Product.objects.filter(id=kwargs["pk"]).values()) +# return Response(data, status=status.HTTP_200_OK) + +# def create(self, request, *args, **kwargs): +# product_serializer_data = ProductSerializer(data=request.data) +# if product_serializer_data.is_valid(): +# product_serializer_data.save() +# status_code = status.HTTP_201_CREATED +# return Response({"message": "Product added successfully"}, status=status_code) +# else: +# status_code = status.HTTP_400_BAD_REQUEST +# return Response({"message": "please fill the details"}, status=status_code) + +# def destroy(self, request, *args, **kwargs): +# product_data = Product.objects.filter(id=kwargs["pk"]) +# if product_data: +# product_data.delete() +# status_code = status.HTTP_201_CREATED +# return Response({"message": "Product deleted successfully"}, status=status_code) +# else: +# status_code = status.HTTP_400_BAD_REQUEST +# return Response({"message": "Product not found"}, status=status_code) + +# def update(self, request, *args, **kwargs): +# product_details = Product.objects.get(id=kwargs["pk"]) +# product_serializer_data = ProductSerializer(product_details, data=request, partial=True) +# if product_serializer_data.is_valid(): +# product_serializer_data.save() +# status_code = status.HTTP_201_CREATED +# return Response({"message": "Product updated successfully"}, status=status_code) +# else: +# status_code = status.HTTP_400_BAD_REQUEST +# return Response({"message": "Product not found"}, status=status_code) + +from rest_framework.generics import ListCreateAPIView, RetrieveUpdateDestroyAPIView +from rest_framework.permissions import IsAuthenticated from .models import Product from .serializers import ProductSerializer -class ProductViewSet(viewsets.ModelViewSet): - queryset = Product.objects.all() +class ProductList(ListCreateAPIView): serializer_class = ProductSerializer + permission_classes = (IsAuthenticated,) - def list(self, request, *args, **kwargs): - data = list(Product.objects.all().values()) - return Response(data, status=status.HTTP_200_OK) + def perform_create(self, serializer): + serializer.save(owner=self.request.user) - def retrieve(self, request, *args, **kwargs): - data = list(Product.objects.filter(id=kwargs["pk"]).values()) - return Response(data, status=status.HTTP_200_OK) + def get_queryset(self): + return Product.objects.filter(owner=self.request.user) - def create(self, request, *args, **kwargs): - product_serializer_data = ProductSerializer(data=request.data) - if product_serializer_data.is_valid(): - product_serializer_data.save() - status_code = status.HTTP_201_CREATED - return Response({"message": "Product added successfully"}, status=status_code) - else: - status_code = status.HTTP_400_BAD_REQUEST - return Response({"message": "please fill the details"}, status=status_code) - def destroy(self, request, *args, **kwargs): - product_data = Product.objects.filter(id=kwargs["pk"]) - if product_data: - product_data.delete() - status_code = status.HTTP_201_CREATED - return Response({"message": "Product deleted successfully"}, status=status_code) - else: - status_code = status.HTTP_400_BAD_REQUEST - return Response({"message": "Product not found"}, status=status_code) +class ProductDetailView(RetrieveUpdateDestroyAPIView): + serializer_class = ProductSerializer + permission_classes = (IsAuthenticated,) + lookup_field = "id" - def update(self, request, *args, **kwargs): - product_details = Product.objects.get(id=kwargs["pk"]) - product_serializer_data = ProductSerializer(product_details, data=request, partial=True) - if product_serializer_data.is_valid(): - product_serializer_data.save() - status_code = status.HTTP_201_CREATED - return Response({"message": "Product updated successfully"}, status=status_code) - else: - status_code = status.HTTP_400_BAD_REQUEST - return Response({"message": "Product not found"}, status=status_code) + def get_queryset(self): + return Product.objects.filter(owner=self.request.user) diff --git a/store/urls.py b/store/urls.py index 09d4b63..35725a2 100644 --- a/store/urls.py +++ b/store/urls.py @@ -30,13 +30,12 @@ schema_view = get_schema_view( license=openapi.License(name="MIT License"), ), public=True, - permission_classes=[ - permissions.AllowAny, - ], + permission_classes=(permissions.AllowAny,), ) urlpatterns = [ path("admin/", admin.site.urls), - path("api/", include("products.urls")), - path("docs/", schema_view.with_ui("swagger", cache_timeout=0), name="schema-swagger-ui"), + path("api/auth/", include("authentication.urls")), + path("api/products/", include("products.urls")), + path("", schema_view.with_ui("swagger", cache_timeout=0), name="schema-swagger-ui"), ]