Пример #1
0
    def clean(self):
        data = super().clean()

        if not self._errors:
            itemid = quotaid = None
            iv = self.data.get('itemvar', '')
            if iv.startswith('q-'):
                quotaid = iv[2:]
            elif '-' in iv:
                itemid, varid = iv.split('-')
            else:
                itemid, varid = iv, None

            if itemid:
                self.instance.item = Item.objects.get(
                    pk=itemid, event=self.instance.event)
                if varid:
                    self.instance.variation = ItemVariation.objects.get(
                        pk=varid, item=self.instance.item)
                else:
                    self.instance.variation = None
                self.instance.quota = None

            else:
                self.instance.quota = Quota.objects.get(
                    pk=quotaid, event=self.instance.event)
                self.instance.item = None
                self.instance.variation = None

        if 'codes' in data:
            data['codes'] = [
                a.strip() for a in data.get('codes', '').strip().split("\n")
                if a
            ]
            cnt = len(data['codes']) * data['max_usages']
        else:
            cnt = data['max_usages']

        Voucher.clean_item_properties(data, self.instance.event,
                                      self.instance.quota, self.instance.item,
                                      self.instance.variation)
        Voucher.clean_subevent(data, self.instance.event)
        Voucher.clean_max_usages(data, self.instance.redeemed)
        check_quota = Voucher.clean_quota_needs_checking(
            data,
            self.initial_instance_data,
            item_changed=data.get('itemvar') != self.initial.get('itemvar'),
            creating=not self.instance.pk)
        if check_quota:
            Voucher.clean_quota_check(data, cnt, self.initial_instance_data,
                                      self.instance.event, self.instance.quota,
                                      self.instance.item,
                                      self.instance.variation)
        Voucher.clean_voucher_code(data, self.instance.event, self.instance.pk)

        voucher_form_validation.send(sender=self.instance.event,
                                     form=self,
                                     data=data)

        return data
Пример #2
0
    def clean(self):
        data = super().clean()

        if not self._errors:
            try:
                itemid = quotaid = None
                iv = self.data.get('itemvar', '')
                if iv.startswith('q-'):
                    quotaid = iv[2:]
                elif '-' in iv:
                    itemid, varid = iv.split('-')
                else:
                    itemid, varid = iv, None

                if itemid:
                    self.instance.item = self.instance.event.items.get(pk=itemid)
                    if varid:
                        self.instance.variation = self.instance.item.variations.get(pk=varid)
                    else:
                        self.instance.variation = None
                    self.instance.quota = None

                else:
                    self.instance.quota = self.instance.event.quotas.get(pk=quotaid)
                    self.instance.item = None
                    self.instance.variation = None
            except ObjectDoesNotExist:
                raise ValidationError(_("Invalid product selected."))

        if 'codes' in data:
            data['codes'] = [a.strip() for a in data.get('codes', '').strip().split("\n") if a]
            cnt = len(data['codes']) * data.get('max_usages', 0)
        else:
            cnt = data['max_usages']

        Voucher.clean_item_properties(
            data, self.instance.event,
            self.instance.quota, self.instance.item, self.instance.variation
        )
        Voucher.clean_subevent(
            data, self.instance.event
        )
        Voucher.clean_max_usages(data, self.instance.redeemed)
        check_quota = Voucher.clean_quota_needs_checking(
            data, self.initial_instance_data,
            item_changed=data.get('itemvar') != self.initial.get('itemvar'),
            creating=not self.instance.pk
        )
        if check_quota:
            Voucher.clean_quota_check(
                data, cnt, self.initial_instance_data, self.instance.event,
                self.instance.quota, self.instance.item, self.instance.variation
            )
        Voucher.clean_voucher_code(data, self.instance.event, self.instance.pk)

        voucher_form_validation.send(sender=self.instance.event, form=self, data=data)

        return data
Пример #3
0
    def clean(self):
        data = super().clean()

        if not self._errors:
            try:
                itemid = quotaid = None
                iv = self.data.get('itemvar', '')
                if iv.startswith('q-'):
                    quotaid = iv[2:]
                elif '-' in iv:
                    itemid, varid = iv.split('-')
                else:
                    itemid, varid = iv, None

                if itemid:
                    self.instance.item = self.instance.event.items.get(
                        pk=itemid)
                    if varid:
                        self.instance.variation = self.instance.item.variations.get(
                            pk=varid)
                    else:
                        self.instance.variation = None
                    self.instance.quota = None

                else:
                    self.instance.quota = self.instance.event.quotas.get(
                        pk=quotaid)
                    self.instance.item = None
                    self.instance.variation = None
            except ObjectDoesNotExist:
                raise ValidationError(_("Invalid product selected."))

        if 'codes' in data:
            data['codes'] = [
                a.strip() for a in data.get('codes', '').strip().split("\n")
                if a
            ]
            cnt = len(data['codes']) * data.get('max_usages', 0)
        else:
            cnt = data.get('max_usages', 0)

        Voucher.clean_item_properties(data, self.instance.event,
                                      self.instance.quota, self.instance.item,
                                      self.instance.variation)
        if not self.instance.show_hidden_items and (
            (self.instance.quota
             and all(i.hide_without_voucher
                     for i in self.instance.quota.items.all())) or
            (self.instance.item and self.instance.item.hide_without_voucher)):
            raise ValidationError({
                'show_hidden_items': [
                    _('The voucher only matches hidden products but you have not selected that it should show '
                      'them.')
                ]
            })
        Voucher.clean_subevent(data, self.instance.event)
        Voucher.clean_max_usages(data, self.instance.redeemed)
        check_quota = Voucher.clean_quota_needs_checking(
            data,
            self.initial_instance_data,
            item_changed=data.get('itemvar') != self.initial.get('itemvar'),
            creating=not self.instance.pk)
        if check_quota:
            Voucher.clean_quota_check(data, cnt, self.initial_instance_data,
                                      self.instance.event, self.instance.quota,
                                      self.instance.item,
                                      self.instance.variation)
        Voucher.clean_voucher_code(data, self.instance.event, self.instance.pk)

        voucher_form_validation.send(sender=self.instance.event,
                                     form=self,
                                     data=data)

        return data
Пример #4
0
    def clean(self):
        data = super().clean()

        if not self._errors:
            itemid = quotaid = None
            iv = self.data.get('itemvar', '')
            if iv.startswith('q-'):
                quotaid = iv[2:]
            elif '-' in iv:
                itemid, varid = iv.split('-')
            else:
                itemid, varid = iv, None

            if itemid:
                self.instance.item = Item.objects.get(
                    pk=itemid, event=self.instance.event)
                if varid:
                    self.instance.variation = ItemVariation.objects.get(
                        pk=varid, item=self.instance.item)
                else:
                    self.instance.variation = None
                self.instance.quota = None

                if self.instance.item.category and self.instance.item.category.is_addon:
                    raise ValidationError(
                        _('It is currently not possible to create vouchers for add-on products.'
                          ))
            else:
                self.instance.quota = Quota.objects.get(
                    pk=quotaid, event=self.instance.event)
                self.instance.item = None
                self.instance.variation = None

        if data.get('max_usages', 0) < self.instance.redeemed:
            raise ValidationError(_(
                'This voucher has already been redeemed %(redeemed)s times. You cannot reduce the maximum number of '
                'usages below this number.'),
                                  params={'redeemed': self.instance.redeemed})

        if 'codes' in data:
            data['codes'] = [
                a.strip() for a in data.get('codes', '').strip().split("\n")
                if a
            ]
            cnt = len(data['codes']) * data['max_usages']
        else:
            cnt = data['max_usages']

        if self.instance.event.has_subevents and data[
                'block_quota'] and not data.get('subevent'):
            raise ValidationError(
                pgettext_lazy(
                    'subevent',
                    'If you want this voucher to block quota, you need to select a specific date.'
                ))

        if self._clean_quota_needs_checking(data):
            self._clean_quota_check(data, cnt)

        if 'code' in data and Voucher.objects.filter(
                Q(code=data['code']) & Q(event=self.instance.event)
                & ~Q(pk=self.instance.pk)).exists():
            raise ValidationError(
                _('A voucher with this code already exists.'))

        voucher_form_validation.send(sender=self.instance.event,
                                     form=self,
                                     data=data)

        return data
Пример #5
0
    def clean(self):
        data = super().clean()

        if not self._errors:
            try:
                itemid = quotaid = None
                iv = self.data.get('itemvar', '')
                if iv.startswith('q-'):
                    quotaid = iv[2:]
                elif '-' in iv:
                    itemid, varid = iv.split('-')
                else:
                    itemid, varid = iv, None

                if itemid:
                    self.instance.item = self.instance.event.items.get(pk=itemid)
                    if varid:
                        self.instance.variation = self.instance.item.variations.get(pk=varid)
                    else:
                        self.instance.variation = None
                    self.instance.quota = None

                else:
                    self.instance.quota = self.instance.event.quotas.get(pk=quotaid)
                    self.instance.item = None
                    self.instance.variation = None
            except ObjectDoesNotExist:
                raise ValidationError(_("Invalid product selected."))

        if 'codes' in data:
            data['codes'] = [a.strip() for a in data.get('codes', '').strip().split("\n") if a]
            cnt = len(data['codes']) * data.get('max_usages', 0)
        else:
            cnt = data.get('max_usages', 0)

        Voucher.clean_item_properties(
            data, self.instance.event,
            self.instance.quota, self.instance.item, self.instance.variation
        )
        if self.instance.quota:
            if all(i.hide_without_voucher for i in self.instance.quota.items.all()):
                raise ValidationError({
                    'itemvar': [
                        _('The quota you selected only contains hidden products. Hidden products can currently only be '
                          'shown by using vouchers that directly apply to the product, not via a quota.')
                    ]
                })
        Voucher.clean_subevent(
            data, self.instance.event
        )
        Voucher.clean_max_usages(data, self.instance.redeemed)
        check_quota = Voucher.clean_quota_needs_checking(
            data, self.initial_instance_data,
            item_changed=data.get('itemvar') != self.initial.get('itemvar'),
            creating=not self.instance.pk
        )
        if check_quota:
            Voucher.clean_quota_check(
                data, cnt, self.initial_instance_data, self.instance.event,
                self.instance.quota, self.instance.item, self.instance.variation
            )
        Voucher.clean_voucher_code(data, self.instance.event, self.instance.pk)

        voucher_form_validation.send(sender=self.instance.event, form=self, data=data)

        return data