remotes/origin/artem
Gena 11 years ago
parent 7aea2c5fa1
commit d01f5779cb
  1. 60
      batiskaf/templates/jinja2/product.jinja
  2. 18
      main/migrations/0010_auto_20150701_1216.py
  3. 4
      main/models.py
  4. 5
      store/admin.py
  5. 10
      store/forms.py
  6. 35
      store/migrations/0028_auto_20150701_1216.py
  7. 41
      store/models.py
  8. 20
      store/views.py
  9. 13
      tmp/eml/20150701-125903-4543369056.eml
  10. 13
      tmp/eml/20150701-125916-4544252560.eml

@ -127,6 +127,66 @@
<div class=" text-left product-description"> <div class=" text-left product-description">
{{ product.description|linebreaks|safe }} {{ product.description|linebreaks|safe }}
</div> </div>
<hr class="dashed"/>
<h3 class="">
Отзывы о товаре {{ product.title }}
</h3><br/>
<div class="well well-lg news-container">
<ul class="media-list">
{% if product.feedback.all() %}
{% for comment in product.feedback.all() %}
<li class="media">
<a name="comment{{ comment.pk }}"></a>
<div class="media-body">
<h4 class="media-heading text-left">
{% for i in range(1,6) %}
<input name="star{{ comment.pk }}" type="radio" class="star" disabled="disabled" {% if i == comment.stars %}checked="checked"{% endif %}/>
{% endfor %}
{{ comment.name }} пишет: <small><a
href="{{ request.get_full_path() }}#comment{{ comment.pk }}">#</a></small></h4>
<p>{{ comment.created.strftime('%d.%m.%Y %H:%M') }}</p>
<p>{{ comment.text|striptags }}</p>
<!-- Nested media object -->
</div>
</li>
{% endfor %}
</ul>
{% else %}
<div class="alert alert-warning alert-dismissable">
<strong>Пока нет ни одного отзыва!</strong> Вы можете <a href="#comment">стать первым</a>!
</div>
{% endif %}
</div>
<hr/>
<div class="comment">
<a name="comment"></a>
<h4 class="text-center">
Оставить отзыв:</h4>
<div class="comment-form col-xs-6 col-xs-offset-3">
<form action="" class="form" method="post"><input type="hidden" name="csrfmiddlewaretoken"
value="{{ csrf_token }}">
{{ form|bootstrap }}
<div class="form-group text-left">
<button type="submit" name="comment-send" class="btn btn-primary"><span
class="glyphicon glyphicon-comment" aria-hidden="true"></span> Отправить
</button>
</div>
</form>
</div>
</div>

@ -0,0 +1,18 @@
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.db import models, migrations
class Migration(migrations.Migration):
dependencies = [
('main', '0009_feedback_stars'),
]
operations = [
migrations.AlterModelOptions(
name='feedback',
options={'verbose_name': 'отзыв о сайте', 'verbose_name_plural': 'отзывы о сайте'},
),
]

@ -37,8 +37,8 @@ class Feedback(models.Model):
# news = models.ForeignKey(News, related_name='comments') # news = models.ForeignKey(News, related_name='comments')
class Meta: class Meta:
verbose_name = 'отзыв' verbose_name = 'отзыв о сайте'
verbose_name_plural = 'отзывы' verbose_name_plural = 'отзывы о сайте'
def __str__(self): def __str__(self):
return '{}: {}'.format(self.name, self.text) return '{}: {}'.format(self.name, self.text)

@ -105,6 +105,11 @@ class OrderAdmin(admin.ModelAdmin):
list_display = ( list_display = (
'first_name', 'last_name', 'phone', 'email', 'city', 'address', 'deliv_type', 'amount', 'status', get_order_items) 'first_name', 'last_name', 'phone', 'email', 'city', 'address', 'deliv_type', 'amount', 'status', get_order_items)
@admin.register(ProductFeedback)
class ProductFeedbackAdmin(admin.ModelAdmin):
list_display = ('created', 'product', 'name', 'email', 'text', 'stars')
# #
# @admin.register(Category) # @admin.register(Category)
# class CategoryAdmin(admin.ModelAdmin): # class CategoryAdmin(admin.ModelAdmin):

@ -1,9 +1,17 @@
from django import forms from django import forms
from main.models import Feedback, STARS_CHOICES
from store.alemtat import alemtat_get_services_tuple from store.alemtat import alemtat_get_services_tuple
from store.models import OrderData from store.models import OrderData, ProductFeedback
class OrderForm(forms.ModelForm): class OrderForm(forms.ModelForm):
class Meta: class Meta:
model = OrderData model = OrderData
fields = ['first_name', 'last_name', 'phone', 'email', 'city', 'address', 'deliv_type'] fields = ['first_name', 'last_name', 'phone', 'email', 'city', 'address', 'deliv_type']
class ProductFeedbackForm(forms.ModelForm):
stars = forms.IntegerField(widget=forms.RadioSelect(choices=STARS_CHOICES), label='Оценка')
class Meta:
model = ProductFeedback
fields = ['stars', 'name', 'email', 'text', ]

File diff suppressed because one or more lines are too long

@ -1,8 +1,9 @@
from django.db import models from django.db import models
from django.contrib.postgres.fields import ArrayField from django.contrib.postgres.fields import ArrayField
from decimal import * from decimal import *
from django.db.models import Count, Min 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 store.alemtat import alemtat_get_cities_tuple, alemtat_get_services_tuple from store.alemtat import alemtat_get_cities_tuple, alemtat_get_services_tuple
FIELD_TYPE_CHAR = 'char' FIELD_TYPE_CHAR = 'char'
@ -194,7 +195,13 @@ class Product(models.Model):
def is_discount(self): def is_discount(self):
return self.variations.filter(discount__gt=0).count() > 0 return self.variations.filter(discount__gt=0).count() > 0
def get_stars(self):
fb_count = self.feedback.count()
fb_sum = self.feedback.aggregate(Sum('stars'))
if fb_count:
return int(fb_sum / fb_count)
else:
return 0
# retval = self.variations.filter(in_stock__gt=0).aggregate( # retval = self.variations.filter(in_stock__gt=0).aggregate(
# Min('price'))['price__min'] or 0 # Min('price'))['price__min'] or 0
@ -214,6 +221,7 @@ class Product(models.Model):
retval += main_category.slug + '/product-' + self.slug retval += main_category.slug + '/product-' + self.slug
return retval return retval
class ProductVariation(models.Model): class ProductVariation(models.Model):
product = models.ForeignKey( product = models.ForeignKey(
Product, verbose_name='Товар', related_name='variations') Product, verbose_name='Товар', related_name='variations')
@ -236,13 +244,14 @@ class ProductVariation(models.Model):
def get_price(self): def get_price(self):
if self.discount: if self.discount:
return int(self.price - (self.price/100*self.discount)) return int(self.price - (self.price / 100 * self.discount))
else: else:
if self.price > 10000: if self.price > 10000:
return int(self.price * Decimal('.95')) return int(self.price * Decimal('.95'))
else: else:
return int(self.price * Decimal('.93')) return int(self.price * Decimal('.93'))
class AttributesInProduct(models.Model): class AttributesInProduct(models.Model):
attribute = models.ForeignKey( attribute = models.ForeignKey(
AttributeForCategory, verbose_name='Атрибут в категории', AttributeForCategory, verbose_name='Атрибут в категории',
@ -288,10 +297,12 @@ STATUS_CHOICES = (
(3, 'Отправлено'), (3, 'Отправлено'),
) )
class OrderData(models.Model): class OrderData(models.Model):
created = models.DateTimeField('Дата и время', auto_now_add=True, editable=False) created = models.DateTimeField('Дата и время', auto_now_add=True, editable=False)
edited = models.DateTimeField('Изменено', auto_now=True, editable=False) edited = models.DateTimeField('Изменено', auto_now=True, editable=False)
profile = models.ForeignKey(Profile, default=None, null=True, blank=False, related_name='orders') profile = models.ForeignKey(Profile, default=None, null=True, blank=False,
related_name='orders')
first_name = models.CharField( first_name = models.CharField(
'Имя', max_length=64, blank=False, null=False) 'Имя', max_length=64, blank=False, null=False)
last_name = models.CharField( last_name = models.CharField(
@ -305,12 +316,14 @@ class OrderData(models.Model):
address = models.CharField( address = models.CharField(
'Адрес', max_length=100, blank=False, null=False) 'Адрес', max_length=100, blank=False, null=False)
deliv_type = models.CharField( deliv_type = models.CharField(
'Способ доставки', max_length=2, blank=False, null=False, default='', choices=alemtat_get_services_tuple()) 'Способ доставки', max_length=2, blank=False, null=False, default='',
choices=alemtat_get_services_tuple())
items = models.CharField( items = models.CharField(
'Товары', max_length=256, blank=False, null=False, default='') 'Товары', max_length=256, blank=False, null=False, default='')
amount = models.FloatField( amount = models.FloatField(
'Сумма', blank=False, null=False, default=0.0) 'Сумма', blank=False, null=False, default=0.0)
status = models.IntegerField('Статус', default=0, null=False, blank=False, choices=STATUS_CHOICES) status = models.IntegerField('Статус', default=0, null=False, blank=False,
choices=STATUS_CHOICES)
class Meta: class Meta:
verbose_name = 'заказ' verbose_name = 'заказ'
@ -334,3 +347,19 @@ class OrderData(models.Model):
variation = ProductVariation.objects.get(pk=variation_id) variation = ProductVariation.objects.get(pk=variation_id)
retval += ((variation, variation_count),) retval += ((variation, variation_count),)
return retval return retval
class ProductFeedback(models.Model):
created = models.DateTimeField('Дата и время', auto_now_add=True, editable=False)
name = models.CharField('Имя', max_length=45, null=False, blank=False)
email = models.EmailField('Email (не будет опубликован)', null=False, blank=False)
text = models.TextField('Комментарий', null=False, blank=False)
stars = models.IntegerField('Оценка', default=5, choices=STARS_CHOICES)
product = models.ForeignKey(Product, related_name='feedback')
class Meta:
verbose_name = 'отзыв о товаре'
verbose_name_plural = 'отзывы о товарах'
def __str__(self):
return '{}: {}'.format(self.name, self.product.title)

@ -10,7 +10,7 @@ from .models import *
from store.alemtat import AlemTat from store.alemtat import AlemTat
from store.cart import Cart, CartItem from store.cart import Cart, CartItem
from django.contrib import messages from django.contrib import messages
from store.forms import OrderForm from store.forms import OrderForm, ProductFeedbackForm
from django.http import JsonResponse from django.http import JsonResponse
from datetime import datetime from datetime import datetime
from django.conf import settings from django.conf import settings
@ -149,8 +149,26 @@ class ProductView(CategoryBaseView, DetailView):
def get_context_data(self, **kwargs): def get_context_data(self, **kwargs):
retval = super(ProductView, self).get_context_data() retval = super(ProductView, self).get_context_data()
retval['category'] = self.category retval['category'] = self.category
retval['form'] = ProductFeedbackForm(self.request.POST or None)
return retval return retval
def post(self, request, *args, **kwargs):
self.category = self._get_full_category(kwargs['categories'])
super(ProductView, self).get(request, args, kwargs)
context_data = self.get_context_data()
#context_data['category'] = self.category
form = ProductFeedbackForm(request.POST or None)
if form.is_valid():
obj = form.save(commit=False)
obj.product = self.object
obj.save()
messages.success(self.request, 'Ваш отзыв успешно опубликован. Спасибо!')
mail_managers('Оставили отзыв о товаре', 'Смотреть в админке')
return redirect(self.object.get_absolute_url())
else:
return self.render_to_response(context_data)
class CartAddView(RedirectView): class CartAddView(RedirectView):
def dispatch(self, request, *args, **kwargs): def dispatch(self, request, *args, **kwargs):

@ -0,0 +1,13 @@
Content-Type: text/plain; charset="utf-8"
MIME-Version: 1.0
Content-Transfer-Encoding: 8bit
Subject:
=?utf-8?b?W0RqYW5nb10g0J7RgdGC0LDQstC40LvQuCDQvtGC0LfRi9CyINC+INGC0L7QstCw?=
=?utf-8?b?0YDQtQ==?=
From: admin@batiskaf-kz.kz
To: spacenergy@me.com, admin@batiskaf-kz.kz
Date: Wed, 01 Jul 2015 06:59:03 -0000
Message-ID: <20150701065903.5216.45243@MacBook-Pro.local>
Смотреть в админке
-------------------------------------------------------------------------------

@ -0,0 +1,13 @@
Content-Type: text/plain; charset="utf-8"
MIME-Version: 1.0
Content-Transfer-Encoding: 8bit
Subject:
=?utf-8?b?W0RqYW5nb10g0J7RgdGC0LDQstC40LvQuCDQvtGC0LfRi9CyINC+INGC0L7QstCw?=
=?utf-8?b?0YDQtQ==?=
From: admin@batiskaf-kz.kz
To: spacenergy@me.com, admin@batiskaf-kz.kz
Date: Wed, 01 Jul 2015 06:59:16 -0000
Message-ID: <20150701065916.5216.63259@MacBook-Pro.local>
Смотреть в админке
-------------------------------------------------------------------------------
Loading…
Cancel
Save