Esempio n. 1
0
    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)
Esempio n. 2
0
 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
Esempio n. 3
0
    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
Esempio n. 4
0
 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)
Esempio n. 5
0
 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)
Esempio n. 6
0
    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
Esempio n. 7
0
    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
Esempio n. 8
0
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
Esempio n. 9
0
    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,
            )