This commit is contained in:
@@ -0,0 +1,35 @@
|
||||
from django import forms
|
||||
from django.core.exceptions import ValidationError
|
||||
|
||||
from shop.models import ProductVariant
|
||||
|
||||
|
||||
class ProductVariantForm(forms.ModelForm):
|
||||
class Meta:
|
||||
model = ProductVariant
|
||||
fields = ('sku', 'stock', 'attribute_values')
|
||||
widgets = {'attribute_values': forms.CheckboxSelectMultiple}
|
||||
|
||||
def __init__(self, *args, product=None, **kwargs):
|
||||
super().__init__(*args, **kwargs)
|
||||
self.product = product or self.instance.product
|
||||
|
||||
def clean(self):
|
||||
cleaned_data = super().clean()
|
||||
attribute_values = cleaned_data.get('attribute_values')
|
||||
|
||||
if attribute_values is not None:
|
||||
combination = set(attribute_values.values_list('pk', flat=True))
|
||||
siblings = ProductVariant.objects.filter(product=self.product).exclude(pk=self.instance.pk)
|
||||
|
||||
for sibling in siblings:
|
||||
if set(sibling.attribute_values.values_list('pk', flat=True)) == combination:
|
||||
raise ValidationError(
|
||||
'Ya existe una variante de este producto con la misma combinación de atributos.'
|
||||
)
|
||||
|
||||
return cleaned_data
|
||||
|
||||
def save(self, commit=True):
|
||||
self.instance.product = self.product
|
||||
return super().save(commit=commit)
|
||||
Reference in New Issue
Block a user