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

1from django import forms 

2from django.conf import settings 

3from django.utils.translation import gettext_lazy as _ 

4 

5from baibu.core.branding import build_languages 

6 

7from . import text as text_rules 

8 

9 

10def language_choices() -> list[tuple[str, str]]: 

11 return build_languages(settings.SUBMISSION_LANGUAGES, default=settings.SUBMISSION_LANGUAGES[0]) 

12 

13 

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 ) 

25 

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 

35 

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