sort products by availability

remotes/origin/mitri4
Dmitriy Shesterkin 9 years ago
parent 41654885d3
commit 518a3228d1
  1. 2
      store/managers.py
  2. 13
      store/models.py
  3. 15
      store/queryset.py
  4. 18
      store/views.py

@ -1,2 +0,0 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*-

@ -5,6 +5,7 @@ from django.db.models import Count, Min, Sum
from accounts.models import Profile from accounts.models import Profile
from main.models import STARS_CHOICES from main.models import STARS_CHOICES
from store.alemtat import alemtat_get_cities_tuple, alemtat_get_services_tuple from store.alemtat import alemtat_get_cities_tuple, alemtat_get_services_tuple
from store.queryset import ProductQuerySet
FIELD_TYPE_CHAR = 'char' FIELD_TYPE_CHAR = 'char'
FIELD_TYPE_INT = 'int' FIELD_TYPE_INT = 'int'
@ -24,6 +25,7 @@ def photo_filename(instance, filename):
return 'photo_uploads/' + slugify_filename(filename) return 'photo_uploads/' + slugify_filename(filename)
class CartModel(models.Model): class CartModel(models.Model):
cart_id = models.CharField('Сессия', max_length=256, default='') cart_id = models.CharField('Сессия', max_length=256, default='')
profile = models.ForeignKey(Profile, default=None, null=True, blank=False, profile = models.ForeignKey(Profile, default=None, null=True, blank=False,
@ -32,6 +34,7 @@ class CartModel(models.Model):
weight = models.CharField('Вес', max_length=20, default='0') weight = models.CharField('Вес', max_length=20, default='0')
total = models.CharField('Итого тенге', max_length=20, default='0') total = models.CharField('Итого тенге', max_length=20, default='0')
class Category(models.Model): class Category(models.Model):
title = models.CharField('Наименование', max_length=256, default='') title = models.CharField('Наименование', max_length=256, default='')
h1 = models.CharField('Заголовок h1', max_length=256, default='', null=True, blank=True) h1 = models.CharField('Заголовок h1', max_length=256, default='', null=True, blank=True)
@ -98,6 +101,11 @@ class Category(models.Model):
def get_childs_ordered_by_count(self): def get_childs_ordered_by_count(self):
return self.childs.annotate(Count('childs')).order_by('priority') # , '-childs__count') return self.childs.annotate(Count('childs')).order_by('priority') # , '-childs__count')
def get_all_products_in_stock_order_by(self, field):
queryset = Product.objects.filter(categories__in=self.get_all_childs()).sorted_in_stock_by_field(field)
return queryset
class Attribute(models.Model): class Attribute(models.Model):
title = models.CharField('Наименование', max_length=256, default='') title = models.CharField('Наименование', max_length=256, default='')
@ -187,6 +195,8 @@ class Product(models.Model):
on_main = models.BooleanField('На главной', default=False) on_main = models.BooleanField('На главной', default=False)
priority = models.IntegerField('Приоритет для главной', default=0) priority = models.IntegerField('Приоритет для главной', default=0)
objects = ProductQuerySet.as_manager()
class Meta: class Meta:
verbose_name = 'товар' verbose_name = 'товар'
verbose_name_plural = 'товары' verbose_name_plural = 'товары'
@ -277,7 +287,8 @@ class ProductVariation(models.Model):
# import pdb; pdb.set_trace() # import pdb; pdb.set_trace()
# from django.core.mail import mail_admins # from django.core.mail import mail_admins
# mail_admins('auth', '{} {}'.format(profile, self.product.brand.slug)) # mail_admins('auth', '{} {}'.format(profile, self.product.brand.slug))
if profile and profile.is_authenticated() and self.product.brand.slug in ['beuchat', 'scorpena'] and profile.sale: if profile and profile.is_authenticated() and self.product.brand.slug in ['beuchat',
'scorpena'] and profile.sale:
return int(self.price - (self.price / Decimal(100) * Decimal(profile.sale))) return int(self.price - (self.price / Decimal(100) * Decimal(profile.sale)))
else: else:
if self.discount: if self.discount:

@ -0,0 +1,15 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from django.db import models
class ProductQuerySet(models.QuerySet):
def sorted_in_stock_by_field(self, field):
queryset = self.extra(select={
'have_stock':
'CASE WHEN (SELECT MAX(in_stock) FROM store_productvariation ' +
'WHERE store_productvariation.product_id = store_product.id) = 0 ' +
'THEN 0 ELSE 1 END'
}).order_by('-have_stock', field)
return queryset

@ -98,25 +98,33 @@ class CategoryView(CategoryBaseView, TemplateView):
pass pass
def get_context_data(self, **kwargs): def get_context_data(self, **kwargs):
retval = super(CategoryView, self).get_context_data() retval = super(CategoryView, self).get_context_data()
q = None q = None
if self.is_search: if self.is_search:
q = self.request.GET.get('q', '') q = self.request.GET.get('q', '')
self.products_qs = Product.objects.filter(title__icontains=q).order_by('-pk') self.products_qs = Product.objects.filter(title__icontains=q).\
sorted_in_stock_by_field('-pk')
brands_pks = [item.brand.pk for item in self.products_qs] brands_pks = [item.brand.pk for item in self.products_qs]
retval['brands'] = Brand.objects.filter(pk__in=brands_pks).order_by( retval['brands'] = Brand.objects.filter(pk__in=brands_pks).order_by(
'title') # list(set(map(lambda item: item.brand, self.products_qs))) 'title') # list(set(map(lambda item: item.brand, self.products_qs)))
elif self.is_sale: elif self.is_sale:
self.products_qs = Product.objects.filter(variations__discount__gt=0).distinct().order_by('-pk') self.products_qs = Product.objects.filter(variations__discount__gt=0).distinct().\
sorted_in_stock_by_field('-pk')
brands_pks = [item.brand.pk for item in self.products_qs] brands_pks = [item.brand.pk for item in self.products_qs]
retval['brands'] = Brand.objects.filter(pk__in=brands_pks).order_by('title') retval['brands'] = Brand.objects.filter(pk__in=brands_pks).order_by('title')
elif self.is_leaders: elif self.is_leaders:
brands_pks = [item.brand.pk for item in self.products_qs] brands_pks = [item.brand.pk for item in self.products_qs]
retval['brands'] = Brand.objects.filter(pk__in=brands_pks).order_by('title') retval['brands'] = Brand.objects.filter(pk__in=brands_pks).order_by('title')
else: else:
self.category = self._get_full_category(kwargs['categories']) self.category = self._get_full_category(kwargs['categories'])
if not self.category.hide_products: if not self.category.hide_products:
self.products_qs = self.category.get_all_products().order_by('-pk') self.products_qs = self.category.get_all_products_in_stock_order_by('-pk')
self.brand_pks = self._get_brand_pks() self.brand_pks = self._get_brand_pks()
self.sort = self._get_sort() self.sort = self._get_sort()
@ -137,10 +145,10 @@ class CategoryView(CategoryBaseView, TemplateView):
'= store_product.id' '= store_product.id'
}) })
self.products_qs = preordered_qs.order_by(sort_parameter) self.products_qs = preordered_qs.order_by('-have_stock', sort_parameter)
self._get_filter_attributes() self._get_filter_attributes()
# print(self.products_qs.query)
self.paginate() self.paginate()
retval['category'] = self.category retval['category'] = self.category
retval['products'] = self.products_qs retval['products'] = self.products_qs

Loading…
Cancel
Save