Coverage for ivatar/tools/forms.py: 80%

41 statements  

« prev     ^ index     » next       coverage.py v7.15.4, created at 2026-08-21 11:51 +0000

1""" 

2Classes for our ivatar.tools.forms 

3""" 

4 

5from django import forms 

6from django.utils.translation import gettext_lazy as _ 

7from django.core.exceptions import ValidationError 

8from django.forms.utils import ErrorList 

9 

10from django.conf import settings 

11 

12# Access settings through django.conf.settings 

13AVATAR_MAX_SIZE = getattr(settings, "AVATAR_MAX_SIZE", 512) 

14MIN_LENGTH_URL = getattr(settings, "MIN_LENGTH_URL", 11) 

15MAX_LENGTH_URL = getattr(settings, "MAX_LENGTH_URL", 255) 

16MIN_LENGTH_EMAIL = getattr(settings, "MIN_LENGTH_EMAIL", 6) 

17MAX_LENGTH_EMAIL = getattr(settings, "MAX_LENGTH_EMAIL", 254) 

18 

19 

20class CheckDomainForm(forms.Form): 

21 """ 

22 Form handling domain check 

23 """ 

24 

25 domain = forms.CharField( 

26 label=_("Domain"), 

27 required=True, 

28 error_messages={"required": _("Cannot check without a domain name.")}, 

29 ) 

30 

31 

32class CheckForm(forms.Form): 

33 """ 

34 Form handling check 

35 """ 

36 

37 mail = forms.EmailField( 

38 label=_("E-Mail"), 

39 required=False, 

40 min_length=MIN_LENGTH_EMAIL, 

41 max_length=MAX_LENGTH_EMAIL, 

42 error_messages={"required": _("Cannot check without a domain name.")}, 

43 ) 

44 

45 openid = forms.CharField( 

46 label=_("OpenID"), 

47 required=False, 

48 min_length=MIN_LENGTH_URL, 

49 max_length=MAX_LENGTH_URL, 

50 error_messages={"required": _("Cannot check without an openid name.")}, 

51 ) 

52 

53 size = forms.IntegerField( 

54 label=_("Size"), 

55 initial=80, 

56 min_value=5, 

57 max_value=AVATAR_MAX_SIZE, 

58 required=True, 

59 ) 

60 

61 default_opt = forms.ChoiceField( 

62 label=_("Default"), 

63 required=False, 

64 widget=forms.HiddenInput, 

65 choices=[ 

66 ("retro", _("Retro (d=retro)")), 

67 ("robohash", _("Roboter (d=robohash)")), 

68 ("wavatar", _("Wavatar (d=wavatar)")), 

69 ("monsterid", _("Monster (d=monsterid)")), 

70 ("identicon", _("Identicon (d=identicon)")), 

71 ("mm", _("Mystery man (d=mm)")), 

72 ("mmng", _("Mystery man NG (d=mmng)")), 

73 ("pagan", _("Retro adventure character (d=pagan)")), 

74 ("none", _("None")), 

75 ], 

76 ) 

77 

78 default_url = forms.URLField( 

79 label=_("Default URL"), 

80 min_length=1, 

81 max_length=MAX_LENGTH_URL, 

82 required=False, 

83 ) 

84 

85 def clean(self): 

86 self.cleaned_data = super().clean() 

87 mail = self.cleaned_data.get("mail") 

88 openid = self.cleaned_data.get("openid") 

89 default_url = self.cleaned_data.get("default_url") 

90 default_opt = self.cleaned_data.get("default_opt") 

91 if default_url and default_opt and default_opt != "none": 

92 if "default_url" not in self._errors: 

93 self._errors["default_url"] = ErrorList() 

94 if "default_opt" not in self._errors: 

95 self._errors["default_opt"] = ErrorList() 

96 

97 errstring = _("Only default URL OR default keyword may be specified") 

98 self._errors["default_url"].append(errstring) 

99 self._errors["default_opt"].append(errstring) 

100 if not mail and not openid: 

101 raise ValidationError(_("Either OpenID or mail must be specified")) 

102 return self.cleaned_data 

103 

104 def clean_openid(self): 

105 data = self.cleaned_data["openid"] 

106 return data.lower() 

107 

108 def clean_mail(self): 

109 data = self.cleaned_data["mail"] 

110 return data.lower()