Coverage for app/venv/lib/python3.14/site-packages/weblate/wladmin/forms.py: 70%
63 statements
« prev ^ index » next coverage.py v7.15.2, created at 2026-10-07 07:15 +0000
« prev ^ index » next coverage.py v7.15.2, created at 2026-10-07 07:15 +0000
1# Copyright © Michal Čihař <michal@weblate.org>
2#
3# SPDX-License-Identifier: GPL-3.0-or-later
5from crispy_forms.helper import FormHelper
6from django import forms
7from django.forms.widgets import MultiWidget
8from django.utils.translation import gettext_lazy
10from weblate.accounts.forms import EmailField
11from weblate.wladmin.models import BackupService
14class ActivateForm(forms.Form):
15 secret = forms.CharField(
16 label=gettext_lazy("Activation token"),
17 required=True,
18 max_length=400,
19 help_text=gettext_lazy(
20 "Please enter the activation token obtained when making the subscription."
21 ),
22 )
25class SSHAddForm(forms.Form):
26 host = forms.CharField(
27 label=gettext_lazy("Hostname"), required=True, max_length=400
28 )
29 port = forms.IntegerField(
30 label=gettext_lazy("Port"), required=False, min_value=1, max_value=65535
31 )
33 def __init__(self, *args, **kwargs) -> None:
34 super().__init__(*args, **kwargs)
35 self.helper = FormHelper(self)
36 self.helper.form_tag = False
37 self.helper.form_class = "form-inline"
38 self.helper.field_template = "bootstrap3/layout/inline_field.html"
41class TestMailForm(forms.Form):
42 email = EmailField(
43 required=True,
44 label=gettext_lazy("E-mail"),
45 help_text=gettext_lazy("The test e-mail will be sent to this address."),
46 )
49class BackupForm(forms.ModelForm):
50 class Meta:
51 model = BackupService
52 fields = ("repository",)
55class BackupSelectionForm(forms.Form):
56 service = forms.ModelChoiceField(BackupService.objects.all())
59class FontField(forms.CharField):
60 def __init__(self, **kwargs) -> None:
61 super().__init__(
62 help_text=gettext_lazy("Please provide font family suitable for CSS."),
63 **kwargs,
64 )
67class ThemeColorWidget(MultiWidget):
68 def __init__(self, attrs=None) -> None:
69 widgets = (
70 forms.TextInput(attrs={"type": "color", "class": "light-theme"}),
71 forms.TextInput(attrs={"type": "color", "class": "dark-theme"}),
72 )
73 super().__init__(widgets, attrs)
75 def decompress(self, value):
76 if value:
77 colors = value.split(",")
78 if len(colors) == 1:
79 return [colors[0], colors[0]]
80 return colors
81 return [None, None]
84class ThemeColorField(forms.MultiValueField):
85 widget = ThemeColorWidget
87 def __init__(self, **kwargs) -> None:
88 fields = (forms.CharField(required=False), forms.CharField(required=False))
89 super().__init__(fields=fields, require_all_fields=False, **kwargs)
91 def compress(self, data_list):
92 return ",".join(data_list) if data_list else None
95class AppearanceForm(forms.Form):
96 page_font = FontField(label=gettext_lazy("Page font"), required=False)
97 brand_font = FontField(label=gettext_lazy("Header font"), required=False)
99 header_color = ThemeColorField(
100 label=gettext_lazy("Navigation color (Light, Dark)"), initial="#2a3744,#1a2634"
101 )
102 header_text_color = ThemeColorField(
103 label=gettext_lazy("Navigation text color (Light, Dark)"),
104 initial="#bfc3c7,#e0e3e7",
105 )
106 navi_color = ThemeColorField(
107 label=gettext_lazy("Navigation color (Light, Dark)"), initial="#1fa385,#0f9375"
108 )
109 focus_color = ThemeColorField(
110 label=gettext_lazy("Focus color (Light, Dark)"), initial="#2eccaa,#25303b"
111 )
112 hover_color = ThemeColorField(
113 label=gettext_lazy("Hover color (Light, Dark)"), initial="#144d3f,#0a3d2f"
114 )
116 hide_footer = forms.BooleanField(
117 label=gettext_lazy("Hide page footer"), required=False
118 )
119 enforce_hamburger = forms.BooleanField(
120 label=gettext_lazy("Always show hamburger menu"),
121 required=False,
122 help_text=gettext_lazy(
123 "Persistent navigational drop-down menu in the top right corner, "
124 "even if there is room for a full menu."
125 ),
126 )
128 def __init__(self, *args, **kwargs) -> None:
129 super().__init__(*args, **kwargs)
130 self.helper = FormHelper(self)
131 self.helper.form_tag = False
134class ChangedCharField(forms.CharField):
135 def has_changed(self, initial, data) -> bool:
136 return True