Coverage for baibu/submissions/forms.py: 100%
27 statements
« prev ^ index » next coverage.py v7.10.7, created at 2026-10-06 13:07 +0000
« prev ^ index » next coverage.py v7.10.7, created at 2026-10-06 13:07 +0000
1from django import forms
2from django.conf import settings
3from django.utils.translation import gettext_lazy as _
5from baibu.core.branding import build_languages
7from . import text as text_rules
10def language_choices() -> list[tuple[str, str]]:
11 return build_languages(settings.SUBMISSION_LANGUAGES, default=settings.SUBMISSION_LANGUAGES[0])
14class SubmissionForm(forms.Form):
15 language_code = forms.ChoiceField(label=_("Language"))
16 text = forms.CharField(
17 label=_("Your writing"),
18 widget=forms.Textarea(attrs={"rows": 12}),
19 help_text=_("A story, a conversation, a recipe, a song: anything you wrote yourself in this language."),
20 )
21 confirm = forms.BooleanField(
22 label=_("I wrote this or have permission to share it, and I have left out other people's personal details."),
23 error_messages={"required": _("Please confirm before submitting.")},
24 )
26 def __init__(self, *args, **kwargs):
27 super().__init__(*args, **kwargs)
28 choices = language_choices()
29 self.fields["language_code"].choices = choices
30 if len(choices) == 1:
31 self.fields["language_code"].initial = choices[0][0]
32 self.fields["language_code"].widget = forms.HiddenInput()
33 self.fields["text"].max_length = settings.SUBMISSION_MAX_CHARACTERS
34 self.fields["text"].widget.attrs["maxlength"] = settings.SUBMISSION_MAX_CHARACTERS
36 def clean_text(self) -> str:
37 value = text_rules.normalise(self.cleaned_data["text"])
38 if len(value) > settings.SUBMISSION_MAX_CHARACTERS:
39 raise forms.ValidationError(
40 _("Please keep it under %(limit)d characters."), params={"limit": settings.SUBMISSION_MAX_CHARACTERS}
41 )
42 if text_rules.word_count(value) < settings.SUBMISSION_MIN_WORDS:
43 raise forms.ValidationError(
44 _("Please write at least %(limit)d words."), params={"limit": settings.SUBMISSION_MIN_WORDS}
45 )
46 return value