checkout/src/purchase/forms.py

73 lines
2.5 KiB
Python
Raw Normal View History

from crispy_forms.bootstrap import InlineRadios
2022-04-24 18:59:04 +02:00
from crispy_forms.helper import FormHelper
from crispy_forms.layout import Div, Layout, Submit
2022-04-24 18:59:04 +02:00
from django import forms
2022-04-25 23:04:49 +02:00
from django.utils.translation import gettext as _
2022-04-24 18:59:04 +02:00
from purchase.layout import BasketItemField
from purchase.models import Basket, Product
PREFIX = "product-"
class BasketForm(forms.ModelForm):
class Meta:
model = Basket
fields = ["payment_method"]
widgets = {"payment_method": forms.RadioSelect}
2022-04-24 18:59:04 +02:00
class Media:
js = ["purchase/js/basket_form.js"]
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.helper = FormHelper()
self.helper.form_class = "form-horizontal"
2022-04-25 23:04:49 +02:00
self.helper.add_input(Submit("submit", _("Save")))
2022-04-24 18:59:04 +02:00
self.helper.layout = Layout()
products = {}
basket = kwargs.get("instance")
if basket:
for item in basket.items.all():
products[item.product] = item.quantity
fields = []
for product in Product.objects.all():
field_name = f"{PREFIX}{product.id}"
self.fields.update(
{
field_name: forms.IntegerField(
label=product.name,
min_value=0,
initial=products.get(product, 0),
2023-03-25 20:01:14 +01:00
),
},
2022-04-24 18:59:04 +02:00
)
fields.append(BasketItemField(field_name, product=product))
self.helper.layout = Layout(
2022-04-25 17:17:58 +02:00
Div(
*fields,
css_class="row row-cols-2 row-cols-sm-3 row-cols-md-4 row-cols-lg-5 row-cols-xl-6 g-4",
),
InlineRadios("payment_method"),
2022-04-24 18:59:04 +02:00
)
2023-03-25 20:01:14 +01:00
def save(self):
2022-04-24 18:59:04 +02:00
instance: Basket = super().save(commit=True)
name: str
2022-04-27 20:46:02 +02:00
products = {product.id: product for product in Product.objects.all()}
2022-04-24 18:59:04 +02:00
for name, value in self.cleaned_data.items():
if name.startswith(PREFIX):
product_id = int(name.removeprefix(PREFIX))
2022-04-27 20:46:02 +02:00
product = products[product_id]
2022-04-24 18:59:04 +02:00
if value > 0:
instance.items.update_or_create(
2022-04-27 20:46:02 +02:00
product=product,
defaults={
"quantity": value,
"unit_price_cents": product.unit_price_cents,
},
2022-04-24 18:59:04 +02:00
)
if value == 0:
2022-04-27 20:46:02 +02:00
instance.items.filter(product=product).delete()
2022-04-24 18:59:04 +02:00
return instance