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", "")) )
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)
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>"
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 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