def __init__(self, event, **kwargs): super().__init__(**kwargs) self.fields[ 'submission_type'].queryset = SubmissionType.objects.filter( event=event) if not self.instance.pk: self.fields['speaker'] = forms.CharField(help_text=_( 'The email address of the speaker holding the talk. They will be invited to create an account.' )) self.fields['speaker_name'] = forms.CharField(help_text=_( 'The name of the speaker that should be displayed publicly.')) self.fields['abstract'].widget.attrs['rows'] = 2 for key in { 'abstract', 'description', 'notes', 'image', 'do_not_record' }: request = event.settings.get(f'cfp_request_{key}') require = event.settings.get(f'cfp_require_{key}') if not request: self.fields.pop(key) else: self.fields[key].required = require min_value = event.settings.get(f'cfp_{key}_min_length') max_value = event.settings.get(f'cfp_{key}_max_length') if min_value: self.fields[key].widget.attrs[f'minlength'] = min_value if max_value: self.fields[key].widget.attrs[f'maxlength'] = max_value self.fields[key].help_text = get_help_text( self.fields[key].help_text, min_value, max_value)
def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) count_chars = self.event.settings.cfp_count_length_in == 'chars' for key in self.Meta.request_require: request = self.event.settings.get(f'cfp_request_{key}') require = self.event.settings.get(f'cfp_require_{key}') if not request: self.fields.pop(key) else: field = self.fields[key] field.required = require min_value = self.event.settings.get(f'cfp_{key}_min_length') max_value = self.event.settings.get(f'cfp_{key}_max_length') if min_value or max_value: if min_value and count_chars: field.widget.attrs[f'minlength'] = min_value if max_value and count_chars: field.widget.attrs[f'maxlength'] = max_value field.validators.append( partial( validate_field_length, min_length=min_value, max_length=max_value, count_in=self.event.settings.cfp_count_length_in, ) ) field.original_help_text = getattr(field, 'original_help_text', '') field.added_help_text = get_help_text( '', min_value, max_value, self.event.settings.cfp_count_length_in, ) field.help_text = field.original_help_text + ' ' + field.added_help_text
def __init__(self, event, **kwargs): self.event = event self.readonly = kwargs.pop('readonly', False) instance = kwargs.get('instance') initial = kwargs.pop('initial', {}) initial['submission_type'] = getattr( instance, 'submission_type', self.event.cfp.default_type ) initial['content_locale'] = getattr( instance, 'content_locale', self.event.locale ) super().__init__(initial=initial, **kwargs) self.fields['abstract'].widget.attrs['rows'] = 2 for key in {'abstract', 'description', 'notes', 'image', 'do_not_record'}: request = event.settings.get(f'cfp_request_{key}') require = event.settings.get(f'cfp_require_{key}') if not request: self.fields.pop(key) else: self.fields[key].required = require min_value = event.settings.get(f'cfp_{key}_min_length') max_value = event.settings.get(f'cfp_{key}_max_length') if min_value: self.fields[key].widget.attrs[f'minlength'] = min_value if max_value: self.fields[key].widget.attrs[f'maxlength'] = max_value self.fields[key].help_text = get_help_text( self.fields[key].help_text, min_value, max_value ) self.fields['submission_type'].queryset = SubmissionType.objects.filter( event=self.event ) _now = now() if ( not self.event.cfp.deadline or self.event.cfp.deadline >= _now ): # No global deadline or still open types = self.event.submission_types.exclude(deadline__lt=_now) else: types = self.event.submission_types.filter(deadline__gte=_now) pks = set(types.values_list('pk', flat=True)) if instance and instance.pk: pks |= {instance.submission_type.pk} self.fields['submission_type'].queryset = self.event.submission_types.filter( pk__in=pks ) locale_names = dict(settings.LANGUAGES) self.fields['content_locale'].choices = [ (a, locale_names[a]) for a in self.event.locales ] if self.readonly: for f in self.fields.values(): f.disabled = True
def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) for key in self.Meta.request_require: request = self.event.settings.get(f'cfp_request_{key}') require = self.event.settings.get(f'cfp_require_{key}') if not request: self.fields.pop(key) else: self.fields[key].required = require min_value = self.event.settings.get(f'cfp_{key}_min_length') max_value = self.event.settings.get(f'cfp_{key}_max_length') if min_value: self.fields[key].widget.attrs[f'minlength'] = min_value if max_value: self.fields[key].widget.attrs[f'maxlength'] = max_value self.fields[key].help_text = get_help_text( self.fields[key].help_text, min_value, max_value)
def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) count_chars = self.event.settings.cfp_count_length_in == "chars" for key in self.Meta.request_require: request = self.event.settings.get(f"cfp_request_{key}") require = self.event.settings.get(f"cfp_require_{key}") if not request and not require: self.fields.pop(key) else: field = self.fields[key] field.required = require min_value = self.event.settings.get(f"cfp_{key}_min_length") max_value = self.event.settings.get(f"cfp_{key}_max_length") if min_value or max_value: if min_value and count_chars: field.widget.attrs["minlength"] = min_value if max_value and count_chars: field.widget.attrs["maxlength"] = max_value field.validators.append( partial( validate_field_length, min_length=min_value, max_length=max_value, count_in=self.event.settings.cfp_count_length_in, )) field.original_help_text = getattr(field, "original_help_text", "") field.added_help_text = get_help_text( "", min_value, max_value, self.event.settings.cfp_count_length_in, ) field.help_text = (field.original_help_text + " " + field.added_help_text)
def get_field(self, *, question, initial, initial_object, readonly): from pretalx.submission.models import QuestionVariant original_help_text = question.help_text help_text = rich_text(question.help_text) if question.is_public and self.event.settings.show_schedule: help_text += " " + str(phrases.base.public_content) count_chars = self.event.settings.cfp_count_length_in == "chars" if question.variant == QuestionVariant.BOOLEAN: # For some reason, django-bootstrap4 does not set the required attribute # itself. widget = (forms.CheckboxInput(attrs={ "required": "required", "placeholder": "" }) if question.required else forms.CheckboxInput()) field = forms.BooleanField( disabled=readonly, help_text=help_text, label=question.question, required=question.required, widget=widget, initial=(initial == "True") if initial else bool(question.default_answer), ) field.original_help_text = original_help_text return field if question.variant == QuestionVariant.NUMBER: field = forms.DecimalField( disabled=readonly, help_text=help_text, label=question.question, required=question.required, min_value=Decimal("0.00"), initial=initial, ) field.original_help_text = original_help_text field.widget.attrs["placeholder"] = "" # XSS return field if question.variant == QuestionVariant.STRING: field = forms.CharField( disabled=readonly, help_text=get_help_text( help_text, question.min_length, question.max_length, self.event.settings.cfp_count_length_in, ), label=question.question, required=question.required, initial=initial, min_length=question.min_length if count_chars else None, max_length=question.max_length if count_chars else None, ) field.original_help_text = original_help_text field.widget.attrs["placeholder"] = "" # XSS field.validators.append( partial( validate_field_length, min_length=question.min_length, max_length=question.max_length, count_in=self.event.settings.cfp_count_length_in, )) return field if question.variant == QuestionVariant.TEXT: field = forms.CharField( label=question.question, required=question.required, widget=forms.Textarea, disabled=readonly, help_text=get_help_text( help_text, question.min_length, question.max_length, self.event.settings.cfp_count_length_in, ), initial=initial, min_length=question.min_length if count_chars else None, max_length=question.max_length if count_chars else None, ) field.validators.append( partial( validate_field_length, min_length=question.min_length, max_length=question.max_length, count_in=self.event.settings.cfp_count_length_in, )) field.original_help_text = original_help_text field.widget.attrs["placeholder"] = "" # XSS return field if question.variant == QuestionVariant.FILE: field = SizeFileField( label=question.question, required=question.required, disabled=readonly, help_text=help_text, initial=initial, ) field.original_help_text = original_help_text field.widget.attrs["placeholder"] = "" # XSS return field if question.variant == QuestionVariant.CHOICES: choices = question.options.all() field = forms.ModelChoiceField( queryset=choices, label=question.question, required=question.required, empty_label=None, initial=initial_object.options.first() if initial_object else question.default_answer, disabled=readonly, help_text=help_text, widget=forms.RadioSelect if len(choices) < 4 else None, ) field.original_help_text = original_help_text field.widget.attrs["placeholder"] = "" # XSS return field if question.variant == QuestionVariant.MULTIPLE: field = forms.ModelMultipleChoiceField( queryset=question.options.all(), label=question.question, required=question.required, widget=forms.CheckboxSelectMultiple, initial=initial_object.options.all() if initial_object else question.default_answer, disabled=readonly, help_text=help_text, ) field.original_help_text = original_help_text field.widget.attrs["placeholder"] = "" # XSS return field return None
def get_field(self, *, question, initial, initial_object, readonly): help_text = rich_text(question.help_text) if question.is_public: help_text += ' ' + str(phrases.base.public_content) count_chars = self.event.settings.cfp_count_length_in == 'chars' if question.variant == QuestionVariant.BOOLEAN: # For some reason, django-bootstrap4 does not set the required attribute # itself. widget = ( forms.CheckboxInput(attrs={'required': 'required', 'placeholder': ''}) if question.required else forms.CheckboxInput() ) return forms.BooleanField( disabled=readonly, help_text=help_text, label=question.question, required=question.required, widget=widget, initial=(initial == 'True') if initial else bool(question.default_answer), ) if question.variant == QuestionVariant.NUMBER: field = forms.DecimalField( disabled=readonly, help_text=help_text, label=question.question, required=question.required, min_value=Decimal('0.00'), initial=initial, ) field.widget.attrs['placeholder'] = '' # XSS return field if question.variant == QuestionVariant.STRING: field = forms.CharField( disabled=readonly, help_text=get_help_text( help_text, question.min_length, question.max_length, self.event.settings.cfp_count_length_in, ), label=question.question, required=question.required, initial=initial, min_length=question.min_length if count_chars else None, max_length=question.max_length if count_chars else None, ) field.widget.attrs['placeholder'] = '' # XSS field.validators.append( partial( validate_field_length, min_length=question.min_length, max_length=question.max_length, count_in=self.event.settings.cfp_count_length_in, ) ) return field if question.variant == QuestionVariant.TEXT: field = forms.CharField( label=question.question, required=question.required, widget=forms.Textarea, disabled=readonly, help_text=get_help_text( help_text, question.min_length, question.max_length, self.event.settings.cfp_count_length_in, ), initial=initial, min_length=question.min_length if count_chars else None, max_length=question.max_length if count_chars else None, ) field.validators.append( partial( validate_field_length, min_length=question.min_length, max_length=question.max_length, count_in=self.event.settings.cfp_count_length_in, ) ) field.widget.attrs['placeholder'] = '' # XSS return field if question.variant == QuestionVariant.FILE: field = forms.FileField( label=question.question, required=question.required, disabled=readonly, help_text=help_text, initial=initial, ) field.widget.attrs['placeholder'] = '' # XSS return field if question.variant == QuestionVariant.CHOICES: field = forms.ModelChoiceField( queryset=question.options.all(), label=question.question, required=question.required, initial=initial_object.options.first() if initial_object else question.default_answer, disabled=readonly, help_text=help_text, ) field.widget.attrs['placeholder'] = '' # XSS return field if question.variant == QuestionVariant.MULTIPLE: field = forms.ModelMultipleChoiceField( queryset=question.options.all(), label=question.question, required=question.required, widget=forms.CheckboxSelectMultiple, initial=initial_object.options.all() if initial_object else question.default_answer, disabled=readonly, help_text=help_text, ) field.widget.attrs['placeholder'] = '' # XSS return field return None
def test_get_text_length_help_text(text, min_length, max_length, _type, warning): assert get_help_text(text, min_length, max_length, _type) == warning
def get_field(self, *, question, initial, initial_object, readonly): if question.variant == QuestionVariant.BOOLEAN: # For some reason, django-bootstrap4 does not set the required attribute # itself. widget = (forms.CheckboxInput(attrs={'required': 'required'}) if question.required else forms.CheckboxInput()) initialbool = ((initial == 'True') if initial else bool(question.default_answer)) return forms.BooleanField( disabled=readonly, help_text=question.help_text, label=question.question, required=question.required, widget=widget, initial=initialbool, ) elif question.variant == QuestionVariant.NUMBER: return forms.DecimalField( disabled=readonly, help_text=question.help_text, label=question.question, required=question.required, min_value=Decimal('0.00'), initial=initial, ) elif question.variant == QuestionVariant.STRING: return forms.CharField( disabled=readonly, help_text=get_help_text(question.help_text, question.min_length, question.max_length), label=question.question, required=question.required, initial=initial, min_length=question.min_length, max_length=question.max_length, ) elif question.variant == QuestionVariant.TEXT: return forms.CharField( label=question.question, required=question.required, widget=forms.Textarea, disabled=readonly, help_text=get_help_text(question.help_text, question.min_length, question.max_length), initial=initial, min_length=question.min_length, max_length=question.max_length, ) elif question.variant == QuestionVariant.FILE: return forms.FileField( label=question.question, required=question.required, disabled=readonly, help_text=question.help_text, initial=initial, ) elif question.variant == QuestionVariant.CHOICES: return forms.ModelChoiceField( queryset=question.options.all(), label=question.question, required=question.required, initial=initial_object.options.first() if initial_object else question.default_answer, disabled=readonly, help_text=question.help_text, ) elif question.variant == QuestionVariant.MULTIPLE: return forms.ModelMultipleChoiceField( queryset=question.options.all(), label=question.question, required=question.required, widget=forms.CheckboxSelectMultiple, initial=initial_object.options.all() if initial_object else question.default_answer, disabled=readonly, help_text=question.help_text, )