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.layout import Layout, Field, Div, HTML, Hidden, Fieldset, Submit
from django import forms
@ -120,6 +122,8 @@ class CartCheckoutForm(RequestNotifiable, forms.ModelForm):
form_action = {'viewname': 'cart:confirm', 'kwargs': {}}
field_template = 'bootstrap/forms/cart_checkout.html'
city = forms.CharField(label=_('Город'),max_length=255)
def __init__(self, *args, **kwargs):
self.helper = FormHelper()
self.helper.form_method = 'post'
@ -140,7 +144,12 @@ class CartCheckoutForm(RequestNotifiable, forms.ModelForm):
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():
city = City()
city.name = self.cleaned_data['city']
@ -167,7 +176,7 @@ class CartCheckoutForm(RequestNotifiable, forms.ModelForm):
class Meta:
model = Order
fields = (
'customer_name', 'customer_email', 'phone', 'customer_address', 'city', 'comment'
'customer_name', 'customer_email', 'phone', 'customer_address', 'comment', 'total_price'
)
widgets = {
'city': forms.TextInput()

@ -227,7 +227,7 @@ ORDER_STATUS_DEFAULT = ORDER_STATUS_NEW
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_email = models.EmailField(_('email'), blank=True, null=True, default=None)
customer_user = models.ForeignKey(
@ -237,7 +237,7 @@ class Order(AbstractStatusModel):
)
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."
)
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)
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):
return self.order_code

@ -2,14 +2,16 @@ import datetime
import logging
import uuid
from functools import reduce
from decimal import Decimal
from django.conf import settings
from django.db import transaction
from django.http import HttpResponseRedirect
from django.shortcuts import redirect
from django.urls import reverse_lazy
from django.utils.translation import ugettext_lazy as _
from django.views.generic import ListView
from django.contrib import messages
from cart.models import Buying, Discount, Offer
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'])
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):
http_method_names = ('post',)
@ -79,7 +87,8 @@ class CartView(ProtectedListView):
context = super().get_context_data(object_list=object_list, **kwargs)
context['title'] = self.title
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)
return context
@ -108,11 +117,27 @@ class CartConfirmView(ProtectedFormView):
form_class = CartCheckoutForm
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):
if form.is_valid():
try:
with transaction.atomic():
form.save()
form.save(self.request.user)
for item in self.request.cart:
buying_form = CartCheckoutBuyingForm(initial={
'offer': item,
@ -123,10 +148,16 @@ class CartConfirmView(ProtectedFormView):
form.send_order_invoice(self.request)
form.send_order_request(self.request)
self.request.cart.clear()
return self.render_to_response(self.get_context_data())
except Exception as 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):
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="content">
@ -31,4 +31,4 @@
</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