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">
{{ product.description|linebreaks|safe }}
</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')
class Meta:
verbose_name = 'отзыв'
verbose_name_plural = 'отзывы'
verbose_name = 'отзыв о сайте'
verbose_name_plural = 'отзывы о сайте'
def __str__(self):
return '{}: {}'.format(self.name, self.text)

@ -105,6 +105,11 @@ class OrderAdmin(admin.ModelAdmin):
list_display = (
'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)
# class CategoryAdmin(admin.ModelAdmin):

@ -1,9 +1,17 @@
from django import forms
from main.models import Feedback, STARS_CHOICES
from store.alemtat import alemtat_get_services_tuple
from store.models import OrderData
from store.models import OrderData, ProductFeedback
class OrderForm(forms.ModelForm):
class Meta:
model = OrderData
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.contrib.postgres.fields import ArrayField
from decimal import *
from django.db.models import Count, Min
from django.db.models import Count, Min, Sum
from accounts.models import Profile
from main.models import STARS_CHOICES
from store.alemtat import alemtat_get_cities_tuple, alemtat_get_services_tuple
FIELD_TYPE_CHAR = 'char'
@ -194,7 +195,13 @@ class Product(models.Model):
def is_discount(self):
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(
# Min('price'))['price__min'] or 0
@ -214,6 +221,7 @@ class Product(models.Model):
retval += main_category.slug + '/product-' + self.slug
return retval
class ProductVariation(models.Model):
product = models.ForeignKey(
Product, verbose_name='Товар', related_name='variations')
@ -236,13 +244,14 @@ class ProductVariation(models.Model):
def get_price(self):
if self.discount:
return int(self.price - (self.price/100*self.discount))
return int(self.price - (self.price / 100 * self.discount))
else:
if self.price > 10000:
return int(self.price * Decimal('.95'))
else:
return int(self.price * Decimal('.93'))
class AttributesInProduct(models.Model):
attribute = models.ForeignKey(
AttributeForCategory, verbose_name='Атрибут в категории',
@ -288,10 +297,12 @@ STATUS_CHOICES = (
(3, 'Отправлено'),
)
class OrderData(models.Model):
created = models.DateTimeField('Дата и время', auto_now_add=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(
'Имя', max_length=64, blank=False, null=False)
last_name = models.CharField(
@ -305,12 +316,14 @@ class OrderData(models.Model):
address = models.CharField(
'Адрес', max_length=100, blank=False, null=False)
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(
'Товары', max_length=256, blank=False, null=False, default='')
amount = models.FloatField(
'Сумма', 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:
verbose_name = 'заказ'
@ -334,3 +347,19 @@ class OrderData(models.Model):
variation = ProductVariation.objects.get(pk=variation_id)
retval += ((variation, variation_count),)
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.cart import Cart, CartItem
from django.contrib import messages
from store.forms import OrderForm
from store.forms import OrderForm, ProductFeedbackForm
from django.http import JsonResponse
from datetime import datetime
from django.conf import settings
@ -149,8 +149,26 @@ class ProductView(CategoryBaseView, DetailView):
def get_context_data(self, **kwargs):
retval = super(ProductView, self).get_context_data()
retval['category'] = self.category
retval['form'] = ProductFeedbackForm(self.request.POST or None)
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):
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