django_magazine/shop/views.py

126 lines
4.2 KiB
Python

from django.shortcuts import render, get_object_or_404, redirect
from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
from django.db.models import Q
from .models import Product, Category
from cart.views import _cart_id
from cart.models import CartItem
from .models import ReviewRating
from .forms import ReviewForm
from django.contrib import messages
from orders.models import OrderProduct
from .models import ProductGallery
def home(request):
products = Product.objects.all().filter(is_available=True)
context = {
'products' : products,
}
return render(request, 'shop/index.html', context)
def shop(request, category_slug=None):
categories = None
products = None
if category_slug != None:
categories = get_object_or_404(Category, slug=category_slug)
products = Product.objects.filter(category=categories, is_available=True)
paginator = Paginator(products, 6)
page = request.GET.get('page')
paged_products = paginator.get_page(page)
products_count = products.count()
else:
products = Product.objects.all().filter(is_available=True)
paginator = Paginator(products, 6)
page = request.GET.get('page')
paged_products = paginator.get_page(page)
products_count = products.count()
for product in products:
reviews = ReviewRating.objects.order_by('-updated_at').filter(product_id=product.id, status=True)
context = {
'category_slug': category_slug,
'products' : paged_products,
'products_count': products_count,
}
return render(request, 'shop/shop/shop.html', context)
def product_details(request, category_slug, product_details_slug):
try:
single_product = Product.objects.get(category__slug=category_slug, slug=product_details_slug)
in_cart = CartItem.objects.filter(cart__cart_id=_cart_id(request), product=single_product).exists()
except Exception as e:
return e
if request.user.is_authenticated:
try:
orderproduct = OrderProduct.objects.filter(user=request.user, product_id=single_product.id).exists()
except OrderProduct.DoesNotExist:
orderproduct = None
else:
orderproduct = None
reviews = ReviewRating.objects.order_by('-updated_at').filter(product_id=single_product.id, status=True)
product_gallery = ProductGallery.objects.filter(product_id=single_product.id)
context = {
'single_product': single_product,
'in_cart': in_cart,
'orderproduct':orderproduct,
'reviews': reviews,
'product_gallery':product_gallery,
}
return render(request, 'shop/shop/product_details.html', context)
def search(request):
products_count = 0
products = None
paged_products = None
if 'keyword' in request.GET:
keyword = request.GET['keyword']
if keyword :
products = Product.objects.filter(Q(description__icontains=keyword) | Q(name__icontains=keyword))
products_count = products.count()
context = {
'products': products,
'products_count': products_count,
}
return render(request, 'shop/shop/search.html', context)
def review(request, product_id):
url = request.META.get('HTTP_REFERER')
if request.method == 'POST':
try:
reviews = ReviewRating.objects.get(user__id=request.user.id,product__id=product_id)
form = ReviewForm(request.POST, instance=reviews)
form.save()
messages.success(request, 'Thank you, your review updated!')
return redirect(url)
except ReviewRating.DoesNotExist:
form = ReviewForm(request.POST)
if form.is_valid():
data = ReviewRating()
data.rating = form.cleaned_data['rating']
data.review = form.cleaned_data['review']
data.ip = request.META.get('REMOTE_ADDR')
data.product_id = product_id
data.user_id = request.user.id
data.save()
messages.success(request, 'Thank you, your review Posted!')
return redirect(url)