Allow plugins to disable and pre-fill questions and contact form fields (#1824)

Co-authored-by: Raphael Michel <michel@rami.io>
Co-authored-by: Raphael Michel <mail@raphaelmichel.de>
This commit is contained in:
Martin Gross
2020-10-26 09:30:16 +01:00
committed by GitHub
parent c2069663f3
commit 4fed690209
5 changed files with 143 additions and 6 deletions

View File

@@ -14,6 +14,7 @@ from pretix.base.models import (
CartPosition, InvoiceAddress, OrderPosition, Question, QuestionAnswer,
QuestionOption,
)
from pretix.presale.signals import contact_form_fields_overrides
class BaseQuestionsViewMixin:
@@ -34,6 +35,9 @@ class BaseQuestionsViewMixin:
def _positions_for_questions(self):
raise NotImplementedError()
def get_question_override_sets(self, position):
return []
@cached_property
def forms(self):
"""
@@ -62,6 +66,23 @@ class BaseQuestionsViewMixin:
self.request.event.settings.attendee_addresses_asked
))
)
override_sets = self.get_question_override_sets(cr)
for overrides in override_sets:
for question_name, question_field in form.fields.items():
if hasattr(question_field, 'question'):
if question_field.question.identifier in overrides:
if 'initial' in overrides[question_field.question.identifier]:
question_field.initial = overrides[question_field.question.identifier]['initial']
if 'disabled' in overrides[question_field.question.identifier]:
question_field.disabled = overrides[question_field.question.identifier]['disabled']
else:
if question_name in overrides:
if 'initial' in overrides[question_name]:
question_field.initial = overrides[question_name]['initial']
if 'disabled' in overrides[question_name]:
question_field.disabled = overrides[question_name]['disabled']
if len(form.fields) > 0:
formlist.append(form)
return formlist
@@ -213,24 +234,47 @@ class OrderQuestionsViewMixin(BaseQuestionsViewMixin):
self.order.total != Decimal('0.00') or not self.request.event.settings.invoice_address_not_asked_free
)
@cached_property
def _contact_override_sets(self):
override_sets = [
resp for recv, resp in contact_form_fields_overrides.send(
self.request.event,
request=self.request,
order=self.order,
)
]
for override in override_sets:
for k in override:
# We don't want initial values to be modified, they should come from the order directly
override[k].pop('initial', None)
return override_sets
@cached_property
def invoice_form(self):
if not self.address_asked and self.request.event.settings.invoice_name_required:
return self.invoice_name_form_class(
f = self.invoice_name_form_class(
data=self.request.POST if self.request.method == "POST" else None,
event=self.request.event,
instance=self.invoice_address, validate_vat_id=False,
all_optional=self.all_optional
)
if self.address_asked:
return self.invoice_form_class(
elif self.address_asked:
f = self.invoice_form_class(
data=self.request.POST if self.request.method == "POST" else None,
event=self.request.event,
instance=self.invoice_address, validate_vat_id=False,
all_optional=self.all_optional,
)
else:
return forms.Form(data=self.request.POST if self.request.method == "POST" else None)
f = forms.Form(data=self.request.POST if self.request.method == "POST" else None)
override_sets = self._contact_override_sets
for overrides in override_sets:
for fname, val in overrides.items():
if 'disabled' in val and fname in f.fields:
f.fields[fname].disabled = val['disabled']
return f
def get_context_data(self, **kwargs):
ctx = super().get_context_data(**kwargs)