diff --git a/cart/forms.py b/cart/forms.py index 1c358e7..52b4c6d 100644 --- a/cart/forms.py +++ b/cart/forms.py @@ -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() diff --git a/cart/models.py b/cart/models.py index e4ab387..969882a 100644 --- a/cart/models.py +++ b/cart/models.py @@ -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 diff --git a/cart/views.py b/cart/views.py index cdedacd..90ddd1f 100644 --- a/cart/views.py +++ b/cart/views.py @@ -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) diff --git a/templates/cart/discount_list.html b/templates/cart/discount_list.html index fe16a12..49d0f1e 100644 --- a/templates/cart/discount_list.html +++ b/templates/cart/discount_list.html @@ -1,6 +1,6 @@ -{% extends 'base.html' %} +{% extends 'common_news.html' %} -{% block content %} +{% block news_content %}
@@ -31,4 +31,4 @@
-{% endblock content %} +{% endblock news_content %} diff --git a/templates/components/breadcrumbs.html b/templates/components/breadcrumbs.html deleted file mode 100644 index 93eab0e..0000000 --- a/templates/components/breadcrumbs.html +++ /dev/null @@ -1,10 +0,0 @@ - -