sforkowany z mtyton/comfy
96 wiersze
3.3 KiB
Python
96 wiersze
3.3 KiB
Python
from django import forms
|
|
from phonenumber_field.formfields import PhoneNumberField
|
|
from phonenumber_field.phonenumber import PhoneNumber
|
|
from django.db.models import Model
|
|
|
|
from store.models import (
|
|
ProductTemplate,
|
|
ProductTemplateParamValue,
|
|
Product,
|
|
PaymentMethod,
|
|
DeliveryMethod
|
|
)
|
|
|
|
|
|
|
|
|
|
class CustomerDataForm(forms.Form):
|
|
|
|
name = forms.CharField(
|
|
max_length=255, label="Imię", widget=forms.TextInput(attrs={"class": "form-control"})
|
|
)
|
|
|
|
surname = forms.CharField(
|
|
max_length=255, label="Nazwisko", widget=forms.TextInput(attrs={"class": "form-control"})
|
|
)
|
|
street = forms.CharField(
|
|
max_length=255, label="Adres", widget=forms.TextInput(attrs={"class": "form-control"})
|
|
)
|
|
city = forms.CharField(
|
|
max_length=255, label="Miasto", widget=forms.TextInput(attrs={"class": "form-control"})
|
|
)
|
|
zip_code = forms.CharField(
|
|
max_length=255, label="Kod pocztowy", widget=forms.TextInput(attrs={"class": "form-control"})
|
|
)
|
|
email = forms.EmailField(
|
|
max_length=255, label="E-mail", widget=forms.EmailInput(attrs={"class": "form-control"})
|
|
)
|
|
phone = PhoneNumberField(
|
|
region="PL", label="Numer telefonu", widget=forms.TextInput(attrs={"class": "form-control"})
|
|
)
|
|
country = forms.ChoiceField(
|
|
choices=(("PL", "Polska"), ), label="Kraj",
|
|
widget=forms.Select(attrs={"class": "form-control"})
|
|
)
|
|
payment_method = forms.ModelChoiceField(
|
|
queryset=PaymentMethod.objects.filter(active=True), label="Sposób płatności",
|
|
widget=forms.Select(attrs={"class": "form-control"})
|
|
)
|
|
delivery_method = forms.ModelChoiceField(
|
|
queryset=DeliveryMethod.objects.filter(active=True), label="Sposób dostawy",
|
|
widget=forms.Select(attrs={"class": "form-control"})
|
|
)
|
|
|
|
def serialize(self):
|
|
"""Clean method should return JSON serializable"""
|
|
new_cleaned_data = {}
|
|
for key, value in self.cleaned_data.items():
|
|
if isinstance(value, PhoneNumber):
|
|
new_cleaned_data[key] = str(value)
|
|
elif isinstance(value, Model):
|
|
new_cleaned_data[key] = value.pk
|
|
else:
|
|
new_cleaned_data[key] = value
|
|
return new_cleaned_data
|
|
|
|
|
|
class ButtonToggleSelect(forms.RadioSelect):
|
|
template_name = "store/forms/button_toggle_select.html"
|
|
|
|
|
|
class ProductTemplateConfigForm(forms.Form):
|
|
|
|
def _create_dynamic_fields(self, template: ProductTemplate):
|
|
template_params = template.template_params.all()
|
|
for param in template_params:
|
|
queryset = ProductTemplateParamValue.objects.filter(param=param)
|
|
if queryset.count() >= 4:
|
|
widget = forms.Select(attrs={"class": "form-select"})
|
|
else:
|
|
widget = ButtonToggleSelect(attrs={"class": "btn-group btn-group-toggle"})
|
|
self.fields[param.key] = forms.ModelChoiceField(
|
|
queryset=queryset,
|
|
widget=widget,
|
|
)
|
|
|
|
def __init__(
|
|
self, template: ProductTemplate, *args, **kwargs
|
|
):
|
|
self.template = template
|
|
super().__init__(*args, **kwargs)
|
|
self._create_dynamic_fields(template)
|
|
|
|
def get_product(self):
|
|
params = list(self.cleaned_data.values())
|
|
return Product.objects.get_or_create_by_params(template=self.template, params=params)
|