Exemplo n.º 1
0
 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))
Exemplo n.º 2
0
    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