Skip to content
This repository was archived by the owner on May 12, 2023. It is now read-only.
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion ecommerce/baskets/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ class BasketItem(BaseAbstractModel):
"""
Basket item model
"""
basket = models.ForeignKey(Basket, verbose_name=_("Basket"), on_delete=models.PROTECT)
basket = models.ForeignKey(Basket, verbose_name=_("Basket"), on_delete=models.PROTECT, blank=True)
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

basket neden blank olabilir dedik, boyle bir sey eklersek problem yasama ihtimalimiz cok buyuk olacaktir.

product = models.ForeignKey(Product, verbose_name=_("Product"), on_delete=models.PROTECT)
quantity = models.PositiveIntegerField(verbose_name=_("Quantity"))
price = models.DecimalField(max_digits=10, decimal_places=2, verbose_name=_("Price"))
Expand Down
55 changes: 54 additions & 1 deletion ecommerce/baskets/views.py
Original file line number Diff line number Diff line change
@@ -1,12 +1,19 @@
from rest_framework import viewsets
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
from core.mixins import DetailedViewSetMixin
from rest_framework.decorators import action

from customers.models import Customer


class BasketItemViewSet(DetailedViewSetMixin, viewsets.ModelViewSet):
permission_classes = ()
http_method_names = ["get"]
queryset = BasketItem.objects.all()
serializer_class = BasketItemSerializer
filterset_class = BasketItemFilter
Expand All @@ -15,12 +22,58 @@ class BasketItemViewSet(DetailedViewSetMixin, viewsets.ModelViewSet):
"detailed": BasketItemDetailedSerializer,
}

def get_queryset(self):
queryset = super().get_queryset()
user = self.request.user.id
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

user.id eger None olursa ne yapmaliyiz? kod nasil davranmali?

return queryset.filter(basket__customer__id=user)


class BasketViewSet(DetailedViewSetMixin, viewsets.ModelViewSet):
permission_classes = ()
http_method_names = ["get", "post", "options"]
queryset = Basket.objects.all()
serializer_class = BasketSerializer
filterset_class = BasketFilter
serializer_action_classes = {
"detailed_list": BasketDetailedSerializer,
"detailed": BasketDetailedSerializer,
"add_product": BasketItemSerializer,
}

def get_queryset(self):
queryset = super().get_queryset()
user = self.request.user.id
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

user.id None olursa ne yapmaliyiz? kod nasil davranmali?

return queryset.filter(basket__customer__id=user)

@action(detail=False, methods=["post", "options"])
def add_product(self, request, pk=None, *args, **kwargs):
"""
Create a new endpoint for adding product to basket item
Check if Basket is exist otherwise create a new one
:param request: request
:param pk: None
:param args:
:param kwargs:
:return: Dictionary
"""
serializer = BasketItemSerializer(data=request.data)
if serializer.is_valid():
user = self.request.user.id
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

user.id None olursa ne yapmaliyiz? yani login olmayan bir kullanici durumunda ne yapmaliyiz?

customer_obj = Customer.objects.filter(id=user).first()
product = serializer.validated_data.get("product")
quantity = serializer.validated_data.get("quantity")
price = serializer.validated_data.get("price")
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

price degerini kullanicidan almak guzel bir fikir olmayacaktir.

basket = Basket.objects.filter(customer=customer_obj, status="open").first()
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

open degerini BasketStatus enum'undan almamizda fayda var.

if not basket:
basket = Basket.objects.create(customer=customer_obj, status="open")
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

serializer'siz kayit olusturmak veya update etmek guzel bir fikir olmayacaktir.

basket_item = BasketItem.objects.filter(basket__customer=user, product=product, price=float(str(price)))
if not basket_item:
basket_item = BasketItem.objects.create(basket=basket, product=product, quantity=quantity, price=float(str(price)))
else:
old_qty = basket_item[0].quantity
new_qty = old_qty + float(quantity)
basket_item[0].quantity = new_qty
basket_item[0].save()
serializer_detailed_data = BasketItemDetailedSerializer(basket_item[0]).data
return Response(serializer_detailed_data)
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

buradan response olarak her zaman icerisinde basket itemlari olan basket response u donmek guzel bir fikir olacaktir.


39 changes: 35 additions & 4 deletions ecommerce/customers/serializers.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
from django.contrib.auth.password_validation import validate_password
from django.utils.translation import gettext_lazy as _
from django.db.transaction import atomic
from rest_framework import serializers
Expand All @@ -7,27 +8,56 @@


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 Meta:
model = Customer
fields = ("first_name", "last_name", "email")


class RegisterSerializer(serializers.ModelSerializer):
"""
Register Serializer for create new user
"""
password = serializers.CharField(
write_only=True, required=True, style={'input_type': 'password', 'placeholder': 'Password'},
validators=[validate_password])
password2 = serializers.CharField(write_only=True, required=True)

def create(self, validated_data):
customer = Customer.objects.create(
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

customer olusturmak icin create_user seklinde guzel bir manager methodumuz var.

first_name=validated_data.get('first_name'),
last_name=validated_data.get('last_name'),
email=validated_data['email'],
)
customer.set_password(validated_data['password'])
customer.save()

return customer

def update(self, instance, validated_data):
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

register serializer'inin update i olmamali sanki?

instance.first_name = validated_data.get('first_name', instance.first_name)
instance.last_name = validated_data.get('last_name', instance.last_name)
instance.email = validated_data.get('email', instance.email)
instance.save()
return instance

class Meta:
model = Customer
fields = ("first_name", "last_name", "email", "password", "password2")


class CountrySerializer(serializers.ModelSerializer):
class Meta:
model = Country
fields = ("id", "name")


class CitySerializer(serializers.ModelSerializer):

class Meta:
model = City
fields = ("id", "name", "country")
Expand Down Expand Up @@ -55,7 +85,8 @@ def validate(self, attrs):

return validated_data

def validate_full_name(self, value):
@staticmethod
def validate_full_name(value):
if len(value) < 10:
raise ValidationError(detail=_("Full name length must be bigger than 10"))
return value
Expand Down
22 changes: 21 additions & 1 deletion ecommerce/customers/views.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
from django.contrib.auth import logout
from django.shortcuts import get_object_or_404
from rest_framework import viewsets, permissions, mixins
from rest_framework.viewsets import GenericViewSet
Expand All @@ -8,7 +9,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):
Expand Down Expand Up @@ -51,6 +52,7 @@ class CityViewSet(DetailedViewSetMixin, viewsets.ModelViewSet):


class AddressViewSet(DetailedViewSetMixin, viewsets.ModelViewSet):
permission_classes = (permissions.IsAuthenticated,)
queryset = Address.objects.all()
serializer_class = AddressSerializer
filterset_class = AddressFilter
Expand All @@ -65,4 +67,22 @@ def get_queryset(self):
return queryset.filter(customer=user)


class RegisterViewSet(mixins.CreateModelMixin, mixins.RetrieveModelMixin, GenericViewSet):
"""
Register new customer endpoint
"""
queryset = Customer.objects.all()
serializer_class = RegisterSerializer
permission_classes = ()
http_method_names = ["get", "put", "patch", "options"]
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

mixins.CreateModelMixin post methodunu bekler, put ve patch icin bir mixin tanimi yapmamisiz ve esasinda gerek de yok diyebilirim, cunku sadece register yapmaya calisiyoruz.


def get_object(self):
"""
Each customer must see own profile
:return: Customer Object
"""
queryset = self.get_queryset()
filter_kwargs = {"id": self.request.user.id}
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

register isleminde login olmus bir kullaniciyi beklemek guzel bir fikir degil sanki?

obj = get_object_or_404(queryset, **filter_kwargs)
return obj

3 changes: 2 additions & 1 deletion ecommerce/ecommerce/urls.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -55,6 +55,7 @@
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('api/register/', RegisterViewSet.as_view({"put": "create", "get": "retrieve"}), name='register')
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

burada tanim yapacak isek RESTful standartlarinda create icin POST yapilmali. Fakat router'a register edilse daha iyi olur.

Register endpointi normal sartlarda get yanitina cevap vermemeli.

]

if settings.DEBUG:
Expand Down