From cf5ac6af4b8317c40b325e7df5786d520c4e0a8c Mon Sep 17 00:00:00 2001 From: Martin Gross Date: Mon, 9 Dec 2019 13:55:26 +0100 Subject: [PATCH] Organizer-level override for giftcard code length --- src/pretix/base/models/giftcards.py | 11 ++++++++--- src/pretix/base/settings.py | 4 ++++ src/pretix/control/forms/organizer.py | 6 ++++++ .../templates/pretixcontrol/organizers/edit.html | 1 + 4 files changed, 19 insertions(+), 3 deletions(-) diff --git a/src/pretix/base/models/giftcards.py b/src/pretix/base/models/giftcards.py index 424167a720..58fad4e950 100644 --- a/src/pretix/base/models/giftcards.py +++ b/src/pretix/base/models/giftcards.py @@ -10,10 +10,10 @@ from pretix.base.banlist import banned from pretix.base.models import LoggedModel -def gen_giftcard_secret(): +def gen_giftcard_secret(length): charset = list('ABCDEFGHJKLMNPQRSTUVWXYZ3789') while True: - code = get_random_string(length=settings.ENTROPY['giftcard_secret'], allowed_chars=charset) + code = get_random_string(length=length, allowed_chars=charset) if not banned(code) and not GiftCard.objects.filter(secret=code).exists(): return code @@ -48,7 +48,6 @@ class GiftCard(LoggedModel): ) secret = models.CharField( max_length=190, - default=gen_giftcard_secret, db_index=True, verbose_name=_('Gift card code'), ) @@ -69,6 +68,12 @@ class GiftCard(LoggedModel): def accepted_by(self, organizer): return self.issuer == organizer or GiftCardAcceptance.objects.filter(issuer=self.issuer, collector=organizer).exists() + def save(self, *args, **kwargs): + if not self.secret: + self.secret = gen_giftcard_secret(self.issuer.settings.giftcard_length) + + super().save(*args, **kwargs) + class Meta: unique_together = (('secret', 'issuer'),) diff --git a/src/pretix/base/settings.py b/src/pretix/base/settings.py index c87cf874d0..72ad0440ee 100644 --- a/src/pretix/base/settings.py +++ b/src/pretix/base/settings.py @@ -746,6 +746,10 @@ Your {event} team""")) 'name_scheme': { 'default': 'full', 'type': str + }, + 'giftcard_length': { + 'default': settings.ENTROPY['giftcard_secret'], + 'type': int } } PERSON_NAME_TITLE_GROUPS = OrderedDict([ diff --git a/src/pretix/control/forms/organizer.py b/src/pretix/control/forms/organizer.py index faff0080f4..4aca838d02 100644 --- a/src/pretix/control/forms/organizer.py +++ b/src/pretix/control/forms/organizer.py @@ -302,6 +302,12 @@ class OrganizerSettingsForm(SettingsForm): help_text=_('If you provide a favicon, we will show it instead of the default pretix icon. ' 'We recommend a size of at least 200x200px to accomodate most devices.') ) + giftcard_length = forms.IntegerField( + label=_('Length of gift card codes'), + help_text=_('The system generates by default {}-character long gift card codes. However, if a different length ' + 'is required, it can be set here.'.format(settings.ENTROPY['giftcard_secret'])), + required=False + ) def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) diff --git a/src/pretix/control/templates/pretixcontrol/organizers/edit.html b/src/pretix/control/templates/pretixcontrol/organizers/edit.html index dad07d10f8..7a2c64a997 100644 --- a/src/pretix/control/templates/pretixcontrol/organizers/edit.html +++ b/src/pretix/control/templates/pretixcontrol/organizers/edit.html @@ -32,6 +32,7 @@ {% endif %} {% bootstrap_field sform.organizer_info_text layout="control" %} {% bootstrap_field sform.event_team_provisioning layout="control" %} + {% bootstrap_field sform.giftcard_length layout="control" %}
{% trans "Organizer page" %}