From 4d180b0182b5b1946e880b4da4eb3014bb07c865 Mon Sep 17 00:00:00 2001 From: VeliAliyev Date: Sat, 18 Dec 2021 23:09:05 +0300 Subject: [PATCH 1/2] new customer registration enabled, created action add_item in basket view --- ecommerce/baskets/serializers.py | 14 ++++++------- ecommerce/baskets/views.py | 27 ++++++++++++++++++++++-- ecommerce/core/serializers.py | 35 +++++++++++++++++++++++++++++++- ecommerce/core/views.py | 11 +++++++++- ecommerce/ecommerce/urls.py | 5 +++-- ecommerce/orders/serializers.py | 2 ++ ecommerce/orders/views.py | 12 +++++++++++ 7 files changed, 93 insertions(+), 13 deletions(-) diff --git a/ecommerce/baskets/serializers.py b/ecommerce/baskets/serializers.py index 9dc4c30..cd5b3d6 100644 --- a/ecommerce/baskets/serializers.py +++ b/ecommerce/baskets/serializers.py @@ -1,22 +1,22 @@ from rest_framework import serializers - from baskets.models import BasketItem, Basket from customers.serializers import CustomerSerializer from products.serializers import ProductSerializer -class BasketItemSerializer(serializers.ModelSerializer): +class BasketSerializer(serializers.ModelSerializer): + customer = serializers.HiddenField(default=serializers.CurrentUserDefault()) class Meta: - model = BasketItem - fields = ("id", "basket", "product", "quantity", "price") + model = Basket + fields = ("id", "customer", "status") -class BasketSerializer(serializers.ModelSerializer): +class BasketItemSerializer(serializers.ModelSerializer): class Meta: - model = Basket - fields = ("id", "customer", "status") + model = BasketItem + fields = ("id", "basket", "product", "quantity", "price") class BasketItemDetailedSerializer(BasketItemSerializer): diff --git a/ecommerce/baskets/views.py b/ecommerce/baskets/views.py index ee32571..0352860 100644 --- a/ecommerce/baskets/views.py +++ b/ecommerce/baskets/views.py @@ -1,5 +1,6 @@ -from rest_framework import viewsets - +from rest_framework import viewsets, status +from rest_framework.decorators import action +from rest_framework.response import Response from baskets.filters import BasketItemFilter, BasketFilter from baskets.models import BasketItem, Basket from baskets.serializers import BasketItemSerializer, BasketSerializer, BasketItemDetailedSerializer, BasketDetailedSerializer @@ -7,6 +8,7 @@ class BasketItemViewSet(DetailedViewSetMixin, viewsets.ModelViewSet): + http_method_names = ["get"] queryset = BasketItem.objects.all() serializer_class = BasketItemSerializer filterset_class = BasketItemFilter @@ -15,12 +17,33 @@ class BasketItemViewSet(DetailedViewSetMixin, viewsets.ModelViewSet): "detailed": BasketItemDetailedSerializer, } + def get_queryset(self): + queryset = super().get_queryset() + user = self.request.user + return queryset.filter(basket__customer=user) + class BasketViewSet(DetailedViewSetMixin, viewsets.ModelViewSet): + permission_classes = () queryset = Basket.objects.all() serializer_class = BasketSerializer filterset_class = BasketFilter serializer_action_classes = { "detailed_list": BasketDetailedSerializer, "detailed": BasketDetailedSerializer, + "add_item": BasketItemSerializer } + + @action(detail=True, methods=['post']) + def add_item(self, request, pk=None): + serializer = BasketItemSerializer(data=request.data) + print("DATA: ", request.data) + if serializer.is_valid(): + serializer.save() + return Response(serializer.data, status=status.HTTP_201_CREATED) + return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) + + def get_queryset(self): + queryset = super().get_queryset() + user = self.request.user + return queryset.filter(customer=user) \ No newline at end of file diff --git a/ecommerce/core/serializers.py b/ecommerce/core/serializers.py index 1f67895..862178c 100644 --- a/ecommerce/core/serializers.py +++ b/ecommerce/core/serializers.py @@ -1,8 +1,12 @@ +from django.contrib.auth.password_validation import validate_password from django.utils.translation import gettext_lazy as _ - +from rest_framework import serializers from rest_framework.exceptions import AuthenticationFailed +from rest_framework.validators import UniqueValidator from rest_framework_simplejwt.serializers import TokenObtainPairSerializer +from customers.models import Customer + class APITokenObtainPairSerializer(TokenObtainPairSerializer): @classmethod @@ -14,3 +18,32 @@ def get_token(cls, user): token["last_name"] = user.last_name token["email"] = user.email return token + + +class RegisterCustomerSerializer(serializers.ModelSerializer): + + password_1 = serializers.CharField(required=True, write_only=True, validators=[validate_password], + style={"input_type": "password"}) + + password_2 = serializers.CharField(required=True, write_only=True, style={"input_type": "password"}) + + class Meta: + model = Customer + fields = ("email", "first_name", "last_name", "password_1", "password_2") + + def validate(self, attrs): + if attrs["password_1"] != attrs["password_2"]: + raise serializers.ValidationError({"password_1": "Passwords didn't match"}) + return attrs + + def create(self, validated_data): + customer = Customer.objects.create( + email=validated_data["email"], + first_name=validated_data["first_name"], + last_name=validated_data["last_name"] + ) + + customer.set_password(validated_data["password_1"]) + customer.save() + + return customer diff --git a/ecommerce/core/views.py b/ecommerce/core/views.py index f7ac70a..274caa7 100644 --- a/ecommerce/core/views.py +++ b/ecommerce/core/views.py @@ -1,7 +1,16 @@ +from rest_framework import generics +from rest_framework.permissions import AllowAny from rest_framework_simplejwt.views import TokenObtainPairView -from core.serializers import APITokenObtainPairSerializer +from core.serializers import APITokenObtainPairSerializer, RegisterCustomerSerializer +from customers.models import Customer class APITokenObtainPairView(TokenObtainPairView): serializer_class = APITokenObtainPairSerializer + + +class RegisterCustomerView(generics.CreateAPIView): + queryset = Customer.objects.all() + permission_classes = (AllowAny,) + serializer_class = RegisterCustomerSerializer \ No newline at end of file diff --git a/ecommerce/ecommerce/urls.py b/ecommerce/ecommerce/urls.py index 28278ef..9e63320 100644 --- a/ecommerce/ecommerce/urls.py +++ b/ecommerce/ecommerce/urls.py @@ -19,7 +19,7 @@ from rest_framework_simplejwt.views import TokenRefreshView from baskets.views import BasketItemViewSet, BasketViewSet -from core.views import APITokenObtainPairView +from core.views import APITokenObtainPairView, RegisterCustomerView from customers.views import AddressViewSet, CityViewSet, \ CountryViewSet, AdminCustomerViewSet, MyProfileViewSet from ecommerce.router import router @@ -55,9 +55,10 @@ path('api/token/refresh/', TokenRefreshView.as_view(), name='token_refresh'), path('api/profile/', MyProfileViewSet.as_view( {"get": "retrieve", "put": "update", "patch": "partial_update"}), name='profile'), + path('register/', RegisterCustomerView.as_view(), name='auth_register'), ] if settings.DEBUG: urlpatterns = urlpatterns + [ path("api-auth/", include("rest_framework.urls", namespace="rest_framework")), - ] + ] \ No newline at end of file diff --git a/ecommerce/orders/serializers.py b/ecommerce/orders/serializers.py index 26223c9..a3aba74 100644 --- a/ecommerce/orders/serializers.py +++ b/ecommerce/orders/serializers.py @@ -14,6 +14,8 @@ class Meta: class OrderSerializer(serializers.ModelSerializer): + customer = serializers.HiddenField(default=serializers.CurrentUserDefault()) + class Meta: model = Order fields = ("id", "customer", "basket", "status", "billing_address", "shipping_address", "total_price") diff --git a/ecommerce/orders/views.py b/ecommerce/orders/views.py index dde7137..ea9d73a 100644 --- a/ecommerce/orders/views.py +++ b/ecommerce/orders/views.py @@ -1,3 +1,4 @@ +from django.shortcuts import get_object_or_404 from rest_framework import viewsets from core.mixins import DetailedViewSetMixin @@ -28,6 +29,17 @@ class OrderViewSet(DetailedViewSetMixin, viewsets.ModelViewSet): "detailed": OrderDetailedSerializer, } + def get_object(self): + queryset = self.get_queryset() + filter_kwargs = {"customer": self.request.user} + obj = get_object_or_404(queryset, **filter_kwargs) + return obj + + def get_queryset(self): + queryset = super().get_queryset() + user = self.request.user + return queryset.filter(customer=user) + class BillingAddressViewSet(DetailedViewSetMixin, viewsets.ModelViewSet): queryset = BillingAddress.objects.all() From a9c1e4d4f1a2958f66c23297e9cb1e26eeb3fe8a Mon Sep 17 00:00:00 2001 From: Veli Aliev Date: Sat, 18 Dec 2021 23:13:12 +0300 Subject: [PATCH 2/2] deleted unnecessary debug print --- ecommerce/baskets/views.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ecommerce/baskets/views.py b/ecommerce/baskets/views.py index 0352860..42a526c 100644 --- a/ecommerce/baskets/views.py +++ b/ecommerce/baskets/views.py @@ -37,7 +37,7 @@ class BasketViewSet(DetailedViewSetMixin, viewsets.ModelViewSet): @action(detail=True, methods=['post']) def add_item(self, request, pk=None): serializer = BasketItemSerializer(data=request.data) - print("DATA: ", request.data) + if serializer.is_valid(): serializer.save() return Response(serializer.data, status=status.HTTP_201_CREATED) @@ -46,4 +46,4 @@ def add_item(self, request, pk=None): def get_queryset(self): queryset = super().get_queryset() user = self.request.user - return queryset.filter(customer=user) \ No newline at end of file + return queryset.filter(customer=user)