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
« prev ^ index » next coverage.py v7.12.0, created at 2025-12-03 00:09 +0000
1"""
2Classes for our ivatar.tools.forms
3"""
5from django import forms
6from django.utils.translation import gettext_lazy as _
7from django.core.exceptions import ValidationError
8from django.forms.utils import ErrorList
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
15class CheckDomainForm(forms.Form):
16 """
17 Form handling domain check
18 """
20 domain = forms.CharField(
21 label=_("Domain"),
22 required=True,
23 error_messages={"required": _("Cannot check without a domain name.")},
24 )
27class CheckForm(forms.Form):
28 """
29 Form handling check
30 """
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 )
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 )
48 size = forms.IntegerField(
49 label=_("Size"),
50 initial=80,
51 min_value=5,
52 max_value=AVATAR_MAX_SIZE,
53 required=True,
54 )
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 )
72 default_url = forms.URLField(
73 label=_("Default URL"),
74 min_length=1,
75 max_length=MAX_LENGTH_URL,
76 required=False,
77 )
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()
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
98 def clean_openid(self):
99 data = self.cleaned_data["openid"]
100 return data.lower()
102 def clean_mail(self):
103 data = self.cleaned_data["mail"]
104 return data.lower()