def clean(self): data = super().clean() selected = set() for k, v in data.items(): if v is True: selected.add((self.fields[k].item, None)) elif v: selected.add((self.fields[k].item, self.vars_cache.get(int(v)))) if len(selected) > self.iao.max_count: # TODO: Proper pluralization raise ValidationError( _(error_messages['addon_max_count']), 'addon_max_count', { 'base': str(self.iao.base_item.name), 'max': self.iao.max_count, 'cat': str(self.iao.addon_category.name), } ) elif len(selected) < self.iao.min_count: # TODO: Proper pluralization raise ValidationError( _(error_messages['addon_min_count']), 'addon_min_count', { 'base': str(self.iao.base_item.name), 'min': self.iao.min_count, 'cat': str(self.iao.addon_category.name), } ) try: validate_cart_addons.send(sender=self.event, addons=selected, base_position=self.base_position, iao=self.iao) except CartError as e: raise ValidationError(str(e))
def _clean_category(self, form, category): selected = {} for i in category['items']: if i.has_variations: for v in i.available_variations: val = int( self.request.POST.get( f'cp_{form["cartpos"].pk}_variation_{i.pk}_{v.pk}') or '0') price = self.request.POST.get( f'cp_{form["cartpos"].pk}_variation_{i.pk}_{v.pk}_price' ) or '0' if val: selected[i, v] = val, price else: val = int( self.request.POST.get( f'cp_{form["cartpos"].pk}_item_{i.pk}') or '0') price = self.request.POST.get( f'cp_{form["cartpos"].pk}_item_{i.pk}_price') or '0' if val: selected[i, None] = val, price if sum(a[0] for a in selected.values()) > category['max_count']: # TODO: Proper pluralization raise ValidationError( _(error_messages['addon_max_count']), 'addon_max_count', { 'base': str(form['item'].name), 'max': category['max_count'], 'cat': str(category['category'].name), }) elif sum(a[0] for a in selected.values()) < category['min_count']: # TODO: Proper pluralization raise ValidationError( _(error_messages['addon_min_count']), 'addon_min_count', { 'base': str(form['item'].name), 'min': category['min_count'], 'cat': str(category['category'].name), }) elif any( sum(v[0] for k, v in selected.items() if k[0] == i) > 1 for i in category['items']) and not category['multi_allowed']: raise ValidationError( _(error_messages['addon_no_multi']), 'addon_no_multi', { 'base': str(form['item'].name), 'cat': str(category['category'].name), }) try: validate_cart_addons.send( sender=self.event, addons={k: v[0] for k, v in selected.items()}, base_position=form["cartpos"], iao=category['iao']) except CartError as e: raise ValidationError(str(e)) return selected