From 438c709f0b15512ffa8f3488b13ba9768576438c Mon Sep 17 00:00:00 2001 From: Max Yakovenko Date: Tue, 21 Aug 2018 21:25:17 +0300 Subject: [PATCH] fix cart app models and forms with tasks --- cart/fixtures/supply_types.json | 2 +- cart/forms.py | 24 ++++++++++++++---------- cart/models.py | 25 ++++++------------------- cart/tasks.py | 13 +++++++------ cart/utils.py | 7 +++++-- cart/views.py | 7 ++++--- 6 files changed, 37 insertions(+), 41 deletions(-) diff --git a/cart/fixtures/supply_types.json b/cart/fixtures/supply_types.json index 0637a08..44f3b60 100644 --- a/cart/fixtures/supply_types.json +++ b/cart/fixtures/supply_types.json @@ -1 +1 @@ -[] \ No newline at end of file +[{"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}}] \ No newline at end of file diff --git a/cart/forms.py b/cart/forms.py index 52b4c6d..19d7eec 100644 --- a/cart/forms.py +++ b/cart/forms.py @@ -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 diff --git a/cart/models.py b/cart/models.py index 969882a..3e0ee37 100644 --- a/cart/models.py +++ b/cart/models.py @@ -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) diff --git a/cart/tasks.py b/cart/tasks.py index 2444d4c..73e6dec 100644 --- a/cart/tasks.py +++ b/cart/tasks.py @@ -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'], diff --git a/cart/utils.py b/cart/utils.py index d47f0ff..1bda8bb 100644 --- a/cart/utils.py +++ b/cart/utils.py @@ -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() diff --git a/cart/views.py b/cart/views.py index 90ddd1f..9cb65bc 100644 --- a/cart/views.py +++ b/cart/views.py @@ -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)