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

1# Copyright © Michal Čihař <michal@weblate.org> 

2# 

3# SPDX-License-Identifier: GPL-3.0-or-later 

4 

5from crispy_forms.helper import FormHelper 

6from django import forms 

7from django.forms.widgets import MultiWidget 

8from django.utils.translation import gettext_lazy 

9 

10from weblate.accounts.forms import EmailField 

11from weblate.wladmin.models import BackupService 

12 

13 

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 ) 

23 

24 

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 ) 

32 

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" 

39 

40 

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 ) 

47 

48 

49class BackupForm(forms.ModelForm): 

50 class Meta: 

51 model = BackupService 

52 fields = ("repository",) 

53 

54 

55class BackupSelectionForm(forms.Form): 

56 service = forms.ModelChoiceField(BackupService.objects.all()) 

57 

58 

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 ) 

65 

66 

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) 

74 

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] 

82 

83 

84class ThemeColorField(forms.MultiValueField): 

85 widget = ThemeColorWidget 

86 

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) 

90 

91 def compress(self, data_list): 

92 return ",".join(data_list) if data_list else None 

93 

94 

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) 

98 

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 ) 

115 

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 ) 

127 

128 def __init__(self, *args, **kwargs) -> None: 

129 super().__init__(*args, **kwargs) 

130 self.helper = FormHelper(self) 

131 self.helper.form_tag = False 

132 

133 

134class ChangedCharField(forms.CharField): 

135 def has_changed(self, initial, data) -> bool: 

136 return True