From 7a3c85c824c3eb931a239fea2c22eecba25a909c Mon Sep 17 00:00:00 2001 From: Utku Aysev Date: Fri, 17 Dec 2021 01:04:45 +0300 Subject: [PATCH 1/3] register is done --- ecommerce/customers/serializers.py | 30 +++++++++++++++++++++++++++--- ecommerce/customers/views.py | 12 ++++++++---- ecommerce/ecommerce/urls.py | 4 +++- 3 files changed, 38 insertions(+), 8 deletions(-) diff --git a/ecommerce/customers/serializers.py b/ecommerce/customers/serializers.py index ffad735..4e841df 100644 --- a/ecommerce/customers/serializers.py +++ b/ecommerce/customers/serializers.py @@ -1,3 +1,4 @@ +from datetime import datetime from django.utils.translation import gettext_lazy as _ from django.db.transaction import atomic from rest_framework import serializers @@ -7,14 +8,38 @@ class CustomerSerializer(serializers.ModelSerializer): - class Meta: model = Customer fields = ("id", "first_name", "last_name", "email", "is_staff", "is_active", "date_joined") -class ProfileSerializer(serializers.ModelSerializer): +class RegisterSerializer(serializers.ModelSerializer): + password = serializers.CharField( + write_only=True, + required=True, + help_text='Minimum 8 characters with numbers and letters', + style={'input_type': 'password', 'placeholder': 'Password'} + ) + + def create(self, validated_data): + user = Customer.objects.create( + email=validated_data['email'], + first_name=validated_data['first_name'], + last_name=validated_data['last_name'], + date_joined=datetime.now() + ) + + user.set_password(validated_data['password']) + user.save() + + return user + class Meta: + model = Customer + fields = ("id", "first_name", "last_name", "password", "email", "is_staff", "is_active") + + +class ProfileSerializer(serializers.ModelSerializer): class Meta: model = Customer fields = ("first_name", "last_name", "email") @@ -27,7 +52,6 @@ class Meta: class CitySerializer(serializers.ModelSerializer): - class Meta: model = City fields = ("id", "name", "country") diff --git a/ecommerce/customers/views.py b/ecommerce/customers/views.py index e2d05b6..beeda84 100644 --- a/ecommerce/customers/views.py +++ b/ecommerce/customers/views.py @@ -8,7 +8,7 @@ from customers.models import Customer, Address, City, Country from customers.serializers import CustomerSerializer, AddressSerializer, CitySerializer, \ CountrySerializer, \ - AddressDetailedSerializer, CityDetailedSerializer, ProfileSerializer + AddressDetailedSerializer, CityDetailedSerializer, ProfileSerializer, RegisterSerializer class AdminCustomerViewSet(viewsets.ModelViewSet): @@ -21,6 +21,13 @@ class AdminCustomerViewSet(viewsets.ModelViewSet): filterset_class = CustomerFilter +class RegisterViewSet(viewsets.ModelViewSet, mixins.CreateModelMixin): + http_method_names = ['post'] + permission_classes = () + queryset = Customer.objects.all() + serializer_class = RegisterSerializer + + class MyProfileViewSet(mixins.RetrieveModelMixin, mixins.UpdateModelMixin, GenericViewSet): queryset = Customer.objects.all() serializer_class = ProfileSerializer @@ -63,6 +70,3 @@ def get_queryset(self): queryset = super().get_queryset() user = self.request.user return queryset.filter(customer=user) - - - diff --git a/ecommerce/ecommerce/urls.py b/ecommerce/ecommerce/urls.py index 28278ef..40497ed 100644 --- a/ecommerce/ecommerce/urls.py +++ b/ecommerce/ecommerce/urls.py @@ -21,7 +21,7 @@ from baskets.views import BasketItemViewSet, BasketViewSet from core.views import APITokenObtainPairView from customers.views import AddressViewSet, CityViewSet, \ - CountryViewSet, AdminCustomerViewSet, MyProfileViewSet + CountryViewSet, AdminCustomerViewSet, MyProfileViewSet, RegisterViewSet from ecommerce.router import router from orders.views import OrderItemViewSet, OrderViewSet, BillingAddressViewSet, ShippingAddressViewSet, \ OrderBankAccountViewSet @@ -46,6 +46,7 @@ router.register("banks", BankViewSet) router.register("admin-products", AdminProductViewSet, basename="admin-product") router.register("admin-customers", AdminCustomerViewSet, basename="admin-customer") +router.register("register", RegisterViewSet, basename="register") urlpatterns = [ @@ -61,3 +62,4 @@ urlpatterns = urlpatterns + [ path("api-auth/", include("rest_framework.urls", namespace="rest_framework")), ] +2 \ No newline at end of file From 05b2b94ffe5930343b1bba2a84ce063482f3b108 Mon Sep 17 00:00:00 2001 From: Utku Aysev Date: Sun, 19 Dec 2021 04:02:28 +0300 Subject: [PATCH 2/3] add basket item is done --- ecommerce/baskets/models.py | 15 ++++++++++++--- ecommerce/baskets/serializers.py | 8 ++++++-- ecommerce/baskets/views.py | 27 ++++++++++++++++++++++++++- 3 files changed, 44 insertions(+), 6 deletions(-) diff --git a/ecommerce/baskets/models.py b/ecommerce/baskets/models.py index 4f109d5..c9d3011 100644 --- a/ecommerce/baskets/models.py +++ b/ecommerce/baskets/models.py @@ -1,3 +1,6 @@ +import json +from datetime import datetime + from django.db import models from django.utils.translation import gettext_lazy as _ @@ -11,9 +14,9 @@ class Basket(BaseAbstractModel): """ Basket model """ - customer = models.ForeignKey(Customer, verbose_name=_("Customer"), + customer = models.ForeignKey(Customer, verbose_name=_("Customer"), on_delete=models.PROTECT, null=True, blank=True) - status = models.CharField(choices=enums.BasketStatus.choices, max_length=10, + status = models.CharField(choices=enums.BasketStatus.choices, max_length=10, verbose_name=_("Basket Status"), default=enums.BasketStatus.OPEN) class Meta: @@ -33,9 +36,15 @@ class BasketItem(BaseAbstractModel): quantity = models.PositiveIntegerField(verbose_name=_("Quantity")) price = models.DecimalField(max_digits=10, decimal_places=2, verbose_name=_("Price")) + @classmethod + def create(clsk, data): + basketItem = clsk(basket=data["basket"], product=data["product"], quantity=data["quantity"], + price=data["price"]) + return basketItem + class Meta: verbose_name = _("Basket item") verbose_name_plural = _("Basket items") def __str__(self): - return f"{self.basket} - {self.product} - {self.quantity} - {self.price}" \ No newline at end of file + return f"{self.basket} - {self.product} - {self.quantity} - {self.price}" diff --git a/ecommerce/baskets/serializers.py b/ecommerce/baskets/serializers.py index 9dc4c30..f6196de 100644 --- a/ecommerce/baskets/serializers.py +++ b/ecommerce/baskets/serializers.py @@ -6,14 +6,18 @@ class BasketItemSerializer(serializers.ModelSerializer): - class Meta: model = BasketItem fields = ("id", "basket", "product", "quantity", "price") -class BasketSerializer(serializers.ModelSerializer): +class AddBasketItemSerializer(serializers.ModelSerializer): + class Meta: + model = BasketItem + fields = ("id", "product", "quantity", "price") + +class BasketSerializer(serializers.ModelSerializer): class Meta: model = Basket fields = ("id", "customer", "status") diff --git a/ecommerce/baskets/views.py b/ecommerce/baskets/views.py index ee32571..0385158 100644 --- a/ecommerce/baskets/views.py +++ b/ecommerce/baskets/views.py @@ -1,8 +1,11 @@ from rest_framework import viewsets +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 +from baskets.serializers import BasketItemSerializer, BasketSerializer, BasketItemDetailedSerializer, \ + BasketDetailedSerializer, AddBasketItemSerializer from core.mixins import DetailedViewSetMixin @@ -13,8 +16,15 @@ class BasketItemViewSet(DetailedViewSetMixin, viewsets.ModelViewSet): serializer_action_classes = { "detailed_list": BasketItemDetailedSerializer, "detailed": BasketItemDetailedSerializer, + } + def get_queryset(self): + queryset = super().get_queryset() + user = self.request.user + print(queryset.filter(basket__customer=user)) + return queryset.filter(basket__customer=user) + class BasketViewSet(DetailedViewSetMixin, viewsets.ModelViewSet): queryset = Basket.objects.all() @@ -23,4 +33,19 @@ class BasketViewSet(DetailedViewSetMixin, viewsets.ModelViewSet): serializer_action_classes = { "detailed_list": BasketDetailedSerializer, "detailed": BasketDetailedSerializer, + "add_basket_item": AddBasketItemSerializer } + + def get_queryset(self): + queryset = super().get_queryset() + user = self.request.user + return queryset.filter(customer=user) + + @action(detail=True, methods=["post"]) + def add_basket_item(self, request, pk): + copy_data = request.data.copy() + copy_data["basket_id"] = pk + serializer = BasketItemSerializer(data=copy_data) + if serializer.is_valid(): + BasketItem.create(copy_data) + return Response(serializer.data) From 0a33e9fc527ce8402b72c4698dee89275632bf7a Mon Sep 17 00:00:00 2001 From: utkuaysev <33395066+utkuaysev@users.noreply.github.com> Date: Tue, 21 Dec 2021 18:30:03 +0300 Subject: [PATCH 3/3] Update README.md --- README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/README.md b/README.md index 7758750..aa59c87 100644 --- a/README.md +++ b/README.md @@ -47,3 +47,7 @@ Run `python manage.py runserver ip_you_want:port_you_want` and go to [`http://ip Ex.: Run `python manage.py runserver 0.0.0.0:5252` and go to [`http://0.0.0.0:5252`](http://0.0.0.0:5252) from the browser. > Note: If ip and port are not specified, it will work on the default ip(127.0.0.1) and port(8000). Make sure that the ip address entered in "ip_you_want" is in ALLOWED_HOSTS variable in the [`.env`](ecommerce/.env) file. + +## API +-register endpoint is created +- items cann add to the basket with /add_basket_item url