Skip to content

Commit

Permalink
Add cart
Browse files Browse the repository at this point in the history
  • Loading branch information
N1ghtH0wk committed Sep 20, 2022
1 parent 73c2916 commit d44a6ee
Show file tree
Hide file tree
Showing 20 changed files with 345 additions and 27 deletions.
Binary file added db.sqlite3
Binary file not shown.
Binary file modified shop_app/__pycache__/admin.cpython-310.pyc
Binary file not shown.
Binary file modified shop_app/__pycache__/models.cpython-310.pyc
Binary file not shown.
Binary file modified shop_app/__pycache__/permissions.cpython-310.pyc
Binary file not shown.
Binary file modified shop_app/__pycache__/serializers.cpython-310.pyc
Binary file not shown.
Binary file modified shop_app/__pycache__/urls.cpython-310.pyc
Binary file not shown.
Binary file modified shop_app/__pycache__/views.cpython-310.pyc
Binary file not shown.
9 changes: 7 additions & 2 deletions shop_app/admin.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,11 @@
from django.contrib import admin
from shop_app.models import Product, Category, Brand
from shop_app.models import Product, Category, Cart, Cart_product


admin.site.register(Product)
admin.site.register(Category)
admin.site.register(Brand)
admin.site.register(Cart_product)

@admin.register(Cart)
class CartAdmin(admin.ModelAdmin):
list_display = ('user',)
35 changes: 35 additions & 0 deletions shop_app/migrations/0002_cart_cart_product_delete_brand.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
# Generated by Django 4.1.1 on 2022-09-20 07:24

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


class Migration(migrations.Migration):

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

operations = [
migrations.CreateModel(
name='Cart',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('product', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='product', to='shop_app.product')),
('user', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='user', to=settings.AUTH_USER_MODEL)),
],
),
migrations.CreateModel(
name='Cart_product',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('cart_id', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='cart_id', to='shop_app.cart')),
('product_id', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='product_id', to='shop_app.product')),
],
),
migrations.DeleteModel(
name='Brand',
),
]
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
# Generated by Django 4.1.1 on 2022-09-20 08:18

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


class Migration(migrations.Migration):

dependencies = [
('shop_app', '0002_cart_cart_product_delete_brand'),
]

operations = [
migrations.RemoveField(
model_name='cart',
name='product',
),
migrations.AddField(
model_name='cart',
name='cart_products',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='product', to='shop_app.cart_product'),
),
migrations.AlterField(
model_name='cart_product',
name='cart_id',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='cart', to='shop_app.cart'),
),
migrations.AlterField(
model_name='cart_product',
name='product_id',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='product', to='shop_app.product'),
),
]
17 changes: 17 additions & 0 deletions shop_app/migrations/0004_remove_cart_cart_products.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
# Generated by Django 4.1.1 on 2022-09-20 08:24

from django.db import migrations


class Migration(migrations.Migration):

dependencies = [
('shop_app', '0003_remove_cart_product_cart_cart_products_and_more'),
]

operations = [
migrations.RemoveField(
model_name='cart',
name='cart_products',
),
]
19 changes: 12 additions & 7 deletions shop_app/models.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
from django.db import models
from django.contrib.auth.models import User


class Product(models.Model):
name = models.CharField(max_length=128)
price = models.DecimalField(decimal_places=2, max_digits=8)
Expand Down Expand Up @@ -28,13 +29,6 @@ def __str__(self):
return f'{self.name}'


class Brand(models.Model):
name = models.CharField("Brand", max_length=128)
description = models.TextField("Description", max_length=1000)
official_site = models.CharField('Official site', max_length=128)
product = models.ForeignKey(Product, models.CASCADE)


class ProductComment(models.Model):
product = models.ForeignKey(Product, models.CASCADE, related_name='comments')
user = models.ForeignKey(User, models.SET_NULL, null=True)
Expand All @@ -44,3 +38,14 @@ class ProductComment(models.Model):
class ProductLike(models.Model):
product = models.ForeignKey(Product, models.CASCADE, related_name='likes')
user = models.ForeignKey(User, models.SET_NULL, null=True)

class Cart(models.Model):
user = models.ForeignKey(User, on_delete=models.CASCADE, null=True, blank=True, related_name='user')
# cart_products = models.ForeignKey('shop_app.Cart_product', on_delete=models.CASCADE, null=True, blank=True, related_name='product')

def __str__(self):
return f'{self.user.first_name}'

class Cart_product(models.Model):
cart_id = models.ForeignKey(Cart, on_delete=models.CASCADE, blank=True, null=True, related_name='cart')
product_id = models.ForeignKey(Product, on_delete=models.CASCADE, blank=True, null=True, related_name='product')
11 changes: 8 additions & 3 deletions shop_app/serializers.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
from shop_app.models import Category, Product, ProductLike, ProductComment, Brand
from shop_app.models import Category, Product, ProductLike, ProductComment, Cart, Cart_product
from rest_framework import serializers


Expand Down Expand Up @@ -40,8 +40,13 @@ class Meta:
fields = '__all__'


class ProductBrandSerializer(serializers.ModelSerializer):
class CartSerializer(serializers.ModelSerializer):
class Meta:
model = Brand
model = Cart
fields = '__all__'

class CartProductSerializer(serializers.ModelSerializer):
class Meta:
model = Cart_product
fields = '__all__'

67 changes: 65 additions & 2 deletions shop_app/tests.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,66 @@
from django.test import TestCase
from django.test import TestCase, Client
from django.contrib.auth.models import User
from shop_app.models import Product

# Create your tests here.

class TestProduct(TestCase):
def test_should_allow_only_get(self):
c = Client()
response = c.get("http://127.0.0.1:8000/product/")
assert response.status_code == 200

response = c.get("http://127.0.0.1:8000/add_to_cart_product")
assert response.status_code == 200

response = c.post("http://127.0.0.1:8000/add_to_cart_productt")
assert response.status_code == 201

response = c.get("http://127.0.0.1:8000/add_to_cart_product/2/")
assert response.status_code == 200

response = c.put("http://127.0.0.1:8000/add_to_cart_product/2/")
assert response.status_code == 200

response = c.delete("http://127.0.0.1:8000/add_to_cart_product/2/")
assert response.status_code == 200

response = c.get("http://127.0.0.1:8000/add_to_cart")
assert response.status_code == 200

response = c.post("http://127.0.0.1:8000/add_to_cart")
assert response.status_code == 200

response = c.get("http://127.0.0.1:8000/add_to_cart/2/")
assert response.status_code == 200

response = c.post("http://127.0.0.1:8000/add_to_cart/2/")
assert response.status_code == 200

response = c.delete("http://127.0.0.1:8000/add_to_cart/2/")
assert response.status_code == 200


class TestHomepage(TestCase):
def test_open_homepage_should_be_success(self):
c = Client()
response = c.get("http://127.0.0.1:8000/")
assert response.status_code == 404


# def test_create_product_with_user(self):
# user = User(
# username="test1",
# email="[email protected]",
# password="test1",
# )
# user.save()
# print(f"\n{user}\n")
# p = Product(
# name="яблоко",
# price=100,
# user=user
# )
# p.save()
#
# assert user.id == p.user.id
# print(f"\nour test done\n")
11 changes: 9 additions & 2 deletions shop_app/urls.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
from django.urls import path
from shop_app.views import ProductViewSet, CategoryViewSet, CommentView
from shop_app.views import ProductViewSet, CategoryViewSet, CommentView, CartView, CartProductView
from django.conf import settings
from django.conf.urls.static import static

Expand All @@ -24,5 +24,12 @@
'patch': 'update'
}
)),
path('product/<int:pk>/comment/create', CommentView.as_view({'post': 'create'}))
path('product/<int:pk>/comment/create', CommentView.as_view({'post': 'create'})),

path('add_to_cart', CartView.as_view({'get': 'list', 'post': 'create', 'delete': 'destroy'})),
path('add_to_cart_product', CartProductView.as_view({'get': 'list', 'post': 'create', })),

path('add_to_cart_product/<int:pk>/', CartProductView.as_view({'get': 'retrieve', 'post': 'create', 'delete': 'destroy', 'put': 'update'})),
path('add_to_cart/<int:pk>/', CartView.as_view({'get': 'retrieve', 'post': 'create', 'delete': 'destroy', 'put': 'update'})),

]
19 changes: 14 additions & 5 deletions shop_app/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,20 +6,18 @@
from rest_framework.response import Response
from rest_framework.views import APIView
from rest_framework.viewsets import ModelViewSet

from shop_app.models import Product, Category, ProductComment, ProductLike
from shop_app.models import Product, Category, ProductComment, ProductLike, Cart, Cart_product
from shop_app.permissions import ProductPermission
from shop_app.serializers import ProductSerializer, CategorySerializer, ProductCommentSerializer, ProductDetailSerializer
from shop_app.serializers import ProductSerializer, CategorySerializer, ProductCommentSerializer, ProductDetailSerializer, CartSerializer, CartProductSerializer


class ProductViewSet(ModelViewSet):
# queryset = Product.objects.all()
serializer_class = ProductSerializer
serializer_classes = {
'retrieve': ProductDetailSerializer,
}
lookup_field = 'pk'
# permission_classes = (ProductPermission,)
permission_classes = (ProductPermission,)
# permission_classes = [permissions.IsAuthenticated]
queryset = Product.objects.all()

Expand Down Expand Up @@ -93,3 +91,14 @@ def get(request, product_pk):
ProductLike.objects.create(product_id=product_pk, user=request.user)
return Response({'success': 'liked'})



class CartView(ModelViewSet):
permissions_classes = [permissions.IsAuthenticated]
queryset = Cart.objects.all()
serializer_class = CartSerializer

class CartProductView(ModelViewSet):
permissions_classes = [permissions.IsAuthenticated]
queryset = Cart_product.objects.all()
serializer_class = CartProductSerializer
Binary file modified store/__pycache__/settings.cpython-310.pyc
Binary file not shown.
Binary file modified store/__pycache__/urls.cpython-310.pyc
Binary file not shown.
Loading

0 comments on commit d44a6ee

Please sign in to comment.