From 3bff20f6c57d1c2d98b4e49a84f1e43a727608ac Mon Sep 17 00:00:00 2001 From: upy Date: Sun, 28 Nov 2021 15:31:02 +0300 Subject: [PATCH 01/11] 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 02/11] 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 03/11] 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 1336d44512e397bda262111e8659d957fc0da4e7 Mon Sep 17 00:00:00 2001 From: eylultuncel Date: Wed, 8 Dec 2021 19:51:41 +0300 Subject: [PATCH 04/11] product views and serializers added --- ecommerce/baskets/migrations/0001_initial.py | 48 ------- .../migrations/0002_auto_20211205_0953.py | 37 ------ .../customers/migrations/0001_initial.py | 121 ------------------ .../migrations/0002_address_city_country.py | 65 ---------- .../migrations/0003_auto_20211203_2031.py | 24 ---- .../migrations/0004_alter_address_district.py | 18 --- .../migrations/0005_auto_20211205_0953.py | 34 ----- ecommerce/ecommerce/urls.py | 4 +- ecommerce/orders/migrations/0001_initial.py | 111 ---------------- .../migrations/0002_auto_20211205_0953.py | 38 ------ ecommerce/payments/migrations/0001_initial.py | 44 ------- ecommerce/products/migrations/0001_initial.py | 31 ----- .../products/migrations/0002_price_stock.py | 42 ------ .../migrations/0003_auto_20211203_1919.py | 31 ----- .../0004_alter_product_categories.py | 18 --- ecommerce/products/serializers.py | 29 ++++- ecommerce/products/views.py | 23 +++- 17 files changed, 52 insertions(+), 666 deletions(-) delete mode 100644 ecommerce/baskets/migrations/0001_initial.py delete mode 100644 ecommerce/baskets/migrations/0002_auto_20211205_0953.py delete mode 100644 ecommerce/customers/migrations/0001_initial.py delete mode 100644 ecommerce/customers/migrations/0002_address_city_country.py delete mode 100644 ecommerce/customers/migrations/0003_auto_20211203_2031.py delete mode 100644 ecommerce/customers/migrations/0004_alter_address_district.py delete mode 100644 ecommerce/customers/migrations/0005_auto_20211205_0953.py delete mode 100644 ecommerce/orders/migrations/0001_initial.py delete mode 100644 ecommerce/orders/migrations/0002_auto_20211205_0953.py delete mode 100644 ecommerce/payments/migrations/0001_initial.py delete mode 100644 ecommerce/products/migrations/0001_initial.py delete mode 100644 ecommerce/products/migrations/0002_price_stock.py delete mode 100644 ecommerce/products/migrations/0003_auto_20211203_1919.py delete mode 100644 ecommerce/products/migrations/0004_alter_product_categories.py diff --git a/ecommerce/baskets/migrations/0001_initial.py b/ecommerce/baskets/migrations/0001_initial.py deleted file mode 100644 index 79a58d7..0000000 --- a/ecommerce/baskets/migrations/0001_initial.py +++ /dev/null @@ -1,48 +0,0 @@ -# Generated by Django 3.2.9 on 2021-12-03 17:37 - -from django.conf import settings -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - initial = True - - dependencies = [ - ('products', '0003_auto_20211203_1919'), - migrations.swappable_dependency(settings.AUTH_USER_MODEL), - ] - - operations = [ - migrations.CreateModel( - name='Basket', - 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')), - ('status', models.CharField(choices=[('open', 'Open'), ('submitted', 'Submitted'), ('merged', 'Merged')], max_length=10, verbose_name='Basket Status')), - ('customer', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, to=settings.AUTH_USER_MODEL, verbose_name='Customer')), - ], - options={ - 'verbose_name': 'Basket', - 'verbose_name_plural': 'Baskets', - }, - ), - migrations.CreateModel( - name='BasketItem', - 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')), - ('price', models.DecimalField(decimal_places=2, max_digits=10, verbose_name='Price')), - ('basket', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='baskets.basket', verbose_name='Basket')), - ('product', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='products.product', verbose_name='Product')), - ], - options={ - 'verbose_name': 'Basket item', - 'verbose_name_plural': 'Basket items', - }, - ), - ] diff --git a/ecommerce/baskets/migrations/0002_auto_20211205_0953.py b/ecommerce/baskets/migrations/0002_auto_20211205_0953.py deleted file mode 100644 index 17bcf3b..0000000 --- a/ecommerce/baskets/migrations/0002_auto_20211205_0953.py +++ /dev/null @@ -1,37 +0,0 @@ -# Generated by Django 3.2.9 on 2021-12-05 06:53 - -from django.conf import settings -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - dependencies = [ - ('products', '0004_alter_product_categories'), - migrations.swappable_dependency(settings.AUTH_USER_MODEL), - ('baskets', '0001_initial'), - ] - - operations = [ - migrations.AlterField( - model_name='basket', - name='customer', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, to=settings.AUTH_USER_MODEL, verbose_name='Customer'), - ), - migrations.AlterField( - model_name='basket', - name='status', - field=models.CharField(choices=[('open', 'Open'), ('submitted', 'Submitted'), ('merged', 'Merged')], default='open', max_length=10, verbose_name='Basket Status'), - ), - migrations.AlterField( - model_name='basketitem', - name='basket', - field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='baskets.basket', verbose_name='Basket'), - ), - migrations.AlterField( - model_name='basketitem', - name='product', - field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='products.product', verbose_name='Product'), - ), - ] diff --git a/ecommerce/customers/migrations/0001_initial.py b/ecommerce/customers/migrations/0001_initial.py deleted file mode 100644 index a691fbb..0000000 --- a/ecommerce/customers/migrations/0001_initial.py +++ /dev/null @@ -1,121 +0,0 @@ -# Generated by Django 3.2.9 on 2021-11-28 09:32 - -import customers.managers -import django.contrib.auth.validators -from django.db import migrations, models -import django.utils.timezone - - -class Migration(migrations.Migration): - - initial = True - - dependencies = [ - ("auth", "0012_alter_user_first_name_max_length"), - ] - - operations = [ - migrations.CreateModel( - name="Customer", - fields=[ - ( - "id", - models.BigAutoField( - auto_created=True, - primary_key=True, - serialize=False, - verbose_name="ID", - ), - ), - ("password", models.CharField(max_length=128, verbose_name="password")), - ( - "last_login", - models.DateTimeField( - blank=True, null=True, verbose_name="last login" - ), - ), - ( - "is_superuser", - models.BooleanField( - default=False, - help_text="Designates that this user has all permissions without explicitly assigning them.", - verbose_name="superuser status", - ), - ), - ( - "first_name", - models.CharField( - blank=True, max_length=150, verbose_name="first name" - ), - ), - ( - "last_name", - models.CharField( - blank=True, max_length=150, verbose_name="last name" - ), - ), - ( - "email", - models.EmailField( - max_length=254, - unique=True, - validators=[ - django.contrib.auth.validators.UnicodeUsernameValidator() - ], - verbose_name="email address", - ), - ), - ( - "is_staff", - models.BooleanField( - default=False, - help_text="Designates whether the user can log into this admin site.", - verbose_name="staff status", - ), - ), - ( - "is_active", - models.BooleanField( - default=True, - help_text="Designates whether this user should be treated as active. Unselect this instead of deleting accounts.", - verbose_name="active", - ), - ), - ( - "date_joined", - models.DateTimeField( - default=django.utils.timezone.now, verbose_name="date joined" - ), - ), - ( - "groups", - models.ManyToManyField( - blank=True, - help_text="The groups this user belongs to. A user will get all permissions granted to each of their groups.", - related_name="user_set", - related_query_name="user", - to="auth.Group", - verbose_name="groups", - ), - ), - ( - "user_permissions", - models.ManyToManyField( - blank=True, - help_text="Specific permissions for this user.", - related_name="user_set", - related_query_name="user", - to="auth.Permission", - verbose_name="user permissions", - ), - ), - ], - options={ - "verbose_name": "customer", - "verbose_name_plural": "customers", - }, - managers=[ - ("objects", customers.managers.CustomerManager()), - ], - ), - ] diff --git a/ecommerce/customers/migrations/0002_address_city_country.py b/ecommerce/customers/migrations/0002_address_city_country.py deleted file mode 100644 index 1f4de99..0000000 --- a/ecommerce/customers/migrations/0002_address_city_country.py +++ /dev/null @@ -1,65 +0,0 @@ -# Generated by Django 3.2.9 on 2021-12-03 16:34 - -import customers.models -from django.conf import settings -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - dependencies = [ - ('customers', '0001_initial'), - ] - - operations = [ - migrations.CreateModel( - name='Country', - 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')), - ('name', models.CharField(max_length=255, verbose_name='Country')), - ], - options={ - 'verbose_name': 'country', - 'verbose_name_plural': 'countries', - }, - ), - migrations.CreateModel( - name='City', - 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')), - ('name', models.CharField(max_length=255)), - ('country', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='customers.country', verbose_name='Country')), - ], - options={ - 'verbose_name': 'city', - 'verbose_name_plural': 'cities', - }, - ), - migrations.CreateModel( - name='Address', - 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')), - ('name', models.CharField(max_length=255, verbose_name='Name')), - ('full_name', models.CharField(blank=True, max_length=255, verbose_name='Full Name')), - ('line_1', models.CharField(max_length=255, verbose_name='Address Line 1')), - ('line_2', models.CharField(blank=True, max_length=255, verbose_name='Address Line 2')), - ('phone', models.CharField(max_length=20, validators=[customers.models.PhoneNumberValidator()], verbose_name='Phone Number')), - ('district', models.CharField(blank=True, max_length=255, verbose_name='District')), - ('zipcode', models.CharField(blank=True, max_length=20, verbose_name='Zip Code')), - ('is_default', models.BooleanField(default=False)), - ('city', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='customers.city', verbose_name='City')), - ('customer', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to=settings.AUTH_USER_MODEL, verbose_name='Customer')), - ], - options={ - 'verbose_name': 'address', - 'verbose_name_plural': 'addresses', - }, - ), - ] diff --git a/ecommerce/customers/migrations/0003_auto_20211203_2031.py b/ecommerce/customers/migrations/0003_auto_20211203_2031.py deleted file mode 100644 index d7e465e..0000000 --- a/ecommerce/customers/migrations/0003_auto_20211203_2031.py +++ /dev/null @@ -1,24 +0,0 @@ -# Generated by Django 3.2.9 on 2021-12-03 17:31 - -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - dependencies = [ - ('customers', '0002_address_city_country'), - ] - - operations = [ - migrations.AlterField( - model_name='address', - name='city', - field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='customers.city', verbose_name='City'), - ), - migrations.AlterField( - model_name='city', - name='country', - field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='customers.country', verbose_name='Country'), - ), - ] diff --git a/ecommerce/customers/migrations/0004_alter_address_district.py b/ecommerce/customers/migrations/0004_alter_address_district.py deleted file mode 100644 index 1b80f6c..0000000 --- a/ecommerce/customers/migrations/0004_alter_address_district.py +++ /dev/null @@ -1,18 +0,0 @@ -# Generated by Django 3.2.9 on 2021-12-04 00:15 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('customers', '0003_auto_20211203_2031'), - ] - - operations = [ - migrations.AlterField( - model_name='address', - name='district', - field=models.CharField(max_length=255, verbose_name='District'), - ), - ] diff --git a/ecommerce/customers/migrations/0005_auto_20211205_0953.py b/ecommerce/customers/migrations/0005_auto_20211205_0953.py deleted file mode 100644 index 431b355..0000000 --- a/ecommerce/customers/migrations/0005_auto_20211205_0953.py +++ /dev/null @@ -1,34 +0,0 @@ -# Generated by Django 3.2.9 on 2021-12-05 06:53 - -import core.utils -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('customers', '0004_alter_address_district'), - ] - - operations = [ - migrations.AlterField( - model_name='address', - name='full_name', - field=models.CharField(max_length=255, verbose_name='Full Name'), - ), - migrations.AlterField( - model_name='address', - name='line_2', - field=models.CharField(blank=True, max_length=255, null=True, verbose_name='Address Line 2'), - ), - migrations.AlterField( - model_name='address', - name='phone', - field=models.CharField(help_text='Phone number must be entered in the format: +901234567890. ', max_length=20, validators=[core.utils.PhoneNumberValidator()], verbose_name='Phone Number'), - ), - migrations.AlterField( - model_name='address', - name='zipcode', - field=models.CharField(max_length=20, verbose_name='Zip Code'), - ), - ] diff --git a/ecommerce/ecommerce/urls.py b/ecommerce/ecommerce/urls.py index 3d9479a..c6fa05a 100644 --- a/ecommerce/ecommerce/urls.py +++ b/ecommerce/ecommerce/urls.py @@ -17,10 +17,12 @@ from django.urls import path, include from ecommerce.router import router -from products.views import ProductViewSet, CategoryViewSet +from products.views import ProductViewSet, CategoryViewSet, StockViewSet, PriceViewSet router.register("products", ProductViewSet) router.register("categories", CategoryViewSet) +router.register("stocks", StockViewSet) +router.register("prices", PriceViewSet) urlpatterns = [ path("api/", include(router.urls)), diff --git a/ecommerce/orders/migrations/0001_initial.py b/ecommerce/orders/migrations/0001_initial.py deleted file mode 100644 index ebd8d39..0000000 --- a/ecommerce/orders/migrations/0001_initial.py +++ /dev/null @@ -1,111 +0,0 @@ -# Generated by Django 3.2.9 on 2021-12-04 00:15 - -import core.utils -from django.conf import settings -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - initial = True - - dependencies = [ - ('customers', '0004_alter_address_district'), - ('baskets', '0001_initial'), - migrations.swappable_dependency(settings.AUTH_USER_MODEL), - ] - - operations = [ - migrations.CreateModel( - name='BillingAddress', - 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')), - ('full_name', models.CharField(blank=True, max_length=255, verbose_name='Full Name')), - ('line_1', models.CharField(max_length=255, verbose_name='Address Line 1')), - ('line_2', models.CharField(blank=True, max_length=255, verbose_name='Address Line 2')), - ('phone', models.CharField(max_length=20, validators=[core.utils.PhoneNumberValidator()], verbose_name='Phone Number')), - ('district', models.CharField(max_length=255, verbose_name='District')), - ('zipcode', models.CharField(blank=True, max_length=20, verbose_name='Zip Code')), - ('city', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='customers.city', verbose_name='City')), - ], - options={ - 'verbose_name': 'Billing Address', - 'verbose_name_plural': 'Billing Addresses', - }, - ), - migrations.CreateModel( - name='Order', - 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')), - ('status', models.CharField(choices=[('pending', 'Pending'), ('processing', 'Processing'), ('shipped', 'Shipped'), ('delivered', 'Delivered'), ('canceled', 'Canceled')], default='pending', max_length=20, verbose_name='Status')), - ('total_price', models.DecimalField(decimal_places=2, max_digits=10, verbose_name='Total Price')), - ('basket', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='baskets.basket', verbose_name='Basket')), - ('billing_address', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='orders.billingaddress', verbose_name='Billing Address')), - ('customer', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to=settings.AUTH_USER_MODEL, verbose_name='Customer')), - ], - options={ - 'verbose_name': 'Order', - 'verbose_name_plural': 'Orders', - }, - ), - migrations.CreateModel( - name='ShippingAddress', - 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')), - ('full_name', models.CharField(blank=True, max_length=255, verbose_name='Full Name')), - ('line_1', models.CharField(max_length=255, verbose_name='Address Line 1')), - ('line_2', models.CharField(blank=True, max_length=255, verbose_name='Address Line 2')), - ('phone', models.CharField(max_length=20, validators=[core.utils.PhoneNumberValidator()], verbose_name='Phone Number')), - ('district', models.CharField(max_length=255, verbose_name='District')), - ('zipcode', models.CharField(blank=True, max_length=20, verbose_name='Zip Code')), - ('city', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='customers.city', verbose_name='City')), - ], - options={ - 'verbose_name': 'Shipping Address', - 'verbose_name_plural': 'Shipping Addresses', - }, - ), - migrations.CreateModel( - name='OrderItem', - 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')), - ('product', models.CharField(max_length=255, verbose_name='Product')), - ('price', models.DecimalField(decimal_places=2, max_digits=10, verbose_name='Price')), - ('order', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='orders.order', verbose_name='Order')), - ], - options={ - 'verbose_name': 'Order Item', - 'verbose_name_plural': 'Order Items', - }, - ), - migrations.CreateModel( - name='OrderBankAccount', - 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')), - ('name', models.CharField(max_length=255, verbose_name='Name')), - ('iban', models.CharField(max_length=100, validators=[core.utils.IBANValidator()], verbose_name='IBAN')), - ('bank_name', models.CharField(max_length=100, verbose_name='Bank Name')), - ('order', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='orders.order', verbose_name='Order')), - ], - options={ - 'verbose_name': 'Order Bank Account', - 'verbose_name_plural': 'Order Bank Accounts', - }, - ), - migrations.AddField( - model_name='order', - name='shipping_address', - field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='orders.shippingaddress', verbose_name='Shipping Address'), - ), - ] diff --git a/ecommerce/orders/migrations/0002_auto_20211205_0953.py b/ecommerce/orders/migrations/0002_auto_20211205_0953.py deleted file mode 100644 index 81fd53b..0000000 --- a/ecommerce/orders/migrations/0002_auto_20211205_0953.py +++ /dev/null @@ -1,38 +0,0 @@ -# Generated by Django 3.2.9 on 2021-12-05 06:53 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('orders', '0001_initial'), - ] - - operations = [ - migrations.AlterField( - model_name='billingaddress', - name='full_name', - field=models.CharField(max_length=255, verbose_name='Full Name'), - ), - migrations.AlterField( - model_name='billingaddress', - name='line_2', - field=models.CharField(blank=True, max_length=255, null=True, verbose_name='Address Line 2'), - ), - migrations.AlterField( - model_name='billingaddress', - name='zipcode', - field=models.CharField(max_length=20, verbose_name='Zip Code'), - ), - migrations.AlterField( - model_name='shippingaddress', - name='full_name', - field=models.CharField(max_length=255, verbose_name='Full Name'), - ), - migrations.AlterField( - model_name='shippingaddress', - name='line_2', - field=models.CharField(blank=True, max_length=255, null=True, verbose_name='Address Line 2'), - ), - ] diff --git a/ecommerce/payments/migrations/0001_initial.py b/ecommerce/payments/migrations/0001_initial.py deleted file mode 100644 index debba57..0000000 --- a/ecommerce/payments/migrations/0001_initial.py +++ /dev/null @@ -1,44 +0,0 @@ -# Generated by Django 3.2.9 on 2021-12-03 21:04 - -from django.db import migrations, models -import django.db.models.deletion -import payments.models - - -class Migration(migrations.Migration): - - initial = True - - dependencies = [ - ] - - operations = [ - migrations.CreateModel( - name='Bank', - 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')), - ('name', models.CharField(max_length=100, verbose_name='Bank Name')), - ], - options={ - 'verbose_name': 'Bank', - 'verbose_name_plural': 'Banks', - }, - ), - migrations.CreateModel( - name='BankAccount', - 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')), - ('name', models.CharField(max_length=100, verbose_name='Bank Account Name')), - ('iban', models.CharField(max_length=100, validators=[payments.models.IBANValidator()], verbose_name='IBAN')), - ('bank', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='payments.bank', verbose_name='Bank Name')), - ], - options={ - 'verbose_name': 'Bank Account', - 'verbose_name_plural': 'Bank Accounts', - }, - ), - ] diff --git a/ecommerce/products/migrations/0001_initial.py b/ecommerce/products/migrations/0001_initial.py deleted file mode 100644 index 128d979..0000000 --- a/ecommerce/products/migrations/0001_initial.py +++ /dev/null @@ -1,31 +0,0 @@ -# Generated by Django 3.2.9 on 2021-11-28 10:29 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - initial = True - - dependencies = [ - ] - - operations = [ - migrations.CreateModel( - name='Product', - 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')), - ('sku', models.CharField(max_length=100, unique=True, verbose_name='SKU')), - ('name', models.CharField(max_length=255, verbose_name='Name')), - ('description', models.TextField(max_length=2000, verbose_name='Description')), - ('color', models.CharField(choices=[('red', 'Red'), ('blue', 'Blue'), ('white', 'White'), ('yellow', 'Yellow')], max_length=20, verbose_name='Color')), - ('size', models.CharField(max_length=30, verbose_name='Size')), - ], - options={ - 'verbose_name': 'product', - 'verbose_name_plural': 'products', - }, - ), - ] diff --git a/ecommerce/products/migrations/0002_price_stock.py b/ecommerce/products/migrations/0002_price_stock.py deleted file mode 100644 index fe839dc..0000000 --- a/ecommerce/products/migrations/0002_price_stock.py +++ /dev/null @@ -1,42 +0,0 @@ -# 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/migrations/0003_auto_20211203_1919.py b/ecommerce/products/migrations/0003_auto_20211203_1919.py deleted file mode 100644 index 0fad1bb..0000000 --- a/ecommerce/products/migrations/0003_auto_20211203_1919.py +++ /dev/null @@ -1,31 +0,0 @@ -# Generated by Django 3.2.9 on 2021-12-03 16:19 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('products', '0002_price_stock'), - ] - - operations = [ - migrations.CreateModel( - name='Category', - 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')), - ('name', models.CharField(max_length=255, verbose_name='Category Name')), - ], - options={ - 'verbose_name': 'category', - 'verbose_name_plural': 'categories', - }, - ), - migrations.AddField( - model_name='product', - name='categories', - field=models.ManyToManyField(to='products.Category', verbose_name='Category Name'), - ), - ] diff --git a/ecommerce/products/migrations/0004_alter_product_categories.py b/ecommerce/products/migrations/0004_alter_product_categories.py deleted file mode 100644 index 9e20adb..0000000 --- a/ecommerce/products/migrations/0004_alter_product_categories.py +++ /dev/null @@ -1,18 +0,0 @@ -# Generated by Django 3.2.9 on 2021-12-05 06:53 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('products', '0003_auto_20211203_1919'), - ] - - operations = [ - migrations.AlterField( - model_name='product', - name='categories', - field=models.ManyToManyField(to='products.Category', verbose_name='Categories'), - ), - ] diff --git a/ecommerce/products/serializers.py b/ecommerce/products/serializers.py index a7eb006..7fb0b75 100644 --- a/ecommerce/products/serializers.py +++ b/ecommerce/products/serializers.py @@ -1,7 +1,7 @@ from django.db.transaction import atomic from rest_framework import serializers -from products.models import Product, Category +from products.models import Product, Category, Stock, Price class ProductSerializer(serializers.ModelSerializer): @@ -37,4 +37,31 @@ def create(self, validated_data): return product +class StockSerializer(serializers.ModelSerializer): + class Meta: + model = Stock + fields = ("product", "quantity") + + +class StockDetailedSerializer(serializers.ModelSerializer): + product = ProductSerializer() + + class Meta: + model = Stock + fields = ("product", "quantity") + + +class PriceSerializer(serializers.ModelSerializer): + + class Meta: + model = Price + fields = ("product", "amount") + + +class PriceDetailedSerializer(serializers.ModelSerializer): + product = ProductSerializer() + + class Meta: + model = Price + fields = ("product", "amount") diff --git a/ecommerce/products/views.py b/ecommerce/products/views.py index fdd33fd..526bdd5 100644 --- a/ecommerce/products/views.py +++ b/ecommerce/products/views.py @@ -2,9 +2,10 @@ from core.mixins import DetailedViewSetMixin from products.filters import ProductFilter -from products.models import Product, Category +from products.models import Product, Category, Stock, Price from products.serializers import ProductSerializer, CategorySerializer, \ - ProductDetailedSerializer + ProductDetailedSerializer, StockSerializer, PriceSerializer, StockDetailedSerializer,\ + PriceDetailedSerializer class ProductViewSet(DetailedViewSetMixin, viewsets.ModelViewSet): @@ -20,3 +21,21 @@ class ProductViewSet(DetailedViewSetMixin, viewsets.ModelViewSet): class CategoryViewSet(viewsets.ModelViewSet): queryset = Category.objects.all() serializer_class = CategorySerializer + + +class StockViewSet(DetailedViewSetMixin, viewsets.ModelViewSet): + queryset = Stock.objects.all() + serializer_class = StockSerializer + serializer_action_classes = { + "detailed_list": StockDetailedSerializer, + "detailed": StockDetailedSerializer, + } + + +class PriceViewSet(DetailedViewSetMixin, viewsets.ModelViewSet): + queryset = Price.objects.all() + serializer_class = PriceSerializer + serializer_action_classes = { + "detailed_list": PriceDetailedSerializer, + "detailed": PriceDetailedSerializer, + } From 69756c860c909a85b164640fc5336acf54769e85 Mon Sep 17 00:00:00 2001 From: eylultuncel Date: Wed, 8 Dec 2021 20:10:43 +0300 Subject: [PATCH 05/11] payments views and serializers added --- ecommerce/ecommerce/urls.py | 4 ++++ ecommerce/payments/serializers.py | 25 +++++++++++++++++++++++++ ecommerce/payments/views.py | 21 +++++++++++++++++++-- 3 files changed, 48 insertions(+), 2 deletions(-) create mode 100644 ecommerce/payments/serializers.py diff --git a/ecommerce/ecommerce/urls.py b/ecommerce/ecommerce/urls.py index c6fa05a..f10fcf6 100644 --- a/ecommerce/ecommerce/urls.py +++ b/ecommerce/ecommerce/urls.py @@ -18,12 +18,16 @@ from ecommerce.router import router from products.views import ProductViewSet, CategoryViewSet, StockViewSet, PriceViewSet +from payments.views import BankViewSet, BankAccountViewSet router.register("products", ProductViewSet) router.register("categories", CategoryViewSet) router.register("stocks", StockViewSet) router.register("prices", PriceViewSet) +router.register("banks", BankViewSet) +router.register("bank_accounts", BankAccountViewSet) + urlpatterns = [ path("api/", include(router.urls)), path('admin/', admin.site.urls), diff --git a/ecommerce/payments/serializers.py b/ecommerce/payments/serializers.py new file mode 100644 index 0000000..7f7020a --- /dev/null +++ b/ecommerce/payments/serializers.py @@ -0,0 +1,25 @@ +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(serializers.ModelSerializer): + bank = BankSerializer() + + class Meta: + model = BankAccount + fields = ("bank", "name", "iban") diff --git a/ecommerce/payments/views.py b/ecommerce/payments/views.py index 91ea44a..733cd92 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 payments.models import Bank, BankAccount +from payments.serializers import BankSerializer, BankAccountSerializer, BankAccountDetailedSerializer + + +class BankViewSet(viewsets.ModelViewSet): + queryset = Bank.objects.all() + serializer_class = BankSerializer + + +class BankAccountViewSet(DetailedViewSetMixin, viewsets.ModelViewSet): + queryset = BankAccount.objects.all() + serializer_class = BankAccountSerializer + serializer_action_classes = { + "detailed_list": BankAccountDetailedSerializer, + "detailed": BankAccountDetailedSerializer, + } -# Create your views here. From 347f48b19f68067399dc756c9188629b0be46361 Mon Sep 17 00:00:00 2001 From: eylultuncel Date: Wed, 8 Dec 2021 23:58:26 +0300 Subject: [PATCH 06/11] orders views and serializers added --- ecommerce/ecommerce/urls.py | 8 ++++ ecommerce/orders/serializers.py | 84 +++++++++++++++++++++++++++++++++ ecommerce/orders/views.py | 55 ++++++++++++++++++++- 3 files changed, 145 insertions(+), 2 deletions(-) create mode 100644 ecommerce/orders/serializers.py diff --git a/ecommerce/ecommerce/urls.py b/ecommerce/ecommerce/urls.py index f10fcf6..9ae50fd 100644 --- a/ecommerce/ecommerce/urls.py +++ b/ecommerce/ecommerce/urls.py @@ -19,6 +19,8 @@ from ecommerce.router import router from products.views import ProductViewSet, CategoryViewSet, StockViewSet, PriceViewSet from payments.views import BankViewSet, BankAccountViewSet +from orders.views import BillingAddressViewSet, ShippingAddressViewSet, OrderBankAccountViewSet, \ + OrderViewSet, OrderItemViewSet router.register("products", ProductViewSet) router.register("categories", CategoryViewSet) @@ -28,6 +30,12 @@ router.register("banks", BankViewSet) router.register("bank_accounts", BankAccountViewSet) +router.register("billing_addresses", BillingAddressViewSet) +router.register("shipping_addresses", ShippingAddressViewSet) +router.register("order_bank_accounts", OrderBankAccountViewSet) +router.register("orders", OrderViewSet) +router.register("order_items", OrderItemViewSet) + urlpatterns = [ path("api/", include(router.urls)), path('admin/', admin.site.urls), diff --git a/ecommerce/orders/serializers.py b/ecommerce/orders/serializers.py new file mode 100644 index 0000000..07b8189 --- /dev/null +++ b/ecommerce/orders/serializers.py @@ -0,0 +1,84 @@ +from rest_framework import serializers + +from customers.serializers import CustomerSerializer, CityDetailedSerializer +from orders.models import BillingAddress, ShippingAddress, OrderBankAccount, Order, OrderItem + + +class BillingAddressSerializer(serializers.ModelSerializer): + + class Meta: + model = BillingAddress + fields = ("full_name", "line_1", "line_2", "phone", "district", "zipcode", "city") + + +class BillingAddressDetailedSerializer(serializers.ModelSerializer): + city = CityDetailedSerializer() + + 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 ShippingAddressDetailedSerializer(serializers.ModelSerializer): + city = CityDetailedSerializer() + + class Meta: + model = ShippingAddress + fields = ("full_name", "line_1", "line_2", "phone", "district", "zipcode", "city") + + +class OrderSerializer(serializers.ModelSerializer): + + class Meta: + model = Order + fields = ("customer", "basket", "status", "billing_address", "shipping_address", "total_price") + + +class OrderDetailedSerializer(serializers.ModelSerializer): + customer = CustomerSerializer() + # basket = BasketSerializer() + billing_address = BillingAddressDetailedSerializer() + shipping_address = ShippingAddressDetailedSerializer() + + class Meta: + model = Order + fields = ("customer", "basket", "status", "billing_address", "shipping_address", "total_price") + + +class OrderBankAccountSerializer(serializers.ModelSerializer): + + class Meta: + model = OrderBankAccount + fields = ("name", "iban", "bank_name", "order") + + +class OrderBankAccountDetailedSerializer(serializers.ModelSerializer): + order = OrderDetailedSerializer() + + class Meta: + model = OrderBankAccount + fields = ("name", "iban", "bank_name", "order") + + +class OrderItemSerializer(serializers.ModelSerializer): + + class Meta: + model = OrderItem + fields = ("order", "product", "price") + + +class OrderItemDetailedSerializer(serializers.ModelSerializer): + order = OrderDetailedSerializer() + + class Meta: + model = OrderItem + fields = ("order", "product", "price") + + diff --git a/ecommerce/orders/views.py b/ecommerce/orders/views.py index 91ea44a..1f29a69 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 BillingAddress, ShippingAddress, OrderBankAccount, Order, OrderItem +from orders.serializers import BillingAddressSerializer, BillingAddressDetailedSerializer, ShippingAddressSerializer, \ + ShippingAddressDetailedSerializer, OrderBankAccountSerializer, OrderBankAccountDetailedSerializer, \ + OrderSerializer, OrderDetailedSerializer, OrderItemSerializer, OrderItemDetailedSerializer + + +class BillingAddressViewSet(DetailedViewSetMixin, viewsets.ModelViewSet): + queryset = BillingAddress.objects.all() + serializer_class = BillingAddressSerializer + serializer_action_classes = { + "detailed_list": BillingAddressDetailedSerializer, + "detailed": BillingAddressDetailedSerializer, + } + + +class ShippingAddressViewSet(DetailedViewSetMixin, viewsets.ModelViewSet): + queryset = ShippingAddress.objects.all() + serializer_class = ShippingAddressSerializer + serializer_action_classes = { + "detailed_list": ShippingAddressDetailedSerializer, + "detailed": ShippingAddressDetailedSerializer, + } + + +class OrderBankAccountViewSet(DetailedViewSetMixin, viewsets.ModelViewSet): + queryset = OrderBankAccount.objects.all() + serializer_class = OrderBankAccountSerializer + serializer_action_classes = { + "detailed_list": OrderBankAccountDetailedSerializer, + "detailed": OrderBankAccountDetailedSerializer, + } + + +class OrderViewSet(DetailedViewSetMixin, viewsets.ModelViewSet): + queryset = Order.objects.all() + serializer_class = OrderSerializer + serializer_action_classes = { + "detailed_list": OrderDetailedSerializer, + "detailed": OrderDetailedSerializer, + } + + +class OrderItemViewSet(DetailedViewSetMixin, viewsets.ModelViewSet): + queryset = OrderItem.objects.all() + serializer_class = OrderItemSerializer + serializer_action_classes = { + "detailed_list": OrderItemDetailedSerializer, + "detailed": OrderItemDetailedSerializer, + } + -# Create your views here. From 741f2cbae87d7d80fd43069ced99df41e81c9e7b Mon Sep 17 00:00:00 2001 From: eylultuncel Date: Thu, 9 Dec 2021 00:08:14 +0300 Subject: [PATCH 07/11] customers views and serializers added --- ecommerce/customers/serializers.py | 54 ++++++++++++++++++++++++++++++ ecommerce/customers/views.py | 36 ++++++++++++++++++-- ecommerce/ecommerce/urls.py | 6 ++++ 3 files changed, 94 insertions(+), 2 deletions(-) create mode 100644 ecommerce/customers/serializers.py diff --git a/ecommerce/customers/serializers.py b/ecommerce/customers/serializers.py new file mode 100644 index 0000000..7be6bb8 --- /dev/null +++ b/ecommerce/customers/serializers.py @@ -0,0 +1,54 @@ +from rest_framework import serializers + +from customers.models import City, Country, Customer, Address + + +class CountrySerializer(serializers.ModelSerializer): + + class Meta: + model = Country + fields = ("name", ) + + +class CitySerializer(serializers.ModelSerializer): + + class Meta: + model = City + fields = ("name", "country") + + +class CityDetailedSerializer(serializers.ModelSerializer): + country = CountrySerializer() + + class Meta: + model = City + fields = ("name", "country") + + +class CustomerSerializer(serializers.ModelSerializer): + + class Meta: + model = Customer + fields = ("first_name", "last_name", "email", "is_staff", "is_active", "date_joined") + + +class AddressSerializer(serializers.ModelSerializer): + + class Meta: + model = Address + fields = ("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 = ("customer", "name", "full_name", "line_1", "line_2", "phone", "district", + "zipcode", "city", "is_default") + + + + diff --git a/ecommerce/customers/views.py b/ecommerce/customers/views.py index 91ea44a..2430d3e 100644 --- a/ecommerce/customers/views.py +++ b/ecommerce/customers/views.py @@ -1,3 +1,35 @@ -from django.shortcuts import render +from rest_framework import viewsets + +from core.mixins import DetailedViewSetMixin +from customers.models import Country, City, Customer, Address +from customers.serializers import CountrySerializer, CitySerializer, CityDetailedSerializer, \ + CustomerSerializer, AddressSerializer, AddressDetailedSerializer + + +class CountryViewSet(viewsets.ModelViewSet): + queryset = Country.objects.all() + serializer_class = CountrySerializer + + +class CityViewSet(DetailedViewSetMixin, viewsets.ModelViewSet): + queryset = City.objects.all() + serializer_class = CitySerializer + serializer_action_classes = { + "detailed_list": CityDetailedSerializer, + "detailed": CityDetailedSerializer, + } + + +class CustomerViewSet(viewsets.ModelViewSet): + queryset = Customer.objects.all() + serializer_class = CustomerSerializer + + +class AddressViewSet(DetailedViewSetMixin, viewsets.ModelViewSet): + queryset = Address.objects.all() + serializer_class = AddressSerializer + serializer_action_classes = { + "detailed_list": AddressDetailedSerializer, + "detailed": AddressDetailedSerializer, + } -# Create your views here. diff --git a/ecommerce/ecommerce/urls.py b/ecommerce/ecommerce/urls.py index 9ae50fd..be4c1da 100644 --- a/ecommerce/ecommerce/urls.py +++ b/ecommerce/ecommerce/urls.py @@ -21,6 +21,7 @@ from payments.views import BankViewSet, BankAccountViewSet from orders.views import BillingAddressViewSet, ShippingAddressViewSet, OrderBankAccountViewSet, \ OrderViewSet, OrderItemViewSet +from customers.views import CountryViewSet, CityViewSet, CustomerViewSet, AddressViewSet router.register("products", ProductViewSet) router.register("categories", CategoryViewSet) @@ -36,6 +37,11 @@ router.register("orders", OrderViewSet) router.register("order_items", OrderItemViewSet) +router.register("countries", CountryViewSet) +router.register("cities", CityViewSet) +router.register("customers", CustomerViewSet) +router.register("addresses", AddressViewSet) + urlpatterns = [ path("api/", include(router.urls)), path('admin/', admin.site.urls), From fc7cc6dbd223b45bef777fa401e94f80720e0fb2 Mon Sep 17 00:00:00 2001 From: eylultuncel Date: Thu, 9 Dec 2021 00:19:12 +0300 Subject: [PATCH 08/11] baskets views and serializers added --- ecommerce/baskets/serializers.py | 36 ++++++++++++++++++++++++++++++++ ecommerce/baskets/views.py | 25 ++++++++++++++++++++-- ecommerce/ecommerce/urls.py | 4 ++++ ecommerce/orders/serializers.py | 3 ++- 4 files changed, 65 insertions(+), 3 deletions(-) create mode 100644 ecommerce/baskets/serializers.py diff --git a/ecommerce/baskets/serializers.py b/ecommerce/baskets/serializers.py new file mode 100644 index 0000000..eed56d6 --- /dev/null +++ b/ecommerce/baskets/serializers.py @@ -0,0 +1,36 @@ +from rest_framework import serializers + +from baskets.models import Basket, BasketItem +from customers.serializers import CustomerSerializer +from products.serializers import ProductDetailedSerializer + + +class BasketSerializer(serializers.ModelSerializer): + + class Meta: + model = Basket + fields = ("customer", "status") + + +class BasketDetailedSerializer(serializers.ModelSerializer): + customer = CustomerSerializer() + + class Meta: + model = Basket + fields = ("customer", "status") + + +class BasketItemSerializer(serializers.ModelSerializer): + + class Meta: + model = BasketItem + fields = ("basket", "product", "quantity", "price") + + +class BasketItemDetailedSerializer(serializers.ModelSerializer): + basket = BasketDetailedSerializer() + product = ProductDetailedSerializer() + + class Meta: + model = BasketItem + fields = ("basket", "product", "quantity", "price") diff --git a/ecommerce/baskets/views.py b/ecommerce/baskets/views.py index 91ea44a..de88e96 100644 --- a/ecommerce/baskets/views.py +++ b/ecommerce/baskets/views.py @@ -1,3 +1,24 @@ -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.serializers import BasketSerializer, BasketDetailedSerializer, \ + BasketItemSerializer, BasketItemDetailedSerializer + + +class BasketViewSet(DetailedViewSetMixin, viewsets.ModelViewSet): + queryset = Basket.objects.all() + serializer_class = BasketSerializer + serializer_action_classes = { + "detailed_list": BasketDetailedSerializer, + "detailed": BasketDetailedSerializer, + } + + +class BasketItemViewSet(DetailedViewSetMixin, viewsets.ModelViewSet): + queryset = BasketItem.objects.all() + serializer_class = BasketItemSerializer + serializer_action_classes = { + "detailed_list": BasketItemDetailedSerializer, + "detailed": BasketItemDetailedSerializer, + } diff --git a/ecommerce/ecommerce/urls.py b/ecommerce/ecommerce/urls.py index be4c1da..996d4dd 100644 --- a/ecommerce/ecommerce/urls.py +++ b/ecommerce/ecommerce/urls.py @@ -22,6 +22,7 @@ from orders.views import BillingAddressViewSet, ShippingAddressViewSet, OrderBankAccountViewSet, \ OrderViewSet, OrderItemViewSet from customers.views import CountryViewSet, CityViewSet, CustomerViewSet, AddressViewSet +from baskets.views import BasketViewSet, BasketItemViewSet router.register("products", ProductViewSet) router.register("categories", CategoryViewSet) @@ -42,6 +43,9 @@ router.register("customers", CustomerViewSet) router.register("addresses", AddressViewSet) +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/serializers.py b/ecommerce/orders/serializers.py index 07b8189..bc6bb8e 100644 --- a/ecommerce/orders/serializers.py +++ b/ecommerce/orders/serializers.py @@ -1,5 +1,6 @@ from rest_framework import serializers +from baskets.serializers import BasketDetailedSerializer from customers.serializers import CustomerSerializer, CityDetailedSerializer from orders.models import BillingAddress, ShippingAddress, OrderBankAccount, Order, OrderItem @@ -43,7 +44,7 @@ class Meta: class OrderDetailedSerializer(serializers.ModelSerializer): customer = CustomerSerializer() - # basket = BasketSerializer() + basket = BasketDetailedSerializer() billing_address = BillingAddressDetailedSerializer() shipping_address = ShippingAddressDetailedSerializer() From c357a3bea37ef00bc331a60b569130f7ae4f67ca Mon Sep 17 00:00:00 2001 From: eylultuncel Date: Fri, 10 Dec 2021 12:17:43 +0300 Subject: [PATCH 09/11] pagination added --- ecommerce/ecommerce/settings.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/ecommerce/ecommerce/settings.py b/ecommerce/ecommerce/settings.py index 898a8ee..a79beef 100644 --- a/ecommerce/ecommerce/settings.py +++ b/ecommerce/ecommerce/settings.py @@ -152,3 +152,8 @@ def gettext_noop(s): AUTH_USER_MODEL = "customers.Customer" LOCALE_PATHS = (str(BASE_DIR / "locale/"), ) + +REST_FRAMEWORK = { + 'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.PageNumberPagination', + 'PAGE_SIZE': 5 +} \ No newline at end of file From 2fec2793cb83bab667d97de83e4d072db12f0532 Mon Sep 17 00:00:00 2001 From: eylultuncel Date: Sat, 11 Dec 2021 14:13:45 +0300 Subject: [PATCH 10/11] filters added to all apps --- ecommerce/baskets/filters.py | 19 +++++++++++ ecommerce/baskets/views.py | 3 ++ ecommerce/customers/filters.py | 38 ++++++++++++++++++++++ ecommerce/customers/views.py | 5 +++ ecommerce/ecommerce/settings.py | 9 ++---- ecommerce/orders/filters.py | 56 +++++++++++++++++++++++++++++++++ ecommerce/orders/views.py | 7 +++++ ecommerce/payments/filters.py | 21 +++++++++++++ ecommerce/payments/views.py | 3 ++ ecommerce/products/filters.py | 24 ++++++++++++-- ecommerce/products/views.py | 5 ++- 11 files changed, 181 insertions(+), 9 deletions(-) create mode 100644 ecommerce/baskets/filters.py create mode 100644 ecommerce/customers/filters.py create mode 100644 ecommerce/orders/filters.py create mode 100644 ecommerce/payments/filters.py diff --git a/ecommerce/baskets/filters.py b/ecommerce/baskets/filters.py new file mode 100644 index 0000000..e668547 --- /dev/null +++ b/ecommerce/baskets/filters.py @@ -0,0 +1,19 @@ +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"), lookup_expr="icontains") + + 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/views.py b/ecommerce/baskets/views.py index de88e96..0f3b781 100644 --- a/ecommerce/baskets/views.py +++ b/ecommerce/baskets/views.py @@ -1,6 +1,7 @@ from rest_framework import viewsets from core.mixins import DetailedViewSetMixin +from baskets.filters import BasketFilter, BasketItemFilter from baskets.models import Basket, BasketItem from baskets.serializers import BasketSerializer, BasketDetailedSerializer, \ BasketItemSerializer, BasketItemDetailedSerializer @@ -9,6 +10,7 @@ class BasketViewSet(DetailedViewSetMixin, viewsets.ModelViewSet): queryset = Basket.objects.all() serializer_class = BasketSerializer + filterset_class = BasketFilter serializer_action_classes = { "detailed_list": BasketDetailedSerializer, "detailed": BasketDetailedSerializer, @@ -18,6 +20,7 @@ class BasketViewSet(DetailedViewSetMixin, viewsets.ModelViewSet): class BasketItemViewSet(DetailedViewSetMixin, viewsets.ModelViewSet): queryset = BasketItem.objects.all() serializer_class = BasketItemSerializer + filterset_class = BasketItemFilter serializer_action_classes = { "detailed_list": BasketItemDetailedSerializer, "detailed": BasketItemDetailedSerializer, diff --git a/ecommerce/customers/filters.py b/ecommerce/customers/filters.py new file mode 100644 index 0000000..aac0395 --- /dev/null +++ b/ecommerce/customers/filters.py @@ -0,0 +1,38 @@ +from django.utils.translation import gettext_lazy as _ +from django_filters import rest_framework as filters + +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") + + class Meta: + model = Customer + fields = ("first_name", "last_name", "email") + + +class CityFilter(filters.FilterSet): + name = filters.CharFilter(label=_("Name"), lookup_expr="icontains") + + class Meta: + model = City + fields = ("name", "country") + + +class CountryFilter(filters.FilterSet): + name = filters.CharFilter(label=_("Name"), lookup_expr="icontains") + + class Meta: + model = Country + fields = ("name",) + + +class AddressFilter(filters.FilterSet): + name = filters.CharFilter(label=_("Name"), lookup_expr="icontains") + + class Meta: + model = Address + fields = ("name", "full_name", "phone", "district", "zipcode", "customer", "city") diff --git a/ecommerce/customers/views.py b/ecommerce/customers/views.py index 2430d3e..3042167 100644 --- a/ecommerce/customers/views.py +++ b/ecommerce/customers/views.py @@ -1,6 +1,7 @@ from rest_framework import viewsets from core.mixins import DetailedViewSetMixin +from customers.filters import CustomerFilter, CityFilter, CountryFilter, AddressFilter from customers.models import Country, City, Customer, Address from customers.serializers import CountrySerializer, CitySerializer, CityDetailedSerializer, \ CustomerSerializer, AddressSerializer, AddressDetailedSerializer @@ -8,12 +9,14 @@ class CountryViewSet(viewsets.ModelViewSet): queryset = Country.objects.all() + filterset_class = CountryFilter serializer_class = CountrySerializer class CityViewSet(DetailedViewSetMixin, viewsets.ModelViewSet): queryset = City.objects.all() serializer_class = CitySerializer + filterset_class = CityFilter serializer_action_classes = { "detailed_list": CityDetailedSerializer, "detailed": CityDetailedSerializer, @@ -22,12 +25,14 @@ class CityViewSet(DetailedViewSetMixin, viewsets.ModelViewSet): class CustomerViewSet(viewsets.ModelViewSet): queryset = Customer.objects.all() + filterset_class = CustomerFilter serializer_class = CustomerSerializer class AddressViewSet(DetailedViewSetMixin, viewsets.ModelViewSet): queryset = Address.objects.all() serializer_class = AddressSerializer + filterset_class = AddressFilter serializer_action_classes = { "detailed_list": AddressDetailedSerializer, "detailed": AddressDetailedSerializer, diff --git a/ecommerce/ecommerce/settings.py b/ecommerce/ecommerce/settings.py index a79beef..7d068a1 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.PageNumberPagination', + 'PAGE_SIZE': 5 } MIDDLEWARE = [ @@ -152,8 +154,3 @@ def gettext_noop(s): AUTH_USER_MODEL = "customers.Customer" LOCALE_PATHS = (str(BASE_DIR / "locale/"), ) - -REST_FRAMEWORK = { - 'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.PageNumberPagination', - 'PAGE_SIZE': 5 -} \ No newline at end of file diff --git a/ecommerce/orders/filters.py b/ecommerce/orders/filters.py new file mode 100644 index 0000000..cb3bc3a --- /dev/null +++ b/ecommerce/orders/filters.py @@ -0,0 +1,56 @@ +from django.utils.translation import gettext_lazy as _ +from django_filters import rest_framework as filters + +from orders.models import BillingAddress, ShippingAddress, OrderBankAccount, Order, OrderItem + + +class BillingAddressFilter(filters.FilterSet): + ful_name = filters.CharFilter(label=_("Full Name"), lookup_expr="icontains") + line1 = filters.CharFilter(label=_("Line1"), lookup_expr="icontains") + line2 = filters.CharFilter(label=_("Line2"), lookup_expr="icontains") + phone = filters.CharFilter(label=_("Phone"), lookup_expr="icontains") + district = filters.CharFilter(label=_("District"), lookup_expr="icontains") + zipcode = filters.CharFilter(label=_("Zipcode"), lookup_expr="icontains") + + class Meta: + model = BillingAddress + fields = ("full_name", "line_1", "line_2", "phone", "district", "zipcode", "city") + + +class ShippingAddressFilter(filters.FilterSet): + ful_name = filters.CharFilter(label=_("Full Name"), lookup_expr="icontains") + line1 = filters.CharFilter(label=_("Line1"), lookup_expr="icontains") + line2 = filters.CharFilter(label=_("Line2"), lookup_expr="icontains") + phone = filters.CharFilter(label=_("Phone"), lookup_expr="icontains") + district = filters.CharFilter(label=_("District"), lookup_expr="icontains") + zipcode = filters.CharFilter(label=_("Zipcode"), lookup_expr="icontains") + + class Meta: + model = ShippingAddress + fields = ("full_name", "line_1", "line_2", "phone", "district", "zipcode", "city") + + +class OrderBankAccountFilter(filters.FilterSet): + name = filters.CharFilter(label=_("Name"), lookup_expr="icontains") + iban = filters.CharFilter(label=_("Iban"), lookup_expr="icontains") + bank_name = filters.CharFilter(label=_("Bank Name"), lookup_expr="icontains") + + class Meta: + model = OrderBankAccount + fields = ("name", "iban", "bank_name", "order") + + +class OrderFilter(filters.FilterSet): + status = filters.CharFilter(label=_("Status"), lookup_expr="icontains") + + class Meta: + model = Order + fields = ("customer", "basket", "status", "billing_address", "shipping_address", "total_price") + + +class OrderItemFilter(filters.FilterSet): + product = filters.CharFilter(label=_("Product"), lookup_expr="icontains") + + class Meta: + model = OrderItem + fields = ("order", "product", "price") diff --git a/ecommerce/orders/views.py b/ecommerce/orders/views.py index 1f29a69..506da03 100644 --- a/ecommerce/orders/views.py +++ b/ecommerce/orders/views.py @@ -1,6 +1,8 @@ from rest_framework import viewsets from core.mixins import DetailedViewSetMixin +from orders.filters import BillingAddressFilter, ShippingAddressFilter, OrderBankAccountFilter, \ + OrderFilter, OrderItemFilter from orders.models import BillingAddress, ShippingAddress, OrderBankAccount, Order, OrderItem from orders.serializers import BillingAddressSerializer, BillingAddressDetailedSerializer, ShippingAddressSerializer, \ ShippingAddressDetailedSerializer, OrderBankAccountSerializer, OrderBankAccountDetailedSerializer, \ @@ -10,6 +12,7 @@ class BillingAddressViewSet(DetailedViewSetMixin, viewsets.ModelViewSet): queryset = BillingAddress.objects.all() serializer_class = BillingAddressSerializer + filterset_class = BillingAddressFilter serializer_action_classes = { "detailed_list": BillingAddressDetailedSerializer, "detailed": BillingAddressDetailedSerializer, @@ -19,6 +22,7 @@ class BillingAddressViewSet(DetailedViewSetMixin, viewsets.ModelViewSet): class ShippingAddressViewSet(DetailedViewSetMixin, viewsets.ModelViewSet): queryset = ShippingAddress.objects.all() serializer_class = ShippingAddressSerializer + filterset_class = ShippingAddressFilter serializer_action_classes = { "detailed_list": ShippingAddressDetailedSerializer, "detailed": ShippingAddressDetailedSerializer, @@ -28,6 +32,7 @@ class ShippingAddressViewSet(DetailedViewSetMixin, viewsets.ModelViewSet): class OrderBankAccountViewSet(DetailedViewSetMixin, viewsets.ModelViewSet): queryset = OrderBankAccount.objects.all() serializer_class = OrderBankAccountSerializer + filterset_class = OrderBankAccountFilter serializer_action_classes = { "detailed_list": OrderBankAccountDetailedSerializer, "detailed": OrderBankAccountDetailedSerializer, @@ -37,6 +42,7 @@ class OrderBankAccountViewSet(DetailedViewSetMixin, viewsets.ModelViewSet): class OrderViewSet(DetailedViewSetMixin, viewsets.ModelViewSet): queryset = Order.objects.all() serializer_class = OrderSerializer + filterset_class = OrderFilter serializer_action_classes = { "detailed_list": OrderDetailedSerializer, "detailed": OrderDetailedSerializer, @@ -46,6 +52,7 @@ class OrderViewSet(DetailedViewSetMixin, viewsets.ModelViewSet): class OrderItemViewSet(DetailedViewSetMixin, viewsets.ModelViewSet): queryset = OrderItem.objects.all() serializer_class = OrderItemSerializer + filterset_class = OrderItemFilter serializer_action_classes = { "detailed_list": OrderItemDetailedSerializer, "detailed": OrderItemDetailedSerializer, diff --git a/ecommerce/payments/filters.py b/ecommerce/payments/filters.py new file mode 100644 index 0000000..4896727 --- /dev/null +++ b/ecommerce/payments/filters.py @@ -0,0 +1,21 @@ +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=_("Name"), lookup_expr="icontains") + + class Meta: + model = Bank + fields = ("name", ) + + +class BankAccountFilter(filters.FilterSet): + name = filters.CharFilter(label=_("Name"), lookup_expr="icontains") + iban = filters.CharFilter(label=_("Iban"), lookup_expr="icontains") + + class Meta: + model = BankAccount + fields = ("bank", "name", "iban") diff --git a/ecommerce/payments/views.py b/ecommerce/payments/views.py index 733cd92..eb12fc5 100644 --- a/ecommerce/payments/views.py +++ b/ecommerce/payments/views.py @@ -1,18 +1,21 @@ 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 BankSerializer, BankAccountSerializer, BankAccountDetailedSerializer class BankViewSet(viewsets.ModelViewSet): queryset = Bank.objects.all() + filterset_class = BankFilter serializer_class = BankSerializer class BankAccountViewSet(DetailedViewSetMixin, viewsets.ModelViewSet): queryset = BankAccount.objects.all() serializer_class = BankAccountSerializer + filterset_class = BankAccountFilter serializer_action_classes = { "detailed_list": BankAccountDetailedSerializer, "detailed": BankAccountDetailedSerializer, diff --git a/ecommerce/products/filters.py b/ecommerce/products/filters.py index 1ab7578..424df01 100644 --- a/ecommerce/products/filters.py +++ b/ecommerce/products/filters.py @@ -2,7 +2,15 @@ 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, Stock, Price + + +class CategoryFilter(filters.FilterSet): + name = filters.CharFilter(label=_("Name"), lookup_expr="icontains") + + class Meta: + model = Category + fields = ("name",) class ProductFilter(filters.FilterSet): @@ -10,8 +18,20 @@ class ProductFilter(filters.FilterSet): class Meta: model = Product - fields = ("size", "color", "name") + fields = ("size", "color", "name", "description", "color", "size", "categories") def filter_name(self, qs, name, value): replaced_value = value.replace("Ş", "ş") return qs.filter(Q(name__icontains=replaced_value) | Q(name__icontains=value)) + + +class StockFilter(filters.FilterSet): + class Meta: + model = Stock + fields = ("product", "quantity") + + +class PriceFilter(filters.FilterSet): + class Meta: + model = Price + fields = ("product", "amount") diff --git a/ecommerce/products/views.py b/ecommerce/products/views.py index 526bdd5..1712f80 100644 --- a/ecommerce/products/views.py +++ b/ecommerce/products/views.py @@ -1,7 +1,7 @@ from rest_framework import viewsets from core.mixins import DetailedViewSetMixin -from products.filters import ProductFilter +from products.filters import ProductFilter, CategoryFilter, StockFilter, PriceFilter from products.models import Product, Category, Stock, Price from products.serializers import ProductSerializer, CategorySerializer, \ ProductDetailedSerializer, StockSerializer, PriceSerializer, StockDetailedSerializer,\ @@ -20,12 +20,14 @@ class ProductViewSet(DetailedViewSetMixin, viewsets.ModelViewSet): class CategoryViewSet(viewsets.ModelViewSet): queryset = Category.objects.all() + filterset_class = CategoryFilter serializer_class = CategorySerializer class StockViewSet(DetailedViewSetMixin, viewsets.ModelViewSet): queryset = Stock.objects.all() serializer_class = StockSerializer + filterset_class = StockFilter serializer_action_classes = { "detailed_list": StockDetailedSerializer, "detailed": StockDetailedSerializer, @@ -35,6 +37,7 @@ class StockViewSet(DetailedViewSetMixin, viewsets.ModelViewSet): class PriceViewSet(DetailedViewSetMixin, viewsets.ModelViewSet): queryset = Price.objects.all() serializer_class = PriceSerializer + filterset_class = PriceFilter serializer_action_classes = { "detailed_list": PriceDetailedSerializer, "detailed": PriceDetailedSerializer, From 0f5e0f65f72f0d1212c8ea6214f17c073c9c6eb7 Mon Sep 17 00:00:00 2001 From: eylultuncel Date: Sat, 11 Dec 2021 14:17:26 +0300 Subject: [PATCH 11/11] migration files -after merge all migrations deleted and migrate again from zero --- ecommerce/baskets/migrations/0001_initial.py | 45 +++++++ .../migrations/0002_basket_customer.py | 23 ++++ .../customers/migrations/0001_initial.py | 94 +++++++++++++++ ecommerce/orders/migrations/0001_initial.py | 111 ++++++++++++++++++ ecommerce/payments/migrations/0001_initial.py | 44 +++++++ ecommerce/products/migrations/0001_initial.py | 74 ++++++++++++ 6 files changed, 391 insertions(+) create mode 100644 ecommerce/baskets/migrations/0001_initial.py create mode 100644 ecommerce/baskets/migrations/0002_basket_customer.py create mode 100644 ecommerce/customers/migrations/0001_initial.py create mode 100644 ecommerce/orders/migrations/0001_initial.py create mode 100644 ecommerce/payments/migrations/0001_initial.py create mode 100644 ecommerce/products/migrations/0001_initial.py diff --git a/ecommerce/baskets/migrations/0001_initial.py b/ecommerce/baskets/migrations/0001_initial.py new file mode 100644 index 0000000..2b443b8 --- /dev/null +++ b/ecommerce/baskets/migrations/0001_initial.py @@ -0,0 +1,45 @@ +# Generated by Django 3.2.9 on 2021-12-08 13:35 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ('products', '0001_initial'), + ] + + operations = [ + migrations.CreateModel( + name='Basket', + 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')), + ('status', models.CharField(choices=[('open', 'Open'), ('submitted', 'Submitted'), ('merged', 'Merged')], default='open', max_length=10, verbose_name='Basket Status')), + ], + options={ + 'verbose_name': 'Basket', + 'verbose_name_plural': 'Baskets', + }, + ), + migrations.CreateModel( + name='BasketItem', + 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')), + ('price', models.DecimalField(decimal_places=2, max_digits=10, verbose_name='Price')), + ('basket', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='baskets.basket', verbose_name='Basket')), + ('product', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='products.product', verbose_name='Product')), + ], + options={ + 'verbose_name': 'Basket item', + 'verbose_name_plural': 'Basket items', + }, + ), + ] diff --git a/ecommerce/baskets/migrations/0002_basket_customer.py b/ecommerce/baskets/migrations/0002_basket_customer.py new file mode 100644 index 0000000..8affa63 --- /dev/null +++ b/ecommerce/baskets/migrations/0002_basket_customer.py @@ -0,0 +1,23 @@ +# Generated by Django 3.2.9 on 2021-12-08 13:35 + +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ('baskets', '0001_initial'), + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ] + + operations = [ + migrations.AddField( + model_name='basket', + name='customer', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, to=settings.AUTH_USER_MODEL, verbose_name='Customer'), + ), + ] diff --git a/ecommerce/customers/migrations/0001_initial.py b/ecommerce/customers/migrations/0001_initial.py new file mode 100644 index 0000000..39ec9f3 --- /dev/null +++ b/ecommerce/customers/migrations/0001_initial.py @@ -0,0 +1,94 @@ +# Generated by Django 3.2.9 on 2021-12-08 13:35 + +import core.utils +import customers.managers +from django.conf import settings +import django.contrib.auth.validators +from django.db import migrations, models +import django.db.models.deletion +import django.utils.timezone + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ('auth', '0012_alter_user_first_name_max_length'), + ] + + operations = [ + migrations.CreateModel( + name='Customer', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('password', models.CharField(max_length=128, verbose_name='password')), + ('last_login', models.DateTimeField(blank=True, null=True, verbose_name='last login')), + ('is_superuser', models.BooleanField(default=False, help_text='Designates that this user has all permissions without explicitly assigning them.', verbose_name='superuser status')), + ('first_name', models.CharField(blank=True, max_length=150, verbose_name='first name')), + ('last_name', models.CharField(blank=True, max_length=150, verbose_name='last name')), + ('email', models.EmailField(max_length=254, unique=True, validators=[django.contrib.auth.validators.UnicodeUsernameValidator()], verbose_name='email address')), + ('is_staff', models.BooleanField(default=False, help_text='Designates whether the user can log into this admin site.', verbose_name='staff status')), + ('is_active', models.BooleanField(default=True, help_text='Designates whether this user should be treated as active. Unselect this instead of deleting accounts.', verbose_name='active')), + ('date_joined', models.DateTimeField(default=django.utils.timezone.now, verbose_name='date joined')), + ('groups', models.ManyToManyField(blank=True, help_text='The groups this user belongs to. A user will get all permissions granted to each of their groups.', related_name='user_set', related_query_name='user', to='auth.Group', verbose_name='groups')), + ('user_permissions', models.ManyToManyField(blank=True, help_text='Specific permissions for this user.', related_name='user_set', related_query_name='user', to='auth.Permission', verbose_name='user permissions')), + ], + options={ + 'verbose_name': 'customer', + 'verbose_name_plural': 'customers', + }, + managers=[ + ('objects', customers.managers.CustomerManager()), + ], + ), + migrations.CreateModel( + name='Country', + 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')), + ('name', models.CharField(max_length=255, verbose_name='Country')), + ], + options={ + 'verbose_name': 'country', + 'verbose_name_plural': 'countries', + }, + ), + migrations.CreateModel( + name='City', + 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')), + ('name', models.CharField(max_length=255)), + ('country', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='customers.country', verbose_name='Country')), + ], + options={ + 'verbose_name': 'city', + 'verbose_name_plural': 'cities', + }, + ), + migrations.CreateModel( + name='Address', + 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')), + ('name', models.CharField(max_length=255, verbose_name='Name')), + ('full_name', models.CharField(max_length=255, verbose_name='Full Name')), + ('line_1', models.CharField(max_length=255, verbose_name='Address Line 1')), + ('line_2', models.CharField(blank=True, max_length=255, null=True, verbose_name='Address Line 2')), + ('phone', models.CharField(help_text='Phone number must be entered in the format: +901234567890. ', max_length=20, validators=[core.utils.PhoneNumberValidator()], verbose_name='Phone Number')), + ('district', models.CharField(max_length=255, verbose_name='District')), + ('zipcode', models.CharField(max_length=20, verbose_name='Zip Code')), + ('is_default', models.BooleanField(default=False)), + ('city', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='customers.city', verbose_name='City')), + ('customer', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to=settings.AUTH_USER_MODEL, verbose_name='Customer')), + ], + options={ + 'verbose_name': 'address', + 'verbose_name_plural': 'addresses', + }, + ), + ] diff --git a/ecommerce/orders/migrations/0001_initial.py b/ecommerce/orders/migrations/0001_initial.py new file mode 100644 index 0000000..001363d --- /dev/null +++ b/ecommerce/orders/migrations/0001_initial.py @@ -0,0 +1,111 @@ +# Generated by Django 3.2.9 on 2021-12-08 13:35 + +import core.utils +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ('customers', '0001_initial'), + ('baskets', '0001_initial'), + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ] + + operations = [ + migrations.CreateModel( + name='BillingAddress', + 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')), + ('full_name', models.CharField(max_length=255, verbose_name='Full Name')), + ('line_1', models.CharField(max_length=255, verbose_name='Address Line 1')), + ('line_2', models.CharField(blank=True, max_length=255, null=True, verbose_name='Address Line 2')), + ('phone', models.CharField(max_length=20, validators=[core.utils.PhoneNumberValidator()], verbose_name='Phone Number')), + ('district', models.CharField(max_length=255, verbose_name='District')), + ('zipcode', models.CharField(max_length=20, verbose_name='Zip Code')), + ('city', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='customers.city', verbose_name='City')), + ], + options={ + 'verbose_name': 'Billing Address', + 'verbose_name_plural': 'Billing Addresses', + }, + ), + migrations.CreateModel( + name='Order', + 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')), + ('status', models.CharField(choices=[('pending', 'Pending'), ('processing', 'Processing'), ('shipped', 'Shipped'), ('delivered', 'Delivered'), ('canceled', 'Canceled')], default='pending', max_length=20, verbose_name='Status')), + ('total_price', models.DecimalField(decimal_places=2, max_digits=10, verbose_name='Total Price')), + ('basket', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='baskets.basket', verbose_name='Basket')), + ('billing_address', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='orders.billingaddress', verbose_name='Billing Address')), + ('customer', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to=settings.AUTH_USER_MODEL, verbose_name='Customer')), + ], + options={ + 'verbose_name': 'Order', + 'verbose_name_plural': 'Orders', + }, + ), + migrations.CreateModel( + name='ShippingAddress', + 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')), + ('full_name', models.CharField(max_length=255, verbose_name='Full Name')), + ('line_1', models.CharField(max_length=255, verbose_name='Address Line 1')), + ('line_2', models.CharField(blank=True, max_length=255, null=True, verbose_name='Address Line 2')), + ('phone', models.CharField(max_length=20, validators=[core.utils.PhoneNumberValidator()], verbose_name='Phone Number')), + ('district', models.CharField(max_length=255, verbose_name='District')), + ('zipcode', models.CharField(blank=True, max_length=20, verbose_name='Zip Code')), + ('city', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='customers.city', verbose_name='City')), + ], + options={ + 'verbose_name': 'Shipping Address', + 'verbose_name_plural': 'Shipping Addresses', + }, + ), + migrations.CreateModel( + name='OrderItem', + 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')), + ('product', models.CharField(max_length=255, verbose_name='Product')), + ('price', models.DecimalField(decimal_places=2, max_digits=10, verbose_name='Price')), + ('order', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='orders.order', verbose_name='Order')), + ], + options={ + 'verbose_name': 'Order Item', + 'verbose_name_plural': 'Order Items', + }, + ), + migrations.CreateModel( + name='OrderBankAccount', + 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')), + ('name', models.CharField(max_length=255, verbose_name='Name')), + ('iban', models.CharField(max_length=100, validators=[core.utils.IBANValidator()], verbose_name='IBAN')), + ('bank_name', models.CharField(max_length=100, verbose_name='Bank Name')), + ('order', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='orders.order', verbose_name='Order')), + ], + options={ + 'verbose_name': 'Order Bank Account', + 'verbose_name_plural': 'Order Bank Accounts', + }, + ), + migrations.AddField( + model_name='order', + name='shipping_address', + field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='orders.shippingaddress', verbose_name='Shipping Address'), + ), + ] diff --git a/ecommerce/payments/migrations/0001_initial.py b/ecommerce/payments/migrations/0001_initial.py new file mode 100644 index 0000000..881afe1 --- /dev/null +++ b/ecommerce/payments/migrations/0001_initial.py @@ -0,0 +1,44 @@ +# Generated by Django 3.2.9 on 2021-12-08 13:35 + +import core.utils +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ] + + operations = [ + migrations.CreateModel( + name='Bank', + 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')), + ('name', models.CharField(max_length=100, verbose_name='Bank Name')), + ], + options={ + 'verbose_name': 'Bank', + 'verbose_name_plural': 'Banks', + }, + ), + migrations.CreateModel( + name='BankAccount', + 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')), + ('name', models.CharField(max_length=100, verbose_name='Bank Account Name')), + ('iban', models.CharField(max_length=100, validators=[core.utils.IBANValidator()], verbose_name='IBAN')), + ('bank', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='payments.bank', verbose_name='Bank Name')), + ], + options={ + 'verbose_name': 'Bank Account', + 'verbose_name_plural': 'Bank Accounts', + }, + ), + ] diff --git a/ecommerce/products/migrations/0001_initial.py b/ecommerce/products/migrations/0001_initial.py new file mode 100644 index 0000000..4fd67ec --- /dev/null +++ b/ecommerce/products/migrations/0001_initial.py @@ -0,0 +1,74 @@ +# Generated by Django 3.2.9 on 2021-12-08 13:35 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ] + + operations = [ + migrations.CreateModel( + name='Category', + 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')), + ('name', models.CharField(max_length=255, verbose_name='Category Name')), + ], + options={ + 'verbose_name': 'category', + 'verbose_name_plural': 'categories', + }, + ), + migrations.CreateModel( + name='Product', + 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')), + ('sku', models.CharField(max_length=100, unique=True, verbose_name='SKU')), + ('name', models.CharField(max_length=255, verbose_name='Name')), + ('description', models.TextField(max_length=2000, verbose_name='Description')), + ('color', models.CharField(choices=[('red', 'Red'), ('blue', 'Blue'), ('white', 'White'), ('yellow', 'Yellow')], max_length=20, verbose_name='Color')), + ('size', models.CharField(max_length=30, verbose_name='Size')), + ('categories', models.ManyToManyField(to='products.Category', verbose_name='Categories')), + ], + options={ + 'verbose_name': 'product', + 'verbose_name_plural': 'products', + }, + ), + 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', + }, + ), + ]