-
Notifications
You must be signed in to change notification settings - Fork 30
Ahmetbahadircol HW4 #96
base: main
Are you sure you want to change the base?
Changes from all commits
0da3ec4
7bf753a
7f5dc05
c351608
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| 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 | ||
|
|
@@ -15,12 +22,58 @@ class BasketItemViewSet(DetailedViewSetMixin, viewsets.ModelViewSet): | |
| "detailed": BasketItemDetailedSerializer, | ||
| } | ||
|
|
||
| def get_queryset(self): | ||
| queryset = super().get_queryset() | ||
| user = self.request.user.id | ||
|
Owner
There was a problem hiding this comment. Choose a reason for hiding this commentThe 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 | ||
|
Owner
There was a problem hiding this comment. Choose a reason for hiding this commentThe 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 | ||
|
Owner
There was a problem hiding this comment. Choose a reason for hiding this commentThe 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") | ||
|
Owner
There was a problem hiding this comment. Choose a reason for hiding this commentThe 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() | ||
|
Owner
There was a problem hiding this comment. Choose a reason for hiding this commentThe 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") | ||
|
Owner
There was a problem hiding this comment. Choose a reason for hiding this commentThe 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) | ||
|
Owner
There was a problem hiding this comment. Choose a reason for hiding this commentThe 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. |
||
|
|
||
| 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 | ||
|
|
@@ -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( | ||
|
Owner
There was a problem hiding this comment. Choose a reason for hiding this commentThe 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): | ||
|
Owner
There was a problem hiding this comment. Choose a reason for hiding this commentThe 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") | ||
|
|
@@ -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 | ||
|
|
||
| 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 | ||
|
|
@@ -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): | ||
|
|
@@ -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 | ||
|
|
@@ -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"] | ||
|
Owner
There was a problem hiding this comment. Choose a reason for hiding this commentThe 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} | ||
|
Owner
There was a problem hiding this comment. Choose a reason for hiding this commentThe 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 | ||
|
|
||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -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 | ||
|
|
@@ -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') | ||
|
Owner
There was a problem hiding this comment. Choose a reason for hiding this commentThe 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: | ||
|
|
||
There was a problem hiding this comment.
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.