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
22 changes: 22 additions & 0 deletions ecommerce/baskets/filters.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
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
Copy link
Owner

Choose a reason for hiding this comment

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

boyle bir kullanimi nereden ogrendik?


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


class BasketItemFilter(filters.FilterSet):
product = ProductFilter
basket = BasketFilter

class Meta:
model = BasketItem
fields = ("basket", "product")
25 changes: 25 additions & 0 deletions ecommerce/baskets/serializers.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
from rest_framework import serializers
from baskets.models import Basket, BasketItem
from customers.serializers import CustomerSerializer
from products.serializers import ProductSerializer, ProductDetailedSerializer


class BasketSerializer(serializers.ModelSerializer):
class Meta:
model = Basket
fields = ("id", "customer", "status")


class BasketItemSerializer(serializers.ModelSerializer):
class Meta:
model = BasketItem
fields = ("id", "basket", "product", "quantity", "price")


class BasketDetailedSerializer(BasketSerializer):
customer = CustomerSerializer()


class BasketItemDetailedSerializer(BasketItemSerializer):
basket = BasketSerializer()
product = ProductSerializer()
28 changes: 26 additions & 2 deletions ecommerce/baskets/views.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,27 @@
from django.shortcuts import render
from rest_framework import viewsets

# Create your views here.
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


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.utils.translation import gettext_lazy as _
from django_filters import rest_framework as filters

from customers.models import City, Country, Customer, 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")

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


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")
53 changes: 53 additions & 0 deletions ecommerce/customers/serializers.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
from rest_framework import serializers
from django.db.transaction import atomic

from customers.models import Customer, Address, City, Country


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


class CountrySerializer(serializers.ModelSerializer):
class Meta:
model = Country
fields = ("id", "name")


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


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


class AddressDetailedSerializer(AddressSerializer):
customer = CustomerSerializer()
city = CitySerializer()


class CityDetailedSerializer(CitySerializer):
country = CountrySerializer()

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

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

ProductDetailedSerializer icerisinde ornek olmasi acisindan vermistik, genelde detailed serializerlari sadece veri gostermek icin aliyoruz ve kayit yapmak ve guncellemek icin kullanmiyoruz, ozel durumlar yoksa kayit create/update islemleri icin genel olarak nested olmayan serializer'i kullaniyoruz.

country = validated_data.pop("country", None)
city = super().create(validated_data)
if country:
serializer = CountrySerializer(data=country, many=True)
serializer.is_valid(raise_exception=True)
serializer.save()
city.categories.add(*serializer.instance)

Choose a reason for hiding this comment

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

city objesinin categories adında bir fieldı yok.

city nin country fieldı zorunlu olduğundan oluşturabilmek için önce country oluşturman gerekli.

return city
40 changes: 38 additions & 2 deletions ecommerce/customers/views.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,39 @@
from django.shortcuts import render
from rest_framework import viewsets

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


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 CustomerViewSet(DetailedViewSetMixin, viewsets.ModelViewSet):
queryset = Customer.objects.all()
serializer_class = CustomerSerializer
filterset_class = CustomerFilter


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

ALLOWED_HOSTS = env.list('ALLOWED_HOSTS', default=[])


# Application definition

INSTALLED_APPS = [
Expand All @@ -54,7 +53,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': 100
Copy link

Choose a reason for hiding this comment

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

Page Number Pagination daha iyi olabilir.

}

MIDDLEWARE = [
Expand Down Expand Up @@ -88,13 +89,11 @@

WSGI_APPLICATION = 'ecommerce.wsgi.application'


# Database
# https://docs.djangoproject.com/en/3.2/ref/settings/#databases

DATABASES = {'default': env.db('DATABASE_URL')}


# Password validation
# https://docs.djangoproject.com/en/3.2/ref/settings/#auth-password-validators

Expand All @@ -113,7 +112,6 @@
},
]


# Internationalization
# https://docs.djangoproject.com/en/3.2/topics/i18n/

Expand All @@ -138,7 +136,6 @@ def gettext_noop(s):

USE_TZ = True


# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/3.2/howto/static-files/

Expand All @@ -151,4 +148,4 @@ def gettext_noop(s):
DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField'
AUTH_USER_MODEL = "customers.Customer"

LOCALE_PATHS = (str(BASE_DIR / "locale/"), )
LOCALE_PATHS = (str(BASE_DIR / "locale/"),)
22 changes: 22 additions & 0 deletions ecommerce/ecommerce/urls.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,10 +18,32 @@

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

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

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

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

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

router.register("orders", OrderViewSet)
router.register("billing-addresses", BillingAddressViewSet)
router.register("shipping-addresses", ShippingAddressViewSet)
router.register("order-bank-accounts", OrderBankAccountViewSet)
router.register("order-items", OrderItemViewSet)

urlpatterns = [
path("api/", include(router.urls)),
path('admin/', admin.site.urls),
Expand Down
54 changes: 54 additions & 0 deletions ecommerce/orders/filters.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
from django_filters import rest_framework as filters
from django.utils.translation import gettext_lazy as _

from customers.filters import CityFilter, CustomerFilter
from orders.models import BillingAddress, ShippingAddress, OrderBankAccount, Order, OrderItem
from products.filters import ProductFilter
from baskets.filters import BasketFilter


class BillingAddressFilter(filters.FilterSet):
full_name = filters.CharFilter(label=_("Full Name"), lookup_expr="icontains")
city = CityFilter

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


class ShippingAddressFilter(filters.FilterSet):
full_name = filters.CharFilter(label=_("Full Name"), lookup_expr="icontains")
city = CityFilter

class Meta:
model = ShippingAddress
fields = ("full_name", "city")


class OrderFilter(filters.FilterSet):
customer = CustomerFilter
basket = BasketFilter

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


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

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


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

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