From 486bc111d3383cf70138afd8948c0439ecb91d37 Mon Sep 17 00:00:00 2001 From: Oz Onuk Date: Sat, 11 Dec 2021 11:37:30 +0000 Subject: [PATCH 1/8] For Baskets app: serializers added,filters added, viewsets added to views --- ecommerce/baskets/filters.py | 15 +++++++++++++++ ecommerce/baskets/serializers.py | 27 +++++++++++++++++++++++++++ ecommerce/baskets/views.py | 28 ++++++++++++++++++++++++++-- 3 files changed, 68 insertions(+), 2 deletions(-) create mode 100644 ecommerce/baskets/filters.py create mode 100644 ecommerce/baskets/serializers.py diff --git a/ecommerce/baskets/filters.py b/ecommerce/baskets/filters.py new file mode 100644 index 0000000..9d2fb9a --- /dev/null +++ b/ecommerce/baskets/filters.py @@ -0,0 +1,15 @@ +from django_filters import rest_framework as filters + +from baskets.models import Basket, BasketItem + + +class BasketFilter(filters.FilterSet): + class Meta: + model = Basket + fields = ('customer', 'status') + + +class BasketItemFilter(filters.FilterSet): + class Meta: + model = BasketItem + fields = ("basket", "product", "quantity", "price") diff --git a/ecommerce/baskets/serializers.py b/ecommerce/baskets/serializers.py new file mode 100644 index 0000000..4d70e6c --- /dev/null +++ b/ecommerce/baskets/serializers.py @@ -0,0 +1,27 @@ +from rest_framework import serializers + +from baskets.models import Basket, BasketItem +from customers.serializers import CustomerSerializer +from products.serializers import ProductSerializer + + +class BasketSerializer(serializers.ModelSerializer): + class Meta: + model = Basket + fields = ('id', 'customer', 'status') + + +class BasketDetailedSerializer(BasketSerializer): + customers = CustomerSerializer() + + +class BasketItemSerializer(serializers.ModelSerializer): + class Meta: + model = BasketItem + fields = ('id', 'basket', 'product', 'quantity', 'price') + + +class BasketItemDetailedSerializer(BasketItemSerializer): + baskets = BasketSerializer() + products = ProductSerializer() + diff --git a/ecommerce/baskets/views.py b/ecommerce/baskets/views.py index 91ea44a..2a6a283 100644 --- a/ecommerce/baskets/views.py +++ b/ecommerce/baskets/views.py @@ -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, BasketItemSerializer, BasketDetailedSerializer, \ + 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, + } From b615f9227c311dabfc98822304d2d191b0db39cc Mon Sep 17 00:00:00 2001 From: Oz Onuk Date: Sat, 11 Dec 2021 11:38:59 +0000 Subject: [PATCH 2/8] For customers app: serializers added,filters added, viewsets added to views --- ecommerce/customers/filters.py | 42 ++++++++++++++++++++++++++++++ ecommerce/customers/serializers.py | 38 +++++++++++++++++++++++++++ ecommerce/customers/views.py | 41 +++++++++++++++++++++++++++-- 3 files changed, 119 insertions(+), 2 deletions(-) create mode 100644 ecommerce/customers/filters.py create mode 100644 ecommerce/customers/serializers.py diff --git a/ecommerce/customers/filters.py b/ecommerce/customers/filters.py new file mode 100644 index 0000000..1526ff4 --- /dev/null +++ b/ecommerce/customers/filters.py @@ -0,0 +1,42 @@ +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") + + class Meta: + model = Customer + fields = ("first_name", "last_name", "email", "is_staff", "is_active") + + +class CityFilter(filters.FilterSet): + name = filters.CharFilter(label=_("City"), lookup_expr="icontains") + + class Meta: + model = City + fields = ("name", "country") + + +class CountryFilter(filters.FilterSet): + name = filters.CharFilter(label=_("Country"), lookup_expr="icontains") + + class Meta: + model = Country + fields = ("name",) + + +class AddressFilter(filters.FilterSet): + name = filters.CharFilter(label=_("Address"), lookup_expr="icontains") + + class Meta: + model = Address + fields = ( + "name", "full_name", "phone", "district", "zipcode", "customer", + "city",) diff --git a/ecommerce/customers/serializers.py b/ecommerce/customers/serializers.py new file mode 100644 index 0000000..bdf8453 --- /dev/null +++ b/ecommerce/customers/serializers.py @@ -0,0 +1,38 @@ +from rest_framework import serializers + +from customers.models import City, Country, Customer, Address + + +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', 'is_staff', 'is_active', 'date_joined') + + +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 CityDetailedSerializer(CitySerializer): + countries = CountrySerializer() + + +class AddressDetailedSerializer(AddressSerializer): + customers = CustomerSerializer + cities = CitySerializer diff --git a/ecommerce/customers/views.py b/ecommerce/customers/views.py index 91ea44a..599c81b 100644 --- a/ecommerce/customers/views.py +++ b/ecommerce/customers/views.py @@ -1,3 +1,40 @@ -from django.shortcuts import render +from rest_framework import viewsets + +from core.mixins import DetailedViewSetMixin +from customers.filters import AddressFilter, CityFilter, CustomerFilter, CountryFilter +from customers.models import City, Country, Customer, Address +from customers.serializers import CitySerializer, CountrySerializer, CustomerSerializer, 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(viewsets.ModelViewSet): + queryset = Country.objects.all() + serializer_class = CountrySerializer + filterset_class = CountryFilter + + +class CustomerViewSet(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, + } -# Create your views here. From ad894a0c4a7d5369403cdfb9f8921dcd040a7d96 Mon Sep 17 00:00:00 2001 From: Oz Onuk Date: Sat, 11 Dec 2021 11:39:58 +0000 Subject: [PATCH 3/8] For orders app: serializers added,filters added, viewsets added to views --- ecommerce/orders/filter.py | 71 +++++++++++++++++++++++++++++++++ ecommerce/orders/serializers.py | 56 ++++++++++++++++++++++++++ ecommerce/orders/views.py | 61 +++++++++++++++++++++++++++- 3 files changed, 186 insertions(+), 2 deletions(-) create mode 100644 ecommerce/orders/filter.py create mode 100644 ecommerce/orders/serializers.py diff --git a/ecommerce/orders/filter.py b/ecommerce/orders/filter.py new file mode 100644 index 0000000..aa8989c --- /dev/null +++ b/ecommerce/orders/filter.py @@ -0,0 +1,71 @@ +from django.utils.translation import gettext_lazy as _ +from django_filters import rest_framework as filters + +from orders import enums +from customers.filters import CityFilter +from orders.models import BillingAddress, ShippingAddress, Order, OrderItem, \ + OrderBankAccount + + +class BillingAddressFilter(filters.FilterSet): + full_name = filters.CharFilter(label=_("Full Name"), + lookup_expr="icontains") + phone = filters.CharFilter(label=_("Phone")) + line_1 = filters.CharFilter(label=_("Line 1"), lookup_expr="icontains") + line_2 = filters.CharFilter(label=_("Line 2"), lookup_expr="icontains") + district = filters.CharFilter(label=_("District"), lookup_expr="icontains") + zipcode = filters.CharFilter(label=_("Zipcode")) + city = CityFilter + + class Meta: + model = BillingAddress + fields = ( + "full_name", "line_1", "line_2", "phone", "district", "zipcode", "city") + + +class ShippingAddressFilter(filters.FilterSet): + full_name = filters.CharFilter(label=_("Full Name"), + lookup_expr="icontains") + phone = filters.CharFilter(label=_("Phone")) + line_1 = filters.CharFilter(label=_("Line 1"), lookup_expr="icontains") + line_2 = filters.CharFilter(label=_("Line 2"), lookup_expr="icontains") + district = filters.CharFilter(label=_("District"), lookup_expr="icontains") + zipcode = filters.CharFilter(label=_("Zipcode")) + city = CityFilter + + class Meta: + model = ShippingAddress + fields = ( + "full_name", "line_1", "line_2", "phone", "district", "zipcode", "city") + + +class OrderFilter(filters.FilterSet): + #status = filters.ChoiceFilter(choices=enums.OrderStatus.choices) + total_price = filters.NumberFilter(label=_("Total Price")) + + class Meta: + model = Order + fields = ( + "customer", "basket", "status", "billing_address", "shipping_address", + "total_price") + + +class OrderItemFilter(filters.FilterSet): + product = filters.CharFilter(label=_("Product"), lookup_expr="icontains") + price = filters.NumberFilter() + + class Meta: + model = OrderItem + fields = ("order", "product", "price") + + +class OrderBankAccountFilter(filters.FilterSet): + name = filters.CharFilter(label=_("Order Bank Account Name"), + lookup_expr="icontains") + iban = filters.CharFilter(label=_("IBAN"), lookup_expr="exact") + bank_name = filters.CharFilter(label=_("Bank Name"), + lookup_expr="icontains") + + class Meta: + model = OrderBankAccount + fields = ("name", "iban", "bank_name", "order") \ No newline at end of file diff --git a/ecommerce/orders/serializers.py b/ecommerce/orders/serializers.py new file mode 100644 index 0000000..298167f --- /dev/null +++ b/ecommerce/orders/serializers.py @@ -0,0 +1,56 @@ +from rest_framework import serializers + +from customers.serializers import CitySerializer, CustomerSerializer +from orders.models import ShippingAddress, BillingAddress, OrderBankAccount, Order, OrderItem + + +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 = ('id', 'customer', 'basket', 'status', 'billing_address', 'shipping_address', 'total_price') + + +class OrderItemSerializer(serializers.ModelSerializer): + class Meta: + model = OrderItem + fields = ('id', 'order', 'product', 'price') + + +class BillingAddressDetailedSerializer(BillingAddressSerializer): + cities = CitySerializer() + + +class ShippingAddressDetailedSerializer(ShippingAddressSerializer): + cities = CitySerializer() + + +class OrderBankAccountDetailedSerializer(OrderBankAccountSerializer): + orders = OrderSerializer() + + +class OrderDetailedSerializer(OrderSerializer): + customers = CustomerSerializer() + billing_addresses = BillingAddressSerializer() + shipping_addresses = ShippingAddressSerializer() + + +class OrderItemDetailedSerializer(OrderItemSerializer): + orders = OrderSerializer() diff --git a/ecommerce/orders/views.py b/ecommerce/orders/views.py index 91ea44a..d17b3dc 100644 --- a/ecommerce/orders/views.py +++ b/ecommerce/orders/views.py @@ -1,3 +1,60 @@ -from django.shortcuts import render +from rest_framework import viewsets -# Create your views here. +from core.mixins import DetailedViewSetMixin +from orders.filter import ShippingAddressFilter, BillingAddressFilter, OrderBankAccountFilter, OrderFilter, \ + OrderItemFilter +from orders.models import ShippingAddress, BillingAddress, OrderBankAccount, Order, OrderItem +from orders.serializers import ShippingAddressSerializer, BillingAddressSerializer, OrderBankAccountSerializer, \ + OrderSerializer, \ + OrderItemSerializer, ShippingAddressDetailedSerializer, BillingAddressDetailedSerializer, OrderDetailedSerializer, \ + OrderBankAccountDetailedSerializer, OrderItemDetailedSerializer + + +class ShippingAddressViewSet(DetailedViewSetMixin, viewsets.ModelViewSet): + queryset = ShippingAddress.objects.all() + serializer_class = ShippingAddressSerializer + filterset_class = ShippingAddressFilter + serializer_action_classes = { + "detailed_list": ShippingAddressDetailedSerializer, + "detailed": ShippingAddressDetailedSerializer, + } + + +class BillingAddressViewSet(DetailedViewSetMixin, viewsets.ModelViewSet): + queryset = BillingAddress.objects.all() + serializer_class = BillingAddressSerializer + filterset_class = BillingAddressFilter + serializer_action_classes = { + "detailed_list": BillingAddressDetailedSerializer, + "detailed": BillingAddressDetailedSerializer, + } + + +class OrderBankAccountViewSet(DetailedViewSetMixin, viewsets.ModelViewSet): + queryset = OrderBankAccount.objects.all() + serializer_class = OrderBankAccountSerializer + filterset_class = OrderBankAccountFilter + serializer_action_classes = { + "detailed_list": OrderBankAccountDetailedSerializer, + "detailed": OrderBankAccountDetailedSerializer, + } + + +class OrderViewSet(DetailedViewSetMixin, viewsets.ModelViewSet): + queryset = Order.objects.all() + serializer_class = OrderSerializer + filterset_class = OrderFilter + serializer_action_classes = { + "detailed_list": OrderDetailedSerializer, + "detailed": OrderDetailedSerializer, + } + + +class OrderItemViewSet(DetailedViewSetMixin, viewsets.ModelViewSet): + queryset = OrderItem.objects.all() + serializer_class = OrderItemSerializer + filterset_class = OrderItemFilter + serializer_action_classes = { + "detailed_list": OrderItemDetailedSerializer, + "detailed": OrderItemDetailedSerializer, + } From 88de4ca431d4a0ed5f5b4398be752b715e4286c0 Mon Sep 17 00:00:00 2001 From: Oz Onuk Date: Sat, 11 Dec 2021 11:40:32 +0000 Subject: [PATCH 4/8] For payments app: serializers added,filters added, viewsets added to views --- ecommerce/payments/filters.py | 21 +++++++++++++++++++++ ecommerce/payments/serializers.py | 19 +++++++++++++++++++ ecommerce/payments/views.py | 22 ++++++++++++++++++++-- 3 files changed, 60 insertions(+), 2 deletions(-) create mode 100644 ecommerce/payments/filters.py create mode 100644 ecommerce/payments/serializers.py diff --git a/ecommerce/payments/filters.py b/ecommerce/payments/filters.py new file mode 100644 index 0000000..4bda836 --- /dev/null +++ b/ecommerce/payments/filters.py @@ -0,0 +1,21 @@ +from django_filters import rest_framework as filters +from django.utils.translation import gettext_lazy as _ + +from payments.models import Bank, BankAccount + + +class BankFilter(filters.FilterSet): + name = filters.CharFilter(label=_("Bank Name"), lookup_expr="icontains") + + class Meta: + model = Bank + fields = ("name",) + + +class BankAccountFilter(filters.FilterSet): + bank = filters.CharFilter(label=_("Bank Name"), lookup_expr="icontains") + name = filters.CharFilter(label=_("Bank Account Name"), lookup_expr="icontains") + + class Meta: + model = BankAccount + fields = ("bank", "name", "iban") diff --git a/ecommerce/payments/serializers.py b/ecommerce/payments/serializers.py new file mode 100644 index 0000000..e414d3c --- /dev/null +++ b/ecommerce/payments/serializers.py @@ -0,0 +1,19 @@ +from rest_framework import serializers + +from payments.models import Bank, BankAccount + + +class BankSerializer(serializers.ModelSerializer): + class Meta: + model = Bank + fields = ('id', 'name') + + +class BankAccountSerializer(serializers.ModelSerializer): + class Meta: + model = BankAccount + fields = ('id', 'bank', 'name', 'iban') + + +class BankAccountDetailedSerializer(BankAccountSerializer): + banks = BankSerializer() diff --git a/ecommerce/payments/views.py b/ecommerce/payments/views.py index 91ea44a..0d7034b 100644 --- a/ecommerce/payments/views.py +++ b/ecommerce/payments/views.py @@ -1,3 +1,21 @@ -from django.shortcuts import render +from rest_framework import viewsets -# Create your views here. +from payments.filters import BankFilter, BankAccountFilter +from payments.models import Bank, BankAccount +from payments.serializers import BankSerializer, BankAccountSerializer, BankAccountDetailedSerializer + + +class BankViewSet(viewsets.ModelViewSet): + queryset = Bank.objects.all() + serializer_class = BankSerializer + filterset_class = BankFilter + + +class BankAccountViewSet(viewsets.ModelViewSet): + queryset = BankAccount.objects.all() + serializer_class = BankAccountSerializer + filterset_class = BankAccountFilter + serializer_action_classes = { + "detailed_list": BankAccountDetailedSerializer, + "detailed": BankAccountDetailedSerializer, + } From 44f38544735c67fea0b4785d85bd4ff3f6edb480 Mon Sep 17 00:00:00 2001 From: Oz Onuk Date: Sat, 11 Dec 2021 11:42:34 +0000 Subject: [PATCH 5/8] For products app: serializers and filters for stock and price models added, viewsets for stock and price added to views --- ecommerce/products/filters.py | 26 +++++++++++++++++++++++++- ecommerce/products/serializers.py | 23 +++++++++++++++++++---- ecommerce/products/views.py | 27 ++++++++++++++++++++++++--- 3 files changed, 68 insertions(+), 8 deletions(-) diff --git a/ecommerce/products/filters.py b/ecommerce/products/filters.py index 1ab7578..0c7520d 100644 --- a/ecommerce/products/filters.py +++ b/ecommerce/products/filters.py @@ -2,7 +2,7 @@ from django_filters import rest_framework as filters from django.utils.translation import gettext_lazy as _ -from products.models import Product +from products.models import Product, Category, Stock, Price class ProductFilter(filters.FilterSet): @@ -15,3 +15,27 @@ class Meta: def filter_name(self, qs, name, value): replaced_value = value.replace("Ş", "ş") return qs.filter(Q(name__icontains=replaced_value) | Q(name__icontains=value)) + + +class CategoryFilter(filters.FilterSet): + name = filters.CharFilter(label=_("Category"), lookup_expr="icontains") + + class Meta: + model = Category + fields = ("name",) + + +class StockFilter(filters.FilterSet): + quantity = filters.RangeFilter(label=_("Stock Quantity")) + + class Meta: + model = Stock + fields = ("product", "quantity") + + +class PriceFilter(filters.FilterSet): + amount = filters.NumberFilter(label=_("Price Amount")) + + class Meta: + model = Price + fields = ("product", "amount") diff --git a/ecommerce/products/serializers.py b/ecommerce/products/serializers.py index a7eb006..9c0cbb4 100644 --- a/ecommerce/products/serializers.py +++ b/ecommerce/products/serializers.py @@ -1,21 +1,19 @@ from django.db.transaction import atomic from rest_framework import serializers -from products.models import Product, Category +from products.models import Product, Category, Stock, Price class ProductSerializer(serializers.ModelSerializer): - class Meta: model = Product fields = ("id", "sku", "name", "description", "color", "size", "categories", "created_at", "modified_at") class CategorySerializer(serializers.ModelSerializer): - class Meta: model = Category - fields = ("id", "name", ) + fields = ("id", "name",) class ProductDetailedSerializer(serializers.ModelSerializer): @@ -37,4 +35,21 @@ def create(self, validated_data): return product +class StockSerializer(serializers.ModelSerializer): + class Meta: + model = Stock + fields = ('id', 'product', 'quantity') + + +class StockDetailedSerializer(StockSerializer): + products = ProductSerializer() + + +class PriceSerializer(serializers.ModelSerializer): + class Meta: + model = Price + fields = ("product", "amount") + +class PriceDetailedSerializer(PriceSerializer): + products = ProductSerializer() diff --git a/ecommerce/products/views.py b/ecommerce/products/views.py index fdd33fd..bf750f0 100644 --- a/ecommerce/products/views.py +++ b/ecommerce/products/views.py @@ -1,10 +1,10 @@ from rest_framework import viewsets from core.mixins import DetailedViewSetMixin -from products.filters import ProductFilter -from products.models import Product, Category +from products.filters import ProductFilter, CategoryFilter, StockFilter, PriceFilter +from products.models import Product, Category, Stock, Price from products.serializers import ProductSerializer, CategorySerializer, \ - ProductDetailedSerializer + ProductDetailedSerializer, StockSerializer, StockDetailedSerializer, PriceSerializer, PriceDetailedSerializer class ProductViewSet(DetailedViewSetMixin, viewsets.ModelViewSet): @@ -20,3 +20,24 @@ class ProductViewSet(DetailedViewSetMixin, viewsets.ModelViewSet): class CategoryViewSet(viewsets.ModelViewSet): queryset = Category.objects.all() serializer_class = CategorySerializer + filterset_class = CategoryFilter + + +class StockViewSet(DetailedViewSetMixin, viewsets.ModelViewSet): + queryset = Stock.objects.all() + serializer_class = StockSerializer + filterset_class = StockFilter + serializer_action_classes = { + "detailed_list": StockDetailedSerializer, + "detailed": StockDetailedSerializer, + } + + +class PriceViewSet(DetailedViewSetMixin, viewsets.ModelViewSet): + queryset = Price.objects.all() + serializer_class = PriceSerializer + filterset_class = PriceFilter + serializer_action_classes = { + "detailed_list": PriceDetailedSerializer, + "detailed": PriceDetailedSerializer, + } From 2cb9e31344bc533b45b08095cae2646d5f71d0ed Mon Sep 17 00:00:00 2001 From: Oz Onuk Date: Sat, 11 Dec 2021 11:44:19 +0000 Subject: [PATCH 6/8] Router registrations made for each endpoint, needed configurations for restframework done, pagination added --- ecommerce/ecommerce/settings.py | 11 ++++------- ecommerce/ecommerce/urls.py | 21 ++++++++++++++++++++- 2 files changed, 24 insertions(+), 8 deletions(-) diff --git a/ecommerce/ecommerce/settings.py b/ecommerce/ecommerce/settings.py index 898a8ee..c2b3538 100644 --- a/ecommerce/ecommerce/settings.py +++ b/ecommerce/ecommerce/settings.py @@ -32,7 +32,6 @@ ALLOWED_HOSTS = env.list('ALLOWED_HOSTS', default=[]) - # Application definition INSTALLED_APPS = [ @@ -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': 10 # Pagination added } MIDDLEWARE = [ @@ -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 @@ -113,7 +112,6 @@ }, ] - # Internationalization # https://docs.djangoproject.com/en/3.2/topics/i18n/ @@ -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/ @@ -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/"),) diff --git a/ecommerce/ecommerce/urls.py b/ecommerce/ecommerce/urls.py index 3d9479a..474ca7d 100644 --- a/ecommerce/ecommerce/urls.py +++ b/ecommerce/ecommerce/urls.py @@ -17,10 +17,29 @@ from django.urls import path, include from ecommerce.router import router -from products.views import ProductViewSet, CategoryViewSet +from products.views import ProductViewSet, CategoryViewSet, StockViewSet, PriceViewSet +from baskets.views import BasketViewSet, BasketItemViewSet +from customers.views import CityViewSet, CountryViewSet, CustomerViewSet, AddressViewSet +from orders.views import ShippingAddressViewSet, BillingAddressViewSet, OrderBankAccountViewSet,OrderViewSet, OrderItemViewSet +from payments.views import BankViewSet, BankAccountViewSet router.register("products", ProductViewSet) router.register("categories", CategoryViewSet) +router.register("stocks", StockViewSet) +router.register("prices", PriceViewSet) +router.register("baskets",BasketViewSet) +router.register("basket-items", BasketItemViewSet) +router.register("cities", CityViewSet) +router.register("countries", CountryViewSet) +router.register("customers", CustomerViewSet) +router.register("addresses", AddressViewSet) +router.register("shipping-addresses", ShippingAddressViewSet) +router.register("billing-addresses", BillingAddressViewSet) +router.register("order-bank-accounts", OrderBankAccountViewSet) +router.register("orders", OrderViewSet) +router.register("order-items", OrderItemViewSet) +router.register("banks", BankViewSet) +router.register("bank-accounts", BankAccountViewSet) urlpatterns = [ path("api/", include(router.urls)), From 89a0b3da120f362d91dcbd6551113cd8788995ac Mon Sep 17 00:00:00 2001 From: Oz Onuk Date: Sat, 11 Dec 2021 12:27:35 +0000 Subject: [PATCH 7/8] README.md file updated --- ecommerce/README.md | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/ecommerce/README.md b/ecommerce/README.md index 83c3722..6ecfa21 100644 --- a/ecommerce/README.md +++ b/ecommerce/README.md @@ -20,4 +20,26 @@ It contains billing address model, shipping address model, order bank account mo ### Payments -It contains bank model and bank account model. \ No newline at end of file +It contains bank model and bank account model. + + +## Rest API + +### End points + /api/products/" + /api/categories/" + /api/stocks/" + /api/prices/" + /api/baskets/" + /api/basket-items/" + /api/cities/" + /api/countries/" + /api/customers/" + /api/addresses/" + /api/shipping-addresses/" + /api/billing-addresses/" + /api/order-bank-accounts/" + /api/orders/" + /api/order-items/" + /api/banks/" + /api/bank-accounts/" \ No newline at end of file From a6cd742d1ec74171452a36422610f278709e25f6 Mon Sep 17 00:00:00 2001 From: Oz Onuk Date: Sat, 11 Dec 2021 12:28:22 +0000 Subject: [PATCH 8/8] Explanatory comments added --- ecommerce/baskets/filters.py | 4 ++-- ecommerce/baskets/serializers.py | 5 ++++- ecommerce/baskets/views.py | 6 ++++-- ecommerce/customers/filters.py | 4 ++++ ecommerce/customers/serializers.py | 6 ++++++ ecommerce/customers/views.py | 3 ++- ecommerce/ecommerce/urls.py | 6 ++++-- ecommerce/orders/filter.py | 17 ++++++++++------- ecommerce/orders/serializers.py | 10 ++++++++++ ecommerce/orders/views.py | 5 +++++ ecommerce/payments/filters.py | 2 ++ ecommerce/payments/serializers.py | 3 +++ ecommerce/payments/views.py | 2 ++ ecommerce/products/filters.py | 2 ++ ecommerce/products/serializers.py | 4 ++++ ecommerce/products/views.py | 4 ++-- 16 files changed, 66 insertions(+), 17 deletions(-) diff --git a/ecommerce/baskets/filters.py b/ecommerce/baskets/filters.py index 9d2fb9a..fc33956 100644 --- a/ecommerce/baskets/filters.py +++ b/ecommerce/baskets/filters.py @@ -2,13 +2,13 @@ from baskets.models import Basket, BasketItem - +#Basket Filter class BasketFilter(filters.FilterSet): class Meta: model = Basket fields = ('customer', 'status') - +#Basket Item Filter class BasketItemFilter(filters.FilterSet): class Meta: model = BasketItem diff --git a/ecommerce/baskets/serializers.py b/ecommerce/baskets/serializers.py index 4d70e6c..d2c09d0 100644 --- a/ecommerce/baskets/serializers.py +++ b/ecommerce/baskets/serializers.py @@ -5,23 +5,26 @@ from products.serializers import ProductSerializer +# Basket Serializer class BasketSerializer(serializers.ModelSerializer): class Meta: model = Basket fields = ('id', 'customer', 'status') +# Basket Detailed Serializer - nested serializer class BasketDetailedSerializer(BasketSerializer): customers = CustomerSerializer() +# Basket Item Serializer class BasketItemSerializer(serializers.ModelSerializer): class Meta: model = BasketItem fields = ('id', 'basket', 'product', 'quantity', 'price') +# Basket Item Detailed Serializer - nested serializer class BasketItemDetailedSerializer(BasketItemSerializer): baskets = BasketSerializer() products = ProductSerializer() - diff --git a/ecommerce/baskets/views.py b/ecommerce/baskets/views.py index 2a6a283..b3f3569 100644 --- a/ecommerce/baskets/views.py +++ b/ecommerce/baskets/views.py @@ -7,7 +7,8 @@ from core.mixins import DetailedViewSetMixin -class BasketViewSet(DetailedViewSetMixin,viewsets.ModelViewSet): +# Basket ViewSet +class BasketViewSet(DetailedViewSetMixin, viewsets.ModelViewSet): queryset = Basket.objects.all() serializer_class = BasketSerializer filterset_class = BasketFilter @@ -17,7 +18,8 @@ class BasketViewSet(DetailedViewSetMixin,viewsets.ModelViewSet): } -class BasketItemViewSet(DetailedViewSetMixin,viewsets.ModelViewSet): +# Basket Item ViewSet +class BasketItemViewSet(DetailedViewSetMixin, viewsets.ModelViewSet): queryset = BasketItem.objects.all() serializer_class = BasketItemSerializer filterset_class = BasketItemFilter diff --git a/ecommerce/customers/filters.py b/ecommerce/customers/filters.py index 1526ff4..334b525 100644 --- a/ecommerce/customers/filters.py +++ b/ecommerce/customers/filters.py @@ -4,6 +4,7 @@ from customers.models import Customer, City, Country, Address +# Customer Filter class CustomerFilter(filters.FilterSet): first_name = filters.CharFilter(label=_("First Name"), lookup_expr="icontains") @@ -16,6 +17,7 @@ class Meta: fields = ("first_name", "last_name", "email", "is_staff", "is_active") +# City Filter class CityFilter(filters.FilterSet): name = filters.CharFilter(label=_("City"), lookup_expr="icontains") @@ -24,6 +26,7 @@ class Meta: fields = ("name", "country") +# Country Filter class CountryFilter(filters.FilterSet): name = filters.CharFilter(label=_("Country"), lookup_expr="icontains") @@ -32,6 +35,7 @@ class Meta: fields = ("name",) +# Address Filter class AddressFilter(filters.FilterSet): name = filters.CharFilter(label=_("Address"), lookup_expr="icontains") diff --git a/ecommerce/customers/serializers.py b/ecommerce/customers/serializers.py index bdf8453..4b02fd3 100644 --- a/ecommerce/customers/serializers.py +++ b/ecommerce/customers/serializers.py @@ -3,24 +3,28 @@ from customers.models import City, Country, Customer, Address +# City Serializer class CitySerializer(serializers.ModelSerializer): class Meta: model = City fields = ('id', 'name', 'country') +# Country Serializer class CountrySerializer(serializers.ModelSerializer): class Meta: model = Country fields = ('id', 'name') +# Customer Serializer class CustomerSerializer(serializers.ModelSerializer): class Meta: model = Customer fields = ('id', 'first_name', 'last_name', 'email', 'is_staff', 'is_active', 'date_joined') +# Address Serializer class AddressSerializer(serializers.ModelSerializer): class Meta: model = Address @@ -29,10 +33,12 @@ class Meta: 'is_default') +# City Detailed Serializer - nested serializer class CityDetailedSerializer(CitySerializer): countries = CountrySerializer() +# Address Detailed Serializer - nested serializer class AddressDetailedSerializer(AddressSerializer): customers = CustomerSerializer cities = CitySerializer diff --git a/ecommerce/customers/views.py b/ecommerce/customers/views.py index 599c81b..e4e7cdd 100644 --- a/ecommerce/customers/views.py +++ b/ecommerce/customers/views.py @@ -23,12 +23,14 @@ class CountryViewSet(viewsets.ModelViewSet): filterset_class = CountryFilter +# Customer ViewSet class CustomerViewSet(viewsets.ModelViewSet): queryset = Customer.objects.all() serializer_class = CustomerSerializer filterset_class = CustomerFilter +# Address ViewSet class AddressViewSet(DetailedViewSetMixin, viewsets.ModelViewSet): queryset = Address.objects.all() serializer_class = AddressSerializer @@ -37,4 +39,3 @@ class AddressViewSet(DetailedViewSetMixin, viewsets.ModelViewSet): "detailed_list": AddressDetailedSerializer, "detailed": AddressDetailedSerializer, } - diff --git a/ecommerce/ecommerce/urls.py b/ecommerce/ecommerce/urls.py index 474ca7d..d823baf 100644 --- a/ecommerce/ecommerce/urls.py +++ b/ecommerce/ecommerce/urls.py @@ -20,14 +20,16 @@ from products.views import ProductViewSet, CategoryViewSet, StockViewSet, PriceViewSet from baskets.views import BasketViewSet, BasketItemViewSet from customers.views import CityViewSet, CountryViewSet, CustomerViewSet, AddressViewSet -from orders.views import ShippingAddressViewSet, BillingAddressViewSet, OrderBankAccountViewSet,OrderViewSet, OrderItemViewSet +from orders.views import ShippingAddressViewSet, BillingAddressViewSet, OrderBankAccountViewSet, OrderViewSet, \ + OrderItemViewSet from payments.views import BankViewSet, BankAccountViewSet +# Router Registrations for Each End Point router.register("products", ProductViewSet) router.register("categories", CategoryViewSet) router.register("stocks", StockViewSet) router.register("prices", PriceViewSet) -router.register("baskets",BasketViewSet) +router.register("baskets", BasketViewSet) router.register("basket-items", BasketItemViewSet) router.register("cities", CityViewSet) router.register("countries", CountryViewSet) diff --git a/ecommerce/orders/filter.py b/ecommerce/orders/filter.py index aa8989c..7fbf3d2 100644 --- a/ecommerce/orders/filter.py +++ b/ecommerce/orders/filter.py @@ -1,12 +1,12 @@ from django.utils.translation import gettext_lazy as _ from django_filters import rest_framework as filters -from orders import enums from customers.filters import CityFilter from orders.models import BillingAddress, ShippingAddress, Order, OrderItem, \ OrderBankAccount +# Billing Address Filter class BillingAddressFilter(filters.FilterSet): full_name = filters.CharFilter(label=_("Full Name"), lookup_expr="icontains") @@ -20,9 +20,10 @@ class BillingAddressFilter(filters.FilterSet): class Meta: model = BillingAddress fields = ( - "full_name", "line_1", "line_2", "phone", "district", "zipcode", "city") + "full_name", "line_1", "line_2", "phone", "district", "zipcode", "city") +# Shipping Address Filter class ShippingAddressFilter(filters.FilterSet): full_name = filters.CharFilter(label=_("Full Name"), lookup_expr="icontains") @@ -36,20 +37,21 @@ class ShippingAddressFilter(filters.FilterSet): class Meta: model = ShippingAddress fields = ( - "full_name", "line_1", "line_2", "phone", "district", "zipcode", "city") + "full_name", "line_1", "line_2", "phone", "district", "zipcode", "city") +# Order Filter class OrderFilter(filters.FilterSet): - #status = filters.ChoiceFilter(choices=enums.OrderStatus.choices) total_price = filters.NumberFilter(label=_("Total Price")) class Meta: model = Order fields = ( - "customer", "basket", "status", "billing_address", "shipping_address", - "total_price") + "customer", "basket", "status", "billing_address", "shipping_address", + "total_price") +# Order Item Filter class OrderItemFilter(filters.FilterSet): product = filters.CharFilter(label=_("Product"), lookup_expr="icontains") price = filters.NumberFilter() @@ -59,6 +61,7 @@ class Meta: fields = ("order", "product", "price") +# Order Bank Account Filter class OrderBankAccountFilter(filters.FilterSet): name = filters.CharFilter(label=_("Order Bank Account Name"), lookup_expr="icontains") @@ -68,4 +71,4 @@ class OrderBankAccountFilter(filters.FilterSet): class Meta: model = OrderBankAccount - fields = ("name", "iban", "bank_name", "order") \ No newline at end of file + fields = ("name", "iban", "bank_name", "order") diff --git a/ecommerce/orders/serializers.py b/ecommerce/orders/serializers.py index 298167f..8432d58 100644 --- a/ecommerce/orders/serializers.py +++ b/ecommerce/orders/serializers.py @@ -4,53 +4,63 @@ from orders.models import ShippingAddress, BillingAddress, OrderBankAccount, Order, OrderItem +# Billing Address Serializer class BillingAddressSerializer(serializers.ModelSerializer): class Meta: model = BillingAddress fields = ('id', 'full_name', 'line_1', 'line_2', 'phone', 'district', 'zipcode', 'city') +# Shipping Address Serializer class ShippingAddressSerializer(serializers.ModelSerializer): class Meta: model = ShippingAddress fields = ('id', 'full_name', 'line_1', 'line_2', 'phone', 'district', 'zipcode', 'city') +# Order Bank Account Serializer class OrderBankAccountSerializer(serializers.ModelSerializer): class Meta: model = OrderBankAccount fields = ('id', 'name', 'iban', 'bank_name', 'order') +# Order Serializer class OrderSerializer(serializers.ModelSerializer): class Meta: model = Order fields = ('id', 'customer', 'basket', 'status', 'billing_address', 'shipping_address', 'total_price') +# Order Item Serializer class OrderItemSerializer(serializers.ModelSerializer): class Meta: model = OrderItem fields = ('id', 'order', 'product', 'price') +# Billing Address Detailed Serializer - nested serializer class BillingAddressDetailedSerializer(BillingAddressSerializer): cities = CitySerializer() +# Shipping Address Detailed Serializer - nested serializer class ShippingAddressDetailedSerializer(ShippingAddressSerializer): cities = CitySerializer() +# Order Bank Account Detailed Serializer - nested serializer class OrderBankAccountDetailedSerializer(OrderBankAccountSerializer): orders = OrderSerializer() +# Order Detailed Serializer - nested serializer class OrderDetailedSerializer(OrderSerializer): customers = CustomerSerializer() billing_addresses = BillingAddressSerializer() shipping_addresses = ShippingAddressSerializer() +# Order Item Detailed Serializer - nested serializer class OrderItemDetailedSerializer(OrderItemSerializer): orders = OrderSerializer() diff --git a/ecommerce/orders/views.py b/ecommerce/orders/views.py index d17b3dc..01ce3b1 100644 --- a/ecommerce/orders/views.py +++ b/ecommerce/orders/views.py @@ -10,6 +10,7 @@ OrderBankAccountDetailedSerializer, OrderItemDetailedSerializer +# Shipping Address ViewSet class ShippingAddressViewSet(DetailedViewSetMixin, viewsets.ModelViewSet): queryset = ShippingAddress.objects.all() serializer_class = ShippingAddressSerializer @@ -20,6 +21,7 @@ class ShippingAddressViewSet(DetailedViewSetMixin, viewsets.ModelViewSet): } +# Billing Address ViewSet class BillingAddressViewSet(DetailedViewSetMixin, viewsets.ModelViewSet): queryset = BillingAddress.objects.all() serializer_class = BillingAddressSerializer @@ -30,6 +32,7 @@ class BillingAddressViewSet(DetailedViewSetMixin, viewsets.ModelViewSet): } +# Order Bank Account ViewSet class OrderBankAccountViewSet(DetailedViewSetMixin, viewsets.ModelViewSet): queryset = OrderBankAccount.objects.all() serializer_class = OrderBankAccountSerializer @@ -40,6 +43,7 @@ class OrderBankAccountViewSet(DetailedViewSetMixin, viewsets.ModelViewSet): } +# Order ViewSet class OrderViewSet(DetailedViewSetMixin, viewsets.ModelViewSet): queryset = Order.objects.all() serializer_class = OrderSerializer @@ -50,6 +54,7 @@ class OrderViewSet(DetailedViewSetMixin, viewsets.ModelViewSet): } +# Order Item ViewSet class OrderItemViewSet(DetailedViewSetMixin, viewsets.ModelViewSet): queryset = OrderItem.objects.all() serializer_class = OrderItemSerializer diff --git a/ecommerce/payments/filters.py b/ecommerce/payments/filters.py index 4bda836..488c85e 100644 --- a/ecommerce/payments/filters.py +++ b/ecommerce/payments/filters.py @@ -4,6 +4,7 @@ from payments.models import Bank, BankAccount +# Bank Filter class BankFilter(filters.FilterSet): name = filters.CharFilter(label=_("Bank Name"), lookup_expr="icontains") @@ -12,6 +13,7 @@ class Meta: fields = ("name",) +# Bank Account Filter class BankAccountFilter(filters.FilterSet): bank = filters.CharFilter(label=_("Bank Name"), lookup_expr="icontains") name = filters.CharFilter(label=_("Bank Account Name"), lookup_expr="icontains") diff --git a/ecommerce/payments/serializers.py b/ecommerce/payments/serializers.py index e414d3c..6f57273 100644 --- a/ecommerce/payments/serializers.py +++ b/ecommerce/payments/serializers.py @@ -3,17 +3,20 @@ from payments.models import Bank, BankAccount +# Bank Serializer class BankSerializer(serializers.ModelSerializer): class Meta: model = Bank fields = ('id', 'name') +# Bank Account Serializer class BankAccountSerializer(serializers.ModelSerializer): class Meta: model = BankAccount fields = ('id', 'bank', 'name', 'iban') +# Bank Account Detailed Serializer - nested serializer class BankAccountDetailedSerializer(BankAccountSerializer): banks = BankSerializer() diff --git a/ecommerce/payments/views.py b/ecommerce/payments/views.py index 0d7034b..3b6d826 100644 --- a/ecommerce/payments/views.py +++ b/ecommerce/payments/views.py @@ -5,12 +5,14 @@ from payments.serializers import BankSerializer, BankAccountSerializer, BankAccountDetailedSerializer +# Bank ViewSet class BankViewSet(viewsets.ModelViewSet): queryset = Bank.objects.all() serializer_class = BankSerializer filterset_class = BankFilter +# Bank Account ViewSet class BankAccountViewSet(viewsets.ModelViewSet): queryset = BankAccount.objects.all() serializer_class = BankAccountSerializer diff --git a/ecommerce/products/filters.py b/ecommerce/products/filters.py index 0c7520d..1395991 100644 --- a/ecommerce/products/filters.py +++ b/ecommerce/products/filters.py @@ -25,6 +25,7 @@ class Meta: fields = ("name",) +# Stock Filter class StockFilter(filters.FilterSet): quantity = filters.RangeFilter(label=_("Stock Quantity")) @@ -33,6 +34,7 @@ class Meta: fields = ("product", "quantity") +# Price Filter class PriceFilter(filters.FilterSet): amount = filters.NumberFilter(label=_("Price Amount")) diff --git a/ecommerce/products/serializers.py b/ecommerce/products/serializers.py index 9c0cbb4..5350983 100644 --- a/ecommerce/products/serializers.py +++ b/ecommerce/products/serializers.py @@ -35,21 +35,25 @@ def create(self, validated_data): return product +# Stock Serializer class StockSerializer(serializers.ModelSerializer): class Meta: model = Stock fields = ('id', 'product', 'quantity') +# Stock Detailed Serializer - nested serializer class StockDetailedSerializer(StockSerializer): products = ProductSerializer() +# Price Serializer class PriceSerializer(serializers.ModelSerializer): class Meta: model = Price fields = ("product", "amount") +# Price Detailed Serializer - nested serializer class PriceDetailedSerializer(PriceSerializer): products = ProductSerializer() diff --git a/ecommerce/products/views.py b/ecommerce/products/views.py index bf750f0..b727f83 100644 --- a/ecommerce/products/views.py +++ b/ecommerce/products/views.py @@ -22,7 +22,7 @@ class CategoryViewSet(viewsets.ModelViewSet): serializer_class = CategorySerializer filterset_class = CategoryFilter - +# Stock ViewSet class StockViewSet(DetailedViewSetMixin, viewsets.ModelViewSet): queryset = Stock.objects.all() serializer_class = StockSerializer @@ -32,7 +32,7 @@ class StockViewSet(DetailedViewSetMixin, viewsets.ModelViewSet): "detailed": StockDetailedSerializer, } - +# Price ViewSet class PriceViewSet(DetailedViewSetMixin, viewsets.ModelViewSet): queryset = Price.objects.all() serializer_class = PriceSerializer