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

38 statements  

« prev     ^ index     » next       coverage.py v7.12.0, created at 2025-12-03 00:09 +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 ivatar.settings import AVATAR_MAX_SIZE 

11from ivatar.settings import MIN_LENGTH_URL, MAX_LENGTH_URL 

12from ivatar.settings import MIN_LENGTH_EMAIL, MAX_LENGTH_EMAIL 

13 

14 

15class CheckDomainForm(forms.Form): 

16 """ 

17 Form handling domain check 

18 """ 

19 

20 domain = forms.CharField( 

21 label=_("Domain"), 

22 required=True, 

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

24 ) 

25 

26 

27class CheckForm(forms.Form): 

28 """ 

29 Form handling check 

30 """ 

31 

32 mail = forms.EmailField( 

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

34 required=False, 

35 min_length=MIN_LENGTH_EMAIL, 

36 max_length=MAX_LENGTH_EMAIL, 

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

38 ) 

39 

40 openid = forms.CharField( 

41 label=_("OpenID"), 

42 required=False, 

43 min_length=MIN_LENGTH_URL, 

44 max_length=MAX_LENGTH_URL, 

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

46 ) 

47 

48 size = forms.IntegerField( 

49 label=_("Size"), 

50 initial=80, 

51 min_value=5, 

52 max_value=AVATAR_MAX_SIZE, 

53 required=True, 

54 ) 

55 

56 default_opt = forms.ChoiceField( 

57 label=_("Default"), 

58 required=False, 

59 widget=forms.HiddenInput, 

60 choices=[ 

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

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

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

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

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

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

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

68 ("none", _("None")), 

69 ], 

70 ) 

71 

72 default_url = forms.URLField( 

73 label=_("Default URL"), 

74 min_length=1, 

75 max_length=MAX_LENGTH_URL, 

76 required=False, 

77 ) 

78 

79 def clean(self): 

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

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

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

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

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

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

86 if "default_url" not in self._errors: 

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

88 if "default_opt" not in self._errors: 

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

90 

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

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

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

94 if not mail and not openid: 

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

96 return self.cleaned_data 

97 

98 def clean_openid(self): 

99 data = self.cleaned_data["openid"] 

100 return data.lower() 

101 

102 def clean_mail(self): 

103 data = self.cleaned_data["mail"] 

104 return data.lower()