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
6 changes: 3 additions & 3 deletions ecommerce/.env.dist
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
SECRET_KEY=g)8v11ythdn-p_^4+@z23_1&x=qzp^(-#py*8v$&4bnjb&=$a%
Copy link
Owner

Choose a reason for hiding this comment

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

bu dosyaya gerce bilgileri eklememeliyiz.

DEBUG=True
SECRET_KEY=secret_key
DATABASE_URL=psql://superuser_username:superuser_password@server_ip:server_port/db_name
DATABASE_URL=psql://bootcamp:123456@Localhost:5432/bootcampecommerce
ALLOWED_HOSTS=127.0.0.1,0.0.0.0
TIME_ZONE=Europe/Istanbul
TIME_ZONE=Europe/Istanbul
35 changes: 35 additions & 0 deletions ecommerce/baskets/filters.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
from django.db.models import Q
from django_filters import rest_framework as filters
from django.utils.translation import gettext_lazy as _
from baskets.models import Basket, BasketItem
from products.models import Product


class BasketFilter(filters.FilterSet):
"""
Basket Filter
"""
customer = filters.CharFilter(label=_("Customer"), method="filter_name")

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

def filter_name(self, qs, name, value):
replaced_value = value.replace("Ş", "ş")
return qs.filter(Q(customer__first_name__icontains=replaced_value) | Q(customer__first_name__icontains=value))

class BasketItemFilter(filters.FilterSet):
"""
Basket Item Filter
"""
product = filters.CharFilter(label=_("Product-Name"), method="filter_name")

class Meta:
model = BasketItem
fields = ("basket", "product", "quantity", "price")

def filter_name(self, qs, name, value):
replaced_value = value.replace("Ş", "ş")
return qs.filter(Q(product__name__icontains=replaced_value) | Q(product__name__icontains=value))

38 changes: 38 additions & 0 deletions ecommerce/baskets/serializers.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
from rest_framework import serializers
from django.db.transaction import atomic
from baskets.models import Basket, BasketItem
from customers.serializers import CustomerSerializer
from products.serializers import ProductSerializer


class BasketSerializer(serializers.ModelSerializer):
"""
Basket Serializer
"""

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


class BasketItemSerializer(serializers.ModelSerializer):
product = ProductSerializer

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


class BasketItemDetailedSerializer(BasketItemSerializer):
"""
Basket Item Detailed Serializer
"""
basket = BasketSerializer(many=False)


class BasketDetailedSerializer(BasketSerializer):
"""
Basket Detailed Serializer
"""
customer = CustomerSerializer(many=False)

25 changes: 24 additions & 1 deletion ecommerce/baskets/views.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,26 @@
from django.shortcuts import render

from rest_framework import viewsets
from baskets.serializers import BasketSerializer, BasketItemSerializer, BasketItemDetailedSerializer, BasketDetailedSerializer
from baskets.models import Basket, BasketItem
from core.mixins import DetailedViewSetMixin
from baskets.filters import BasketFilter, BasketItemFilter
# 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
}

33 changes: 33 additions & 0 deletions ecommerce/customers/filters.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
from django.db.models import Q
from django_filters import rest_framework as filters
from django.utils.translation import gettext_lazy as _

from customers.models import Address, Customer


class AddressFilter(filters.FilterSet):
customer = filters.CharFilter(label=_("Customer"), method="filter_name")

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

def filter_name(self, qs, name, value):
replaced_value = value.replace("Ş", "ş")
return qs.filter(Q(customer__first_name__icontains=replaced_value) | Q(customer__first_name__icontains=value))

class CustomerFilter(filters.FilterSet):
"""
Customer Filter
Filters customers by their names
"""
first_name = filters.CharFilter(label=_("Name"), method="filter_name")

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

def filter_name(self, qs, first_name, value):
replaced_value = value.replace("Ş", "ş")
return qs.filter(Q(first_name__icontains=replaced_value) | Q(first_name__icontains=value))
1 change: 0 additions & 1 deletion ecommerce/customers/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,6 @@ class Country(BaseAbstractModel):
Country model
"""
name = models.CharField(max_length=255, verbose_name=_("Country"))

class Meta:
verbose_name = _("country")
verbose_name_plural = _("countries")
Expand Down
71 changes: 71 additions & 0 deletions ecommerce/customers/serializers.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
from rest_framework import serializers
from customers.models import Customer, City, Country, Address
from django.db.transaction import atomic



class CitySerializer(serializers.ModelSerializer):

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

class CountrySerializer(serializers.ModelSerializer):

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

class CityDetailedSerializer(CitySerializer):
country = CountrySerializer(many= False)

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

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):
"""
Address Detailed Serializer
includes Customer and DetailedCity Serializers
"""
customer = CustomerSerializer(many=False)
city = CityDetailedSerializer(many= False)

class Meta:
model = Address
fields = ("id", "customer", "name", "full_name", "line_1", "line_2",
"phone", "district", "zipcode", "city")
@atomic()
def create(self, validated_data):
customer = validated_data.pop("customer", None)
address = super().create(validated_data)
if customer:
serializer = CustomerSerializer(data=customer, many=False)
serializer.is_valid(raise_exception=True)
serializer.save()
address.customer.add(*serializer.instance)

city = validated_data.pop("city", None)
address = super().create(validated_data)

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

return address

35 changes: 34 additions & 1 deletion ecommerce/customers/views.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,36 @@
from django.shortcuts import render

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

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

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

class CountryViewSet(viewsets.ModelViewSet):
queryset = Country.objects.all()
serializer_class = CountrySerializer


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.PageNumberPagination',
'PAGE_SIZE': 100
}

MIDDLEWARE = [
Expand Down
19 changes: 18 additions & 1 deletion ecommerce/ecommerce/urls.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,12 +15,29 @@
"""
from django.contrib import admin
from django.urls import path, include

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

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("baskets", BasketViewSet)
router.register("basket_items", BasketItemViewSet)
router.register("banks", BankViewSet)
router.register("bank_accounts", BankAccountViewSet)
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)),
Expand Down
20 changes: 20 additions & 0 deletions ecommerce/orders/filters.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
from django.db.models import Q
from django_filters import rest_framework as filters
from django.utils.translation import gettext_lazy as _
from orders.models import Order, OrderItem



class OrderFilter(filters.FilterSet):
"""
Order Filter
"""
customer = filters.CharFilter(label=_("Customer"), method="filter_name")

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

def filter_name(self, qs, name, value):
replaced_value = value.replace("Ş", "ş")
return qs.filter(Q(customer__first_name__icontains=replaced_value) | Q(customer__first_name__icontains=value))
71 changes: 71 additions & 0 deletions ecommerce/orders/serializers.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
from django.db.transaction import atomic
from rest_framework import serializers
from customers.serializers import CustomerSerializer
from orders.models import Order, OrderItem, OrderBankAccount, BillingAddress, \
ShippingAddress
from products.serializers import ProductSerializer

class BillingAddressSerializer(serializers.ModelSerializer):

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

class ShippingAddressSerializer(serializers.ModelSerializer):

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

class OrderBankAccountSerializer(serializers.ModelSerializer):

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

class OrderSerializer(serializers.ModelSerializer):

class Meta:
model = Order
fields = ("customer", "basket", "status", "billing_address",
"shipping_address", "total_price","created_at","modified_at")

class OrderItemSerializer(serializers.ModelSerializer):

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

class OrderItemDetailedSerializer(serializers.ModelSerializer):
"""
Order Item Detailed Serializer
Order and Product Informations Included
"""
order = OrderSerializer(many=False)
product = ProductSerializer(many=True)

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

@atomic()
def create(self, validated_data):
order = validated_data.pop("order", None)
product = validated_data.pop("product", None)
order_item = super().create(validated_data)

if order:
serializer = OrderSerializer(data=order, many=True)
serializer.is_valid(raise_exception=True)
serializer.save()
order_item.order.add(*serializer.instance)

if product:
serializer = ProductSerializer(data=product, many=True)
serializer.is_valid(raise_exception=True)
serializer.save()
order_item.order.add(*serializer.instance)

return order
Loading