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
1 change: 1 addition & 0 deletions ecommerce/baskets/serializers.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ class Meta:


class BasketSerializer(serializers.ModelSerializer):
customer = serializers.HiddenField(default=serializers.CurrentUserDefault())

class Meta:
model = Basket
Expand Down
29 changes: 27 additions & 2 deletions ecommerce/baskets/views.py
Original file line number Diff line number Diff line change
@@ -1,12 +1,15 @@
from rest_framework import viewsets
from rest_framework import viewsets, status
from rest_framework.response import Response
from rest_framework.decorators import action

from baskets.filters import BasketItemFilter, BasketFilter
from baskets.models import BasketItem, Basket
from baskets.serializers import BasketItemSerializer, BasketSerializer, BasketItemDetailedSerializer, BasketDetailedSerializer
from core.mixins import DetailedViewSetMixin


class BasketItemViewSet(DetailedViewSetMixin, viewsets.ModelViewSet):
class BasketItemViewSet(DetailedViewSetMixin,viewsets.ModelViewSet):
http_method_names = ["get"]
queryset = BasketItem.objects.all()
serializer_class = BasketItemSerializer
filterset_class = BasketItemFilter
Expand All @@ -15,12 +18,34 @@ 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.

login olmamis bir customer varsa sanki problem var.

return queryset.filter(basket__customer__id=user)


class BasketViewSet(DetailedViewSetMixin, viewsets.ModelViewSet):
permission_classes = ()
http_method_names = ["get", "delete", "post"]
Copy link
Owner

Choose a reason for hiding this comment

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

basketi kullaniciya sildirmek guzel bir fikir degil sanki.

queryset = Basket.objects.all()
serializer_class = BasketSerializer
filterset_class = BasketFilter
serializer_action_classes = {
"detailed_list": BasketDetailedSerializer,
"detailed": BasketDetailedSerializer,
"create_product": BasketItemSerializer
Copy link
Owner

Choose a reason for hiding this comment

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

create_product seklinde bir action tanimlamamasiz.

}

def get_queryset(self):
# customer can only see own basket
queryset = super().get_queryset()
user = self.request.user
return queryset.filter(customer=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 customer varsa sanki problem var.


@action(detail=True, methods=['post'])
def add_product(self, request, pk=None):
serializer = BasketItemSerializer(data=request.data)
Copy link
Owner

Choose a reason for hiding this comment

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

price bilgisini kullanicidan almak guzel gozukmuyor.

if serializer.is_valid():
serializer.save()
return Response(serializer.data, status=status.HTTP_201_CREATED)
Copy link
Owner

Choose a reason for hiding this comment

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

basketviewset baskete ait bir serializer verisi donse daha guzel olur.

return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
13 changes: 13 additions & 0 deletions ecommerce/core/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -32,3 +32,16 @@ class IsStaffUserAuthenticated(BasePermission):

def has_permission(self, request, view):
return bool(request.user and request.user.is_authenticated and request.user.is_staff)


class IsAuthenticated(BasePermission):
# checks whether the user auth or not
def has_permission(self, request, view):
return bool(request.user and request.user.is_authenticated)


class CanCreateUser(BasePermission):
# users who create account are either new user or staff user
def has_permission(self, request, view):
return IsStaffUserAuthenticated.has_permission(self, request, view) \
or not (IsAuthenticated.has_permission(self, request, view))
38 changes: 34 additions & 4 deletions ecommerce/customers/serializers.py
Original file line number Diff line number Diff line change
@@ -1,20 +1,22 @@
import django.core.validators as EmailValidator
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
from rest_framework.exceptions import ValidationError

from customers.models import Customer, Address, City, Country
from rest_framework.validators import UniqueValidator


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")
Expand All @@ -27,7 +29,6 @@ class Meta:


class CitySerializer(serializers.ModelSerializer):

class Meta:
model = City
fields = ("id", "name", "country")
Expand Down Expand Up @@ -55,7 +56,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 All @@ -68,3 +70,31 @@ class AddressDetailedSerializer(AddressSerializer):

class CityDetailedSerializer(CitySerializer):
country = CountrySerializer()


class CustomerRegisterSerializer(serializers.ModelSerializer):
email = serializers.EmailField(label=_("email"),
write_only=True,
required=True,
validators=[EmailValidator, UniqueValidator(queryset=Customer.objects.all())])
password = serializers.CharField(label=_("Password"),
write_only=True,
required=True,
validators=[validate_password])
password_confirm = serializers.CharField(label=_("Confirm Password"),
write_only=True,
required=True)

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

def validate(self, attrs):
if attrs["password"] != attrs["password_confirm"]:
raise ValidationError(_("Passwords don't match."))
return attrs

def create(self, validated_data):
validated_data.pop("password_confirm")
new_customer = Customer.objects.create_user(**validated_data)
return new_customer
9 changes: 6 additions & 3 deletions ecommerce/customers/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,11 @@
from rest_framework.viewsets import GenericViewSet

from core.mixins import DetailedViewSetMixin
from core.utils import IsStaffUserAuthenticated
from core.utils import IsStaffUserAuthenticated, CanCreateUser
from customers.filters import CustomerFilter, AddressFilter, CountryFilter, CityFilter
from customers.models import Customer, Address, City, Country
from customers.serializers import CustomerSerializer, AddressSerializer, CitySerializer, \
CountrySerializer, \
CountrySerializer, CustomerRegisterSerializer, \
AddressDetailedSerializer, CityDetailedSerializer, ProfileSerializer


Expand Down Expand Up @@ -65,4 +65,7 @@ def get_queryset(self):
return queryset.filter(customer=user)



class CustomerRegisterViewSet(mixins.CreateModelMixin, GenericViewSet):
permission_classes = (CanCreateUser,)
queryset = Customer.objects.all()
serializer_class = CustomerRegisterSerializer
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, CustomerRegisterViewSet
from ecommerce.router import router
from orders.views import OrderItemViewSet, OrderViewSet, BillingAddressViewSet, ShippingAddressViewSet, \
OrderBankAccountViewSet
Expand All @@ -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", CustomerRegisterViewSet, basename="register")


urlpatterns = [
Expand Down