Пример #1
0
 def _update_cfp_help_text(self, field_name):
     field = self.fields.get(field_name)
     if not field or not self.field_configuration:
         return
     field_data = self.field_configuration.get(field_name) or {}
     field.original_help_text = field_data.get("help_text") or ""
     if field.original_help_text:
         field.help_text = rich_text(
             str(field.original_help_text)
             + " "
             + str(getattr(field, "added_help_text", ""))
         )
Пример #2
0
    def form_valid(self, form):
        preview = self.request.POST.get("action") == "preview"
        if preview:
            self.output = {}
            # Only approximate, good enough. Doesn't run deduplication, so it doesn't have to
            # run rendering for all placeholders for all people, either.
            result = form.get_recipient_submissions()
            if not len(result):
                messages.error(
                    self.request,
                    _("There are no proposals or sessions matching this selection."),
                )
                return self.get(self.request, *self.args, **self.kwargs)
            for locale in self.request.event.locales:
                with language(locale):
                    context_dict = TolerantDict()
                    for k, v in form.get_valid_placeholders().items():
                        context_dict[
                            k
                        ] = '<span class="placeholder" title="{}">{}</span>'.format(
                            _(
                                "This value will be replaced based on dynamic parameters."
                            ),
                            v.render_sample(self.request.event),
                        )

                    subject = bleach.clean(
                        form.cleaned_data["subject"].localize(locale), tags=[]
                    )
                    preview_subject = subject.format_map(context_dict)
                    message = form.cleaned_data["text"].localize(locale)
                    preview_text = rich_text(message.format_map(context_dict))

                    self.output[locale] = {
                        "subject": _("Subject: {subject}").format(
                            subject=preview_subject
                        ),
                        "html": preview_text,
                    }
                    self.mail_count = len(result)
            return self.get(self.request, *self.args, **self.kwargs)

        result = form.save()
        messages.success(
            self.request,
            _(
                "{count} emails have been saved to the outbox – you can make individual changes there or just send them all."
            ).format(count=len(result)),
        )
        return super().form_valid(form)
Пример #3
0
 def post(self, request, *args, **kwargs):
     event = request.event
     action = request.POST.get("action")
     if action == "activate":
         if event.is_public:
             messages.success(request, _("This event was already live."))
         else:
             responses = activate_event.send_robust(event, request=request)
             exceptions = [
                 response[1] for response in responses
                 if isinstance(response[1], Exception)
             ]
             if exceptions:
                 messages.error(
                     request,
                     mark_safe("\n".join(rich_text(e) for e in exceptions)),
                 )
             else:
                 event.is_public = True
                 event.save()
                 event.log_action(
                     "pretalx.event.activate",
                     person=self.request.user,
                     orga=True,
                     data={},
                 )
                 messages.success(request, _("This event is now public."))
                 for response in responses:
                     if isinstance(response[1], str):
                         messages.success(request, response[1])
     else:  # action == 'deactivate'
         if not event.is_public:
             messages.success(request, _("This event was already hidden."))
         else:
             event.is_public = False
             event.save()
             event.log_action(
                 "pretalx.event.deactivate",
                 person=self.request.user,
                 orga=True,
                 data={},
             )
             messages.success(request, _("This event is now hidden."))
     return redirect(event.orga_urls.base)
def test_common_templatetag_rich_text(text, richer_text):
    assert rich_text(text) == f"<p>{richer_text}</p>"
Пример #5
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
Пример #6
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
Пример #7
0
    def get_field(self, *, question, initial, initial_object, readonly):
        help_text = rich_text(question.help_text)
        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=help_text,
                label=question.question,
                required=question.required,
                widget=widget,
                initial=initialbool,
            )
        if question.variant == QuestionVariant.NUMBER:
            return forms.DecimalField(
                disabled=readonly,
                help_text=help_text,
                label=question.question,
                required=question.required,
                min_value=Decimal('0.00'),
                initial=initial,
            )
        if question.variant == QuestionVariant.STRING:
            return forms.CharField(
                disabled=readonly,
                help_text=get_help_text(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,
            )
        if question.variant == QuestionVariant.TEXT:
            return 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),
                initial=initial,
                min_length=question.min_length,
                max_length=question.max_length,
            )
        if question.variant == QuestionVariant.FILE:
            return forms.FileField(
                label=question.question,
                required=question.required,
                disabled=readonly,
                help_text=help_text,
                initial=initial,
            )
        if 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=help_text,
            )
        if 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=help_text,
            )
        return None