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
25 changes: 25 additions & 0 deletions ecommerce/baskets/filters.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
from django.utils.translation import gettext_lazy as _
from django_filters import rest_framework as filters

from baskets.models import Basket, BasketItem
from customers.filters import CustomerFilter
from products.filters import ProductFilter


class BasketFilter(filters.FilterSet):
customer = CustomerFilter
status = filters.CharFilter(label=_("Status"), lookup_expr="icontains")

class Meta:
model = Basket
fields = ("customer", "status")


class BasketItemFilter(filters.FilterSet):
product = ProductFilter
basket = BasketFilter
price = filters.NumberFilter(label=_("Price"), lookup_expr="gte")

class Meta:
model = BasketItem
fields = ("product", "basket", "price")
65 changes: 65 additions & 0 deletions ecommerce/baskets/serializers.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
from django.db.transaction import atomic
from rest_framework import serializers

from baskets.models import Basket, BasketItem

from products.serializers import ProductSerializer, ProductDetailedSerializer
from customers.serializers import CustomerSerializer


class BasketSerializer(serializers.ModelSerializer):
class Meta:
model = Basket
read_only_fields = ['id', 'created_at', 'updated_at']
Copy link
Owner

Choose a reason for hiding this comment

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

bu alanlar zaten read_only degil mi?

fields = ("id", "customer", "status")


class BasketItemSerializer(serializers.ModelSerializer):
class Meta:
model = BasketItem
read_only_fields = ['id', 'created_at', 'updated_at']
fields = ("id", "basket", "product", "quantity", "price")


class BasketDetailedSerializer(BasketSerializer):
customer = CustomerSerializer()
class Meta:
model = Basket
fields = ("customer", "status")

@atomic()
def create(self, validated_data):
customer = validated_data.pop("customer", None)
basket = super().create(validated_data)

if customer:
serializer = CustomerSerializer(data=customer)
serializer.is_valid(raise_exception=True)
serializer.save()
basket.customer.add(*serializer.instance)
Copy link
Owner

Choose a reason for hiding this comment

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

sepet eklerken customer eklenmesi cok kullanisli gozukmiyor sanki?


return basket


class BasketItemDetailedSerializer(BasketItemSerializer):
basket = BasketDetailedSerializer()
product = ProductDetailedSerializer()

@atomic()
def create(self, 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.

genelde (ozel durumlar haric) detailed'lar ile create/update islemleri yapmamayi tercih ediyoruz.

basket = validated_data.pop("basket", None)
product = validated_data.pop("product", None)

basket_item = super().create(validated_data)

if basket:
serializer = BasketSerializer(data=basket)
serializer.is_valid(raise_exception=True)
serializer.save()
basket_item.basket.add(*serializer.instance)
if product:
serializer = ProductSerializer(data=product)
serializer.is_valid(raise_exception=True)
serializer.save()
basket_item.product.add(*serializer.instance)
return basket_item
26 changes: 24 additions & 2 deletions ecommerce/baskets/views.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,25 @@
from django.shortcuts import render
from rest_framework import viewsets
from baskets.filters import BasketFilter, BasketItemFilter
from baskets.models import Basket, BasketItem
from baskets.serializers import BasketSerializer, BasketDetailedSerializer, BasketItemSerializer, BasketItemDetailedSerializer
from core.mixins import DetailedViewSetMixin

# Create your views here.

class BasketViewSet(DetailedViewSetMixin, viewsets.ModelViewSet):
queryset = Basket.objects.all()
serializer_class = BasketSerializer
filterset_class = BasketFilter
serializer_action_classes = {
"detailed_list": BasketDetailedSerializer,
"detailed": BasketDetailedSerializer,
}


class BasketItemViewSet(DetailedViewSetMixin, viewsets.ModelViewSet):
queryset = BasketItem.objects.all()
serializer_class = BasketItemSerializer
filterset_class = BasketItemFilter
serializer_action_classes = {
"detailed_list": BasketItemDetailedSerializer,
"detailed": BasketItemDetailedSerializer,
}
41 changes: 41 additions & 0 deletions ecommerce/customers/filters.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
from django_filters import rest_framework as filters
from django.utils.translation import gettext_lazy as _
from customers.models import Customer, City, Country, Address


class CustomerFilter(filters.FilterSet):
first_name = filters.CharFilter(label=_("First Name"), lookup_expr="icontains")
last_name = filters.CharFilter(label=_("Last Name"), lookup_expr="icontains")
email = filters.CharFilter(label=_("Email"), lookup_expr="icontains")
is_active = filters.BooleanFilter(label=_('Active'), field_name='is_active')

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


class CountryFilter(filters.FilterSet):
name = filters.CharFilter(label=_("Country Name"), lookup_expr="icontains")

class Meta:
model = Country
fields = ("name",)


class CityFilter(filters.FilterSet):
country = CountryFilter
name = filters.CharFilter(label=_("City Name"), lookup_expr="icontains")

class Meta:
model = City
fields = ("name", "country",)


class AddressFilter(filters.FilterSet):
customer = CustomerFilter
name = filters.CharFilter(label=_("Address Name"), lookup_expr="icontains")
city = CityFilter

class Meta:
model = Address
fields = ("customer", "name", "city",)
79 changes: 79 additions & 0 deletions ecommerce/customers/serializers.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,79 @@
from django.db.transaction import atomic
from rest_framework import serializers
from customers.models import Customer, City, Address, Country

class CustomerSerializer(serializers.ModelSerializer):
class Meta:
model = Customer
fields = ("id", "first_name", "last_name", "email",)

class CitySerializer(serializers.ModelSerializer):
class Meta:
model = City
fields = ("id", "name", "country",)


class CityDetailedSerializer(serializers.ModelSerializer):
country = CountrySerializer()

class Meta:
model = City
fields = ("id", "name", "country",)

@atomic()
def create(self, validated_data):
country = validated_data.pop("country", None)
city = super().create(validated_data)
if country:
serializer = CountrySerializer(data=country)
serializer.is_valid(raise_exception=True)
serializer.save()
city.country.add(*serializer.instance)
return city


class AddressSerializer(serializers.ModelSerializer):
class Meta:
model = Address
fields = ("id", "customer", "name", "full_name",
"line_1", "line_2", "phone", "district", "zipcode",
"city", "is_default")


class AddressDetailedSerializer(serializers.ModelSerializer):
customer = CustomerSerializer()
city = CityDetailedSerializer()

class Meta:
model = Address
fields = ("id", "customer", "name", "full_name",
"line_1", "line_2", "phone", "district", "zipcode",
"city", "is_default")

@atomic()
def create(self, validated_data):
customer = validated_data.pop("customer", None)
city = validated_data.pop("city", None)

address = super().create(validated_data)

if customer:
serializer = CustomerSerializer(data=customer)
serializer.is_valid(raise_exception=True)
serializer.save()
address.customer.add(*serializer.instance)

address = super().create(validated_data)

if city:
serializer = CityDetailedSerializer(data=city)
serializer.is_valid(raise_exception=True)
serializer.save()
address.city.add(*serializer.instance)
return address


class CountrySerializer(serializers.ModelSerializer):
class Meta:
model = Country
fields = ("id", "name",)
39 changes: 37 additions & 2 deletions ecommerce/customers/views.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,38 @@
from django.shortcuts import render
from rest_framework import viewsets

# Create your views here.
from core.mixins import DetailedViewSetMixin
from customers.filters import CustomerFilter, CityFilter, CountryFilter, AddressFilter
from customers.models import Customer, City, Country, Address
from customers.serializers import CustomerSerializer, CitySerializer, CountrySerializer, AddressSerializer, CityDetailedSerializer, AddressDetailedSerializer


class CustomerViewSet(viewsets.ModelViewSet):
queryset = Customer.objects.filter(is_active=True)
serializer_class = CustomerSerializer
filterset_class = CustomerFilter


class CityViewSet(DetailedViewSetMixin, viewsets.ModelViewSet):
queryset = City.objects.all()
serializer_class = CitySerializer
filterset_class = CityFilter
serializer_action_classes = {
"detailed_list": CityDetailedSerializer,
"detailed": CityDetailedSerializer,
}


class CountryViewSet(DetailedViewSetMixin, viewsets.ModelViewSet):
queryset = Country.objects.all()
serializer_class = CountrySerializer
filterset_class = CountryFilter


class AddressViewSet(DetailedViewSetMixin, viewsets.ModelViewSet):
queryset = Address.objects.all()
serializer_class = AddressSerializer
filterset_class = AddressFilter
serializer_action_classes = {
"detailed_list": AddressDetailedSerializer,
"detailed": AddressDetailedSerializer,
}
4 changes: 3 additions & 1 deletion ecommerce/ecommerce/settings.py
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,9 @@
]

REST_FRAMEWORK = {
'DEFAULT_FILTER_BACKENDS': ['django_filters.rest_framework.DjangoFilterBackend']
'DEFAULT_FILTER_BACKENDS': ['django_filters.rest_framework.DjangoFilterBackend'],
'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.LimitOffsetPagination',
'PAGE_SIZE': 20
}

MIDDLEWARE = [
Expand Down
21 changes: 21 additions & 0 deletions ecommerce/ecommerce/urls.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,10 +18,31 @@

from ecommerce.router import router
from products.views import ProductViewSet, CategoryViewSet
from customers.views import CustomerViewSet, CityViewSet, CountryViewSet, AddressViewSet
from orders.views import BillingAddressViewSet, ShippingAddressViewSet, OrderViewSet, OrderBankAccountViewSet, OrderItemViewSet
from payments.views import BankViewSet, BankAccountViewSet
from baskets.views import BasketViewSet, BasketItemViewSet

router.register("products", ProductViewSet)
router.register("categories", CategoryViewSet)

router.register("customers", CustomerViewSet)
router.register("cities", CityViewSet)
router.register("countries", CountryViewSet)
router.register("addresses", AddressViewSet)

router.register("billing-address", BillingAddressViewSet)
router.register("shipping-address", ShippingAddressViewSet)
router.register("order", OrderViewSet)
router.register("order-bank-account", OrderBankAccountViewSet)
router.register("order-item", OrderItemViewSet)

router.register("banks", BankViewSet)
router.register("bank-accounts", BankAccountViewSet)

router.register("baskets", BasketViewSet)
router.register("basket-items", BasketItemViewSet)

urlpatterns = [
path("api/", include(router.urls)),
path('admin/', admin.site.urls),
Expand Down
64 changes: 64 additions & 0 deletions ecommerce/orders/filters.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
from django_filters import rest_framework as filters
from django.utils.translation import gettext_lazy as _
from customers.filters import CustomerFilter, CityFilter
from baskets.filters import BasketFilter
from products.filters import ProductFilter
from orders.models import Order, OrderBankAccount, OrderItem, BillingAddress, ShippingAddress


class OrderFilter(filters.FilterSet):
customer = CustomerFilter
basket = BasketFilter
status = filters.CharFilter(label=_("Status"), lookup_expr="iexact")

class Meta:
model = Order
fields = ("customer", "basket", "status",)


class OrderItemFilter(filters.FilterSet):
order = OrderFilter
product = ProductFilter

class Meta:
model = OrderItem
fields = ("order", "product",)


class OrderBankAccountFilter(filters.FilterSet):
order = OrderFilter
name = filters.CharFilter(label=_("City Name"), lookup_expr="icontains")
iban = filters.CharFilter(label=_("IBAN"), lookup_expr="iexact")
bank_name = filters.CharFilter(label=_("Bank Name"), lookup_expr="icontains")

class Meta:
model = OrderBankAccount
fields = ("name", "iban", "bank_name", "order")


class BillingAddressFilter(filters.FilterSet):
full_name = filters.CharFilter(label=_("Full Name"),
lookup_expr="icontains")
phone = filters.CharFilter(label=_("Phone"))
district = filters.CharFilter(label=_("District"), lookup_expr="icontains")
zipcode = filters.CharFilter(label=_("Zipcode"))
city = CityFilter

class Meta:
model = BillingAddress
fields = (
"full_name", "phone", "district", "zipcode", "city")


class ShippingAddressFilter(filters.FilterSet):
full_name = filters.CharFilter(label=_("Full Name"),
lookup_expr="icontains")
phone = filters.CharFilter(label=_("Phone"))
district = filters.CharFilter(label=_("District"), lookup_expr="icontains")
zipcode = filters.CharFilter(label=_("Zipcode"))
city = CityFilter

class Meta:
model = ShippingAddress
fields = (
"full_name", "phone", "district", "zipcode", "city")
Loading