update cart app

remotes/origin/HEAD
Max Yakovenko 8 years ago
parent 2ae48a641c
commit 663af1fd11
  1. 13
      cart/forms.py
  2. 6
      cart/models.py
  3. 39
      cart/views.py
  4. 6
      templates/cart/discount_list.html
  5. 10
      templates/components/breadcrumbs.html

@ -1,3 +1,5 @@
import uuid
from crispy_forms.helper import FormHelper from crispy_forms.helper import FormHelper
from crispy_forms.layout import Layout, Field, Div, HTML, Hidden, Fieldset, Submit from crispy_forms.layout import Layout, Field, Div, HTML, Hidden, Fieldset, Submit
from django import forms from django import forms
@ -120,6 +122,8 @@ class CartCheckoutForm(RequestNotifiable, forms.ModelForm):
form_action = {'viewname': 'cart:confirm', 'kwargs': {}} form_action = {'viewname': 'cart:confirm', 'kwargs': {}}
field_template = 'bootstrap/forms/cart_checkout.html' field_template = 'bootstrap/forms/cart_checkout.html'
city = forms.CharField(label=_('Город'),max_length=255)
def __init__(self, *args, **kwargs): def __init__(self, *args, **kwargs):
self.helper = FormHelper() self.helper = FormHelper()
self.helper.form_method = 'post' self.helper.form_method = 'post'
@ -140,7 +144,12 @@ class CartCheckoutForm(RequestNotifiable, forms.ModelForm):
super().__init__(*args, **kwargs) super().__init__(*args, **kwargs)
def save(self, commit=True): def is_valid(self):
return super().is_valid()
def save(self, user, commit=True):
self.instance.order_code = str(uuid.uuid4())
self.instance.customer_user = user
if not City.objects.filter(name=self.cleaned_data['city']).exists(): if not City.objects.filter(name=self.cleaned_data['city']).exists():
city = City() city = City()
city.name = self.cleaned_data['city'] city.name = self.cleaned_data['city']
@ -167,7 +176,7 @@ class CartCheckoutForm(RequestNotifiable, forms.ModelForm):
class Meta: class Meta:
model = Order model = Order
fields = ( fields = (
'customer_name', 'customer_email', 'phone', 'customer_address', 'city', 'comment' 'customer_name', 'customer_email', 'phone', 'customer_address', 'comment', 'total_price'
) )
widgets = { widgets = {
'city': forms.TextInput() 'city': forms.TextInput()

@ -227,7 +227,7 @@ ORDER_STATUS_DEFAULT = ORDER_STATUS_NEW
class Order(AbstractStatusModel): class Order(AbstractStatusModel):
order_code = models.CharField(_('код заказа'), max_length=255, default=str(uuid.uuid4())) order_code = models.CharField(_('код заказа'), max_length=255)
customer_name = models.CharField(_('имя'), max_length=255) customer_name = models.CharField(_('имя'), max_length=255)
customer_email = models.EmailField(_('email'), blank=True, null=True, default=None) customer_email = models.EmailField(_('email'), blank=True, null=True, default=None)
customer_user = models.ForeignKey( customer_user = models.ForeignKey(
@ -237,7 +237,7 @@ class Order(AbstractStatusModel):
) )
phone_regex = RegexValidator( phone_regex = RegexValidator(
regex=r'^\((+7)|8)?\d{10}$', regex=r'^((\+7)|8)?\d{10}$',
message="Phone number must be entered in the format: '+99999999999'. Up to 12 digits allowed." message="Phone number must be entered in the format: '+99999999999'. Up to 12 digits allowed."
) )
phone = models.CharField(_('телефон'), validators=[phone_regex], max_length=12) phone = models.CharField(_('телефон'), validators=[phone_regex], max_length=12)
@ -247,7 +247,7 @@ class Order(AbstractStatusModel):
total_price = models.DecimalField(_('стоимость'), max_digits=10, decimal_places=2, default=0) total_price = models.DecimalField(_('стоимость'), max_digits=10, decimal_places=2, default=0)
comment = models.TextField(_('комментарий'), blank=True, null=True, default=None) comment = models.TextField(_('комментарий'), blank=True, null=True, default=None)
status = models.SmallIntegerField(_('статус'), default=ORDER_STATUS_CHOICES, choices=ORDER_STATUS_DEFAULT) status = models.SmallIntegerField(_('статус'), choices=ORDER_STATUS_CHOICES, default=ORDER_STATUS_DEFAULT)
def __str__(self): def __str__(self):
return self.order_code return self.order_code

@ -2,14 +2,16 @@ import datetime
import logging import logging
import uuid import uuid
from functools import reduce from functools import reduce
from decimal import Decimal from decimal import Decimal
from django.conf import settings from django.conf import settings
from django.db import transaction from django.db import transaction
from django.http import HttpResponseRedirect
from django.shortcuts import redirect from django.shortcuts import redirect
from django.urls import reverse_lazy from django.urls import reverse_lazy
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import ugettext_lazy as _
from django.views.generic import ListView from django.views.generic import ListView
from django.contrib import messages
from cart.models import Buying, Discount, Offer from cart.models import Buying, Discount, Offer
from core.models import City from core.models import City
@ -35,6 +37,12 @@ class CartAddView(ProtectedBaseFormView):
self.request.cart.add(offer_id=form.cleaned_data['offer'].product_id, quantity=form.cleaned_data['amount']) self.request.cart.add(offer_id=form.cleaned_data['offer'].product_id, quantity=form.cleaned_data['amount'])
return super().form_valid(form) return super().form_valid(form)
def form_invalid(self, form):
if form.errors:
for error in form.errors:
messages.error(self.request, error)
return HttpResponseRedirect(self.get_success_url())
class CartRemoveView(ProtectedBaseFormView): class CartRemoveView(ProtectedBaseFormView):
http_method_names = ('post',) http_method_names = ('post',)
@ -79,7 +87,8 @@ class CartView(ProtectedListView):
context = super().get_context_data(object_list=object_list, **kwargs) context = super().get_context_data(object_list=object_list, **kwargs)
context['title'] = self.title context['title'] = self.title
context['total_price'] = self.get_total_price(self.object_list) context['total_price'] = self.get_total_price(self.object_list)
context['total_price_currency'] = context['total_cashback_currency'] = self.object_list.first().currency.sign if self.object_list.first() else '' context['total_price_currency'] = context[
'total_cashback_currency'] = self.object_list.first().currency.sign if self.object_list.first() else ''
context['total_cashback'] = self.get_total_cashback(self.object_list) context['total_cashback'] = self.get_total_cashback(self.object_list)
return context return context
@ -108,11 +117,27 @@ class CartConfirmView(ProtectedFormView):
form_class = CartCheckoutForm form_class = CartCheckoutForm
title = _('Подтверждение заказа') title = _('Подтверждение заказа')
def get_total_price(self, offers):
return reduce(
lambda initial, offer: initial + offer.price * Decimal(self.request.cart[offer.product_id]['quantity']),
offers,
Decimal(0)
)
def get_form_kwargs(self):
kwargs = super().get_form_kwargs()
data = kwargs['data'].copy()
data.update({
'total_price': self.get_total_price(Offer.active.filter(product_id__in=self.request.cart.keys()))
})
kwargs['data'] = data
return kwargs
def form_valid(self, form): def form_valid(self, form):
if form.is_valid(): if form.is_valid():
try: try:
with transaction.atomic(): with transaction.atomic():
form.save() form.save(self.request.user)
for item in self.request.cart: for item in self.request.cart:
buying_form = CartCheckoutBuyingForm(initial={ buying_form = CartCheckoutBuyingForm(initial={
'offer': item, 'offer': item,
@ -123,10 +148,16 @@ class CartConfirmView(ProtectedFormView):
form.send_order_invoice(self.request) form.send_order_invoice(self.request)
form.send_order_request(self.request) form.send_order_request(self.request)
self.request.cart.clear() self.request.cart.clear()
return self.render_to_response(self.get_context_data())
except Exception as e: except Exception as e:
logger.critical(e) logger.critical(e)
return super().form_invalid(form) return self.form_invalid(form)
def form_invalid(self, form):
for error in form.errors:
messages.error(self.request, error)
return HttpResponseRedirect(self.request.META['HTTP_REFERER'])
def get_context_data(self, **kwargs): def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs) context = super().get_context_data(**kwargs)

@ -1,6 +1,6 @@
{% extends 'base.html' %} {% extends 'common_news.html' %}
{% block content %} {% block news_content %}
<div class="col-12"> <div class="col-12">
<div class="content"> <div class="content">
@ -31,4 +31,4 @@
</div> </div>
</div> </div>
</div> </div>
{% endblock content %} {% endblock news_content %}

@ -1,10 +0,0 @@
<ul class="breadcrumbs">
<li>
<a href="{% url 'index:index' %}">
Главная страница
</a>
</li>
{% block breadcrumbs %}
{% endblock breadcrumbs %}
</ul>
Loading…
Cancel
Save