diff --git a/ecommerce/baskets/filters.py b/ecommerce/baskets/filters.py new file mode 100644 index 0000000..f77e355 --- /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..c3bb50a --- /dev/null +++ b/ecommerce/baskets/serializers.py @@ -0,0 +1,33 @@ +from rest_framework import serializers + +from baskets.models import * +from customers.serializers import CustomerSerializer + + +class BasketSerializer(serializers.ModelSerializer): + class Meta: + model = Basket + fields = "id", "customer", "status", "created_at", "modified_at" + + +class BasketItemSerializer(serializers.ModelSerializer): + class Meta: + model = BasketItem + fields = "id", "basket", "product", "quantity", "price" + + +class BasketDetailedSerializer(serializers.ModelSerializer): + customer = CustomerSerializer() + basket_items = BasketSerializer(many=True) + + class Meta: + model = Basket + fields = "id", "customer", "status", "created_at", "modified_at" + + +class BasketItemDetailedSerializer(serializers.ModelSerializer): + basket = BasketSerializer() + + class Meta: + model = BasketItem + fields = "id", "basket", "product", "quantity", "price" diff --git a/ecommerce/baskets/views.py b/ecommerce/baskets/views.py index 91ea44a..ffc6e75 100644 --- a/ecommerce/baskets/views.py +++ b/ecommerce/baskets/views.py @@ -1,3 +1,23 @@ -from django.shortcuts import render - -# Create your views here. +# from rest_framework import viewsets +# +# from core.mixins import DetailedViewSetMixin +# from baskets.filters import BasketFilter +# from baskets.filters import BasketItemFilter +# from baskets.models import BasketItem, Basket +# from products.serializers import ProductSerializer, CategorySerializer, \ +# ProductDetailedSerializer +# +# +# class ProductViewSet(DetailedViewSetMixin, viewsets.ModelViewSet): +# queryset = Product.objects.all() +# serializer_class = ProductSerializer +# filterset_class = ProductFilter +# serializer_action_classes = { +# "detailed_list": ProductDetailedSerializer, +# "detailed": ProductDetailedSerializer, +# } +# +# +# class CategoryViewSet(viewsets.ModelViewSet): +# queryset = Category.objects.all() +# serializer_class = CategorySerializer diff --git a/ecommerce/core/models.py b/ecommerce/core/models.py index 7e183f8..f1a0941 100644 --- a/ecommerce/core/models.py +++ b/ecommerce/core/models.py @@ -11,3 +11,7 @@ class BaseAbstractModel(models.Model): class Meta: abstract = True + + +def get_all_base_abstract_model_attrs(): + return "created_at", "modified_att" diff --git a/ecommerce/customers/filters.py b/ecommerce/customers/filters.py new file mode 100644 index 0000000..257e16d --- /dev/null +++ b/ecommerce/customers/filters.py @@ -0,0 +1,27 @@ +from django_filters import rest_framework as filters + +from customers.models import City, Country, Customer, get_all_customer_attrs, Address, get_all_address_attrs + + +class CityFilter(filters.FilterSet): + class Meta: + model = City + fields = ("name", "country") + + +class CountryFilter(filters.FilterSet): + class Meta: + model = Country + fields = ("name",) + + +class CustomerFilter(filters.FilterSet): + class Meta: + model = Customer + fields = get_all_customer_attrs() + + +class AddressFilter(filters.FilterSet): + class Meta: + model = Address + fields = get_all_address_attrs() diff --git a/ecommerce/customers/models.py b/ecommerce/customers/models.py index 71f79a6..98d2ddd 100644 --- a/ecommerce/customers/models.py +++ b/ecommerce/customers/models.py @@ -104,6 +104,10 @@ def __str__(self): return f"{self.first_name} - {self.last_name}" +def get_all_customer_attrs(): + return "first_name", "last_name", "email", "is_staff", "is_active", "date_joined" + + class Address(BaseAbstractModel): """ Address model @@ -117,7 +121,8 @@ class Address(BaseAbstractModel): line_1 = models.CharField(max_length=255, verbose_name=_("Address Line 1")) line_2 = models.CharField(max_length=255, verbose_name=_("Address Line 2"), null=True, blank=True) phone = models.CharField( - max_length=20, verbose_name=_("Phone Number"), validators=[phonenumber_validator], help_text=_("Phone number must be entered in the format: +901234567890. ")) + max_length=20, verbose_name=_("Phone Number"), validators=[phonenumber_validator], + help_text=_("Phone number must be entered in the format: +901234567890. ")) district = models.CharField(max_length=255, verbose_name=_("District")) zipcode = models.CharField(max_length=20, verbose_name=_("Zip Code")) city = models.ForeignKey(City, verbose_name=_("City"), on_delete=models.PROTECT) @@ -129,3 +134,7 @@ class Meta: def __str__(self): return f"{self.name} - {self.line_1} - {self.line_2} - {self.district} - {self.city}" + + +def get_all_address_attrs(): + return "customer", "name", "full_name", "line_1", "line_2", "phone", "district", "zipcode", "city", "is_default" diff --git a/ecommerce/customers/serializers.py b/ecommerce/customers/serializers.py new file mode 100644 index 0000000..1da2745 --- /dev/null +++ b/ecommerce/customers/serializers.py @@ -0,0 +1,47 @@ +from django.db.transaction import atomic +from rest_framework import serializers + +from baskets.serializers import BasketSerializer +from core.models import get_all_base_abstract_model_attrs +from customers.models import * + + +class CitySerializer(serializers.ModelSerializer): + class Meta: + model = City + fields = "name", + + +class CountrySerializer(serializers.ModelSerializer): + class Meta: + model = Country + fields = "name", "city" + + +class CustomerSerializer(serializers.ModelSerializer): + class Meta: + model = Customer + fields = get_all_customer_attrs() + ("id") + get_all_base_abstract_model_attrs + + +class AddressSerializer(serializers.ModelSerializer): + class Meta: + model = Address + fields = ("id",) + get_all_customer_attrs() + get_all_base_abstract_model_attrs() + + +class DetailedCustomerSerializer(serializers.ModelSerializer): + addresses = AddressSerializer(many=True) + baskets = BasketSerializer(many=True) + + class Meta: + model = Address + fields = ("id",) + get_all_customer_attrs() + get_all_base_abstract_model_attrs() + + +class DetailedAddressSerializer(serializers.ModelSerializer): + customer = CustomerSerializer() + + class Meta: + model = Address + fields = ("id",) + get_all_customer_attrs() + get_all_base_abstract_model_attrs() diff --git a/ecommerce/orders/filters.py b/ecommerce/orders/filters.py new file mode 100644 index 0000000..3783931 --- /dev/null +++ b/ecommerce/orders/filters.py @@ -0,0 +1,36 @@ +from django_filters import rest_framework as filters + +from customers.models import City, Country, Customer, get_all_customer_attrs, Address, get_all_address_attrs +from orders.models import BillingAddress, get_all_billing_address_attrs, ShippingAddress, \ + get_all_shipping_address_attrs, get_all_order_bank_account_attrs, OrderBankAccount, Order, get_all_order_attrs, \ + OrderItem, get_all_order_item_attrs + + +class BillingAddressFilter(filters.FilterSet): + class Meta: + model = BillingAddress + fields = get_all_billing_address_attrs() + + +class ShippingAddressFilter(filters.FilterSet): + class Meta: + model = ShippingAddress + fields = get_all_shipping_address_attrs() + + +class OrderBankAccountFilter(filters.FilterSet): + class Meta: + model = OrderBankAccount + fields = get_all_order_bank_account_attrs() + + +class OrderFilter(filters.FilterSet): + class Meta: + model = Order + fields = get_all_order_attrs() + + +class OrderItemFilter(filters.FilterSet): + class Meta: + model = OrderItem + fields = get_all_order_item_attrs() diff --git a/ecommerce/orders/models.py b/ecommerce/orders/models.py index 238a0aa..b5a7566 100644 --- a/ecommerce/orders/models.py +++ b/ecommerce/orders/models.py @@ -27,6 +27,10 @@ def __str__(self): return f"{self.full_name} - {self.line_1} - {self.line_2} - {self.district} - {self.city}" +def get_all_billing_address_attrs(): + return "full_name", "line_1", "line_2", "phone", "district", "zipcode", "city" + + class ShippingAddress(BaseAbstractModel): """ Shipping Address Model @@ -48,6 +52,10 @@ def __str__(self): return f"{self.full_name} - {self.line_1} - {self.line_2} - {self.district} - {self.city}" +def get_all_shipping_address_attrs(): + return "full_name", "line_1", "line_2", "phone", "district", "zipcode", "city" + + class OrderBankAccount(BaseAbstractModel): """ Order Bank Account Model @@ -65,13 +73,17 @@ def __str__(self): return f"{self.name} - {self.order}" +def get_all_order_bank_account_attrs(): + return "name", "iban", "bank_name", "order" + + class Order(BaseAbstractModel): """ Order Model """ customer = models.ForeignKey("customers.Customer", verbose_name=_("Customer"), on_delete=models.PROTECT) basket = models.ForeignKey("baskets.Basket", verbose_name=_("Basket"), on_delete=models.PROTECT) - status = models.CharField(choices=enums.OrderStatus.choices, + status = models.CharField(choices=enums.OrderStatus.choices, default=enums.OrderStatus.PENDING, max_length=20, verbose_name=_("Status")) billing_address = models.ForeignKey( BillingAddress, verbose_name=_("Billing Address"), on_delete=models.PROTECT) @@ -87,6 +99,10 @@ def __str__(self): return f"{self.customer} - {self.basket}" +def get_all_order_attrs(): + return "customer", "basket", "status", "billing_address", "shipping_address", "total_price" + + class OrderItem(BaseAbstractModel): """ Order Item Model @@ -98,6 +114,10 @@ class OrderItem(BaseAbstractModel): class Meta: verbose_name = _("Order Item") verbose_name_plural = _("Order Items") - + def __str__(self): - return f"{self.order} - {self.product} - {self.price}" \ No newline at end of file + return f"{self.order} - {self.product} - {self.price}" + + +def get_all_order_item_attrs(): + return "order", "product", "price" diff --git a/ecommerce/orders/serializers.py b/ecommerce/orders/serializers.py new file mode 100644 index 0000000..15237e2 --- /dev/null +++ b/ecommerce/orders/serializers.py @@ -0,0 +1,63 @@ +from rest_framework import serializers + +from core.models import get_all_base_abstract_model_attrs +from customers.serializers import CustomerSerializer +from orders.models import * + + +class BillingAddressSerializer(serializers.ModelSerializer): + class Meta: + model = BillingAddress + fields = get_all_billing_address_attrs() + get_all_base_abstract_model_attrs() + ("id",) + + +class ShippingAddressSerializer(serializers.ModelSerializer): + class Meta: + model = ShippingAddress + fields = get_all_shipping_address_attrs() + get_all_base_abstract_model_attrs() + "id" + + +class OrderBankAccountSerializer(serializers.ModelSerializer): + class Meta: + model = OrderBankAccount + fields = get_all_order_bank_account_attrs() + get_all_base_abstract_model_attrs() + "id" + + +class OrderSerializer(serializers.ModelSerializer): + class Meta: + model = Order + fields = get_all_order_attrs() + get_all_base_abstract_model_attrs() + "id" + + +class OrderItemSerializer(serializers.ModelSerializer): + class Meta: + model = OrderItem + fields = get_all_order_item_attrs() + get_all_base_abstract_model_attrs() + "id" + + +class OrderBankAccountDetailedSerializer(serializers.ModelSerializer): + order = OrderSerializer() + + class Meta: + model = OrderBankAccount + fields = get_all_order_bank_account_attrs() + get_all_base_abstract_model_attrs() + "id" + + +class OrderDetailedSerializer(serializers.ModelSerializer): + order_bank_accounts = OrderBankAccountSerializer(many=True) + customer = CustomerSerializer() + billing_address = BillingAddressSerializer() + shipping_address = ShippingAddressSerializer() + order_items = OrderItemSerializer(many=True) + + class Meta: + model = Order + fields = get_all_order_attrs() + get_all_base_abstract_model_attrs() + "id" + + +class OrderItemSerializer(serializers.ModelSerializer): + order = OrderSerializer() + + class Meta: + model = OrderItem + fields = get_all_order_item_attrs() + get_all_base_abstract_model_attrs() + "id" diff --git a/ecommerce/payments/filters.py b/ecommerce/payments/filters.py new file mode 100644 index 0000000..3783931 --- /dev/null +++ b/ecommerce/payments/filters.py @@ -0,0 +1,36 @@ +from django_filters import rest_framework as filters + +from customers.models import City, Country, Customer, get_all_customer_attrs, Address, get_all_address_attrs +from orders.models import BillingAddress, get_all_billing_address_attrs, ShippingAddress, \ + get_all_shipping_address_attrs, get_all_order_bank_account_attrs, OrderBankAccount, Order, get_all_order_attrs, \ + OrderItem, get_all_order_item_attrs + + +class BillingAddressFilter(filters.FilterSet): + class Meta: + model = BillingAddress + fields = get_all_billing_address_attrs() + + +class ShippingAddressFilter(filters.FilterSet): + class Meta: + model = ShippingAddress + fields = get_all_shipping_address_attrs() + + +class OrderBankAccountFilter(filters.FilterSet): + class Meta: + model = OrderBankAccount + fields = get_all_order_bank_account_attrs() + + +class OrderFilter(filters.FilterSet): + class Meta: + model = Order + fields = get_all_order_attrs() + + +class OrderItemFilter(filters.FilterSet): + class Meta: + model = OrderItem + fields = get_all_order_item_attrs() diff --git a/ecommerce/payments/models.py b/ecommerce/payments/models.py index 7d923d5..aa651e0 100644 --- a/ecommerce/payments/models.py +++ b/ecommerce/payments/models.py @@ -19,6 +19,10 @@ def __str__(self): return self.name +def get_all_bank_attrs(): + return ("name",) + + class BankAccount(BaseAbstractModel): """ Bank Account model @@ -31,6 +35,10 @@ class BankAccount(BaseAbstractModel): class Meta: verbose_name = _("Bank Account") verbose_name_plural = _("Bank Accounts") - + def __str__(self): return f"{self.name} - {self.iban}" + + +def get_all_bank_account_attrs(): + return "bank", "name", "iban" diff --git a/ecommerce/payments/serializers.py b/ecommerce/payments/serializers.py new file mode 100644 index 0000000..66e34fc --- /dev/null +++ b/ecommerce/payments/serializers.py @@ -0,0 +1,30 @@ +from core.models import get_all_base_abstract_model_attrs +from payments.models import * +from rest_framework import serializers + + +class BankSerializer(serializers.ModelSerializer): + class Meta: + model = Bank + fields = get_all_bank_attrs() + get_all_base_abstract_model_attrs() + "id" + + +class BankAccountSerializer(serializers.ModelSerializer): + class Meta: + model = BankAccount + fields = get_all_bank_account_attrs() + get_all_base_abstract_model_attrs() + "id" + + +class BankDetailedSerializer(serializers.ModelSerializer): + bank_accounts = BankAccountSerializer(many=True) + class Meta: + model = Bank + fields = get_all_bank_attrs() + get_all_base_abstract_model_attrs() + "id" + + +class BankAccountDetailedSerializer(serializers.ModelSerializer): + bank = BankSerializer() + + class Meta: + model = BankAccount + fields = get_all_bank_account_attrs() + get_all_base_abstract_model_attrs() + "id" diff --git a/ecommerce/products/filters.py b/ecommerce/products/filters.py index 1ab7578..cd9b09c 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, get_all_category_attrs, Stock, get_all_stock_attrs class ProductFilter(filters.FilterSet): @@ -15,3 +15,17 @@ 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): + + class Meta: + model = Category + fields = get_all_category_attrs() + + +class StockFilter(filters.FilterSet): + + class Meta: + model = Stock + fields = get_all_stock_attrs() diff --git a/ecommerce/products/models.py b/ecommerce/products/models.py index 3483416..9d98b21 100644 --- a/ecommerce/products/models.py +++ b/ecommerce/products/models.py @@ -20,6 +20,10 @@ def __str__(self): return f"{self.name}" +def get_all_category_attrs(): + return ("name",) + + class Product(BaseAbstractModel): """ Product model @@ -58,6 +62,10 @@ def __str__(self): return f"{self.quantity}" +def get_all_stock_attrs(): + return "product", "quantity" + + class Price(BaseAbstractModel): """ Price model @@ -73,3 +81,7 @@ class Meta: def __str__(self): return f"{self.amount}" + + +def get_all_price_attrs(): + return "product", "amount"