From 8816fbd6e38736a46941b4c45d4bd0ba4bee49fd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=96mer=20Bu=C4=9Fra=20Y=C4=B1ld=C4=B1r=C4=B1m?= Date: Sun, 12 Dec 2021 06:42:28 +0300 Subject: [PATCH 1/2] serializers and filters created. views and urls configured --- ecommerce/baskets/filters.py | 0 ecommerce/baskets/serializers.py | 0 ecommerce/customers/filters.py | 0 ecommerce/customers/serializers.py | 0 ecommerce/orders/filters.py | 0 ecommerce/orders/serializers.py | 0 ecommerce/payments/filters.py | 0 ecommerce/payments/serializers.py | 0 8 files changed, 0 insertions(+), 0 deletions(-) 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..e69de29 diff --git a/ecommerce/baskets/serializers.py b/ecommerce/baskets/serializers.py new file mode 100644 index 0000000..e69de29 diff --git a/ecommerce/customers/filters.py b/ecommerce/customers/filters.py new file mode 100644 index 0000000..e69de29 diff --git a/ecommerce/customers/serializers.py b/ecommerce/customers/serializers.py new file mode 100644 index 0000000..e69de29 diff --git a/ecommerce/orders/filters.py b/ecommerce/orders/filters.py new file mode 100644 index 0000000..e69de29 diff --git a/ecommerce/orders/serializers.py b/ecommerce/orders/serializers.py new file mode 100644 index 0000000..e69de29 diff --git a/ecommerce/payments/filters.py b/ecommerce/payments/filters.py new file mode 100644 index 0000000..e69de29 diff --git a/ecommerce/payments/serializers.py b/ecommerce/payments/serializers.py new file mode 100644 index 0000000..e69de29 From d901e639a8037ca9e3ef31acc04ceed441cd726e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=96mer=20Bu=C4=9Fra=20Y=C4=B1ld=C4=B1r=C4=B1m?= Date: Sun, 12 Dec 2021 06:43:29 +0300 Subject: [PATCH 2/2] serializers and filters created. views and urls configured --- ecommerce/baskets/filters.py | 25 +++++ ecommerce/baskets/serializers.py | 65 +++++++++++++ ecommerce/baskets/views.py | 26 +++++- ecommerce/customers/filters.py | 41 ++++++++ ecommerce/customers/serializers.py | 79 ++++++++++++++++ ecommerce/customers/views.py | 39 +++++++- ecommerce/ecommerce/settings.py | 4 +- ecommerce/ecommerce/urls.py | 21 +++++ ecommerce/orders/filters.py | 64 +++++++++++++ ecommerce/orders/serializers.py | 144 +++++++++++++++++++++++++++++ ecommerce/orders/views.py | 55 ++++++++++- ecommerce/payments/filters.py | 23 +++++ ecommerce/payments/serializers.py | 30 ++++++ ecommerce/payments/views.py | 22 ++++- ecommerce/requirements.txt | 1 + 15 files changed, 630 insertions(+), 9 deletions(-) diff --git a/ecommerce/baskets/filters.py b/ecommerce/baskets/filters.py index e69de29..f6e30c8 100644 --- a/ecommerce/baskets/filters.py +++ 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 +from customers.filters import CustomerFilter +from products.filters import ProductFilter + + +class BasketFilter(filters.FilterSet): + customer = CustomerFilter + status = filters.CharFilter(label=_("Status"), lookup_expr="icontains") + + class Meta: + model = Basket + fields = ("customer", "status") + + +class BasketItemFilter(filters.FilterSet): + product = ProductFilter + basket = BasketFilter + price = filters.NumberFilter(label=_("Price"), lookup_expr="gte") + + class Meta: + model = BasketItem + fields = ("product", "basket", "price") \ No newline at end of file diff --git a/ecommerce/baskets/serializers.py b/ecommerce/baskets/serializers.py index e69de29..06c51ec 100644 --- a/ecommerce/baskets/serializers.py +++ b/ecommerce/baskets/serializers.py @@ -0,0 +1,65 @@ +from django.db.transaction import atomic +from rest_framework import serializers + +from baskets.models import Basket, BasketItem + +from products.serializers import ProductSerializer, ProductDetailedSerializer +from customers.serializers import CustomerSerializer + + +class BasketSerializer(serializers.ModelSerializer): + class Meta: + model = Basket + read_only_fields = ['id', 'created_at', 'updated_at'] + fields = ("id", "customer", "status") + + +class BasketItemSerializer(serializers.ModelSerializer): + class Meta: + model = BasketItem + read_only_fields = ['id', 'created_at', 'updated_at'] + fields = ("id", "basket", "product", "quantity", "price") + + +class BasketDetailedSerializer(BasketSerializer): + customer = CustomerSerializer() + class Meta: + model = Basket + fields = ("customer", "status") + + @atomic() + def create(self, validated_data): + customer = validated_data.pop("customer", None) + basket = super().create(validated_data) + + if customer: + serializer = CustomerSerializer(data=customer) + serializer.is_valid(raise_exception=True) + serializer.save() + basket.customer.add(*serializer.instance) + + return basket + + +class BasketItemDetailedSerializer(BasketItemSerializer): + basket = BasketDetailedSerializer() + product = ProductDetailedSerializer() + + @atomic() + def create(self, validated_data): + basket = validated_data.pop("basket", None) + product = validated_data.pop("product", None) + + basket_item = super().create(validated_data) + + if basket: + serializer = BasketSerializer(data=basket) + serializer.is_valid(raise_exception=True) + serializer.save() + basket_item.basket.add(*serializer.instance) + if product: + serializer = ProductSerializer(data=product) + serializer.is_valid(raise_exception=True) + serializer.save() + basket_item.product.add(*serializer.instance) + return basket_item \ No newline at end of file diff --git a/ecommerce/baskets/views.py b/ecommerce/baskets/views.py index 91ea44a..2b46410 100644 --- a/ecommerce/baskets/views.py +++ b/ecommerce/baskets/views.py @@ -1,3 +1,25 @@ -from django.shortcuts import render +from rest_framework import viewsets +from baskets.filters import BasketFilter, BasketItemFilter +from baskets.models import Basket, BasketItem +from baskets.serializers import BasketSerializer, BasketDetailedSerializer, BasketItemSerializer, BasketItemDetailedSerializer +from core.mixins import DetailedViewSetMixin -# Create your views here. + +class BasketViewSet(DetailedViewSetMixin, viewsets.ModelViewSet): + queryset = Basket.objects.all() + serializer_class = BasketSerializer + filterset_class = BasketFilter + serializer_action_classes = { + "detailed_list": BasketDetailedSerializer, + "detailed": BasketDetailedSerializer, + } + + +class BasketItemViewSet(DetailedViewSetMixin, viewsets.ModelViewSet): + queryset = BasketItem.objects.all() + serializer_class = BasketItemSerializer + filterset_class = BasketItemFilter + serializer_action_classes = { + "detailed_list": BasketItemDetailedSerializer, + "detailed": BasketItemDetailedSerializer, + } \ No newline at end of file diff --git a/ecommerce/customers/filters.py b/ecommerce/customers/filters.py index e69de29..0909c69 100644 --- a/ecommerce/customers/filters.py +++ b/ecommerce/customers/filters.py @@ -0,0 +1,41 @@ +from django_filters import rest_framework as filters +from django.utils.translation import gettext_lazy as _ +from customers.models import Customer, City, Country, Address + + +class CustomerFilter(filters.FilterSet): + first_name = filters.CharFilter(label=_("First Name"), lookup_expr="icontains") + last_name = filters.CharFilter(label=_("Last Name"), lookup_expr="icontains") + email = filters.CharFilter(label=_("Email"), lookup_expr="icontains") + is_active = filters.BooleanFilter(label=_('Active'), field_name='is_active') + + class Meta: + model = Customer + fields = ("first_name", "last_name", "email", "is_active") + + +class CountryFilter(filters.FilterSet): + name = filters.CharFilter(label=_("Country Name"), lookup_expr="icontains") + + class Meta: + model = Country + fields = ("name",) + + +class CityFilter(filters.FilterSet): + country = CountryFilter + name = filters.CharFilter(label=_("City Name"), lookup_expr="icontains") + + class Meta: + model = City + fields = ("name", "country",) + + +class AddressFilter(filters.FilterSet): + customer = CustomerFilter + name = filters.CharFilter(label=_("Address Name"), lookup_expr="icontains") + city = CityFilter + + class Meta: + model = Address + fields = ("customer", "name", "city",) \ No newline at end of file diff --git a/ecommerce/customers/serializers.py b/ecommerce/customers/serializers.py index e69de29..048a952 100644 --- a/ecommerce/customers/serializers.py +++ b/ecommerce/customers/serializers.py @@ -0,0 +1,79 @@ +from django.db.transaction import atomic +from rest_framework import serializers +from customers.models import Customer, City, Address, Country + +class CustomerSerializer(serializers.ModelSerializer): + class Meta: + model = Customer + fields = ("id", "first_name", "last_name", "email",) + +class CitySerializer(serializers.ModelSerializer): + class Meta: + model = City + fields = ("id", "name", "country",) + + +class CityDetailedSerializer(serializers.ModelSerializer): + country = CountrySerializer() + + class Meta: + model = City + fields = ("id", "name", "country",) + + @atomic() + def create(self, validated_data): + country = validated_data.pop("country", None) + city = super().create(validated_data) + if country: + serializer = CountrySerializer(data=country) + serializer.is_valid(raise_exception=True) + serializer.save() + city.country.add(*serializer.instance) + return city + + +class AddressSerializer(serializers.ModelSerializer): + class Meta: + model = Address + fields = ("id", "customer", "name", "full_name", + "line_1", "line_2", "phone", "district", "zipcode", + "city", "is_default") + + +class AddressDetailedSerializer(serializers.ModelSerializer): + customer = CustomerSerializer() + city = CityDetailedSerializer() + + class Meta: + model = Address + fields = ("id", "customer", "name", "full_name", + "line_1", "line_2", "phone", "district", "zipcode", + "city", "is_default") + + @atomic() + def create(self, validated_data): + customer = validated_data.pop("customer", None) + city = validated_data.pop("city", None) + + address = super().create(validated_data) + + if customer: + serializer = CustomerSerializer(data=customer) + serializer.is_valid(raise_exception=True) + serializer.save() + address.customer.add(*serializer.instance) + + address = super().create(validated_data) + + if city: + serializer = CityDetailedSerializer(data=city) + serializer.is_valid(raise_exception=True) + serializer.save() + address.city.add(*serializer.instance) + return address + + +class CountrySerializer(serializers.ModelSerializer): + class Meta: + model = Country + fields = ("id", "name",) \ No newline at end of file diff --git a/ecommerce/customers/views.py b/ecommerce/customers/views.py index 91ea44a..431d427 100644 --- a/ecommerce/customers/views.py +++ b/ecommerce/customers/views.py @@ -1,3 +1,38 @@ -from django.shortcuts import render +from rest_framework import viewsets -# Create your views here. +from core.mixins import DetailedViewSetMixin +from customers.filters import CustomerFilter, CityFilter, CountryFilter, AddressFilter +from customers.models import Customer, City, Country, Address +from customers.serializers import CustomerSerializer, CitySerializer, CountrySerializer, AddressSerializer, CityDetailedSerializer, AddressDetailedSerializer + + +class CustomerViewSet(viewsets.ModelViewSet): + queryset = Customer.objects.filter(is_active=True) + serializer_class = CustomerSerializer + filterset_class = CustomerFilter + + +class CityViewSet(DetailedViewSetMixin, viewsets.ModelViewSet): + queryset = City.objects.all() + serializer_class = CitySerializer + filterset_class = CityFilter + serializer_action_classes = { + "detailed_list": CityDetailedSerializer, + "detailed": CityDetailedSerializer, + } + + +class CountryViewSet(DetailedViewSetMixin, viewsets.ModelViewSet): + queryset = Country.objects.all() + serializer_class = CountrySerializer + filterset_class = CountryFilter + + +class AddressViewSet(DetailedViewSetMixin, viewsets.ModelViewSet): + queryset = Address.objects.all() + serializer_class = AddressSerializer + filterset_class = AddressFilter + serializer_action_classes = { + "detailed_list": AddressDetailedSerializer, + "detailed": AddressDetailedSerializer, + } \ No newline at end of file diff --git a/ecommerce/ecommerce/settings.py b/ecommerce/ecommerce/settings.py index 898a8ee..63835b5 100644 --- a/ecommerce/ecommerce/settings.py +++ b/ecommerce/ecommerce/settings.py @@ -54,7 +54,9 @@ ] REST_FRAMEWORK = { - 'DEFAULT_FILTER_BACKENDS': ['django_filters.rest_framework.DjangoFilterBackend'] + 'DEFAULT_FILTER_BACKENDS': ['django_filters.rest_framework.DjangoFilterBackend'], +'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.LimitOffsetPagination', + 'PAGE_SIZE': 20 } MIDDLEWARE = [ diff --git a/ecommerce/ecommerce/urls.py b/ecommerce/ecommerce/urls.py index 3d9479a..98dd461 100644 --- a/ecommerce/ecommerce/urls.py +++ b/ecommerce/ecommerce/urls.py @@ -18,10 +18,31 @@ from ecommerce.router import router from products.views import ProductViewSet, CategoryViewSet +from customers.views import CustomerViewSet, CityViewSet, CountryViewSet, AddressViewSet +from orders.views import BillingAddressViewSet, ShippingAddressViewSet, OrderViewSet, OrderBankAccountViewSet, OrderItemViewSet +from payments.views import BankViewSet, BankAccountViewSet +from baskets.views import BasketViewSet, BasketItemViewSet router.register("products", ProductViewSet) router.register("categories", CategoryViewSet) +router.register("customers", CustomerViewSet) +router.register("cities", CityViewSet) +router.register("countries", CountryViewSet) +router.register("addresses", AddressViewSet) + +router.register("billing-address", BillingAddressViewSet) +router.register("shipping-address", ShippingAddressViewSet) +router.register("order", OrderViewSet) +router.register("order-bank-account", OrderBankAccountViewSet) +router.register("order-item", OrderItemViewSet) + +router.register("banks", BankViewSet) +router.register("bank-accounts", BankAccountViewSet) + +router.register("baskets", BasketViewSet) +router.register("basket-items", BasketItemViewSet) + urlpatterns = [ path("api/", include(router.urls)), path('admin/', admin.site.urls), diff --git a/ecommerce/orders/filters.py b/ecommerce/orders/filters.py index e69de29..5dd5e44 100644 --- a/ecommerce/orders/filters.py +++ b/ecommerce/orders/filters.py @@ -0,0 +1,64 @@ +from django_filters import rest_framework as filters +from django.utils.translation import gettext_lazy as _ +from customers.filters import CustomerFilter, CityFilter +from baskets.filters import BasketFilter +from products.filters import ProductFilter +from orders.models import Order, OrderBankAccount, OrderItem, BillingAddress, ShippingAddress + + +class OrderFilter(filters.FilterSet): + customer = CustomerFilter + basket = BasketFilter + status = filters.CharFilter(label=_("Status"), lookup_expr="iexact") + + class Meta: + model = Order + fields = ("customer", "basket", "status",) + + +class OrderItemFilter(filters.FilterSet): + order = OrderFilter + product = ProductFilter + + class Meta: + model = OrderItem + fields = ("order", "product",) + + +class OrderBankAccountFilter(filters.FilterSet): + order = OrderFilter + name = filters.CharFilter(label=_("City Name"), lookup_expr="icontains") + iban = filters.CharFilter(label=_("IBAN"), lookup_expr="iexact") + bank_name = filters.CharFilter(label=_("Bank Name"), lookup_expr="icontains") + + class Meta: + model = OrderBankAccount + fields = ("name", "iban", "bank_name", "order") + + +class BillingAddressFilter(filters.FilterSet): + full_name = filters.CharFilter(label=_("Full Name"), + lookup_expr="icontains") + phone = filters.CharFilter(label=_("Phone")) + district = filters.CharFilter(label=_("District"), lookup_expr="icontains") + zipcode = filters.CharFilter(label=_("Zipcode")) + city = CityFilter + + class Meta: + model = BillingAddress + fields = ( + "full_name", "phone", "district", "zipcode", "city") + + +class ShippingAddressFilter(filters.FilterSet): + full_name = filters.CharFilter(label=_("Full Name"), + lookup_expr="icontains") + phone = filters.CharFilter(label=_("Phone")) + district = filters.CharFilter(label=_("District"), lookup_expr="icontains") + zipcode = filters.CharFilter(label=_("Zipcode")) + city = CityFilter + + class Meta: + model = ShippingAddress + fields = ( + "full_name", "phone", "district", "zipcode", "city") \ No newline at end of file diff --git a/ecommerce/orders/serializers.py b/ecommerce/orders/serializers.py index e69de29..84296c6 100644 --- a/ecommerce/orders/serializers.py +++ b/ecommerce/orders/serializers.py @@ -0,0 +1,144 @@ +from django.db.transaction import atomic +from rest_framework import serializers +from baskets.serializers import BasketSerializer +from customers.serializers import CitySerializer, CustomerSerializer +from orders.models import BillingAddress, ShippingAddress, Order, OrderBankAccount, 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 OrderSerializer(serializers.ModelSerializer): + class Meta: + model = Order + fields = ("id", "customer", "basket", "status", "billing_address", "shipping_address", "total_price") + + +class OrderBankAccountSerializer(serializers.ModelSerializer): + class Meta: + model = OrderBankAccount + fields = ("id", "name", "iban", "bank_name", "order",) + + +class OrderItemSerializer(serializers.ModelSerializer): + class Meta: + model = OrderItem + fields = ("id", "order", "product", "price",) + + +class BillingAddressDetailedSerializer(serializers.ModelSerializer): + city = CitySerializer(many=False) + + class Meta: + model = BillingAddress + fields = ("id", "full_name", "line_1", "line_2", "phone", "district", "zipcode", "city") + + @atomic() + def create(self, validated_data): + city = validated_data.pop("city", None) + billing_address = super().create(validated_data) + if city: + serializer = CitySerializer(data=city, many=False) + serializer.is_valid(raise_exception=True) + serializer.save() + billing_address.city.add(*serializer.instance) + return billing_address + + +class ShippingAddressDetailedSerializer(serializers.ModelSerializer): + city = CitySerializer(many=False) + + class Meta: + model = ShippingAddress + fields = ("id", "full_name", "line_1", "line_2", "phone", "district", "zipcode", "city",) + + @atomic() + def create(self, validated_data): + city = validated_data.pop("city", None) + shipping_address = super().create(validated_data) + if city: + serializer = CitySerializer(data=city, many=False) + serializer.is_valid(raise_exception=True) + serializer.save() + shipping_address.city.add(*serializer.instance) + return shipping_address + + +class OrderItemDetailedSerializer(serializers.ModelSerializer): + order = OrderSerializer(many=False) + + class Meta: + model = OrderItem + fields = ("id", "order", "product", "price",) + + @atomic() + def create(self, validated_data): + order = validated_data.pop("order", None) + order_item = super().create(validated_data) + if order_item: + serializer = OrderSerializer(data=order, many=False) + serializer.is_valid(raise_exception=True) + serializer.save() + order_item.order.add(*serializer.instance) + + return order_item + + +class OrderDetailedSerializer(serializers.ModelSerializer): + customer = CustomerSerializer(many=False) + basket = BasketSerializer(many=False) + billing_address = BillingAddressSerializer(many=False) + shipping_address = ShippingAddressSerializer(many=False) + + class Meta: + model = Order + fields = ("id", "customer", "basket", "status", "billing_address", "shipping_address", "total_price") + + @atomic() + def create(self, validated_data): + customer = validated_data.pop("customer", None) + basket = validated_data.pop("basket", None) + + order = super().create(validated_data) + if customer: + serializer = CustomerSerializer(data=customer, many=False) + serializer.is_valid(raise_exception=True) + serializer.save() + order.customer.add(*serializer.instance) + + order = super().create(validated_data) + if basket: + serializer = BasketSerializer(data=basket, many=False) + serializer.is_valid(raise_exception=True) + serializer.save() + order.basket.add(*serializer.instance) + return order + + +class OrderBankAccountDetailedSerializer(serializers.ModelSerializer): + order = OrderSerializer(many=False) + + class Meta: + model = OrderBankAccount + fields = ("id", "name", "iban", "bank_name", "order",) + + @atomic() + def create(self, validated_data): + order = validated_data.pop("order", None) + bank_account = super().create(validated_data) + if order: + serializer = OrderSerializer(data=order, many=False) + serializer.is_valid(raise_exception=True) + serializer.save() + bank_account.order.add(*serializer.instance) + + return bank_account \ No newline at end of file diff --git a/ecommerce/orders/views.py b/ecommerce/orders/views.py index 91ea44a..86bbcd5 100644 --- a/ecommerce/orders/views.py +++ b/ecommerce/orders/views.py @@ -1,3 +1,54 @@ -from django.shortcuts import render +from rest_framework import viewsets +from core.mixins import DetailedViewSetMixin +from orders.models import Order, OrderBankAccount, BillingAddress, ShippingAddress, OrderItem +from orders.serializers import (BillingAddressSerializer, BillingAddressDetailedSerializer, OrderSerializer, + OrderDetailedSerializer, OrderItemSerializer, OrderItemDetailedSerializer, + OrderBankAccountSerializer, OrderBankAccountDetailedSerializer, ShippingAddressSerializer, + ShippingAddressDetailedSerializer) +from orders.filters import BillingAddressFilter, OrderFilter, OrderBankAccountFilter, OrderItemFilter, ShippingAddressFilter -# Create your views here. + +class BillingAddressViewSet(DetailedViewSetMixin, viewsets.ModelViewSet): + queryset = BillingAddress.objects.all() + serializer_class = BillingAddressSerializer + filterset_class = BillingAddressFilter + serializer_action_classes = { + "detailed_list": BillingAddressDetailedSerializer, + "detailed": BillingAddressDetailedSerializer, + } + + +class ShippingAddressViewSet(DetailedViewSetMixin, viewsets.ModelViewSet): + queryset = ShippingAddress.objects.all() + serializer_class = ShippingAddressSerializer + filterset_class = ShippingAddressFilter + serializer_action_classes = { + "detailed_list": ShippingAddressDetailedSerializer, + "detailed": ShippingAddressDetailedSerializer, + } + + +class OrderBankAccountViewSet(DetailedViewSetMixin, viewsets.ModelViewSet): + queryset = OrderBankAccount.objects.all() + serializer_class = OrderBankAccountSerializer + filterset_class = OrderBankAccountFilter + + +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, + } \ No newline at end of file diff --git a/ecommerce/payments/filters.py b/ecommerce/payments/filters.py index e69de29..1527628 100644 --- a/ecommerce/payments/filters.py +++ b/ecommerce/payments/filters.py @@ -0,0 +1,23 @@ +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 = BankFilter + iban = filters.CharFilter(label=_("Phone"), lookup_expr="iexact") + name = filters.CharFilter(label=_("Bank Account Name"), lookup_expr="icontains") + + + + class Meta: + model = BankAccount + fields = ("bank", "name", "iban") \ No newline at end of file diff --git a/ecommerce/payments/serializers.py b/ecommerce/payments/serializers.py index e69de29..14ab757 100644 --- a/ecommerce/payments/serializers.py +++ b/ecommerce/payments/serializers.py @@ -0,0 +1,30 @@ +from rest_framework import serializers +from payments.models import Bank, BankAccount +from django.db.transaction import atomic + + +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() + + @atomic() + def create(self, validated_data): + bank = validated_data.pop("bank", None) + bank_acc = super().create(validated_data) + if bank: + serializer = BankSerializer(data=bank) + serializer.is_valid(raise_exception=True) + serializer.save() + bank_acc.bank.add(*serializer.instance) + return bank_acc \ No newline at end of file diff --git a/ecommerce/payments/views.py b/ecommerce/payments/views.py index 91ea44a..a2f759f 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 +from core.mixins import DetailedViewSetMixin +from payments.filters import BankFilter, BankAccountFilter +from payments.models import Bank, BankAccount +from payments.serializers import BankAccountSerializer, BankSerializer, BankAccountDetailedSerializer -# Create your views here. + +class BankViewSet(DetailedViewSetMixin, 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, + } \ No newline at end of file diff --git a/ecommerce/requirements.txt b/ecommerce/requirements.txt index ab0ec02..52ee458 100644 --- a/ecommerce/requirements.txt +++ b/ecommerce/requirements.txt @@ -6,3 +6,4 @@ djangorestframework==3.12.4 ipython==7.30.1 psycopg2-binary==2.9.2 Werkzeug==2.0.2 +