diff --git a/ecommerce/README.md b/ecommerce/README.md index 83c3722..e91f917 100644 --- a/ecommerce/README.md +++ b/ecommerce/README.md @@ -1,23 +1,9 @@ -### Core - -It contains functions, classes and constants to be used as a basis in the core. - -### Customers - -It contains customer model and address model for customers. - -### Products - -It contains product model, category model, stock model and price model for products. - -### Baskets - -It contains basket model and basket item in basket model. - -### Orders - -It contains billing address model, shipping address model, order bank account model, order model and order item model. - -### Payments - -It contains bank model and bank account model. \ No newline at end of file +## All models' serializers, filters, viewsets was created, these are; + 1- Baskets + 2- Customers + 3- Orders + 4- Payments + 5- Products +## Also all models' serializer roots was created at the ecommerce/urls.py + +## Pagination was added to ecommerce/settings.py \ No newline at end of file diff --git a/ecommerce/baskets/filters.py b/ecommerce/baskets/filters.py new file mode 100644 index 0000000..4c519cc --- /dev/null +++ b/ecommerce/baskets/filters.py @@ -0,0 +1,13 @@ +from django.db.models import Q +from django_filters import rest_framework as filters +from django.utils.translation import gettext_lazy as _ + +from baskets.models import Basket + + +class BasketFilter(filters.FilterSet): + name = filters.CharFilter(label=_("Name"), method="") + + class Meta: + model = Basket + fields = ("customer", ) diff --git a/ecommerce/baskets/serializers.py b/ecommerce/baskets/serializers.py new file mode 100644 index 0000000..c55fd0f --- /dev/null +++ b/ecommerce/baskets/serializers.py @@ -0,0 +1,22 @@ + +from rest_framework import serializers + +from baskets.models import Basket, BasketItem + + + +class BasketSerializer(serializers.ModelSerializer): + + class Meta: + model = Basket + fields = ("customer", "status") + + +class BasketItemSerializer(serializers.ModelSerializer): + + class Meta: + model = BasketItem + fields = ("basket", "product","quantity","price" ) + +class BasketItemDetailedSerializer(BasketItemSerializer): + basket = BasketSerializer() \ No newline at end of file diff --git a/ecommerce/baskets/views.py b/ecommerce/baskets/views.py index 91ea44a..71e65b4 100644 --- a/ecommerce/baskets/views.py +++ b/ecommerce/baskets/views.py @@ -1,3 +1,20 @@ -from django.shortcuts import render +from rest_framework import viewsets -# Create your views here. +from core.mixins import DetailedViewSetMixin +from baskets.filters import BasketFilter +from baskets.models import Basket, BasketItem +from baskets.serializers import BasketSerializer, BasketItemSerializer, BasketItemDetailedSerializer + +class BasketViewSet(viewsets.ModelViewSet): + queryset = Basket.objects.all() + serializer_class = BasketSerializer + filterset_class = BasketFilter + +class BasketItemViewSet(DetailedViewSetMixin, viewsets.ModelViewSet): + queryset = BasketItem.objects.all() + serializer_class = BasketItemSerializer + +class BasketItemDetailedViewSet(viewsets.ModelViewSet): + queryset = BasketItem.objects.all() + serializer_class = BasketItemDetailedSerializer + http_method_names = ["get"] \ No newline at end of file diff --git a/ecommerce/customers/filters.py b/ecommerce/customers/filters.py new file mode 100644 index 0000000..95fe6ab --- /dev/null +++ b/ecommerce/customers/filters.py @@ -0,0 +1,18 @@ + +from django_filters import rest_framework as filters +from customers.models import Customer, Address + + + + +class CustomerFilter(filters.FilterSet): + + class Meta: + model = Customer + fields = ("is_active", "is_staff") + +class AddressFilter(filters.FilterSet): + + class Meta: + model = Address + fields = ("name", "city") \ No newline at end of file diff --git a/ecommerce/customers/serializers.py b/ecommerce/customers/serializers.py new file mode 100644 index 0000000..baf917a --- /dev/null +++ b/ecommerce/customers/serializers.py @@ -0,0 +1,46 @@ +from django.db.transaction import atomic +from rest_framework import serializers +from customers.models import Customer, Address, City, Country + +class CustomerSerializer(serializers.ModelSerializer): + + class Meta: + model = Customer + fields = ("first_name", "last_name", "email") + +class AddressSerializer(serializers.ModelSerializer): + + class Meta: + model = Address + fields = ("customer", "name", "full_name", "line_1","line_2","phone","district","zipcode","city") + + +class CountrySerializer(serializers.ModelSerializer): + + class Meta: + model = Country + fields = ("name", ) + +class CitySerializer(serializers.ModelSerializer): + country = CountrySerializer() + class Meta: + model = City + fields = ("name", "country") + +class AddressDetailedSerializer(AddressSerializer): + customer = CustomerSerializer() + city = CitySerializer() + + + @atomic() + def create(self, validated_data): + customers = validated_data.pop("customers", None) + address = super().create(validated_data) + if customers: + serializer = CustomerSerializer(data=addresses, many=True) + serializer.is_valid(raise_exception=True) + serializer.save() + address.customers.add(*serializer.instance) + return address + + diff --git a/ecommerce/customers/views.py b/ecommerce/customers/views.py index 91ea44a..07c5ff8 100644 --- a/ecommerce/customers/views.py +++ b/ecommerce/customers/views.py @@ -1,3 +1,32 @@ -from django.shortcuts import render +from rest_framework import viewsets +from core.mixins import DetailedViewSetMixin -# Create your views here. + +from customers.filters import CustomerFilter, AddressFilter +from customers.models import Customer, Address, City, Country +from customers.serializers import CustomerSerializer, AddressSerializer, CitySerializer, CountrySerializer, \ + AddressDetailedSerializer + + +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 + +class AddressDetailedViewSet(viewsets.ModelViewSet): + queryset = Address.objects.all() + serializer_class = AddressDetailedSerializer + http_method_names = ["get"] + +class CityViewSet(viewsets.ModelViewSet): + queryset = City.objects.all() + serializer_class = CitySerializer + +class CountryViewSet(viewsets.ModelViewSet): + queryset = Country.objects.all() + serializer_class = CountrySerializer diff --git a/ecommerce/ecommerce/settings.py b/ecommerce/ecommerce/settings.py index 898a8ee..ac3bdae 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': 100 } MIDDLEWARE = [ diff --git a/ecommerce/ecommerce/urls.py b/ecommerce/ecommerce/urls.py index 3d9479a..971b7e3 100644 --- a/ecommerce/ecommerce/urls.py +++ b/ecommerce/ecommerce/urls.py @@ -17,10 +17,49 @@ from django.urls import path, include from ecommerce.router import router -from products.views import ProductViewSet, CategoryViewSet - +from products.views import ProductViewSet, CategoryViewSet, ProductDetailedViewSet +from customers.views import CustomerViewSet, AddressViewSet, AddressDetailedViewSet, CityViewSet, CountryViewSet +from baskets.views import BasketViewSet, BasketItemViewSet, BasketItemDetailedViewSet +from payments.views import BankViewSet, BankAccountViewSet, BankAccountDetailedViewSet +from orders.views import OrderViewSet, OrderItemViewSet, OrderBankAccountViewSet, ShippingAddressViewSet, BillingAddressViewSet, OrderDetailedViewSet +""" + ## these routers was designed for showing all details about Product and Product's Category Details +""" +# Product Routers router.register("products", ProductViewSet) +router.register("products-detailed", ProductDetailedViewSet, basename="product-detailed") router.register("categories", CategoryViewSet) +""" + ## these routers was designed for showing all details about Customer and Full Address Details +""" +#Customer Routers +router.register("customers", CustomerViewSet) +router.register("addresses", AddressViewSet) +router.register("cities", CityViewSet) +router.register("countries", CountryViewSet) +router.register("addresses-detailed", AddressDetailedViewSet, basename="address-detailed") + +""" + ## these routers was designed for showing all details about Basket and Basket Items +""" +#Basket Routers +router.register("baskets", BasketViewSet) +router.register("basketitems", BasketItemViewSet) +router.register("basketitems-detailed", BasketItemDetailedViewSet, basename="basket-detailed") + +#Payments Routers +router.register("banks", BankViewSet ) +router.register("bankaccounts", BankAccountViewSet) +router.register("bankaccounts-detailed", BankAccountDetailedViewSet, basename="payment-detailed") + +#Order Routers +router.register("order", OrderViewSet ) +router.register("orderitems", OrderItemViewSet ) +router.register("orderbankaccount", OrderBankAccountViewSet ) +router.register("shippingaddress", ShippingAddressViewSet ) +router.register("billingaddress", BillingAddressViewSet ) +router.register("order-detailed", OrderDetailedViewSet, basename="order-detailed") + urlpatterns = [ path("api/", include(router.urls)), diff --git a/ecommerce/orders/filters.py b/ecommerce/orders/filters.py new file mode 100644 index 0000000..ca5c35d --- /dev/null +++ b/ecommerce/orders/filters.py @@ -0,0 +1,13 @@ + +from django_filters import rest_framework as filters +from django.utils.translation import gettext_lazy as _ + +from orders.models import Order + + +class OrderFilter(filters.FilterSet): + name = filters.CharFilter(label=_("Name"), method="") + + class Meta: + model = Order + fields = ("customer", "status") \ No newline at end of file diff --git a/ecommerce/orders/serializer.py b/ecommerce/orders/serializer.py new file mode 100644 index 0000000..677dc85 --- /dev/null +++ b/ecommerce/orders/serializer.py @@ -0,0 +1,42 @@ +from rest_framework import serializers + +from orders.models import Order, OrderItem, OrderBankAccount, ShippingAddress, BillingAddress +from customers.serializers import CustomerSerializer +from baskets.serializers import BasketSerializer + +class BillingAddressSerializer(serializers.ModelSerializer): + + class Meta: + model = BillingAddress + fields = ("full_name", "line_1", "line_2", "phone","district", "zipcode", "city") + +class ShippingAddressSerializer(serializers.ModelSerializer): + + class Meta: + model = ShippingAddress + fields = ("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 = ("customer", "basket","status","billing_address", "shipping_address","total_price" ) + + +class OrderItemSerializer(serializers.ModelSerializer): + + class Meta: + model = OrderItem + fields = ("order", "product","price" ) + +class OrderDetailedSerializer(OrderSerializer): + billing_address = BillingAddressSerializer() + shipping_address = ShippingAddressSerializer() + customer = CustomerSerializer() + basket = BasketSerializer() \ No newline at end of file diff --git a/ecommerce/orders/views.py b/ecommerce/orders/views.py index 91ea44a..022e63a 100644 --- a/ecommerce/orders/views.py +++ b/ecommerce/orders/views.py @@ -1,3 +1,33 @@ -from django.shortcuts import render +from rest_framework import viewsets +from core.mixins import DetailedViewSetMixin +from orders.filters import OrderFilter +from orders.models import Order, OrderItem, OrderBankAccount, ShippingAddress, BillingAddress +from orders.serializer import OrderSerializer, OrderItemSerializer, OrderBankAccountSerializer, BillingAddressSerializer, ShippingAddressSerializer, \ + OrderDetailedSerializer -# Create your views here. + +class OrderViewSet(DetailedViewSetMixin, viewsets.ModelViewSet): + queryset = Order.objects.all() + filterset_class = OrderFilter + serializer_class = OrderSerializer + +class OrderBankAccountViewSet(viewsets.ModelViewSet): + queryset = OrderBankAccount.objects.all() + serializer_class = OrderBankAccountSerializer + +class OrderItemViewSet(viewsets.ModelViewSet): + queryset = OrderItem.objects.all() + serializer_class = OrderItemSerializer + +class ShippingAddressViewSet(viewsets.ModelViewSet): + queryset = ShippingAddress.objects.all() + serializer_class = ShippingAddressSerializer + +class BillingAddressViewSet(viewsets.ModelViewSet): + queryset = BillingAddress.objects.all() + serializer_class = BillingAddressSerializer + +class OrderDetailedViewSet(viewsets.ModelViewSet): + queryset = Order.objects.all() + serializer_class = OrderDetailedSerializer + http_method_names = ["get"] \ No newline at end of file diff --git a/ecommerce/payments/filters.py b/ecommerce/payments/filters.py new file mode 100644 index 0000000..93e1955 --- /dev/null +++ b/ecommerce/payments/filters.py @@ -0,0 +1,13 @@ + +from django_filters import rest_framework as filters +from django.utils.translation import gettext_lazy as _ + +from payments.models import BankAccount + + +class BankAccountFilter(filters.FilterSet): + name = filters.CharFilter(label=_("Name"), method="") + + class Meta: + model = BankAccount + fields = ("bank",) \ No newline at end of file diff --git a/ecommerce/payments/serializers.py b/ecommerce/payments/serializers.py new file mode 100644 index 0000000..e89ef70 --- /dev/null +++ b/ecommerce/payments/serializers.py @@ -0,0 +1,21 @@ + +from rest_framework import serializers + +from payments.models import Bank, BankAccount + + +class BankSerializer(serializers.ModelSerializer): + + class Meta: + model = Bank + fields = ("name", ) + + +class BankAccountSerializer(serializers.ModelSerializer): + + class Meta: + model = BankAccount + fields = ("bank", "name", "iban") + +class BankAccountDetailedSerializer(BankAccountSerializer): + bank = BankSerializer() \ No newline at end of file diff --git a/ecommerce/payments/views.py b/ecommerce/payments/views.py index 91ea44a..131a40c 100644 --- a/ecommerce/payments/views.py +++ b/ecommerce/payments/views.py @@ -1,3 +1,20 @@ -from django.shortcuts import render +from rest_framework import viewsets +from core.mixins import DetailedViewSetMixin +from core.mixins import DetailedViewSetMixin +from payments.filters import BankAccountFilter +from payments.models import Bank, BankAccount +from payments.serializers import BankSerializer, BankAccountSerializer, BankAccountDetailedSerializer -# Create your views here. + +class BankViewSet(viewsets.ModelViewSet): + queryset = Bank.objects.all() + serializer_class = BankSerializer + +class BankAccountViewSet(DetailedViewSetMixin, viewsets.ModelViewSet): + queryset = BankAccount.objects.all() + serializer_class = BankAccountSerializer + +class BankAccountDetailedViewSet(BankAccountViewSet): + queryset = BankAccount.objects.all() + serializer_class = BankAccountDetailedSerializer + http_method_names = ["get"] diff --git a/ecommerce/products/filters.py b/ecommerce/products/filters.py index 1ab7578..44b2b5c 100644 --- a/ecommerce/products/filters.py +++ b/ecommerce/products/filters.py @@ -6,7 +6,7 @@ class ProductFilter(filters.FilterSet): - name = filters.CharFilter(label=_("Name"), method="filter_name") + name = filters.CharFilter(label=_("Name"), method="") class Meta: model = Product diff --git a/ecommerce/products/serializers.py b/ecommerce/products/serializers.py index a7eb006..39b2c9d 100644 --- a/ecommerce/products/serializers.py +++ b/ecommerce/products/serializers.py @@ -18,13 +18,9 @@ class Meta: fields = ("id", "name", ) -class ProductDetailedSerializer(serializers.ModelSerializer): +class ProductDetailedSerializer(ProductSerializer): categories = CategorySerializer(many=True) - class Meta: - model = Product - fields = ("id", "sku", "name", "description", "color", "size", "categories", "created_at", "modified_at") - @atomic() def create(self, validated_data): categories = validated_data.pop("categories", None) diff --git a/ecommerce/products/views.py b/ecommerce/products/views.py index fdd33fd..9e082eb 100644 --- a/ecommerce/products/views.py +++ b/ecommerce/products/views.py @@ -20,3 +20,8 @@ class ProductViewSet(DetailedViewSetMixin, viewsets.ModelViewSet): class CategoryViewSet(viewsets.ModelViewSet): queryset = Category.objects.all() serializer_class = CategorySerializer + +class ProductDetailedViewSet(viewsets.ModelViewSet): + queryset = Product.objects.all() + serializer_class = ProductDetailedSerializer + http_method_names = ["get"]