fix cart app models and forms with tasks

remotes/origin/HEAD
Max Yakovenko 8 years ago
parent 5b3dc2e413
commit 438c709f0b
  1. 2
      cart/fixtures/supply_types.json
  2. 24
      cart/forms.py
  3. 25
      cart/models.py
  4. 13
      cart/tasks.py
  5. 7
      cart/utils.py
  6. 7
      cart/views.py

@ -1 +1 @@
[] [{"model": "cart.supplytype", "pk": 1, "fields": {"create_at": "2018-08-21T17:10:18.814Z", "updated_at": "2018-08-21T17:10:18.814Z", "name": "\u041f\u043e\u0447\u0442\u0430", "slug": "pochta", "min_term": 3, "max_term": 14, "term_dimension": 0}}]

@ -99,7 +99,7 @@ class CartCheckoutBuyingForm(forms.Form):
def get_initial_for_field(self, field, field_name): def get_initial_for_field(self, field, field_name):
if field_name == 'offer': if field_name == 'offer':
field = Offer.active.get(product_id=self.initia[field_name]) field.initial = Offer.active.get(product_id=self.initia[field_name])
elif field_name == 'order': elif field_name == 'order':
field = Order.objects.get(order_code=self.initial[field_name]) field = Order.objects.get(order_code=self.initial[field_name])
elif field_name == 'amount' or field_name == 'bonus_points': elif field_name == 'amount' or field_name == 'bonus_points':
@ -109,11 +109,11 @@ class CartCheckoutBuyingForm(forms.Form):
def save(self, user): def save(self, user):
buying = Buying() buying = Buying()
buying.user = user buying.user = user
buying.offer = self.offer buying.offer = self.data['offer']
buying.order = self.order buying.order = self.data['order']
buying.bonus_points = self.bonus_points buying.bonus_points = self.data['bonus_points']
buying.amount = self.amount buying.amount = self.data['amount']
buying.total_price = self.offer.get_price_with_discount * self.amount buying.total_price = self.data['offer'].get_price_with_discount() * self.data['amount']
buying.save() buying.save()
return buying return buying
@ -132,7 +132,7 @@ class CartCheckoutForm(RequestNotifiable, forms.ModelForm):
Field('customer_name', css_class="order__input", template=self.field_template), Field('customer_name', css_class="order__input", template=self.field_template),
Field('customer_email', css_class="order__input", template=self.field_template), Field('customer_email', css_class="order__input", template=self.field_template),
Field('customer_user', css_class="order__input", template=self.field_template), Field('customer_user', css_class="order__input", template=self.field_template),
Field('phone', css_class="order__input", template=self.field_template), Field('phone', css_class="order__input", placeholder="(+7/8)9999999999", template=self.field_template),
Field('customer_address', css_class="order__input", template=self.field_template), Field('customer_address', css_class="order__input", template=self.field_template),
Field('city', css_class="order__input", template=self.field_template), Field('city', css_class="order__input", template=self.field_template),
Field('comment', css_class="order__input", template=self.field_template), Field('comment', css_class="order__input", template=self.field_template),
@ -158,7 +158,11 @@ class CartCheckoutForm(RequestNotifiable, forms.ModelForm):
return super().save(commit) return super().save(commit)
def send_order_invoice(self, request): def send_order_invoice(self, request):
return send_user_order_notification.delay(self.instance.id, request) context = {
'order_id': self.instance.id,
'site_url': request.build_absolute_uri(),
}
return send_user_order_notification.delay(context=context)
def send_order_request(self, request): def send_order_request(self, request):
context = { context = {
@ -166,12 +170,12 @@ class CartCheckoutForm(RequestNotifiable, forms.ModelForm):
'recipients': (settings.DEFAULT_FROM_EMAIL,), 'recipients': (settings.DEFAULT_FROM_EMAIL,),
'email': { 'email': {
'subject': _('У вас новый заказ'), 'subject': _('У вас новый заказ'),
'order': self.instance, 'order_id': self.instance.id,
}, },
'send_at_date': self.instance.create_at, 'send_at_date': self.instance.create_at,
} }
return send_admin_order_notification.delay(context) return send_admin_order_notification.delay(context=context)
class Meta: class Meta:
model = Order model = Order

@ -1,16 +1,17 @@
from django.utils.timezone import now, timedelta
import uuid import uuid
from django.core.validators import MinValueValidator, MaxValueValidator, RegexValidator from decimal import Decimal
from autoslug import AutoSlugField
from django.core.validators import MinValueValidator, MaxValueValidator, RegexValidator
from django.db import models from django.db import models
from django.contrib.auth import get_user_model from django.contrib.auth import get_user_model
from django.db.models import Avg from django.db.models import Avg
from django.db.models.signals import post_save from django.db.models.signals import post_save
from django.dispatch import receiver from django.dispatch import receiver
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import ugettext_lazy as _
from django.utils.timezone import now, timedelta
from autoslug import AutoSlugField
# Create your models here. # Create your models here.
from core.models import ( from core.models import (
@ -164,7 +165,8 @@ class Offer(AbstractStatusModel):
account_nds = models.BooleanField(_('с учетом НДС'), default=False) account_nds = models.BooleanField(_('с учетом НДС'), default=False)
def get_price_with_discount(self): def get_price_with_discount(self):
return self.price - ((self.discount.value * self.price) if self.discount else 0) discount = (self.discount.value / 100.0) if self.discount else 0
return round(self.price - (Decimal(discount) * self.price), 2)
def __str__(self): def __str__(self):
return self.product.name return self.product.name
@ -322,18 +324,3 @@ class Buying(AbstractStatusModel):
class Meta: class Meta:
verbose_name = _('Покупка') verbose_name = _('Покупка')
verbose_name_plural = _('Покупки') verbose_name_plural = _('Покупки')
@receiver(post_save, sender=Order)
def product_in_order_post_save(sender, instance, created, **kwargs):
order = instance.order
all_products_in_order = Buying.objects.filter(order=instance, status=ORDER_STATUS_NEW)
order_total_price = sum(item.total_price for item in all_products_in_order)
# if order.discount:
# order.total_price = order_total_price * (order.discount_value / Decimal('100'))
if order.points_quant:
order.total_price = order_total_price - order.points_quant
else:
order.total_price = order_total_price
order.save(force_update=True)

@ -10,12 +10,12 @@ from django.core.mail import EmailMessage, EmailMultiAlternatives
from cart.models import Order from cart.models import Order
@celery.task @celery.task()
def send_user_order_notification(order_id, request): def send_user_order_notification(context):
""" """
Sending Email of order creating Sending Email of order creating
""" """
order = Order.objects.get(id=order_id) order = Order.active.get(pk=context['order_id'])
verb_price = pytils.numeral.in_words(round(order.total_price)) verb_price = pytils.numeral.in_words(round(order.total_price))
verb_cur = pytils.numeral.choose_plural(round(order.total_price), ("рубль", "рубля", "рублей")) verb_cur = pytils.numeral.choose_plural(round(order.total_price), ("рубль", "рубля", "рублей"))
subject = 'Заказ № {}'.format(order.id) subject = 'Заказ № {}'.format(order.id)
@ -34,18 +34,19 @@ def send_user_order_notification(order_id, request):
stylesheets=[ stylesheets=[
weasyprint.CSS(settings.STATIC_ROOT + 'css/build.css')]) weasyprint.CSS(settings.STATIC_ROOT + 'css/build.css')])
order_invoice_name = 'Order_' + order.order_code order_invoice_name = 'Order_' + order.order_code
weasyprint.HTML(string=rendered_html, base_url=request.build_absolute_uri()).write_pdf(order_invoice_name, weasyprint.HTML(string=rendered_html, base_url=context['site_url']).write_pdf(order_invoice_name,
stylesheets=[weasyprint.CSS( stylesheets=[weasyprint.CSS(
settings.STATIC_ROOT + '/css/build.css')]) settings.STATIC_ROOT + '/css/build.css')])
mail_send.attach('order_{}.pdf'.format(order_id), out.getvalue(), 'application/pdf') mail_send.attach('order_{}.pdf'.format(order.id), out.getvalue(), 'application/pdf')
mail_send.send() mail_send.send()
return mail_send return mail_send
@celery.task @celery.task()
def send_admin_order_notification(context): def send_admin_order_notification(context):
body = get_template('emails/html/admin_order_request.html') body = get_template('emails/html/admin_order_request.html')
body_text = get_template('emails/txt/admin_order_request.txt') body_text = get_template('emails/txt/admin_order_request.txt')
context['email']['order'] = Order.active.get(pk=context['email']['order_id'])
email = EmailMultiAlternatives( email = EmailMultiAlternatives(
context['email']['subject'], context['email']['subject'],

@ -35,8 +35,11 @@ class Cart(object):
self.save() self.save()
def clear(self): def clear(self):
del self.store[settings.CART_SESSION_ID] if settings.CART_SESSION_ID in self.store:
self.store.modified = True del self.store[settings.CART_SESSION_ID]
self.store.modified = True
del self.cart
self.cart = {}
def keys(self): def keys(self):
return self.cart.keys() return self.cart.keys()

@ -139,9 +139,10 @@ class CartConfirmView(ProtectedFormView):
with transaction.atomic(): with transaction.atomic():
form.save(self.request.user) form.save(self.request.user)
for item in self.request.cart: for item in self.request.cart:
buying_form = CartCheckoutBuyingForm(initial={ buying_form = CartCheckoutBuyingForm(data={
'offer': item, 'offer': Offer.active.get(pk=item),
'order': form.instance.order_code, 'order': form.instance,
'bonus_points': 0, #@TODO: ADD BONUS PRODUCTS FOR AN ENTIRE PURCHASE
'amount': self.request.cart[item]['quantity'] 'amount': self.request.cart[item]['quantity']
}) })
buying_form.save(self.request.user) buying_form.save(self.request.user)

Loading…
Cancel
Save