from postgresqleu.confreg.models import ConferenceAdditionalOption, ConferenceFeedbackQuestion
from postgresqleu.confreg.models import ConferenceSession, Track, Room
from postgresqleu.confreg.models import ConferenceSessionScheduleSlot, VolunteerSlot
+from postgresqleu.confreg.models import DiscountCode
from postgresqleu.confreg.models import valid_status_transitions, get_status_string
model = ConferenceFeedbackQuestion
fields = ['question', 'isfreetext', 'textchoices', 'sortkey', 'newfieldset']
+
+class BackendNewDiscountCodeForm(django.forms.Form):
+ codetype = django.forms.ChoiceField(choices=((1, 'Fixed amount discount'), (2, 'Percentage discount')))
+
+ def get_newform_data(self):
+ return self.cleaned_data['codetype']
+
+class BackendDiscountCodeForm(BackendForm):
+ list_fields = ['code', 'validuntil', 'maxuses']
+
+ form_before_new = BackendNewDiscountCodeForm
+
+ exclude_date_validators = ['validuntil', ]
+
+ class Meta:
+ model = DiscountCode
+ fields = ['code', 'discountamount', 'discountpercentage', 'regonly', 'validuntil', 'maxuses',
+ 'requiresregtype', 'requiresoption']
+
+ def fix_fields(self):
+ if self.newformdata == "1" and not self.instance.discountamount:
+ self.instance.discountamount = 1
+ elif self.newformdata == "2" and not self.instance.discountpercentage:
+ self.instance.discountpercentage = 1
+
+ if self.instance.discountamount:
+ # Fixed amount discount
+ del self.fields['discountpercentage']
+ del self.fields['regonly']
+ self.fields['discountamount'].validators.append(MinValueValidator(1))
+ else:
+ # Percentage discount
+ del self.fields['discountamount']
+ self.fields['discountpercentage'].validators.extend([
+ MinValueValidator(1),
+ MaxValueValidator(99),
+ ])
+ self.fields['maxuses'].validators.append(MinValueValidator(0))
+
+ self.fields['requiresregtype'].queryset = RegistrationType.objects.filter(conference=self.conference)
+ self.fields['requiresoption'].queryset = ConferenceAdditionalOption.objects.filter(conference=self.conference).exclude(pk=self.instance.pk)
+
+ self.update_protected_fields()
from backendforms import BackendRegistrationDayForm, BackendAdditionalOptionForm
from backendforms import BackendTrackForm, BackendRoomForm, BackendConferenceSessionForm
from backendforms import BackendConferenceSessionSlotForm, BackendVolunteerSlotForm
-from backendforms import BackendFeedbackQuestionForm
+from backendforms import BackendFeedbackQuestionForm, BackendDiscountCodeForm
def get_authenticated_conference(request, urlname):
if not request.user.is_authenticated:
rest,
allow_new=True,
allow_delete=True)
+
+def edit_discountcodes(request, urlname, rest):
+ return backend_list_editor(request,
+ urlname,
+ BackendDiscountCodeForm,
+ rest,
+ allow_new=True,
+ allow_delete=True)
migrations.AlterField(
model_name='discountcode',
name='discountamount',
- field=models.DecimalField(max_digits=10, decimal_places=2),
+ field=models.DecimalField(max_digits=10, decimal_places=2, default=0),
),
migrations.AlterField(
model_name='registrationtype',
class DiscountCode(models.Model):
conference = models.ForeignKey(Conference, null=False, blank=False)
code = models.CharField(max_length=100, null=False, blank=False)
- discountamount = models.DecimalField(decimal_places=2, max_digits=10, null=False)
+ discountamount = models.DecimalField(decimal_places=2, max_digits=10, null=False, default=0)
discountpercentage = models.IntegerField(null=False, blank=False, default=0)
regonly = models.BooleanField(null=False, blank=False, default=False, help_text="Apply percentage discount only to the registration cost, not additional options. By default, it's applied to both.")
validuntil = models.DateField(blank=True, null=True)
url(r'^events/admin/(\w+)/scheduleslots/(.*/)?$', postgresqleu.confreg.backendviews.edit_scheduleslots),
url(r'^events/admin/(\w+)/volunteerslots/(.*/)?$', postgresqleu.confreg.backendviews.edit_volunteerslots),
url(r'^events/admin/(\w+)/feedbackquestions/(.*/)?$', postgresqleu.confreg.backendviews.edit_feedbackquestions),
+ url(r'^events/admin/(\w+)/discountcodes/(.*/)?$', postgresqleu.confreg.backendviews.edit_discountcodes),
url(r'^events/sponsor/', include('postgresqleu.confsponsor.urls')),
<h2>Prepaid vouchers and discount codes</h2>
<div class="row">
<div class="col-md-3 col-sm-6 col-xs-12 buttonrow"><a class="btn btn-default btn-block" href="/events/admin/{{c.urlname}}/prepaid/list/">Prepaid vouchers</a></div>
- <div class="col-md-3 col-sm-6 col-xs-12 buttonrow"><a class="btn btn-default btn-block" href="/admin/confreg/discountcode/?conference__id__exact={{c.id}}">Discount codes</a></div>
+ <div class="col-md-3 col-sm-6 col-xs-12 buttonrow"><a class="btn btn-default btn-block" href="/events/admin/{{c.urlname}}/discountcodes/">Discount codes</a></div>
</div>
<h2>Metadata</h2>