diff --git a/ecommerce/.env.dist b/ecommerce/.env.dist index b7f48c2..87200fc 100644 --- a/ecommerce/.env.dist +++ b/ecommerce/.env.dist @@ -1,5 +1,5 @@ DEBUG=True SECRET_KEY=secret_key -DATABASE_URL=psql://superuser_username:superuser_password@server_ip:server_port/db_name +DATABASE_URL=psql://username:password@ipaddress:port/db_name ALLOWED_HOSTS=127.0.0.1,0.0.0.0 TIME_ZONE=Europe/Istanbul \ No newline at end of file diff --git a/ecommerce/baskets/filters.py b/ecommerce/baskets/filters.py new file mode 100644 index 0000000..e737e28 --- /dev/null +++ b/ecommerce/baskets/filters.py @@ -0,0 +1,20 @@ +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, BasketItem + + +class BasketFilter(filters.FilterSet): + status = filters.CharFilter(label=_("Status"), method="filter_name") + + class Meta: + model = Basket + fields = ("customer", "status") + + +class BasketItemFilter(filters.FilterSet): + + class Meta: + model = BasketItem + fields = ("basket", "product", "price") diff --git a/ecommerce/baskets/models.py b/ecommerce/baskets/models.py index 4f109d5..ca4e695 100644 --- a/ecommerce/baskets/models.py +++ b/ecommerce/baskets/models.py @@ -16,6 +16,8 @@ class Basket(BaseAbstractModel): status = models.CharField(choices=enums.BasketStatus.choices, max_length=10, verbose_name=_("Basket Status"), default=enums.BasketStatus.OPEN) + + class Meta: verbose_name = _("Basket") verbose_name_plural = _("Baskets") diff --git a/ecommerce/baskets/serializers.py b/ecommerce/baskets/serializers.py new file mode 100644 index 0000000..ae551c2 --- /dev/null +++ b/ecommerce/baskets/serializers.py @@ -0,0 +1,16 @@ +from rest_framework import serializers +from baskets.models import Basket, BasketItem + + +class BasketSerializers(serializers.ModelSerializer): + + class Meta: + model = Basket + fields = "__all__" + + +class BasketItemSerializers(serializers.ModelSerializer): + + class Meta: + model = BasketItem + fields = "__all__" diff --git a/ecommerce/baskets/views.py b/ecommerce/baskets/views.py index 91ea44a..de526fa 100644 --- a/ecommerce/baskets/views.py +++ b/ecommerce/baskets/views.py @@ -1,3 +1,19 @@ -from django.shortcuts import render +from rest_framework import viewsets -# Create your views here. +from core.mixins import DetailedViewSetMixin + +from baskets.models import Basket, BasketItem +from baskets.filters import BasketFilter, BasketItemFilter +from baskets.serializers import BasketSerializers, BasketItemSerializers + + +class BasketViewSet(DetailedViewSetMixin, viewsets.ModelViewSet): + queryset = Basket.objects.all() + serializer_class = BasketSerializers + filterset_class = BasketFilter + + +class BasketItemViewSet(DetailedViewSetMixin, viewsets.ModelViewSet): + queryset = BasketItem.objects.all() + serializer_class = BasketItemSerializers + filterset_class = BasketItemFilter \ No newline at end of file diff --git a/ecommerce/customers/filters.py b/ecommerce/customers/filters.py new file mode 100644 index 0000000..60cc376 --- /dev/null +++ b/ecommerce/customers/filters.py @@ -0,0 +1,42 @@ +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): + 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") + + +class CountryFilter(filters.FilterSet): + name = filters.CharFilter(label=_("Country"), lookup_expr="icontains") + + class Meta: + model = Country + fields = ("name",) + + +class CityFilter(filters.FilterSet): + country = CountryFilter + name = filters.CharFilter(label=_("City"), lookup_expr="icontains") + + class Meta: + model = City + fields = ("name", "country") + + +class AddressFilter(filters.FilterSet): + customer = CustomerFilter + city = CityFilter + name = filters.CharFilter(label=_("Address"), lookup_expr="icontains") + + 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..78f91b9 --- /dev/null +++ b/ecommerce/customers/serializers.py @@ -0,0 +1,39 @@ +from rest_framework import serializers + +from customers.models import City, Customer, Address, Country + + +class CustomerSerializer(serializers.ModelSerializer): + + class Meta: + model = Customer + fields = "__all__" + + +class CitySerializer(serializers.ModelSerializer): + class Meta: + model = City + fields = "__all__" + + +class CountrySerializer(serializers.ModelSerializer): + class Meta: + model = Country + fields = "__all__" + + +class AddressSerializer(serializers.ModelSerializer): + class Meta: + model = Address + fields = "__all__" + + +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..6772c09 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, AddressFilter, CountryFilter +from customers.serializers import CustomerSerializer, CitySerializer, AddressSerializer, CountrySerializer, \ + AddressDetailedSerializer, CityDetailedSerializer +from customers.models import Customer, City, Address, Country + + +class CustomerViewSet(DetailedViewSetMixin, viewsets.ModelViewSet): + queryset = Customer.objects.all() + 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..57e1e4e 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': 5 } MIDDLEWARE = [ diff --git a/ecommerce/ecommerce/urls.py b/ecommerce/ecommerce/urls.py index 3d9479a..a2955c5 100644 --- a/ecommerce/ecommerce/urls.py +++ b/ecommerce/ecommerce/urls.py @@ -16,13 +16,35 @@ from django.contrib import admin from django.urls import path, include +from baskets.views import BasketViewSet, BasketItemViewSet 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 router.register("products", ProductViewSet) router.register("categories", CategoryViewSet) +router.register("baskets", BasketViewSet) +router.register("basket-items", BasketItemViewSet) + +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) + urlpatterns = [ path("api/", include(router.urls)), - path('admin/', admin.site.urls), + path('', admin.site.urls), ] diff --git a/ecommerce/orders/filters.py b/ecommerce/orders/filters.py new file mode 100644 index 0000000..2bfa2b7 --- /dev/null +++ b/ecommerce/orders/filters.py @@ -0,0 +1,57 @@ +from django.utils.translation import gettext_lazy as _ +from django_filters import rest_framework as filters + +from baskets.filters import BasketFilter +from customers.filters import CityFilter, CustomerFilter +from orders.models import BillingAddress, ShippingAddress, OrderBankAccount, Order, OrderItem +from products.filters import ProductFilter + + +class BillingAddressFilter(filters.FilterSet): + full_name = filters.CharFilter(label=_("Full Billing Address"), lookup_expr="icontains") + phone = filters.CharFilter(label=_("Phone"), lookup_expr="iexact") + city = CityFilter + + class Meta: + model = BillingAddress + fields = ("full_name", "phone", "city",) + + +class ShippingAddressFilter(filters.FilterSet): + full_name = filters.CharFilter(label=_("Full Shipping Address"), lookup_expr="icontains") + phone = filters.CharFilter(label=_("Phone"), lookup_expr="iexact") + city = CityFilter + + class Meta: + model = ShippingAddress + fields = ("full_name", "phone", "city",) + + +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 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 OrderItemFilter(filters.FilterSet): + order = OrderFilter + product = ProductFilter + + class Meta: + model = OrderItem + fields = ("order", "product",) \ No newline at end of file diff --git a/ecommerce/orders/serializers.py b/ecommerce/orders/serializers.py new file mode 100644 index 0000000..476a33e --- /dev/null +++ b/ecommerce/orders/serializers.py @@ -0,0 +1,35 @@ +from rest_framework import serializers +from orders.models import BillingAddress, ShippingAddress, OrderBankAccount, Order, OrderItem + + +class BillingAddressSerializer(serializers.ModelSerializer): + class Meta: + model = BillingAddress + fields = '__all__' + + +class ShippingAddressSerializer(serializers.ModelSerializer): + class Meta: + model = ShippingAddress + fields = '__all__' + + + +class OrderSerializer(serializers.ModelSerializer): + class Meta: + model = Order + fields = '__all__' + + +class OrderBankAccountSerializer(serializers.ModelSerializer): + + class Meta: + model = OrderBankAccount + fields = '__all__' + + +class OrderItemSerializer(serializers.ModelSerializer): + + class Meta: + model = OrderItem + fields = '__all__' \ No newline at end of file diff --git a/ecommerce/orders/views.py b/ecommerce/orders/views.py index 91ea44a..8769802 100644 --- a/ecommerce/orders/views.py +++ b/ecommerce/orders/views.py @@ -1,3 +1,42 @@ -from django.shortcuts import render +from rest_framework import viewsets -# Create your views here. +from core.mixins import DetailedViewSetMixin +from orders.filters import BillingAddressFilter, OrderBankAccountFilter, OrderFilter, \ + OrderItemFilter, ShippingAddressFilter +from orders.serializers import BillingAddressSerializer, OrderBankAccountSerializer, \ + OrderItemSerializer, OrderSerializer, ShippingAddressSerializer +from orders.models import BillingAddress, Order, OrderBankAccount, OrderItem, ShippingAddress + + +class BillingAddressViewSet(viewsets.ModelViewSet): + queryset = BillingAddress.objects.all() + serializer_class = BillingAddressSerializer + filterset_class = BillingAddressFilter + + + +class ShippingAddressViewSet(DetailedViewSetMixin, viewsets.ModelViewSet): + queryset = ShippingAddress.objects.all() + serializer_class = ShippingAddressSerializer + filterset_class = ShippingAddressFilter + + + +class OrderViewSet(viewsets.ModelViewSet): + queryset = Order.objects.all() + serializer_class = OrderSerializer + filterset_class = OrderFilter + + + +class OrderBankAccountViewSet(viewsets.ModelViewSet): + queryset = OrderBankAccount.objects.all() + serializer_class = OrderBankAccountSerializer + filterset_class = OrderBankAccountFilter + + + +class OrderItemViewSet(viewsets.ModelViewSet): + queryset = OrderItem.objects.all() + serializer_class = OrderItemSerializer + filterset_class = OrderItemFilter diff --git a/ecommerce/payments/filters.py b/ecommerce/payments/filters.py new file mode 100644 index 0000000..d193c8e --- /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"), lookup_expr="icontains") + + class Meta: + model = Bank + fields = ("name",) + + +class BankAccountFilter(filters.FilterSet): + name = filters.CharFilter(label=_("Bank Account Name"), lookup_expr="icontains") + iban = filters.CharFilter(label=_("Phone"), lookup_expr="iexact") + bank = BankFilter + + class Meta: + model = BankAccount + fields = ("name", "iban", "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..2ecfa77 --- /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 = ("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..df77b09 100644 --- a/ecommerce/payments/views.py +++ b/ecommerce/payments/views.py @@ -1,3 +1,22 @@ -from django.shortcuts import render +from rest_framework import viewsets -# Create your views here. +from core.mixins import DetailedViewSetMixin +from payments.filters import BankFilter, BankAccountFilter +from payments.models import Bank, BankAccount +from payments.serializers import BankAccountSerializer, BankSerializer, BankAccountDetailedSerializer + + +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/products/serializers.py b/ecommerce/products/serializers.py index a7eb006..dddd238 100644 --- a/ecommerce/products/serializers.py +++ b/ecommerce/products/serializers.py @@ -38,3 +38,5 @@ def create(self, validated_data): + +