From 3bff20f6c57d1c2d98b4e49a84f1e43a727608ac Mon Sep 17 00:00:00 2001 From: upy Date: Sun, 28 Nov 2021 15:31:02 +0300 Subject: [PATCH 1/7] added product models --- ecommerce/ecommerce/settings.py | 6 ++- ecommerce/products/admin.py | 31 +++++++++++++- .../products/migrations/0002_price_stock.py | 42 +++++++++++++++++++ ecommerce/products/models.py | 30 ++++++++++++- 4 files changed, 106 insertions(+), 3 deletions(-) create mode 100644 ecommerce/products/migrations/0002_price_stock.py diff --git a/ecommerce/ecommerce/settings.py b/ecommerce/ecommerce/settings.py index b8d6509..b03f064 100644 --- a/ecommerce/ecommerce/settings.py +++ b/ecommerce/ecommerce/settings.py @@ -51,6 +51,7 @@ MIDDLEWARE = [ 'django.middleware.security.SecurityMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', + 'django.middleware.locale.LocaleMiddleware', 'django.middleware.common.CommonMiddleware', 'django.middleware.csrf.CsrfViewMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', @@ -116,7 +117,8 @@ def gettext_noop(s): LANGUAGES = [ ("en", gettext_noop("English")), - ("tr", gettext_noop("Turkish")) + ("tr", gettext_noop("Turkish")), + ("de", gettext_noop("German")) ] TIME_ZONE = env('TIME_ZONE') @@ -138,3 +140,5 @@ def gettext_noop(s): DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField' AUTH_USER_MODEL = "customers.Customer" + +LOCALE_PATHS = (str(BASE_DIR / "locale/"), ) diff --git a/ecommerce/products/admin.py b/ecommerce/products/admin.py index 8c38f3f..66ffa6b 100644 --- a/ecommerce/products/admin.py +++ b/ecommerce/products/admin.py @@ -1,3 +1,32 @@ from django.contrib import admin -# Register your models here. +from products.models import Product, Stock, Price + + +class StockInline(admin.StackedInline): + model = Stock + + +class PriceInline(admin.StackedInline): + model = Price + + +@admin.register(Product) +class ProductAdmin(admin.ModelAdmin): + search_fields = ("name", "sku") + list_display = ("sku", "name", "color", "size") + inlines = [StockInline, PriceInline] + + +@admin.register(Stock) +class StockAdmin(admin.ModelAdmin): + list_display = ("product", "quantity") + search_fields = ("product__name", "product__sku") + autocomplete_fields = ("product", ) + + +@admin.register(Price) +class StockAdmin(admin.ModelAdmin): + list_display = ("product", "amount") + search_fields = ("product__name", "product__sku") + autocomplete_fields = ("product", ) diff --git a/ecommerce/products/migrations/0002_price_stock.py b/ecommerce/products/migrations/0002_price_stock.py new file mode 100644 index 0000000..fe839dc --- /dev/null +++ b/ecommerce/products/migrations/0002_price_stock.py @@ -0,0 +1,42 @@ +# Generated by Django 3.2.9 on 2021-11-28 11:15 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('products', '0001_initial'), + ] + + operations = [ + migrations.CreateModel( + name='Stock', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('created_at', models.DateTimeField(auto_now_add=True, verbose_name='Created at')), + ('modified_at', models.DateTimeField(auto_now=True, verbose_name='Modified at')), + ('quantity', models.PositiveIntegerField(verbose_name='Quantity')), + ('product', models.OneToOneField(on_delete=django.db.models.deletion.PROTECT, to='products.product', verbose_name='Product')), + ], + options={ + 'verbose_name': 'stock', + 'verbose_name_plural': 'stocks', + }, + ), + migrations.CreateModel( + name='Price', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('created_at', models.DateTimeField(auto_now_add=True, verbose_name='Created at')), + ('modified_at', models.DateTimeField(auto_now=True, verbose_name='Modified at')), + ('amount', models.DecimalField(decimal_places=2, max_digits=10, verbose_name='Amount')), + ('product', models.OneToOneField(on_delete=django.db.models.deletion.PROTECT, to='products.product', verbose_name='Product')), + ], + options={ + 'verbose_name': 'price', + 'verbose_name_plural': 'prices', + }, + ), + ] diff --git a/ecommerce/products/models.py b/ecommerce/products/models.py index fdd0eea..5c95817 100644 --- a/ecommerce/products/models.py +++ b/ecommerce/products/models.py @@ -18,4 +18,32 @@ class Meta: verbose_name_plural = _("products") def __str__(self): - return self.sku + return f"{self.sku} - {self.name}" + + +class Stock(BaseAbstractModel): + product = models.OneToOneField(Product, verbose_name=_("Product"), + on_delete=models.PROTECT) + quantity = models.PositiveIntegerField(verbose_name=_("Quantity")) + + class Meta: + verbose_name = _("stock") + verbose_name_plural = _("stocks") + + def __str__(self): + return f"{self.product} - {self.quantity}" + + +class Price(BaseAbstractModel): + product = models.OneToOneField(Product, verbose_name=_("Product"), + on_delete=models.PROTECT) + amount = models.DecimalField(verbose_name=_("Amount"), + max_digits=10, decimal_places=2) + + class Meta: + verbose_name = _("price") + verbose_name_plural = _("prices") + + def __str__(self): + return f"{self.product} - {self.amount}" + From 851428d5a54bae8c14c5a0fbacdcf584f1d0ff5b Mon Sep 17 00:00:00 2001 From: upy Date: Sun, 28 Nov 2021 15:31:16 +0300 Subject: [PATCH 2/7] added locale files --- ecommerce/locale/de/LC_MESSAGES/django.po | 165 ++++++++++++++++++++++ ecommerce/locale/tr/LC_MESSAGES/django.po | 165 ++++++++++++++++++++++ 2 files changed, 330 insertions(+) create mode 100644 ecommerce/locale/de/LC_MESSAGES/django.po create mode 100644 ecommerce/locale/tr/LC_MESSAGES/django.po diff --git a/ecommerce/locale/de/LC_MESSAGES/django.po b/ecommerce/locale/de/LC_MESSAGES/django.po new file mode 100644 index 0000000..4deb82e --- /dev/null +++ b/ecommerce/locale/de/LC_MESSAGES/django.po @@ -0,0 +1,165 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2021-11-28 14:47+0300\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: core/models.py:6 +msgid "Created at" +msgstr "" + +#: core/models.py:7 +msgid "Modified at" +msgstr "" + +#: customers/admin.py:12 +msgid "Personal info" +msgstr "" + +#: customers/admin.py:14 +msgid "Permissions" +msgstr "" + +#: customers/admin.py:25 +msgid "Important dates" +msgstr "" + +#: customers/models.py:23 +msgid "first name" +msgstr "" + +#: customers/models.py:24 +msgid "last name" +msgstr "" + +#: customers/models.py:26 +msgid "email address" +msgstr "" + +#: customers/models.py:29 +msgid "staff status" +msgstr "" + +#: customers/models.py:31 +msgid "Designates whether the user can log into this admin site." +msgstr "" + +#: customers/models.py:34 +msgid "active" +msgstr "" + +#: customers/models.py:37 +msgid "" +"Designates whether this user should be treated as active. Unselect this " +"instead of deleting accounts." +msgstr "" + +#: customers/models.py:41 +msgid "date joined" +msgstr "" + +#: customers/models.py:49 +msgid "customer" +msgstr "" + +#: customers/models.py:50 +msgid "customers" +msgstr "" + +#: ecommerce/settings.py:118 +msgid "English" +msgstr "" + +#: ecommerce/settings.py:119 +msgid "Turkish" +msgstr "" + +#: ecommerce/settings.py:120 +msgid "German" +msgstr "" + +#: products/enums.py:6 +msgid "Red" +msgstr "" + +#: products/enums.py:7 +msgid "Blue" +msgstr "" + +#: products/enums.py:8 +msgid "White" +msgstr "" + +#: products/enums.py:9 +msgid "Yellow" +msgstr "" + +#: products/models.py:9 +msgid "SKU" +msgstr "" + +#: products/models.py:10 +msgid "Name" +msgstr "" + +#: products/models.py:11 +msgid "Description" +msgstr "" + +#: products/models.py:13 +msgid "Color" +msgstr "" + +#: products/models.py:14 +msgid "Size" +msgstr "" + +#: products/models.py:17 +msgid "product" +msgstr "" + +#: products/models.py:18 +msgid "products" +msgstr "" + +#: products/models.py:25 products/models.py:38 +msgid "Product" +msgstr "" + +#: products/models.py:27 +msgid "Quantity" +msgstr "" + +#: products/models.py:30 +msgid "stock" +msgstr "" + +#: products/models.py:31 +msgid "stocks" +msgstr "" + +#: products/models.py:40 +msgid "Amount" +msgstr "" + +#: products/models.py:44 +msgid "price" +msgstr "" + +#: products/models.py:45 +msgid "prices" +msgstr "" diff --git a/ecommerce/locale/tr/LC_MESSAGES/django.po b/ecommerce/locale/tr/LC_MESSAGES/django.po new file mode 100644 index 0000000..3be7fed --- /dev/null +++ b/ecommerce/locale/tr/LC_MESSAGES/django.po @@ -0,0 +1,165 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2021-11-28 15:02+0300\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" + +#: core/models.py:6 +msgid "Created at" +msgstr "Oluşturma tarihi" + +#: core/models.py:7 +msgid "Modified at" +msgstr "Değiştirme tarihi" + +#: customers/admin.py:12 +msgid "Personal info" +msgstr "" + +#: customers/admin.py:14 +msgid "Permissions" +msgstr "" + +#: customers/admin.py:25 +msgid "Important dates" +msgstr "" + +#: customers/models.py:23 +msgid "first name" +msgstr "" + +#: customers/models.py:24 +msgid "last name" +msgstr "" + +#: customers/models.py:26 +msgid "email address" +msgstr "" + +#: customers/models.py:29 +msgid "staff status" +msgstr "" + +#: customers/models.py:31 +msgid "Designates whether the user can log into this admin site." +msgstr "" + +#: customers/models.py:34 +msgid "active" +msgstr "" + +#: customers/models.py:37 +msgid "" +"Designates whether this user should be treated as active. Unselect this " +"instead of deleting accounts." +msgstr "" + +#: customers/models.py:41 +msgid "date joined" +msgstr "" + +#: customers/models.py:49 +msgid "customer" +msgstr "" + +#: customers/models.py:50 +msgid "customers" +msgstr "Müşteriler" + +#: ecommerce/settings.py:119 +msgid "English" +msgstr "" + +#: ecommerce/settings.py:120 +msgid "Turkish" +msgstr "" + +#: ecommerce/settings.py:121 +msgid "German" +msgstr "" + +#: products/enums.py:6 +msgid "Red" +msgstr "Kırmız" + +#: products/enums.py:7 +msgid "Blue" +msgstr "Mavi" + +#: products/enums.py:8 +msgid "White" +msgstr "Beyaz" + +#: products/enums.py:9 +msgid "Yellow" +msgstr "" + +#: products/models.py:9 +msgid "SKU" +msgstr "" + +#: products/models.py:10 +msgid "Name" +msgstr "İsim" + +#: products/models.py:11 +msgid "Description" +msgstr "Açıklama" + +#: products/models.py:13 +msgid "Color" +msgstr "Renk" + +#: products/models.py:14 +msgid "Size" +msgstr "Boyut" + +#: products/models.py:17 +msgid "product" +msgstr "Ürün" + +#: products/models.py:18 +msgid "products" +msgstr "Ürünler" + +#: products/models.py:25 products/models.py:38 +msgid "Product" +msgstr "" + +#: products/models.py:27 +msgid "Quantity" +msgstr "" + +#: products/models.py:30 +msgid "stock" +msgstr "Stok" + +#: products/models.py:31 +msgid "stocks" +msgstr "Stoklar" + +#: products/models.py:40 +msgid "Amount" +msgstr "" + +#: products/models.py:44 +msgid "price" +msgstr "" + +#: products/models.py:45 +msgid "prices" +msgstr "" From b67c18996c939886b5b74f252f0058294860b7e9 Mon Sep 17 00:00:00 2001 From: upy Date: Sun, 28 Nov 2021 15:44:46 +0300 Subject: [PATCH 3/7] added French language --- ecommerce/ecommerce/settings.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/ecommerce/ecommerce/settings.py b/ecommerce/ecommerce/settings.py index b03f064..245e977 100644 --- a/ecommerce/ecommerce/settings.py +++ b/ecommerce/ecommerce/settings.py @@ -118,7 +118,8 @@ def gettext_noop(s): LANGUAGES = [ ("en", gettext_noop("English")), ("tr", gettext_noop("Turkish")), - ("de", gettext_noop("German")) + ("de", gettext_noop("German")), + ("fr", gettext_noop("French")), ] TIME_ZONE = env('TIME_ZONE') From 7360d92870abc3fa997a3728dd2db3777f5deea1 Mon Sep 17 00:00:00 2001 From: eylultuncel Date: Thu, 16 Dec 2021 23:24:00 +0300 Subject: [PATCH 4/7] permissions and get_queryset added --- ecommerce/baskets/views.py | 10 +++++++++ ecommerce/orders/views.py | 42 ++++++++++++++++++++++++++++++++++++- ecommerce/payments/views.py | 6 ++++++ 3 files changed, 57 insertions(+), 1 deletion(-) diff --git a/ecommerce/baskets/views.py b/ecommerce/baskets/views.py index ee32571..8224b07 100644 --- a/ecommerce/baskets/views.py +++ b/ecommerce/baskets/views.py @@ -15,6 +15,11 @@ class BasketItemViewSet(DetailedViewSetMixin, viewsets.ModelViewSet): "detailed": BasketItemDetailedSerializer, } + def get_queryset(self): + queryset = super().get_queryset() + user = self.request.user + return queryset.filter(customer=user) + class BasketViewSet(DetailedViewSetMixin, viewsets.ModelViewSet): queryset = Basket.objects.all() @@ -24,3 +29,8 @@ class BasketViewSet(DetailedViewSetMixin, viewsets.ModelViewSet): "detailed_list": BasketDetailedSerializer, "detailed": BasketDetailedSerializer, } + + def get_queryset(self): + queryset = super().get_queryset() + user = self.request.user + return queryset.filter(customer=user) diff --git a/ecommerce/orders/views.py b/ecommerce/orders/views.py index dde7137..98c753f 100644 --- a/ecommerce/orders/views.py +++ b/ecommerce/orders/views.py @@ -1,6 +1,7 @@ -from rest_framework import viewsets +from rest_framework import viewsets, permissions from core.mixins import DetailedViewSetMixin +from core.utils import IsStaffUserAuthenticated from orders.filters import OrderItemFilter, OrderFilter, BillingAddressFilter, ShippingAddressFilter, \ OrderBankAccountFilter from orders.models import OrderItem, Order, BillingAddress, ShippingAddress, OrderBankAccount @@ -18,6 +19,25 @@ class OrderItemViewSet(DetailedViewSetMixin, viewsets.ModelViewSet): "detailed": OrderItemDetailedSerializer, } + def get_queryset(self): + queryset = super().get_queryset() + user = self.request.user + return queryset.filter(customer=user) + + +class AdminOrderViewSet(DetailedViewSetMixin, viewsets.ModelViewSet): + permission_classes = ( + permissions.IsAuthenticated, + IsStaffUserAuthenticated + ) + queryset = Order.objects.all() + serializer_class = OrderSerializer + filterset_class = OrderFilter + serializer_action_classes = { + "detailed_list": OrderDetailedSerializer, + "detailed": OrderDetailedSerializer, + } + class OrderViewSet(DetailedViewSetMixin, viewsets.ModelViewSet): queryset = Order.objects.all() @@ -28,6 +48,11 @@ class OrderViewSet(DetailedViewSetMixin, viewsets.ModelViewSet): "detailed": OrderDetailedSerializer, } + def get_queryset(self): + queryset = super().get_queryset() + user = self.request.user + return queryset.filter(customer=user) + class BillingAddressViewSet(DetailedViewSetMixin, viewsets.ModelViewSet): queryset = BillingAddress.objects.all() @@ -38,6 +63,11 @@ class BillingAddressViewSet(DetailedViewSetMixin, viewsets.ModelViewSet): "detailed": BillingAddressDetailedSerializer, } + def get_queryset(self): + queryset = super().get_queryset() + user = self.request.user + return queryset.filter(customer=user) + class ShippingAddressViewSet(DetailedViewSetMixin, viewsets.ModelViewSet): queryset = ShippingAddress.objects.all() @@ -48,6 +78,11 @@ class ShippingAddressViewSet(DetailedViewSetMixin, viewsets.ModelViewSet): "detailed": ShippingAddressDetailedSerializer, } + def get_queryset(self): + queryset = super().get_queryset() + user = self.request.user + return queryset.filter(customer=user) + class OrderBankAccountViewSet(DetailedViewSetMixin, viewsets.ModelViewSet): queryset = OrderBankAccount.objects.all() @@ -57,3 +92,8 @@ class OrderBankAccountViewSet(DetailedViewSetMixin, viewsets.ModelViewSet): "detailed_list": OrderBankAccountDetailedSerializer, "detailed": OrderBankAccountDetailedSerializer, } + + def get_queryset(self): + queryset = super().get_queryset() + user = self.request.user + return queryset.filter(customer=user) diff --git a/ecommerce/payments/views.py b/ecommerce/payments/views.py index 09b28a7..145fce2 100644 --- a/ecommerce/payments/views.py +++ b/ecommerce/payments/views.py @@ -15,8 +15,14 @@ class BankAccountViewSet(DetailedViewSetMixin, viewsets.ModelViewSet): "detailed": BankAccountDetailedSerializer, } + def get_queryset(self): + queryset = super().get_queryset() + user = self.request.user + return queryset.filter(customer=user) + class BankViewSet(viewsets.ModelViewSet): + http_method_names = ["get"] queryset = Bank.objects.all() serializer_class = BankSerializer filterset_class = BankFilter From 93cedc14abd3c31d375ac58dd21ebe46bbd128d0 Mon Sep 17 00:00:00 2001 From: eylultuncel Date: Sat, 18 Dec 2021 00:10:37 +0300 Subject: [PATCH 5/7] register endpoint created --- ecommerce/customers/serializers.py | 18 ++++++++++++++++++ ecommerce/customers/views.py | 11 +++++++++-- ecommerce/ecommerce/urls.py | 3 ++- 3 files changed, 29 insertions(+), 3 deletions(-) diff --git a/ecommerce/customers/serializers.py b/ecommerce/customers/serializers.py index ffad735..cbfa456 100644 --- a/ecommerce/customers/serializers.py +++ b/ecommerce/customers/serializers.py @@ -13,6 +13,24 @@ class Meta: fields = ("id", "first_name", "last_name", "email", "is_staff", "is_active", "date_joined") +class RegisterSerializer(serializers.ModelSerializer): + password = serializers.CharField(write_only=True) + + def create(self, validated_data): + customer = Customer.objects.create_user( + email=validated_data['email'], + first_name=validated_data['first_name'], + last_name=validated_data["last_name"], + password=validated_data["password"] + ) + customer.save() + return customer + + class Meta: + model = Customer + fields = ("id", "email", "first_name", "last_name", "password",) + + class ProfileSerializer(serializers.ModelSerializer): class Meta: diff --git a/ecommerce/customers/views.py b/ecommerce/customers/views.py index e2d05b6..48abaf6 100644 --- a/ecommerce/customers/views.py +++ b/ecommerce/customers/views.py @@ -7,8 +7,15 @@ 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, ProfileSerializer + CountrySerializer, AddressDetailedSerializer, CityDetailedSerializer, \ + ProfileSerializer, RegisterSerializer + + +class RegisterViewSet(viewsets.ModelViewSet, mixins.CreateModelMixin): + permission_classes = () + http_method_names = ['post'] + queryset = Customer.objects.all() + serializer_class = RegisterSerializer class AdminCustomerViewSet(viewsets.ModelViewSet): diff --git a/ecommerce/ecommerce/urls.py b/ecommerce/ecommerce/urls.py index 28278ef..4a6a5f1 100644 --- a/ecommerce/ecommerce/urls.py +++ b/ecommerce/ecommerce/urls.py @@ -21,7 +21,7 @@ from baskets.views import BasketItemViewSet, BasketViewSet from core.views import APITokenObtainPairView from customers.views import AddressViewSet, CityViewSet, \ - CountryViewSet, AdminCustomerViewSet, MyProfileViewSet + CountryViewSet, AdminCustomerViewSet, MyProfileViewSet, RegisterViewSet from ecommerce.router import router from orders.views import OrderItemViewSet, OrderViewSet, BillingAddressViewSet, ShippingAddressViewSet, \ OrderBankAccountViewSet @@ -46,6 +46,7 @@ router.register("banks", BankViewSet) router.register("admin-products", AdminProductViewSet, basename="admin-product") router.register("admin-customers", AdminCustomerViewSet, basename="admin-customer") +router.register("register", RegisterViewSet) urlpatterns = [ From ef080f4039c3aeaa090d71d9103cebb634a7e186 Mon Sep 17 00:00:00 2001 From: eylultuncel Date: Sat, 18 Dec 2021 14:34:23 +0300 Subject: [PATCH 6/7] fix errors in get_querysets --- ecommerce/baskets/views.py | 4 ++-- ecommerce/orders/views.py | 18 ++++-------------- ecommerce/payments/views.py | 5 ----- 3 files changed, 6 insertions(+), 21 deletions(-) diff --git a/ecommerce/baskets/views.py b/ecommerce/baskets/views.py index 8224b07..28e94b1 100644 --- a/ecommerce/baskets/views.py +++ b/ecommerce/baskets/views.py @@ -17,8 +17,8 @@ class BasketItemViewSet(DetailedViewSetMixin, viewsets.ModelViewSet): def get_queryset(self): queryset = super().get_queryset() - user = self.request.user - return queryset.filter(customer=user) + user_id = self.request.user.id + return queryset.filter(basket__customer__id=user_id) class BasketViewSet(DetailedViewSetMixin, viewsets.ModelViewSet): diff --git a/ecommerce/orders/views.py b/ecommerce/orders/views.py index 98c753f..ba2dc29 100644 --- a/ecommerce/orders/views.py +++ b/ecommerce/orders/views.py @@ -21,8 +21,8 @@ class OrderItemViewSet(DetailedViewSetMixin, viewsets.ModelViewSet): def get_queryset(self): queryset = super().get_queryset() - user = self.request.user - return queryset.filter(customer=user) + user_id = self.request.user.id + return queryset.filter(order__customer__id=user_id) class AdminOrderViewSet(DetailedViewSetMixin, viewsets.ModelViewSet): @@ -63,11 +63,6 @@ class BillingAddressViewSet(DetailedViewSetMixin, viewsets.ModelViewSet): "detailed": BillingAddressDetailedSerializer, } - def get_queryset(self): - queryset = super().get_queryset() - user = self.request.user - return queryset.filter(customer=user) - class ShippingAddressViewSet(DetailedViewSetMixin, viewsets.ModelViewSet): queryset = ShippingAddress.objects.all() @@ -78,11 +73,6 @@ class ShippingAddressViewSet(DetailedViewSetMixin, viewsets.ModelViewSet): "detailed": ShippingAddressDetailedSerializer, } - def get_queryset(self): - queryset = super().get_queryset() - user = self.request.user - return queryset.filter(customer=user) - class OrderBankAccountViewSet(DetailedViewSetMixin, viewsets.ModelViewSet): queryset = OrderBankAccount.objects.all() @@ -95,5 +85,5 @@ class OrderBankAccountViewSet(DetailedViewSetMixin, viewsets.ModelViewSet): def get_queryset(self): queryset = super().get_queryset() - user = self.request.user - return queryset.filter(customer=user) + user_id = self.request.user.id + return queryset.filter(order__customer__id=user_id) diff --git a/ecommerce/payments/views.py b/ecommerce/payments/views.py index 145fce2..f8f1cd2 100644 --- a/ecommerce/payments/views.py +++ b/ecommerce/payments/views.py @@ -15,11 +15,6 @@ class BankAccountViewSet(DetailedViewSetMixin, viewsets.ModelViewSet): "detailed": BankAccountDetailedSerializer, } - def get_queryset(self): - queryset = super().get_queryset() - user = self.request.user - return queryset.filter(customer=user) - class BankViewSet(viewsets.ModelViewSet): http_method_names = ["get"] From dcb27fdc40e9cdc021b1e97fd5234258c3ec04cc Mon Sep 17 00:00:00 2001 From: eylultuncel Date: Sat, 18 Dec 2021 16:30:06 +0300 Subject: [PATCH 7/7] add_to_basket endpoint added --- ecommerce/baskets/serializers.py | 1 + ecommerce/baskets/views.py | 31 +++++++++++++++++++++++++++++++ 2 files changed, 32 insertions(+) diff --git a/ecommerce/baskets/serializers.py b/ecommerce/baskets/serializers.py index 9dc4c30..0c53dd3 100644 --- a/ecommerce/baskets/serializers.py +++ b/ecommerce/baskets/serializers.py @@ -10,6 +10,7 @@ class BasketItemSerializer(serializers.ModelSerializer): class Meta: model = BasketItem fields = ("id", "basket", "product", "quantity", "price") + read_only_fields = ["basket", "price"] class BasketSerializer(serializers.ModelSerializer): diff --git a/ecommerce/baskets/views.py b/ecommerce/baskets/views.py index 28e94b1..3b95083 100644 --- a/ecommerce/baskets/views.py +++ b/ecommerce/baskets/views.py @@ -1,9 +1,14 @@ +from django.core.exceptions import ObjectDoesNotExist +from django.db.transaction import atomic from rest_framework import viewsets +from rest_framework.decorators import action +from rest_framework.response import Response 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 +from products.models import Product class BasketItemViewSet(DetailedViewSetMixin, viewsets.ModelViewSet): @@ -22,15 +27,41 @@ def get_queryset(self): class BasketViewSet(DetailedViewSetMixin, viewsets.ModelViewSet): + http_method_names = ["get", "delete"] queryset = Basket.objects.all() serializer_class = BasketSerializer filterset_class = BasketFilter serializer_action_classes = { "detailed_list": BasketDetailedSerializer, "detailed": BasketDetailedSerializer, + "add_to_basket": BasketItemSerializer, } def get_queryset(self): queryset = super().get_queryset() user = self.request.user return queryset.filter(customer=user) + + @atomic() + @action(detail=True, methods=['post'], http_method_names=['post']) + def add_to_basket(self, request, pk=None): + user_id = self.request.user.id + product = Product.objects.get(id=request.data["product"]) + quantity = request.data["quantity"] + price = product.price + try: + basket = Basket.objects.get(customer__id=user_id, status="open") + except ObjectDoesNotExist: + basket = Basket.objects.create(customer_id=user_id, status="open") + + try: + basket_item = BasketItem.objects.get(basket__customer__id=user_id, product=product) + basket_item.quantity += int(quantity) + except ObjectDoesNotExist: + basket_item = BasketItem.objects.create(basket=basket, product=product, quantity=int(quantity), price=price) + + basket.save() + basket_item.save() + + serializer = BasketItemSerializer(basket_item) + return Response(serializer.data)