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):
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':
field = Order.objects.get(order_code=self.initial[field_name])
elif field_name == 'amount' or field_name == 'bonus_points':
@ -109,11 +109,11 @@ class CartCheckoutBuyingForm(forms.Form):
def save(self, user):
buying = Buying()
buying.user = user
buying.offer = self.offer
buying.order = self.order
buying.bonus_points = self.bonus_points
buying.amount = self.amount
buying.total_price = self.offer.get_price_with_discount * self.amount
buying.offer = self.data['offer']
buying.order = self.data['order']
buying.bonus_points = self.data['bonus_points']
buying.amount = self.data['amount']
buying.total_price = self.data['offer'].get_price_with_discount() * self.data['amount']
buying.save()
return buying
@ -132,7 +132,7 @@ class CartCheckoutForm(RequestNotifiable, forms.ModelForm):
Field('customer_name', 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('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('city', 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)
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):
context = {
@ -166,12 +170,12 @@ class CartCheckoutForm(RequestNotifiable, forms.ModelForm):
'recipients': (settings.DEFAULT_FROM_EMAIL,),
'email': {
'subject': _('У вас новый заказ'),
'order': self.instance,
'order_id': self.instance.id,
},
'send_at_date': self.instance.create_at,
}
return send_admin_order_notification.delay(context)
return send_admin_order_notification.delay(context=context)
class Meta:
model = Order

@ -1,16 +1,17 @@
from django.utils.timezone import now, timedelta
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.contrib.auth import get_user_model
from django.db.models import Avg
from django.db.models.signals import post_save
from django.dispatch import receiver
from django.utils.translation import ugettext_lazy as _
from django.utils.timezone import now, timedelta
from autoslug import AutoSlugField
# Create your models here.
from core.models import (
@ -164,7 +165,8 @@ class Offer(AbstractStatusModel):
account_nds = models.BooleanField(_('с учетом НДС'), default=False)
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):
return self.product.name
@ -322,18 +324,3 @@ class Buying(AbstractStatusModel):
class Meta:
verbose_name = _('Покупка')
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
@celery.task
def send_user_order_notification(order_id, request):
@celery.task()
def send_user_order_notification(context):
"""
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_cur = pytils.numeral.choose_plural(round(order.total_price), ("рубль", "рубля", "рублей"))
subject = 'Заказ № {}'.format(order.id)
@ -34,18 +34,19 @@ def send_user_order_notification(order_id, request):
stylesheets=[
weasyprint.CSS(settings.STATIC_ROOT + 'css/build.css')])
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(
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()
return mail_send
@celery.task
@celery.task()
def send_admin_order_notification(context):
body = get_template('emails/html/admin_order_request.html')
body_text = get_template('emails/txt/admin_order_request.txt')
context['email']['order'] = Order.active.get(pk=context['email']['order_id'])
email = EmailMultiAlternatives(
context['email']['subject'],

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

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

Loading…
Cancel
Save