Skip to content
This repository has been archived by the owner on May 12, 2023. It is now read-only.

Keremserttas hw4 #106

Open
wants to merge 4 commits into
base: main
Choose a base branch
from
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
49 changes: 48 additions & 1 deletion ecommerce/baskets/views.py
Original file line number Diff line number Diff line change
@@ -1,9 +1,16 @@
from django.core.exceptions import ObjectDoesNotExist, MultipleObjectsReturned
from django.db.transaction import atomic
from rest_framework import viewsets
from rest_framework import 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
from baskets.serializers import BasketItemSerializer, BasketSerializer, BasketItemDetailedSerializer, \
BasketDetailedSerializer
from core.mixins import DetailedViewSetMixin
from products.models import Product


class BasketItemViewSet(DetailedViewSetMixin, viewsets.ModelViewSet):
Expand All @@ -15,6 +22,11 @@ class BasketItemViewSet(DetailedViewSetMixin, viewsets.ModelViewSet):
"detailed": BasketItemDetailedSerializer,
}

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

Choose a reason for hiding this comment

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

login olmamis bir kullanici durumunda problem olusuyor sanki?

return queryset.filter(basket__customer__id=user)


class BasketViewSet(DetailedViewSetMixin, viewsets.ModelViewSet):
queryset = Basket.objects.all()
Expand All @@ -24,3 +36,38 @@ class BasketViewSet(DetailedViewSetMixin, viewsets.ModelViewSet):
"detailed_list": BasketDetailedSerializer,
"detailed": BasketDetailedSerializer,
}

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

Choose a reason for hiding this comment

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

login olmamis bir kullanici durumunda problem olusuyor sanki?

return queryset.filter(customer=user)

@atomic()
@action(detail=True, methods=['post'], http_method_names=['post'])
def add_basket_item(self, request):

user_id = self.request.user.id
product = Product.objects.get(id=request.data["product"])
quantity = request.data["quantity"]
price = product.price

try:
basket = Basket.objects.get(customer__id=user_id)
except ObjectDoesNotExist:
basket = Basket.objects.create(customer_id=user_id)
except MultipleObjectsReturned:
basket = Basket.objects.filter(customer__id=user_id).first()

basket_item = BasketItem.objects.filter(basket=basket, product=product, price=price).first()

if basket_item:
basket_item.quantity += quantity

else:
basket_item = BasketItem.objects.create(basket=basket, product=product, quantity=quantity,price=price)
Copy link
Owner

Choose a reason for hiding this comment

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

kayit insert/update validation islemlerini serializer uzerinden yapmamizda fayda var.


basket_item.save()
basket.save()

serializer = BasketItemSerializer(basket)
Copy link
Owner

Choose a reason for hiding this comment

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

basket viewseti basket e ait bir serializer datasi donmesi daha iyi bir fikir olur.

return Response(serializer.data, status=status.HTTP_201_CREATED)
27 changes: 27 additions & 0 deletions ecommerce/customers/serializers.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
from django.contrib.auth.password_validation import validate_password
from django.core.validators import EmailValidator
from django.utils.translation import gettext_lazy as _
from django.db.transaction import atomic
from rest_framework import serializers
Expand All @@ -13,6 +15,31 @@ class Meta:
fields = ("id", "first_name", "last_name", "email", "is_staff", "is_active", "date_joined")


class RegisterSerializer(serializers.ModelSerializer):
email = serializers.EmailField(required=True, validators=[EmailValidator()])
password = serializers.CharField(required=True, validators=[validate_password])
password_repeat = serializers.CharField(required=True)

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

def validate(self, attrs):
if attrs["password"] != attrs["password_repeat"]:
raise ValidationError(_("Passwords should be the same"))
return attrs

def create(self, validated_data):
customer = Customer.objects.create_user(
first_name=validated_data["first_name"],
last_name=validated_data["last_name"],
email=validated_data["email"],
password=validated_data["password"]
)
customer.save()
return customer


class ProfileSerializer(serializers.ModelSerializer):

class Meta:
Expand Down
11 changes: 10 additions & 1 deletion ecommerce/customers/views.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
from django.shortcuts import get_object_or_404
from rest_framework import viewsets, permissions, mixins
from rest_framework.permissions import AllowAny
from rest_framework.viewsets import GenericViewSet

from core.mixins import DetailedViewSetMixin
Expand All @@ -8,7 +9,15 @@
from customers.models import Customer, Address, City, Country
from customers.serializers import CustomerSerializer, AddressSerializer, CitySerializer, \
CountrySerializer, \
AddressDetailedSerializer, CityDetailedSerializer, ProfileSerializer
AddressDetailedSerializer, CityDetailedSerializer,\
ProfileSerializer, RegisterSerializer\



class RegisterViewSet(mixins.CreateModelMixin, GenericViewSet):
permission_classes = (AllowAny,)
queryset = Customer.objects.all()
serializer_class = RegisterSerializer


class AdminCustomerViewSet(viewsets.ModelViewSet):
Expand Down
4 changes: 2 additions & 2 deletions 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 All @@ -46,7 +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)

urlpatterns = [
path("api/", include(router.urls)),
Expand Down
7 changes: 6 additions & 1 deletion ecommerce/orders/views.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
from rest_framework import viewsets
from rest_framework import viewsets, permissions

from core.mixins import DetailedViewSetMixin
from orders.filters import OrderItemFilter, OrderFilter, BillingAddressFilter, ShippingAddressFilter, \
Expand All @@ -10,6 +10,7 @@


class OrderItemViewSet(DetailedViewSetMixin, viewsets.ModelViewSet):
permission_classes = (permissions.IsAuthenticated,)
queryset = OrderItem.objects.all()
serializer_class = OrderItemSerializer
filterset_class = OrderItemFilter
Expand All @@ -20,6 +21,7 @@ class OrderItemViewSet(DetailedViewSetMixin, viewsets.ModelViewSet):


class OrderViewSet(DetailedViewSetMixin, viewsets.ModelViewSet):
permission_classes = (permissions.IsAuthenticated,)
queryset = Order.objects.all()
serializer_class = OrderSerializer
filterset_class = OrderFilter
Expand All @@ -30,6 +32,7 @@ class OrderViewSet(DetailedViewSetMixin, viewsets.ModelViewSet):


class BillingAddressViewSet(DetailedViewSetMixin, viewsets.ModelViewSet):
permission_classes = (permissions.IsAuthenticated,)
queryset = BillingAddress.objects.all()
serializer_class = BillingAddressSerializer
filterset_class = BillingAddressFilter
Expand All @@ -40,6 +43,7 @@ class BillingAddressViewSet(DetailedViewSetMixin, viewsets.ModelViewSet):


class ShippingAddressViewSet(DetailedViewSetMixin, viewsets.ModelViewSet):
permission_classes = (permissions.IsAuthenticated,)
queryset = ShippingAddress.objects.all()
serializer_class = ShippingAddressSerializer
filterset_class = ShippingAddressFilter
Expand All @@ -50,6 +54,7 @@ class ShippingAddressViewSet(DetailedViewSetMixin, viewsets.ModelViewSet):


class OrderBankAccountViewSet(DetailedViewSetMixin, viewsets.ModelViewSet):
permission_classes = (permissions.IsAuthenticated,)
queryset = OrderBankAccount.objects.all()
serializer_class = OrderBankAccountSerializer
filterset_class = OrderBankAccountFilter
Expand Down
4 changes: 3 additions & 1 deletion ecommerce/payments/views.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
from rest_framework import viewsets
from rest_framework import viewsets, permissions

from core.mixins import DetailedViewSetMixin
from payments.filters import BankAccountFilter, BankFilter
Expand All @@ -7,6 +7,7 @@


class BankAccountViewSet(DetailedViewSetMixin, viewsets.ModelViewSet):
permission_classes = (permissions.IsAuthenticated,)
queryset = BankAccount.objects.all()
serializer_class = BankAccountSerializer
filterset_class = BankAccountFilter
Expand All @@ -17,6 +18,7 @@ class BankAccountViewSet(DetailedViewSetMixin, viewsets.ModelViewSet):


class BankViewSet(viewsets.ModelViewSet):
permission_classes = (permissions.IsAuthenticated,)
queryset = Bank.objects.all()
serializer_class = BankSerializer
filterset_class = BankFilter
Expand Down
2 changes: 2 additions & 0 deletions ecommerce/products/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -37,12 +37,14 @@ class AdminProductViewSet(DetailedViewSetMixin, viewsets.ModelViewSet):


class CategoryViewSet(viewsets.ModelViewSet):
permission_classes = ()
http_method_names = ["get"]
queryset = Category.objects.all()
serializer_class = CategorySerializer


class PriceViewSet(viewsets.ModelViewSet):
permission_classes = ()
http_method_names = ["get"]
queryset = Price.objects.all()
filterset_class = PriceFilter
Expand Down