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
4 changes: 4 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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
15 changes: 12 additions & 3 deletions ecommerce/baskets/models.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,6 @@
import json
from datetime import datetime

from django.db import models
from django.utils.translation import gettext_lazy as _

Expand All @@ -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:
Expand All @@ -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}"
return f"{self.basket} - {self.product} - {self.quantity} - {self.price}"
8 changes: 6 additions & 2 deletions ecommerce/baskets/serializers.py
Original file line number Diff line number Diff line change
Expand Up @@ -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")
Expand Down
27 changes: 26 additions & 1 deletion ecommerce/baskets/views.py
Original file line number Diff line number Diff line change
@@ -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


Expand All @@ -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
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.

print(queryset.filter(basket__customer=user))
return queryset.filter(basket__customer=user)


class BasketViewSet(DetailedViewSetMixin, viewsets.ModelViewSet):
queryset = Basket.objects.all()
Expand 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
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(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)
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 islemlerini modeller uzerinden degil de serializer uzerinden yapmak daha iyi bir fikir.

return Response(serializer.data)
30 changes: 27 additions & 3 deletions ecommerce/customers/serializers.py
Original file line number Diff line number Diff line change
@@ -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
Expand All @@ -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(
Copy link
Owner

Choose a reason for hiding this comment

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

manager uzerinde create_user isminde guzel bir methodumuz var.

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


class CitySerializer(serializers.ModelSerializer):

class Meta:
model = City
fields = ("id", "name", "country")
Expand Down
12 changes: 8 additions & 4 deletions ecommerce/customers/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -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):
Expand All @@ -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
Expand Down Expand Up @@ -63,6 +70,3 @@ def get_queryset(self):
queryset = super().get_queryset()
user = self.request.user
return queryset.filter(customer=user)



4 changes: 3 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 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", RegisterViewSet, basename="register")


urlpatterns = [
Expand All @@ -61,3 +62,4 @@
urlpatterns = urlpatterns + [
path("api-auth/", include("rest_framework.urls", namespace="rest_framework")),
]
2