forked from CGM_Public/pretix_original
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:
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user