Skip to content
This repository was archived by the owner on May 12, 2023. It is now read-only.
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 5 additions & 8 deletions ecommerce/baskets/migrations/0001_initial.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
# Generated by Django 3.2.9 on 2021-12-03 17:37
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

migration dosyalarina dokunmamaliyiz.

# Generated by Django 3.2.9 on 2021-12-14 19:34

from django.conf import settings
from django.db import migrations, models
import django.db.models.deletion

Expand All @@ -10,8 +9,7 @@ class Migration(migrations.Migration):
initial = True

dependencies = [
('products', '0003_auto_20211203_1919'),
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
('products', '0001_initial'),
]

operations = [
Expand All @@ -21,8 +19,7 @@ class Migration(migrations.Migration):
('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')),
('status', models.CharField(choices=[('open', 'Open'), ('submitted', 'Submitted'), ('merged', 'Merged')], default='open', max_length=10, verbose_name='Basket Status')),
],
options={
'verbose_name': 'Basket',
Expand All @@ -37,8 +34,8 @@ class Migration(migrations.Migration):
('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')),
('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',
Expand Down
37 changes: 0 additions & 37 deletions ecommerce/baskets/migrations/0002_auto_20211205_0953.py

This file was deleted.

23 changes: 23 additions & 0 deletions ecommerce/baskets/migrations/0002_basket_customer.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
# Generated by Django 3.2.9 on 2021-12-14 19:34

from django.conf import settings
from django.db import migrations, models
import django.db.models.deletion


class Migration(migrations.Migration):

initial = True

dependencies = [
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
('baskets', '0001_initial'),
]

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'),
),
]
6 changes: 3 additions & 3 deletions ecommerce/baskets/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ class Basket(BaseAbstractModel):
Basket model
"""
customer = models.ForeignKey(Customer, verbose_name=_("Customer"),
on_delete=models.PROTECT, null=True, blank=True)
on_delete=models.PROTECT, null=True, blank=True,related_name='cart')
status = models.CharField(choices=enums.BasketStatus.choices, max_length=10,
verbose_name=_("Basket Status"), default=enums.BasketStatus.OPEN)

Expand All @@ -28,8 +28,8 @@ class BasketItem(BaseAbstractModel):
"""
Basket item model
"""
basket = models.ForeignKey(Basket, verbose_name=_("Basket"), on_delete=models.PROTECT)
product = models.ForeignKey(Product, verbose_name=_("Product"), on_delete=models.PROTECT)
basket = models.ForeignKey(Basket,related_name='items', verbose_name=_("Basket"), on_delete=models.PROTECT)
product = models.ForeignKey(Product,related_name='items', verbose_name=_("Product"), on_delete=models.PROTECT)
quantity = models.PositiveIntegerField(verbose_name=_("Quantity"))
price = models.DecimalField(max_digits=10, decimal_places=2, verbose_name=_("Price"))

Expand Down
7 changes: 7 additions & 0 deletions ecommerce/baskets/serializers.py
Original file line number Diff line number Diff line change
Expand Up @@ -26,3 +26,10 @@ class BasketItemDetailedSerializer(BasketItemSerializer):

class BasketDetailedSerializer(BasketSerializer):
customer = CustomerSerializer()

class BasketPostSerializer(serializers.ModelSerializer):
customer = CustomerSerializer()
items = BasketItemSerializer(many=True)
class Meta:
model = Basket
fields = ('id', 'customer', 'items')
92 changes: 89 additions & 3 deletions ecommerce/baskets/views.py
Original file line number Diff line number Diff line change
@@ -1,9 +1,12 @@
from rest_framework import viewsets

from rest_framework.decorators import action
from rest_framework.response import Response
from baskets.filters import BasketItemFilter, BasketFilter
from baskets.models import BasketItem, Basket
from baskets.serializers import BasketItemSerializer, BasketSerializer, BasketItemDetailedSerializer, BasketDetailedSerializer
from baskets.serializers import BasketItemSerializer, BasketSerializer, BasketItemDetailedSerializer, \
BasketDetailedSerializer,BasketPostSerializer
from core.mixins import DetailedViewSetMixin
from products.models import Product


class BasketItemViewSet(DetailedViewSetMixin, viewsets.ModelViewSet):
Expand All @@ -22,5 +25,88 @@ class BasketViewSet(DetailedViewSetMixin, viewsets.ModelViewSet):
filterset_class = BasketFilter
serializer_action_classes = {
"detailed_list": BasketDetailedSerializer,
"detailed": BasketDetailedSerializer,
"detailed": BasketPostSerializer,
"add_to_basket": BasketPostSerializer,
"remove_from_basket": BasketPostSerializer
}

def get_queryset(self):
queryset = super().get_queryset()
user = self.request.user
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

login olmamis kullanici durumu soz konusu ise burada problem olusuyor sanki?

return queryset.filter(customer=user)

@action(detail=True, methods=['post', 'put'])
def add_to_basket(self, request, pk=None):
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

kayit ekleme/guncelleme, valitation islemleri serializer tarafinda yapilmasi daha iyi olacaktir.

"""Add an item to a user's basket.
Adding to basket is disallowed if there is not enough inventory for the
product available. If there is, the quantity is increased on an existing
basket item or a new basket item is created with that quantity and added
to the basket.
"""
basket = self.get_object()

try:
product = Product.objects.get(
pk=request.data['items'][0]['product']
)
quantity = int(request.data['items'][0]['quantity'])
price = request.data['items'][0]['price']
except Exception as ex:
print(ex)
return Response('Required fields must be filled')
"""
before adding the item to the basket, product's stock quantity is checked
"""

if product.stock.quantity <= 0 or product.stock.quantity - quantity < 0:
print("There is no more product available")
return Response('There is no more product available')
existing_basket_item = BasketItem.objects.filter(basket=basket, product=product).first()
"""
before creating a new basket item check if it is in the basket already
and if it is increase the quantity of that item
"""
if existing_basket_item:
existing_basket_item.quantity += quantity
existing_basket_item.save()
else:
new_basket_item = BasketItem(basket=basket, product=product, quantity=quantity, price=price)
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

model objelerini kullanmak yerine serializerlari kullanmak daha iyi fikir.

new_basket_item.save()
serializer = BasketPostSerializer(basket)
return Response(serializer.data)

@action(detail=True, methods=['post', 'put'])
def remove_from_basket(self, request, pk=None):
"""Remove an item from a user's basket.
Removing from the basket can be done with editing quantity for item.
Edited quantity is decreased from the existing quantity.
But after removing if items quantity is equal to zero item is deleted.
"""
basket = self.get_object()
try:
product = Product.objects.get(
pk=request.data['items'][0]['product']
)
quantity = int(request.data['items'][0]['quantity'])
price = request.data['items'][0]['price']
except Exception as ex:
print(ex)
return Response('Required fields must be filled')

try:
basket_item = BasketItem.objects.get(basket=basket, product=product)
except Exception as ex:
print(ex)
return Response({'status': 'fail'})

# if removing an item where the quantity of the item will become zero after process, remove the basket item
# completely otherwise decrease the quantity of the basket item
if basket_item.quantity - quantity <= 0:
basket_item.delete()
else:
basket_item.quantity -= quantity
basket_item.save()

# return the updated basket to indicate success
serializer = BasketPostSerializer(basket)
return Response(serializer.data)
Loading