From 8ec9af4df0b917f8b9179d5fca65d9ee3f39874b Mon Sep 17 00:00:00 2001 From: Gundwane21 Date: Sat, 11 Dec 2021 14:43:16 +0300 Subject: [PATCH 1/2] all filters serializers and views are added, registered to router at api/ --- ecommerce/baskets/filters.py | 25 ++++++++++++ ecommerce/baskets/serializers.py | 30 +++++++++++++++ ecommerce/baskets/views.py | 25 ++++++++++++ ecommerce/customers/filters.py | 38 ++++++++++++++++++ ecommerce/customers/serializers.py | 44 +++++++++++++++++++++ ecommerce/customers/views.py | 40 +++++++++++++++++++ ecommerce/ecommerce/urls.py | 19 +++++++++ ecommerce/orders/filters.py | 60 +++++++++++++++++++++++++++++ ecommerce/orders/serializers.py | 61 +++++++++++++++++++++++++++++ ecommerce/orders/views.py | 62 ++++++++++++++++++++++++++++++ ecommerce/payments/filters.py | 22 +++++++++++ ecommerce/payments/serializers.py | 21 ++++++++++ ecommerce/payments/views.py | 23 +++++++++++ 13 files changed, 470 insertions(+) create mode 100644 ecommerce/baskets/filters.py create mode 100644 ecommerce/baskets/serializers.py create mode 100644 ecommerce/customers/filters.py create mode 100644 ecommerce/customers/serializers.py create mode 100644 ecommerce/orders/filters.py create mode 100644 ecommerce/orders/serializers.py create mode 100644 ecommerce/payments/filters.py create mode 100644 ecommerce/payments/serializers.py diff --git a/ecommerce/baskets/filters.py b/ecommerce/baskets/filters.py new file mode 100644 index 0000000..bc6b99c --- /dev/null +++ b/ecommerce/baskets/filters.py @@ -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 + + +class BasketFilter(filters.FilterSet): + """ + Basket Models Filter + """ + status = filters.CharFilter(label=_("Status")) + + class Meta: + model = Basket + fields = ("customer", "status") + + +class BasketItemFilter(filters.FilterSet): + """ + BasketItem Models Filter + """ + + 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..e21a0bd --- /dev/null +++ b/ecommerce/baskets/serializers.py @@ -0,0 +1,30 @@ +from rest_framework import serializers + +from products.serializers import ProductSerializer +from customers.serializers import CustomerSerializer +from baskets.models import BasketItem, Basket + + +class BasketSerializer(serializers.ModelSerializer): + + class Meta: + model = Basket + fields = ("id", "customer", "status") + + +class BasketDetailedSerializer(BasketSerializer): + customer = CustomerSerializer() + + +class BasketItemSerializer(serializers.ModelSerializer): + + class Meta: + model = BasketItem + fields = ("basket", "product", "quantity", "price",) + + +class BasketItemDetailedSerializer(BasketItemSerializer): + basket = BasketSerializer() + product = ProductSerializer() + + diff --git a/ecommerce/baskets/views.py b/ecommerce/baskets/views.py index 91ea44a..5e2d4b8 100644 --- a/ecommerce/baskets/views.py +++ b/ecommerce/baskets/views.py @@ -1,3 +1,28 @@ from django.shortcuts import render +from rest_framework import viewsets # Create your views here. +from baskets.filters import BasketItemFilter, BasketFilter +from baskets.models import BasketItem, Basket +from baskets.serializers import BasketItemSerializer, BasketSerializer, BasketItemDetailedSerializer, BasketDetailedSerializer +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, + "detail": BasketDetailedSerializer, + } + + +class BasketItemViewSet(DetailedViewSetMixin, viewsets.ModelViewSet): + queryset = BasketItem.objects.all() + serializer_class = BasketItemSerializer + filterset_class = BasketItemFilter + serializer_action_classes = { + "detailed_list": BasketItemDetailedSerializer, + "detail": BasketItemDetailedSerializer, + } \ No newline at end of file diff --git a/ecommerce/customers/filters.py b/ecommerce/customers/filters.py new file mode 100644 index 0000000..72b6690 --- /dev/null +++ b/ecommerce/customers/filters.py @@ -0,0 +1,38 @@ +from django.utils.translation import gettext_lazy as _ + +from django_filters import rest_framework as filters +from customers.models import Customer, Address, Country, City + + +class CustomerFilter(filters.FilterSet): + email = filters.CharFilter(label=_("Email")) + + class Meta: + model = Customer + fields = ("first_name", "last_name", "email") + + +class CityFilter(filters.FilterSet): + name = filters.CharFilter(label=_("City")) + + class Meta: + model = City + fields = ("name", "country") + + +class CountryFilter(filters.FilterSet): + name = filters.CharFilter(label=_("Country")) + + class Meta: + model = Country + fields = ("name",) + + +class AddressFilter(filters.FilterSet): + name = filters.CharFilter(label=_("Address")) + + class Meta: + model = Address + fields = ("name", "full_name", "phone", "district", "zipcode", "city", "customer") + + diff --git a/ecommerce/customers/serializers.py b/ecommerce/customers/serializers.py new file mode 100644 index 0000000..b203b6a --- /dev/null +++ b/ecommerce/customers/serializers.py @@ -0,0 +1,44 @@ +from rest_framework import serializers +from core.mixins import DetailedViewSetMixin + +from customers.models import Customer, Address, City, Country + + +class CustomerSerializer(serializers.ModelSerializer): + + class Meta: + model = Customer + fields = ("id", "first_name", "last_name", "email") + + +class CountrySerializer(serializers.ModelSerializer): + class Meta: + model = Country + fields = ("name",) + + +class CitySerializer(serializers.ModelSerializer): + + class Meta: + model = City + fields = ("name", "country") + + +class AddressSerializer(serializers.ModelSerializer): + + class Meta: + model = Address + fields = ( "name", "full_name", "phone", "district", "zipcode", "city", "customer") + + +class CityDetailedSerializer(CitySerializer): + country = CountrySerializer() + + +class AddressDetailedSerializer(AddressSerializer): + customer = CustomerSerializer() + city = CitySerializer() + + + + diff --git a/ecommerce/customers/views.py b/ecommerce/customers/views.py index 91ea44a..d125536 100644 --- a/ecommerce/customers/views.py +++ b/ecommerce/customers/views.py @@ -1,3 +1,43 @@ from django.shortcuts import render # Create your views here. +from rest_framework import viewsets +from core.mixins import DetailedViewSetMixin + +from customers.filters import CustomerFilter, AddressFilter, CountryFilter, CityFilter +from customers.models import Customer, Address, City, Country +from customers.serializers import CustomerSerializer, AddressSerializer, CitySerializer, CountrySerializer, AddressDetailedSerializer, CityDetailedSerializer + + +class CustomerViewSet(viewsets.ModelViewSet): + queryset = Customer.objects.all() + serializer_class = CustomerSerializer + filterset_class = CustomerFilter + + +class CountryViewSet(viewsets.ModelViewSet): + queryset = Country.objects.all() + serializer_class = CountrySerializer + filterset_class = CountryFilter + + +class CityViewSet(DetailedViewSetMixin, viewsets.ModelViewSet): + queryset = City.objects.select_related("country").all() + serializer_class = CitySerializer + filterset_class = CityFilter + serializer_action_classes = { + "detailed_list": CityDetailedSerializer, + "detail": CityDetailedSerializer, + } + + +class AddressViewSet(DetailedViewSetMixin, viewsets.ModelViewSet): + queryset = Address.objects.all() + serializer_class = AddressSerializer + filterset_class = AddressFilter + serializer_action_classes = { + "detailed_list": AddressDetailedSerializer, + "detail": AddressDetailedSerializer, + } + + diff --git a/ecommerce/ecommerce/urls.py b/ecommerce/ecommerce/urls.py index 3d9479a..503aa8c 100644 --- a/ecommerce/ecommerce/urls.py +++ b/ecommerce/ecommerce/urls.py @@ -17,8 +17,27 @@ from django.urls import path, include from ecommerce.router import router + +from products.views import ProductViewSet, CategoryViewSet +from baskets.views import BasketItemViewSet, BasketViewSet +from customers.views import CustomerViewSet, AddressViewSet, CityViewSet, CountryViewSet +from orders.views import OrderItemViewSet, OrderViewSet, BillingAddressViewSet, ShippingAddressViewSet, OrderBankAccountViewSet +from payments.views import BankAccountViewSet, BankViewSet from products.views import ProductViewSet, CategoryViewSet +router.register("customers", CustomerViewSet) +router.register("addresses", AddressViewSet) +router.register("cities", CityViewSet) +router.register("countries", CountryViewSet) +router.register("order-items", OrderItemViewSet) +router.register("orders", OrderViewSet) +router.register("order-bank-accounts", OrderBankAccountViewSet) +router.register("banks", BankViewSet) +router.register("bank-accounts", BankAccountViewSet) +router.register("billing-addresses", BillingAddressViewSet) +router.register("shipping-addresses", ShippingAddressViewSet) +router.register("basket-items", BasketItemViewSet) +router.register("baskets", BasketViewSet) router.register("products", ProductViewSet) router.register("categories", CategoryViewSet) diff --git a/ecommerce/orders/filters.py b/ecommerce/orders/filters.py new file mode 100644 index 0000000..2871c6f --- /dev/null +++ b/ecommerce/orders/filters.py @@ -0,0 +1,60 @@ +from django.utils.translation import gettext_lazy as _ +from django_filters import rest_framework as filters + +from orders import enums +from orders.models import OrderItem, Order, OrderBankAccount, ShippingAddress, BillingAddress + +from customers.filters import CityFilter, CustomerFilter +from baskets.filters import BasketFilter + + +class BillingAddressFilter(filters.FilterSet): + full_name = filters.CharFilter(label=_("Full Name")) + city = CityFilter + + class Meta: + model = BillingAddress + fields = ("full_name", "city") + + +class ShippingAddressFilter(filters.FilterSet): + full_name = filters.CharFilter(label=_("Full Name")) + city = CityFilter + + class Meta: + model = ShippingAddress + fields = ("full_name", "city") + + +class OrderFilter(filters.FilterSet): + customer = CustomerFilter + basket = BasketFilter + status = filters.ChoiceFilter(choices=enums.OrderStatus.choices) + + class Meta: + model = Order + fields = ("customer", "basket", "status") + + +class OrderItemFilter(filters.FilterSet): + order = OrderFilter + product = filters.CharFilter(label=_("Product")) + + class Meta: + model = OrderItem + fields = ("order", "product") + + +class OrderBankAccountFilter(filters.FilterSet): + name = filters.CharFilter(label=_("Name")) + iban = filters.CharFilter(label=_("IBAN")) + bank_name = filters.CharFilter(label=_("Bank Name")) + order = OrderFilter + + class Meta: + model = OrderBankAccount + fields = ("name", "iban", "bank_name", "order") + + + + diff --git a/ecommerce/orders/serializers.py b/ecommerce/orders/serializers.py new file mode 100644 index 0000000..7a74ca2 --- /dev/null +++ b/ecommerce/orders/serializers.py @@ -0,0 +1,61 @@ +from rest_framework import serializers + +from orders.models import Order, OrderItem, BillingAddress, ShippingAddress, OrderBankAccount +from customers.serializers import CustomerSerializer, CitySerializer +from baskets.serializers import BasketSerializer + + +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 = ("name", "iban", "bank_name", "order") + + +class OrderSerializer(serializers.ModelSerializer): + + class Meta: + model = Order + fields = ("id", "customer", "basket", "status", "total_price") + + +class OrderItemSerializer(serializers.ModelSerializer): + + class Meta: + model = OrderItem + fields = ("order", "product", "price", ) + + +class BillingAddressDetailedSerializer(BillingAddressSerializer): + city = CitySerializer() + + +class ShippingAddressDetailedSerializer(ShippingAddressSerializer): + city = CitySerializer() + + +class OrderBankAccountDetailedSerializer(OrderBankAccountSerializer): + order = OrderSerializer() + + +class OrderDetailedSerializer(OrderSerializer): + basket = BasketSerializer() + customer = CustomerSerializer() + + +class OrderItemDetailedSerializer(OrderItemSerializer): + order = OrderSerializer() diff --git a/ecommerce/orders/views.py b/ecommerce/orders/views.py index 91ea44a..8b5d6ca 100644 --- a/ecommerce/orders/views.py +++ b/ecommerce/orders/views.py @@ -1,3 +1,65 @@ from django.shortcuts import render +from rest_framework import viewsets # Create your views here. +from core.mixins import DetailedViewSetMixin + +from orders.filters import BillingAddressFilter, ShippingAddressFilter, OrderFilter, OrderItemFilter, OrderBankAccountFilter +from orders.models import BillingAddress, Order, ShippingAddress, OrderItem, OrderBankAccount +from orders.serializers import OrderSerializer, BillingAddressSerializer, \ + ShippingAddressSerializer, OrderDetailedSerializer, \ + BillingAddressDetailedSerializer, ShippingAddressDetailedSerializer, \ + OrderItemSerializer, OrderItemDetailedSerializer, \ + OrderBankAccountSerializer, OrderBankAccountDetailedSerializer + + + +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 OrderViewSet(DetailedViewSetMixin, viewsets.ModelViewSet): + queryset = Order.objects.all() + serializer_class = OrderSerializer + filterset_class = OrderFilter + serializer_action_classes = { + "detailed_list": OrderDetailedSerializer, + "detailed": OrderDetailedSerializer, + } + + +class OrderBankAccountViewSet(DetailedViewSetMixin, viewsets.ModelViewSet): + queryset = OrderBankAccount.objects.all() + serializer_class = OrderBankAccountSerializer + filterset_class = OrderBankAccountFilter + serializer_action_classes = { + "detailed_list": OrderBankAccountDetailedSerializer, + "detailed": OrderBankAccountDetailedSerializer, + } + + +class OrderItemViewSet(DetailedViewSetMixin, viewsets.ModelViewSet): + queryset = OrderItem.objects.all() + serializer_class = OrderItemSerializer + filterset_class = OrderItemFilter + serializer_action_classes = { + "detailed_list": OrderItemDetailedSerializer, + "detailed": OrderItemDetailedSerializer, + } + diff --git a/ecommerce/payments/filters.py b/ecommerce/payments/filters.py new file mode 100644 index 0000000..9f2019f --- /dev/null +++ b/ecommerce/payments/filters.py @@ -0,0 +1,22 @@ +from django.utils.translation import gettext_lazy as _ +from django_filters import rest_framework as filters + +from payments.models import Bank, BankAccount + + +class BankFilter(filters.FilterSet): + name = filters.CharFilter(label=_("Bank Name")) + + class Meta: + model = Bank + fields = ("name", ) + + +class BankAccountFilter(filters.FilterSet): + name = filters.CharFilter(label=_("Bank Name")) + iban = filters.CharFilter(label=_("IBAN")) + + class Meta: + model = BankAccount + fields = ("name", ) + diff --git a/ecommerce/payments/serializers.py b/ecommerce/payments/serializers.py new file mode 100644 index 0000000..bdcf9bc --- /dev/null +++ b/ecommerce/payments/serializers.py @@ -0,0 +1,21 @@ +from rest_framework import serializers + +from payments.models import BankAccount, Bank + + +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): + bank = BankSerializer() diff --git a/ecommerce/payments/views.py b/ecommerce/payments/views.py index 91ea44a..460541c 100644 --- a/ecommerce/payments/views.py +++ b/ecommerce/payments/views.py @@ -1,3 +1,26 @@ from django.shortcuts import render +from rest_framework import viewsets # Create your views here. +from core.mixins import DetailedViewSetMixin + +from payments.models import Bank, BankAccount +from payments.filters import BankFilter, BankAccountFilter +from payments.serializers import BankSerializer, BankAccountSerializer, BankAccountDetailedSerializer + + +class BankViewSet(viewsets.ModelViewSet): + queryset = Bank.objects.all() + serializer_class = BankSerializer + filterset_class = BankFilter + + +class BankAccountViewSet(DetailedViewSetMixin, viewsets.ModelViewSet): + queryset = BankAccount.objects.all() + serializer_class = BankAccountSerializer + filterset_class = BankAccountFilter + serializer_action_classes = { + "detailed_list": BankAccountDetailedSerializer, + "detailed": BankAccountDetailedSerializer, + } + From 178fd14cc3b1b18546a2df9ad79904e5835cbb86 Mon Sep 17 00:00:00 2001 From: Gundwane21 Date: Sat, 8 Jan 2022 15:38:26 +0300 Subject: [PATCH 2/2] Fix according to feedback --- ecommerce/baskets/filters.py | 1 - ecommerce/baskets/serializers.py | 2 +- ecommerce/customers/filters.py | 4 ---- ecommerce/customers/serializers.py | 6 +++--- ecommerce/orders/filters.py | 13 ------------- ecommerce/orders/serializers.py | 4 ++-- ecommerce/payments/filters.py | 3 --- 7 files changed, 6 insertions(+), 27 deletions(-) diff --git a/ecommerce/baskets/filters.py b/ecommerce/baskets/filters.py index bc6b99c..35f2812 100644 --- a/ecommerce/baskets/filters.py +++ b/ecommerce/baskets/filters.py @@ -8,7 +8,6 @@ class BasketFilter(filters.FilterSet): """ Basket Models Filter """ - status = filters.CharFilter(label=_("Status")) class Meta: model = Basket diff --git a/ecommerce/baskets/serializers.py b/ecommerce/baskets/serializers.py index e21a0bd..ed2a42b 100644 --- a/ecommerce/baskets/serializers.py +++ b/ecommerce/baskets/serializers.py @@ -20,7 +20,7 @@ class BasketItemSerializer(serializers.ModelSerializer): class Meta: model = BasketItem - fields = ("basket", "product", "quantity", "price",) + fields = ("id", "basket", "product", "quantity", "price",) class BasketItemDetailedSerializer(BasketItemSerializer): diff --git a/ecommerce/customers/filters.py b/ecommerce/customers/filters.py index 72b6690..e40f0cd 100644 --- a/ecommerce/customers/filters.py +++ b/ecommerce/customers/filters.py @@ -5,7 +5,6 @@ class CustomerFilter(filters.FilterSet): - email = filters.CharFilter(label=_("Email")) class Meta: model = Customer @@ -13,7 +12,6 @@ class Meta: class CityFilter(filters.FilterSet): - name = filters.CharFilter(label=_("City")) class Meta: model = City @@ -21,7 +19,6 @@ class Meta: class CountryFilter(filters.FilterSet): - name = filters.CharFilter(label=_("Country")) class Meta: model = Country @@ -29,7 +26,6 @@ class Meta: class AddressFilter(filters.FilterSet): - name = filters.CharFilter(label=_("Address")) class Meta: model = Address diff --git a/ecommerce/customers/serializers.py b/ecommerce/customers/serializers.py index b203b6a..103f015 100644 --- a/ecommerce/customers/serializers.py +++ b/ecommerce/customers/serializers.py @@ -14,21 +14,21 @@ class Meta: class CountrySerializer(serializers.ModelSerializer): class Meta: model = Country - fields = ("name",) + fields = ("id", "name",) class CitySerializer(serializers.ModelSerializer): class Meta: model = City - fields = ("name", "country") + fields = ("id", "name", "country") class AddressSerializer(serializers.ModelSerializer): class Meta: model = Address - fields = ( "name", "full_name", "phone", "district", "zipcode", "city", "customer") + fields = ("id", "name", "full_name", "phone", "district", "zipcode", "city", "customer") class CityDetailedSerializer(CitySerializer): diff --git a/ecommerce/orders/filters.py b/ecommerce/orders/filters.py index 2871c6f..0e0ce20 100644 --- a/ecommerce/orders/filters.py +++ b/ecommerce/orders/filters.py @@ -9,8 +9,6 @@ class BillingAddressFilter(filters.FilterSet): - full_name = filters.CharFilter(label=_("Full Name")) - city = CityFilter class Meta: model = BillingAddress @@ -18,8 +16,6 @@ class Meta: class ShippingAddressFilter(filters.FilterSet): - full_name = filters.CharFilter(label=_("Full Name")) - city = CityFilter class Meta: model = ShippingAddress @@ -27,9 +23,6 @@ class Meta: class OrderFilter(filters.FilterSet): - customer = CustomerFilter - basket = BasketFilter - status = filters.ChoiceFilter(choices=enums.OrderStatus.choices) class Meta: model = Order @@ -37,8 +30,6 @@ class Meta: class OrderItemFilter(filters.FilterSet): - order = OrderFilter - product = filters.CharFilter(label=_("Product")) class Meta: model = OrderItem @@ -46,10 +37,6 @@ class Meta: class OrderBankAccountFilter(filters.FilterSet): - name = filters.CharFilter(label=_("Name")) - iban = filters.CharFilter(label=_("IBAN")) - bank_name = filters.CharFilter(label=_("Bank Name")) - order = OrderFilter class Meta: model = OrderBankAccount diff --git a/ecommerce/orders/serializers.py b/ecommerce/orders/serializers.py index 7a74ca2..360881c 100644 --- a/ecommerce/orders/serializers.py +++ b/ecommerce/orders/serializers.py @@ -23,7 +23,7 @@ class OrderBankAccountSerializer(serializers.ModelSerializer): class Meta: model = OrderBankAccount - fields = ("name", "iban", "bank_name", "order") + fields = ("id", "name", "iban", "bank_name", "order") class OrderSerializer(serializers.ModelSerializer): @@ -37,7 +37,7 @@ class OrderItemSerializer(serializers.ModelSerializer): class Meta: model = OrderItem - fields = ("order", "product", "price", ) + fields = ("id", "order", "product", "price", ) class BillingAddressDetailedSerializer(BillingAddressSerializer): diff --git a/ecommerce/payments/filters.py b/ecommerce/payments/filters.py index 9f2019f..a53faa9 100644 --- a/ecommerce/payments/filters.py +++ b/ecommerce/payments/filters.py @@ -5,7 +5,6 @@ class BankFilter(filters.FilterSet): - name = filters.CharFilter(label=_("Bank Name")) class Meta: model = Bank @@ -13,8 +12,6 @@ class Meta: class BankAccountFilter(filters.FilterSet): - name = filters.CharFilter(label=_("Bank Name")) - iban = filters.CharFilter(label=_("IBAN")) class Meta: model = BankAccount