WTForms 3.1.2__tar.gz → 3.2.1__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (185) hide show
  1. {wtforms-3.1.2 → wtforms-3.2.1}/CHANGES.rst +36 -1
  2. {wtforms-3.1.2 → wtforms-3.2.1}/PKG-INFO +10 -10
  3. {wtforms-3.1.2 → wtforms-3.2.1}/README.rst +5 -5
  4. {wtforms-3.1.2 → wtforms-3.2.1}/docs/conf.py +3 -3
  5. {wtforms-3.1.2 → wtforms-3.2.1}/docs/contributing.rst +2 -2
  6. {wtforms-3.1.2 → wtforms-3.2.1}/docs/ext.rst +3 -3
  7. {wtforms-3.1.2 → wtforms-3.2.1}/docs/faq.rst +6 -6
  8. {wtforms-3.1.2 → wtforms-3.2.1}/docs/fields.rst +1 -1
  9. wtforms-3.2.1/docs/requirements.txt +5 -0
  10. {wtforms-3.1.2 → wtforms-3.2.1}/docs/whats_new.rst +2 -2
  11. {wtforms-3.1.2 → wtforms-3.2.1}/pyproject.toml +21 -29
  12. wtforms-3.2.1/src/wtforms/__init__.py +79 -0
  13. {wtforms-3.1.2 → wtforms-3.2.1}/src/wtforms/csrf/session.py +1 -0
  14. wtforms-3.2.1/src/wtforms/fields/__init__.py +71 -0
  15. {wtforms-3.1.2 → wtforms-3.2.1}/src/wtforms/fields/core.py +10 -19
  16. {wtforms-3.1.2 → wtforms-3.2.1}/src/wtforms/fields/datetime.py +2 -1
  17. {wtforms-3.1.2 → wtforms-3.2.1}/src/wtforms/fields/form.py +2 -1
  18. {wtforms-3.1.2 → wtforms-3.2.1}/src/wtforms/fields/list.py +2 -1
  19. {wtforms-3.1.2 → wtforms-3.2.1}/src/wtforms/form.py +3 -2
  20. {wtforms-3.1.2 → wtforms-3.2.1}/src/wtforms/locale/ar/LC_MESSAGES/wtforms.mo +0 -0
  21. {wtforms-3.1.2 → wtforms-3.2.1}/src/wtforms/locale/ar/LC_MESSAGES/wtforms.po +8 -8
  22. {wtforms-3.1.2 → wtforms-3.2.1}/src/wtforms/locale/bg/LC_MESSAGES/wtforms.mo +0 -0
  23. {wtforms-3.1.2 → wtforms-3.2.1}/src/wtforms/locale/bg/LC_MESSAGES/wtforms.po +8 -8
  24. {wtforms-3.1.2 → wtforms-3.2.1}/src/wtforms/locale/ca/LC_MESSAGES/wtforms.mo +0 -0
  25. {wtforms-3.1.2 → wtforms-3.2.1}/src/wtforms/locale/ca/LC_MESSAGES/wtforms.po +8 -8
  26. {wtforms-3.1.2 → wtforms-3.2.1}/src/wtforms/locale/cs_CZ/LC_MESSAGES/wtforms.mo +0 -0
  27. {wtforms-3.1.2 → wtforms-3.2.1}/src/wtforms/locale/cs_CZ/LC_MESSAGES/wtforms.po +8 -8
  28. {wtforms-3.1.2 → wtforms-3.2.1}/src/wtforms/locale/cy/LC_MESSAGES/wtforms.mo +0 -0
  29. {wtforms-3.1.2 → wtforms-3.2.1}/src/wtforms/locale/cy/LC_MESSAGES/wtforms.po +8 -8
  30. {wtforms-3.1.2 → wtforms-3.2.1}/src/wtforms/locale/de/LC_MESSAGES/wtforms.mo +0 -0
  31. {wtforms-3.1.2 → wtforms-3.2.1}/src/wtforms/locale/de/LC_MESSAGES/wtforms.po +8 -8
  32. {wtforms-3.1.2 → wtforms-3.2.1}/src/wtforms/locale/de_CH/LC_MESSAGES/wtforms.mo +0 -0
  33. {wtforms-3.1.2 → wtforms-3.2.1}/src/wtforms/locale/de_CH/LC_MESSAGES/wtforms.po +8 -8
  34. {wtforms-3.1.2 → wtforms-3.2.1}/src/wtforms/locale/el/LC_MESSAGES/wtforms.mo +0 -0
  35. {wtforms-3.1.2 → wtforms-3.2.1}/src/wtforms/locale/el/LC_MESSAGES/wtforms.po +8 -8
  36. {wtforms-3.1.2 → wtforms-3.2.1}/src/wtforms/locale/en/LC_MESSAGES/wtforms.mo +0 -0
  37. {wtforms-3.1.2 → wtforms-3.2.1}/src/wtforms/locale/es/LC_MESSAGES/wtforms.mo +0 -0
  38. {wtforms-3.1.2 → wtforms-3.2.1}/src/wtforms/locale/es/LC_MESSAGES/wtforms.po +12 -12
  39. {wtforms-3.1.2 → wtforms-3.2.1}/src/wtforms/locale/et/LC_MESSAGES/wtforms.mo +0 -0
  40. {wtforms-3.1.2 → wtforms-3.2.1}/src/wtforms/locale/et/LC_MESSAGES/wtforms.po +8 -8
  41. {wtforms-3.1.2 → wtforms-3.2.1}/src/wtforms/locale/fa/LC_MESSAGES/wtforms.mo +0 -0
  42. {wtforms-3.1.2 → wtforms-3.2.1}/src/wtforms/locale/fa/LC_MESSAGES/wtforms.po +8 -8
  43. {wtforms-3.1.2 → wtforms-3.2.1}/src/wtforms/locale/fi/LC_MESSAGES/wtforms.mo +0 -0
  44. {wtforms-3.1.2 → wtforms-3.2.1}/src/wtforms/locale/fi/LC_MESSAGES/wtforms.po +8 -8
  45. {wtforms-3.1.2 → wtforms-3.2.1}/src/wtforms/locale/fr/LC_MESSAGES/wtforms.mo +0 -0
  46. {wtforms-3.1.2 → wtforms-3.2.1}/src/wtforms/locale/fr/LC_MESSAGES/wtforms.po +12 -12
  47. {wtforms-3.1.2 → wtforms-3.2.1}/src/wtforms/locale/he/LC_MESSAGES/wtforms.mo +0 -0
  48. {wtforms-3.1.2 → wtforms-3.2.1}/src/wtforms/locale/he/LC_MESSAGES/wtforms.po +8 -8
  49. {wtforms-3.1.2 → wtforms-3.2.1}/src/wtforms/locale/hu/LC_MESSAGES/wtforms.mo +0 -0
  50. {wtforms-3.1.2 → wtforms-3.2.1}/src/wtforms/locale/hu/LC_MESSAGES/wtforms.po +8 -8
  51. {wtforms-3.1.2 → wtforms-3.2.1}/src/wtforms/locale/it/LC_MESSAGES/wtforms.mo +0 -0
  52. {wtforms-3.1.2 → wtforms-3.2.1}/src/wtforms/locale/it/LC_MESSAGES/wtforms.po +8 -8
  53. {wtforms-3.1.2 → wtforms-3.2.1}/src/wtforms/locale/ja/LC_MESSAGES/wtforms.mo +0 -0
  54. {wtforms-3.1.2 → wtforms-3.2.1}/src/wtforms/locale/ja/LC_MESSAGES/wtforms.po +8 -8
  55. wtforms-3.2.1/src/wtforms/locale/kk/LC_MESSAGES/wtforms.mo +0 -0
  56. wtforms-3.2.1/src/wtforms/locale/kk/LC_MESSAGES/wtforms.po +187 -0
  57. wtforms-3.2.1/src/wtforms/locale/ko/LC_MESSAGES/wtforms.mo +0 -0
  58. {wtforms-3.1.2 → wtforms-3.2.1}/src/wtforms/locale/ko/LC_MESSAGES/wtforms.po +24 -24
  59. {wtforms-3.1.2 → wtforms-3.2.1}/src/wtforms/locale/nb/LC_MESSAGES/wtforms.mo +0 -0
  60. {wtforms-3.1.2 → wtforms-3.2.1}/src/wtforms/locale/nb/LC_MESSAGES/wtforms.po +8 -8
  61. wtforms-3.2.1/src/wtforms/locale/nl/LC_MESSAGES/wtforms.mo +0 -0
  62. {wtforms-3.1.2 → wtforms-3.2.1}/src/wtforms/locale/nl/LC_MESSAGES/wtforms.po +20 -23
  63. {wtforms-3.1.2 → wtforms-3.2.1}/src/wtforms/locale/pl/LC_MESSAGES/wtforms.mo +0 -0
  64. {wtforms-3.1.2 → wtforms-3.2.1}/src/wtforms/locale/pl/LC_MESSAGES/wtforms.po +8 -8
  65. wtforms-3.2.1/src/wtforms/locale/pt/LC_MESSAGES/wtforms.mo +0 -0
  66. {wtforms-3.1.2 → wtforms-3.2.1}/src/wtforms/locale/pt/LC_MESSAGES/wtforms.po +26 -29
  67. {wtforms-3.1.2 → wtforms-3.2.1}/src/wtforms/locale/ro/LC_MESSAGES/wtforms.mo +0 -0
  68. {wtforms-3.1.2 → wtforms-3.2.1}/src/wtforms/locale/ro/LC_MESSAGES/wtforms.po +14 -10
  69. wtforms-3.2.1/src/wtforms/locale/ru/LC_MESSAGES/wtforms.mo +0 -0
  70. {wtforms-3.1.2 → wtforms-3.2.1}/src/wtforms/locale/ru/LC_MESSAGES/wtforms.po +18 -18
  71. {wtforms-3.1.2 → wtforms-3.2.1}/src/wtforms/locale/sk/LC_MESSAGES/wtforms.mo +0 -0
  72. {wtforms-3.1.2 → wtforms-3.2.1}/src/wtforms/locale/sk/LC_MESSAGES/wtforms.po +13 -13
  73. {wtforms-3.1.2 → wtforms-3.2.1}/src/wtforms/locale/sv/LC_MESSAGES/wtforms.mo +0 -0
  74. {wtforms-3.1.2 → wtforms-3.2.1}/src/wtforms/locale/sv/LC_MESSAGES/wtforms.po +12 -12
  75. {wtforms-3.1.2 → wtforms-3.2.1}/src/wtforms/locale/tr/LC_MESSAGES/wtforms.mo +0 -0
  76. {wtforms-3.1.2 → wtforms-3.2.1}/src/wtforms/locale/tr/LC_MESSAGES/wtforms.po +12 -12
  77. wtforms-3.2.1/src/wtforms/locale/uk/LC_MESSAGES/wtforms.mo +0 -0
  78. {wtforms-3.1.2 → wtforms-3.2.1}/src/wtforms/locale/uk/LC_MESSAGES/wtforms.po +38 -41
  79. {wtforms-3.1.2 → wtforms-3.2.1}/src/wtforms/locale/wtforms.pot +11 -11
  80. {wtforms-3.1.2 → wtforms-3.2.1}/src/wtforms/locale/zh/LC_MESSAGES/wtforms.mo +0 -0
  81. {wtforms-3.1.2 → wtforms-3.2.1}/src/wtforms/locale/zh/LC_MESSAGES/wtforms.po +8 -8
  82. wtforms-3.2.1/src/wtforms/locale/zh_TW/LC_MESSAGES/wtforms.mo +0 -0
  83. {wtforms-3.1.2 → wtforms-3.2.1}/src/wtforms/locale/zh_TW/LC_MESSAGES/wtforms.po +35 -38
  84. {wtforms-3.1.2 → wtforms-3.2.1}/src/wtforms/utils.py +4 -2
  85. {wtforms-3.1.2 → wtforms-3.2.1}/src/wtforms/validators.py +6 -4
  86. wtforms-3.2.1/src/wtforms/widgets/__init__.py +57 -0
  87. {wtforms-3.1.2 → wtforms-3.2.1}/src/wtforms/widgets/core.py +21 -35
  88. {wtforms-3.1.2 → wtforms-3.2.1}/tests/fields/test_boolean.py +0 -1
  89. {wtforms-3.1.2 → wtforms-3.2.1}/tests/fields/test_custom.py +1 -1
  90. {wtforms-3.1.2 → wtforms-3.2.1}/tests/fields/test_date.py +0 -1
  91. {wtforms-3.1.2 → wtforms-3.2.1}/tests/fields/test_datetime.py +9 -7
  92. {wtforms-3.1.2 → wtforms-3.2.1}/tests/fields/test_datetimelocal.py +4 -2
  93. {wtforms-3.1.2 → wtforms-3.2.1}/tests/fields/test_decimal.py +0 -1
  94. {wtforms-3.1.2 → wtforms-3.2.1}/tests/fields/test_field.py +3 -3
  95. {wtforms-3.1.2 → wtforms-3.2.1}/tests/fields/test_file.py +0 -1
  96. {wtforms-3.1.2 → wtforms-3.2.1}/tests/fields/test_filters.py +0 -1
  97. {wtforms-3.1.2 → wtforms-3.2.1}/tests/fields/test_flags.py +1 -1
  98. {wtforms-3.1.2 → wtforms-3.2.1}/tests/fields/test_float.py +0 -1
  99. {wtforms-3.1.2 → wtforms-3.2.1}/tests/fields/test_html5.py +2 -3
  100. {wtforms-3.1.2 → wtforms-3.2.1}/tests/fields/test_integer.py +0 -1
  101. {wtforms-3.1.2 → wtforms-3.2.1}/tests/fields/test_month.py +0 -1
  102. {wtforms-3.1.2 → wtforms-3.2.1}/tests/fields/test_radio.py +0 -1
  103. {wtforms-3.1.2 → wtforms-3.2.1}/tests/fields/test_selectmultiple.py +4 -2
  104. {wtforms-3.1.2 → wtforms-3.2.1}/tests/fields/test_string.py +0 -1
  105. {wtforms-3.1.2 → wtforms-3.2.1}/tests/fields/test_time.py +0 -1
  106. {wtforms-3.1.2 → wtforms-3.2.1}/tests/fields/test_week.py +0 -1
  107. {wtforms-3.1.2 → wtforms-3.2.1}/tests/test_form.py +6 -6
  108. {wtforms-3.1.2 → wtforms-3.2.1}/tests/test_widgets.py +1 -1
  109. {wtforms-3.1.2 → wtforms-3.2.1}/tests/validators/test_anyof.py +15 -0
  110. {wtforms-3.1.2 → wtforms-3.2.1}/tests/validators/test_disabled.py +0 -1
  111. {wtforms-3.1.2 → wtforms-3.2.1}/tests/validators/test_noneof.py +15 -0
  112. {wtforms-3.1.2 → wtforms-3.2.1}/tests/validators/test_readonly.py +0 -1
  113. {wtforms-3.1.2 → wtforms-3.2.1}/tox.ini +2 -3
  114. wtforms-3.1.2/.hgignore +0 -1
  115. wtforms-3.1.2/docs/requirements.txt +0 -5
  116. wtforms-3.1.2/src/wtforms/__init__.py +0 -7
  117. wtforms-3.1.2/src/wtforms/fields/__init__.py +0 -11
  118. wtforms-3.1.2/src/wtforms/locale/ko/LC_MESSAGES/wtforms.mo +0 -0
  119. wtforms-3.1.2/src/wtforms/locale/nl/LC_MESSAGES/wtforms.mo +0 -0
  120. wtforms-3.1.2/src/wtforms/locale/pt/LC_MESSAGES/wtforms.mo +0 -0
  121. wtforms-3.1.2/src/wtforms/locale/ru/LC_MESSAGES/wtforms.mo +0 -0
  122. wtforms-3.1.2/src/wtforms/locale/uk/LC_MESSAGES/wtforms.mo +0 -0
  123. wtforms-3.1.2/src/wtforms/locale/zh_TW/LC_MESSAGES/wtforms.mo +0 -0
  124. wtforms-3.1.2/src/wtforms/widgets/__init__.py +0 -3
  125. {wtforms-3.1.2 → wtforms-3.2.1}/.gitignore +0 -0
  126. {wtforms-3.1.2 → wtforms-3.2.1}/LICENSE.rst +0 -0
  127. {wtforms-3.1.2 → wtforms-3.2.1}/docs/Makefile +0 -0
  128. {wtforms-3.1.2 → wtforms-3.2.1}/docs/_static/logo_joined.svg +0 -0
  129. {wtforms-3.1.2 → wtforms-3.2.1}/docs/_static/logo_split.svg +0 -0
  130. {wtforms-3.1.2 → wtforms-3.2.1}/docs/_static/logo_square.svg +0 -0
  131. {wtforms-3.1.2 → wtforms-3.2.1}/docs/changes.rst +0 -0
  132. {wtforms-3.1.2 → wtforms-3.2.1}/docs/crash_course.rst +0 -0
  133. {wtforms-3.1.2 → wtforms-3.2.1}/docs/csrf.rst +0 -0
  134. {wtforms-3.1.2 → wtforms-3.2.1}/docs/forms.rst +0 -0
  135. {wtforms-3.1.2 → wtforms-3.2.1}/docs/i18n.rst +0 -0
  136. {wtforms-3.1.2 → wtforms-3.2.1}/docs/index.rst +0 -0
  137. {wtforms-3.1.2 → wtforms-3.2.1}/docs/license.rst +0 -0
  138. {wtforms-3.1.2 → wtforms-3.2.1}/docs/make.bat +0 -0
  139. {wtforms-3.1.2 → wtforms-3.2.1}/docs/meta.rst +0 -0
  140. {wtforms-3.1.2 → wtforms-3.2.1}/docs/specific_problems.rst +0 -0
  141. {wtforms-3.1.2 → wtforms-3.2.1}/docs/validators.rst +0 -0
  142. {wtforms-3.1.2 → wtforms-3.2.1}/docs/widgets.rst +0 -0
  143. {wtforms-3.1.2 → wtforms-3.2.1}/hatch_build.py +0 -0
  144. {wtforms-3.1.2 → wtforms-3.2.1}/src/wtforms/csrf/__init__.py +0 -0
  145. {wtforms-3.1.2 → wtforms-3.2.1}/src/wtforms/csrf/core.py +0 -0
  146. {wtforms-3.1.2 → wtforms-3.2.1}/src/wtforms/fields/choices.py +0 -0
  147. {wtforms-3.1.2 → wtforms-3.2.1}/src/wtforms/fields/numeric.py +0 -0
  148. {wtforms-3.1.2 → wtforms-3.2.1}/src/wtforms/fields/simple.py +0 -0
  149. {wtforms-3.1.2 → wtforms-3.2.1}/src/wtforms/i18n.py +0 -0
  150. {wtforms-3.1.2 → wtforms-3.2.1}/src/wtforms/locale/README.md +0 -0
  151. {wtforms-3.1.2 → wtforms-3.2.1}/src/wtforms/locale/en/LC_MESSAGES/wtforms.po +0 -0
  152. {wtforms-3.1.2 → wtforms-3.2.1}/src/wtforms/meta.py +0 -0
  153. {wtforms-3.1.2 → wtforms-3.2.1}/tests/__init__.py +0 -0
  154. {wtforms-3.1.2 → wtforms-3.2.1}/tests/common.py +0 -0
  155. {wtforms-3.1.2 → wtforms-3.2.1}/tests/conftest.py +0 -0
  156. {wtforms-3.1.2 → wtforms-3.2.1}/tests/fields/__init__.py +0 -0
  157. {wtforms-3.1.2 → wtforms-3.2.1}/tests/fields/test_color.py +0 -0
  158. {wtforms-3.1.2 → wtforms-3.2.1}/tests/fields/test_defaults.py +0 -0
  159. {wtforms-3.1.2 → wtforms-3.2.1}/tests/fields/test_form.py +1 -1
  160. {wtforms-3.1.2 → wtforms-3.2.1}/tests/fields/test_hidden.py +0 -0
  161. {wtforms-3.1.2 → wtforms-3.2.1}/tests/fields/test_label.py +0 -0
  162. {wtforms-3.1.2 → wtforms-3.2.1}/tests/fields/test_list.py +1 -1
  163. {wtforms-3.1.2 → wtforms-3.2.1}/tests/fields/test_password.py +0 -0
  164. {wtforms-3.1.2 → wtforms-3.2.1}/tests/fields/test_select.py +1 -1
  165. {wtforms-3.1.2 → wtforms-3.2.1}/tests/fields/test_submit.py +0 -0
  166. {wtforms-3.1.2 → wtforms-3.2.1}/tests/fields/test_textarea.py +0 -0
  167. {wtforms-3.1.2 → wtforms-3.2.1}/tests/test_csrf.py +1 -1
  168. {wtforms-3.1.2 → wtforms-3.2.1}/tests/test_i18n.py +0 -0
  169. {wtforms-3.1.2 → wtforms-3.2.1}/tests/test_locale_babel.py +1 -1
  170. {wtforms-3.1.2 → wtforms-3.2.1}/tests/test_webob.py +0 -0
  171. {wtforms-3.1.2 → wtforms-3.2.1}/tests/validators/__init__.py +0 -0
  172. {wtforms-3.1.2 → wtforms-3.2.1}/tests/validators/test_data_required.py +0 -0
  173. {wtforms-3.1.2 → wtforms-3.2.1}/tests/validators/test_email.py +0 -0
  174. {wtforms-3.1.2 → wtforms-3.2.1}/tests/validators/test_equal_to.py +0 -0
  175. {wtforms-3.1.2 → wtforms-3.2.1}/tests/validators/test_input_required.py +0 -0
  176. {wtforms-3.1.2 → wtforms-3.2.1}/tests/validators/test_ipaddress.py +0 -0
  177. {wtforms-3.1.2 → wtforms-3.2.1}/tests/validators/test_lazy_proxy.py +0 -0
  178. {wtforms-3.1.2 → wtforms-3.2.1}/tests/validators/test_length.py +0 -0
  179. {wtforms-3.1.2 → wtforms-3.2.1}/tests/validators/test_mac_address.py +0 -0
  180. {wtforms-3.1.2 → wtforms-3.2.1}/tests/validators/test_number_range.py +0 -0
  181. {wtforms-3.1.2 → wtforms-3.2.1}/tests/validators/test_optional.py +0 -0
  182. {wtforms-3.1.2 → wtforms-3.2.1}/tests/validators/test_regexp.py +0 -0
  183. {wtforms-3.1.2 → wtforms-3.2.1}/tests/validators/test_url.py +0 -0
  184. {wtforms-3.1.2 → wtforms-3.2.1}/tests/validators/test_uuid.py +0 -0
  185. {wtforms-3.1.2 → wtforms-3.2.1}/tests/validators/test_validators.py +0 -0
@@ -1,5 +1,41 @@
1
1
  .. currentmodule:: wtforms
2
2
 
3
+ Version 3.2.1
4
+ -------------
5
+
6
+ Released 2024-10-21
7
+
8
+ - Fix :class:`~fields.SelectMultipleBase` import. :issue:`861` :pr:`862`
9
+
10
+ Version 3.2.0
11
+ -------------
12
+
13
+ Released 2024-10-20
14
+
15
+ - Translations update: korean, chinese (traditional), portugese, russian,
16
+ dutch, kazakh, swedish, turkish, slovak, ukranian, spanish, french.
17
+ - Move the repository to the pallets-eco organization. :pr:`854`
18
+ - Stop supporting Python 3.9 and start supporting Python 3.13 :pr:`855`
19
+ - Removed `required` flag support from :class:`~fields.HiddenWidget`,
20
+ :class:`~fields.RangeWidget` and :class:`~fields.SelectWidget` to
21
+ conform to W3C :pr:`810`
22
+ - :class:`~wtforms.validators.NoneOf` and :class:`~wtforms.validators.AnyOf`
23
+ can validate multiple valued fields like :class:`~fields.SelectMultipleField`
24
+ :pr:`538` :pr:`807`
25
+ - Use GHA and pre-commit workflows inspired from Flask. :pr:`856` :pr:`860`
26
+ - ⚠️Breaking change⚠️: Some deprecated code was removed (:pr:`859`):
27
+
28
+ - :class:`~wtforms.Flags` can no longer be tuples. :issue:`467`
29
+ - `iter_choices` needs a tuple of 4 items :issue:`816`
30
+
31
+ - ⚠️Breaking change⚠️: The key for form errors moved from :data:`None` to
32
+ empty string `""`. :issue:`829` :pr:`858`
33
+
34
+ .. note::
35
+ If you need to keep the old behavior you can set the ``_form_error_key``
36
+ parameter of your form to :data:`None`.
37
+
38
+
3
39
  Version 3.1.2
4
40
  -------------
5
41
 
@@ -22,7 +58,6 @@ Released 2023-11-01
22
58
  - Restored support for 3-items tuple return value from `iter_choices`
23
59
  :pr:`816`
24
60
 
25
-
26
61
  Version 3.1.0
27
62
  -------------
28
63
 
@@ -1,11 +1,11 @@
1
- Metadata-Version: 2.1
1
+ Metadata-Version: 2.3
2
2
  Name: WTForms
3
- Version: 3.1.2
3
+ Version: 3.2.1
4
4
  Summary: Form validation and rendering for Python web development.
5
5
  Project-URL: Documentation, https://wtforms.readthedocs.io
6
6
  Project-URL: Changes, https://wtforms.readthedocs.io/changes
7
- Project-URL: Source Code, https://github.com/wtforms/wtforms/
8
- Project-URL: Issue Tracker, https://github.com/wtforms/wtforms/issues
7
+ Project-URL: Source Code, https://github.com/pallets-eco/wtforms/
8
+ Project-URL: Issue Tracker, https://github.com/pallets-eco/wtforms/issues
9
9
  Project-URL: Chat, https://discord.gg/pallets
10
10
  Maintainer: WTForms
11
11
  License: Copyright 2008 WTForms
@@ -44,7 +44,7 @@ Classifier: License :: OSI Approved :: BSD License
44
44
  Classifier: Operating System :: OS Independent
45
45
  Classifier: Programming Language :: Python
46
46
  Classifier: Topic :: Internet :: WWW/HTTP :: Dynamic Content
47
- Requires-Python: >=3.8
47
+ Requires-Python: >=3.9
48
48
  Requires-Dist: markupsafe
49
49
  Provides-Extra: email
50
50
  Requires-Dist: email-validator; extra == 'email'
@@ -100,9 +100,9 @@ with frameworks even better.
100
100
 
101
101
  .. _Flask-WTF: https://flask-wtf.readthedocs.io/
102
102
  .. _WTForms-Alchemy: https://wtforms-alchemy.readthedocs.io/
103
- .. _WTForms-SQLAlchemy: https://github.com/wtforms/wtforms-sqlalchemy
104
- .. _WTForms-AppEngine: https://github.com/wtforms/wtforms-appengine
105
- .. _WTForms-Django: https://github.com/wtforms/wtforms-django
103
+ .. _WTForms-SQLAlchemy: https://github.com/pallets-eco/wtforms-sqlalchemy
104
+ .. _WTForms-AppEngine: https://github.com/pallets-eco/wtforms-appengine
105
+ .. _WTForms-Django: https://github.com/pallets-eco/wtforms-django
106
106
  .. _WTForms-Bootstrap5: https://github.com/LaunchPlatform/wtforms-bootstrap5
107
107
  .. _Starlette-WTF: https://github.com/muicss/starlette-wtf
108
108
  .. _Bootstrap-Flask: https://github.com/helloflask/bootstrap-flask
@@ -113,7 +113,7 @@ Links
113
113
 
114
114
  - Documentation: https://wtforms.readthedocs.io/
115
115
  - Releases: https://pypi.org/project/WTForms/
116
- - Code: https://github.com/wtforms/wtforms
117
- - Issue tracker: https://github.com/wtforms/wtforms/issues
116
+ - Code: https://github.com/pallets-eco/wtforms
117
+ - Issue tracker: https://github.com/pallets-eco/wtforms/issues
118
118
  - Discord Chat: https://discord.gg/F65P7Z9
119
119
  - Translation: https://hosted.weblate.org/projects/wtforms/wtforms/
@@ -48,9 +48,9 @@ with frameworks even better.
48
48
 
49
49
  .. _Flask-WTF: https://flask-wtf.readthedocs.io/
50
50
  .. _WTForms-Alchemy: https://wtforms-alchemy.readthedocs.io/
51
- .. _WTForms-SQLAlchemy: https://github.com/wtforms/wtforms-sqlalchemy
52
- .. _WTForms-AppEngine: https://github.com/wtforms/wtforms-appengine
53
- .. _WTForms-Django: https://github.com/wtforms/wtforms-django
51
+ .. _WTForms-SQLAlchemy: https://github.com/pallets-eco/wtforms-sqlalchemy
52
+ .. _WTForms-AppEngine: https://github.com/pallets-eco/wtforms-appengine
53
+ .. _WTForms-Django: https://github.com/pallets-eco/wtforms-django
54
54
  .. _WTForms-Bootstrap5: https://github.com/LaunchPlatform/wtforms-bootstrap5
55
55
  .. _Starlette-WTF: https://github.com/muicss/starlette-wtf
56
56
  .. _Bootstrap-Flask: https://github.com/helloflask/bootstrap-flask
@@ -61,7 +61,7 @@ Links
61
61
 
62
62
  - Documentation: https://wtforms.readthedocs.io/
63
63
  - Releases: https://pypi.org/project/WTForms/
64
- - Code: https://github.com/wtforms/wtforms
65
- - Issue tracker: https://github.com/wtforms/wtforms/issues
64
+ - Code: https://github.com/pallets-eco/wtforms
65
+ - Issue tracker: https://github.com/pallets-eco/wtforms/issues
66
66
  - Discord Chat: https://discord.gg/F65P7Z9
67
67
  - Translation: https://hosted.weblate.org/projects/wtforms/wtforms/
@@ -22,7 +22,7 @@ extensions = [
22
22
  intersphinx_mapping = {
23
23
  "python": ("https://docs.python.org/3/", None),
24
24
  }
25
- issues_github_path = "wtforms/wtforms"
25
+ issues_github_path = "pallets-eco/wtforms"
26
26
 
27
27
  # HTML -----------------------------------------------------------------
28
28
 
@@ -30,12 +30,12 @@ html_theme = "werkzeug"
30
30
  html_context = {
31
31
  "project_links": [
32
32
  ProjectLink("PyPI Releases", "https://pypi.org/project/WTForms/"),
33
- ProjectLink("Source Code", "https://github.com/wtforms/wtforms/"),
33
+ ProjectLink("Source Code", "https://github.com/pallets-eco/wtforms/"),
34
34
  ProjectLink(
35
35
  "Discord Chat",
36
36
  "https://discord.gg/F65P7Z9",
37
37
  ),
38
- ProjectLink("Issue Tracker", "https://github.com/wtforms/wtforms/issues/"),
38
+ ProjectLink("Issue Tracker", "https://github.com/pallets-eco/wtforms/issues/"),
39
39
  ]
40
40
  }
41
41
  html_sidebars = {
@@ -12,7 +12,7 @@ How to Contribute
12
12
  WTForms is now on `GitHub`_, so all contributions should be either associated
13
13
  with a pull request or with a ticket & patch.
14
14
 
15
- .. _GitHub: https://github.com/wtforms/wtforms
15
+ .. _GitHub: https://github.com/pallets-eco/wtforms
16
16
 
17
17
 
18
18
  Contribution Guidelines
@@ -38,7 +38,7 @@ Code submitted should:
38
38
  advantage of `Github Actions`_ for running tests on all supported Python
39
39
  versions.
40
40
 
41
- .. _Github Actions: https://github.com/wtforms/wtforms/actions
41
+ .. _Github Actions: https://github.com/pallets-eco/wtforms/actions
42
42
  .. _PEP8: https://www.python.org/dev/peps/pep-0008/
43
43
 
44
44
 
@@ -5,8 +5,8 @@ Extensions
5
5
 
6
6
  All WTForms extensions were removed in WTForms 3.0.
7
7
 
8
- * ``wtforms.ext.appengine`` was extracted to `WTForms-Appengine <https://github.com/wtforms/wtforms-appengine>`_
8
+ * ``wtforms.ext.appengine`` was extracted to `WTForms-Appengine <https://github.com/pallets-eco/wtforms-appengine>`_
9
9
  * ``wtforms.ext.csrf`` was integrated into WTForms core. See :doc:`CSRF Docs <csrf>`
10
- * ``wtforms.ext.django`` was extracted to `WTForms-Django <https://github.com/wtforms/wtforms-django>`_
10
+ * ``wtforms.ext.django`` was extracted to `WTForms-Django <https://github.com/pallets-eco/wtforms-django>`_
11
11
  * ``wtforms.ext.i18n`` was integrated into WTForms core. See :doc:`i18n`
12
- * ``wtforms.ext.sqlalchemy`` was extracted to `WTForms-SQLAlchemy <https://github.com/wtforms/wtforms-sqlalchemy>`_
12
+ * ``wtforms.ext.sqlalchemy`` was extracted to `WTForms-SQLAlchemy <https://github.com/pallets-eco/wtforms-sqlalchemy>`_
@@ -37,10 +37,10 @@ but if it's not listed, it doesn't mean it won't work.
37
37
  Special support is there for `SQLAlchemy`_, `Google App Engine`_, and `Django`_
38
38
  collections via companion packages.
39
39
 
40
- .. _SQLAlchemy: https://github.com/wtforms/wtforms-sqlalchemy
41
- .. _Google App Engine: https://github.com/wtforms/wtforms-appengine
42
- .. _WTForms-Django: https://github.com/wtforms/wtforms-django
43
- .. _Django: https://github.com/wtforms/wtforms-django
40
+ .. _SQLAlchemy: https://github.com/pallets-eco/wtforms-sqlalchemy
41
+ .. _Google App Engine: https://github.com/pallets-eco/wtforms-appengine
42
+ .. _WTForms-Django: https://github.com/pallets-eco/wtforms-django
43
+ .. _Django: https://github.com/pallets-eco/wtforms-django
44
44
 
45
45
  Does WTForms support unicode?
46
46
  -----------------------------
@@ -57,7 +57,7 @@ you should have no unicode issues.
57
57
  What versions of Python are supported?
58
58
  --------------------------------------
59
59
 
60
- WTForms supports Python 3.8+
60
+ WTForms supports Python 3.9+
61
61
 
62
62
 
63
63
  How can I contribute to WTForms?
@@ -67,7 +67,7 @@ WTForms is not that scary. Really. We try to keep it as succinct and readable as
67
67
  possible. For bugs and feature requests, you can file a
68
68
  ticket on the `project page`_.
69
69
 
70
- .. _project page: https://github.com/wtforms/wtforms
70
+ .. _project page: https://github.com/pallets-eco/wtforms
71
71
 
72
72
 
73
73
  How do I mark in a template when a field is required?
@@ -258,7 +258,7 @@ refer to a single input from the form.
258
258
 
259
259
  .. autoclass:: IntegerRangeField(default field arguments)
260
260
 
261
- .. autoclass:: MonthField(default field arguments, format='%Y:%m')
261
+ .. autoclass:: MonthField(default field arguments, format='%Y-%m')
262
262
 
263
263
  .. autoclass:: RadioField(default field arguments, choices=[], coerce=str)
264
264
 
@@ -0,0 +1,5 @@
1
+ Sphinx~=7.0.0
2
+ Pallets-Sphinx-Themes~=2.2.0
3
+ sphinx-issues~=4.0.0
4
+ sphinxcontrib-log-cabinet~=1.0.1
5
+ python-dateutil~=2.8.2
@@ -68,8 +68,8 @@ the new API's unless it needs to work across both WTForms 1.x and 2.x
68
68
 
69
69
  .. _WTForms-Alchemy: https://pypi.org/project/WTForms-Alchemy/
70
70
  .. _WTForms-Alchemy-docs: https://wtforms-alchemy.readthedocs.io/
71
- .. _WTForms-Appengine: https://github.com/wtforms/wtforms-appengine
72
- .. _WTForms-Django: https://github.com/wtforms/wtforms-django
71
+ .. _WTForms-Appengine: https://github.com/pallets-eco/wtforms-appengine
72
+ .. _WTForms-Django: https://github.com/pallets-eco/wtforms-django
73
73
 
74
74
 
75
75
  Low-level Changes
@@ -13,7 +13,7 @@ classifiers = [
13
13
  "Programming Language :: Python",
14
14
  "Topic :: Internet :: WWW/HTTP :: Dynamic Content",
15
15
  ]
16
- requires-python = ">=3.8"
16
+ requires-python = ">=3.9"
17
17
  dependencies = [
18
18
  "MarkupSafe",
19
19
  ]
@@ -22,8 +22,8 @@ dynamic = ["version"]
22
22
  [project.urls]
23
23
  Documentation = "https://wtforms.readthedocs.io"
24
24
  Changes = "https://wtforms.readthedocs.io/changes"
25
- "Source Code" = "https://github.com/wtforms/wtforms/"
26
- "Issue Tracker" = "https://github.com/wtforms/wtforms/issues"
25
+ "Source Code" = "https://github.com/pallets-eco/wtforms/"
26
+ "Issue Tracker" = "https://github.com/pallets-eco/wtforms/issues"
27
27
  Chat = "https://discord.gg/pallets"
28
28
 
29
29
  [project.optional-dependencies]
@@ -78,30 +78,22 @@ exclude_lines = [
78
78
  "pass",
79
79
  ]
80
80
 
81
- [tool.flake8]
82
- # B = bugbear
83
- # E = pycodestyle errors
84
- # F = flake8 pyflakes
85
- # W = pycodestyle warnings
86
- # B9 = bugbear opinions
87
- # ISC = implicit-str-concat
88
- select = ["B", "E", "F", "W", "B9", "ISC"]
89
- ignore = [
90
- # slice notation whitespace, invalid
91
- "E203",
92
- # line length, handled by bugbear B950
93
- "E501",
94
- # bare except, handled by bugbear B001
95
- "E722",
96
- # bin op line break, invalid
97
- "W503",
98
- # requires 'strict' argument for 'zip'
99
- # that needs python >= 3.10
100
- "B905",
101
- ]
102
- # up to 88 allowed by bugbear B950
103
- max-line-length = 80
104
- per-file-ignores = [
105
- # __init__ modules export names
106
- "**/__init__.py: F401, F403",
81
+ [tool.ruff]
82
+ src = ["src"]
83
+ fix = true
84
+ show-fixes = true
85
+ output-format = "full"
86
+
87
+ [tool.ruff.lint]
88
+ select = [
89
+ "B", # flake8-bugbear
90
+ "E", # pycodestyle error
91
+ "F", # pyflakes
92
+ "I", # isort
93
+ "UP", # pyupgrade
94
+ "W", # pycodestyle warning
107
95
  ]
96
+
97
+ [tool.ruff.lint.isort]
98
+ force-single-line = true
99
+ order-by-type = false
@@ -0,0 +1,79 @@
1
+ from wtforms import validators
2
+ from wtforms import widgets
3
+ from wtforms.fields.choices import RadioField
4
+ from wtforms.fields.choices import SelectField
5
+ from wtforms.fields.choices import SelectFieldBase
6
+ from wtforms.fields.choices import SelectMultipleField
7
+ from wtforms.fields.core import Field
8
+ from wtforms.fields.core import Flags
9
+ from wtforms.fields.core import Label
10
+ from wtforms.fields.datetime import DateField
11
+ from wtforms.fields.datetime import DateTimeField
12
+ from wtforms.fields.datetime import DateTimeLocalField
13
+ from wtforms.fields.datetime import MonthField
14
+ from wtforms.fields.datetime import TimeField
15
+ from wtforms.fields.datetime import WeekField
16
+ from wtforms.fields.form import FormField
17
+ from wtforms.fields.list import FieldList
18
+ from wtforms.fields.numeric import DecimalField
19
+ from wtforms.fields.numeric import DecimalRangeField
20
+ from wtforms.fields.numeric import FloatField
21
+ from wtforms.fields.numeric import IntegerField
22
+ from wtforms.fields.numeric import IntegerRangeField
23
+ from wtforms.fields.simple import BooleanField
24
+ from wtforms.fields.simple import ColorField
25
+ from wtforms.fields.simple import EmailField
26
+ from wtforms.fields.simple import FileField
27
+ from wtforms.fields.simple import HiddenField
28
+ from wtforms.fields.simple import MultipleFileField
29
+ from wtforms.fields.simple import PasswordField
30
+ from wtforms.fields.simple import SearchField
31
+ from wtforms.fields.simple import StringField
32
+ from wtforms.fields.simple import SubmitField
33
+ from wtforms.fields.simple import TelField
34
+ from wtforms.fields.simple import TextAreaField
35
+ from wtforms.fields.simple import URLField
36
+ from wtforms.form import Form
37
+ from wtforms.validators import ValidationError
38
+
39
+ __version__ = "3.2.1"
40
+
41
+ __all__ = [
42
+ "validators",
43
+ "widgets",
44
+ "Form",
45
+ "ValidationError",
46
+ "SelectField",
47
+ "SelectMultipleField",
48
+ "SelectFieldBase",
49
+ "RadioField",
50
+ "Field",
51
+ "Flags",
52
+ "Label",
53
+ "DateTimeField",
54
+ "DateField",
55
+ "TimeField",
56
+ "MonthField",
57
+ "DateTimeLocalField",
58
+ "WeekField",
59
+ "FormField",
60
+ "FieldList",
61
+ "IntegerField",
62
+ "DecimalField",
63
+ "FloatField",
64
+ "IntegerRangeField",
65
+ "DecimalRangeField",
66
+ "BooleanField",
67
+ "TextAreaField",
68
+ "PasswordField",
69
+ "FileField",
70
+ "MultipleFileField",
71
+ "HiddenField",
72
+ "SearchField",
73
+ "SubmitField",
74
+ "StringField",
75
+ "TelField",
76
+ "URLField",
77
+ "EmailField",
78
+ "ColorField",
79
+ ]
@@ -12,6 +12,7 @@ for extra security) is used as the value of the csrf_token. If this token
12
12
  validates with the hmac of the random value + expiration time, and the
13
13
  expiration time is not passed, the CSRF validation will pass.
14
14
  """
15
+
15
16
  import hmac
16
17
  import os
17
18
  from datetime import datetime
@@ -0,0 +1,71 @@
1
+ from wtforms.fields.choices import RadioField
2
+ from wtforms.fields.choices import SelectField
3
+ from wtforms.fields.choices import SelectFieldBase
4
+ from wtforms.fields.choices import SelectMultipleField
5
+ from wtforms.fields.core import Field
6
+ from wtforms.fields.core import Flags
7
+ from wtforms.fields.core import Label
8
+ from wtforms.fields.datetime import DateField
9
+ from wtforms.fields.datetime import DateTimeField
10
+ from wtforms.fields.datetime import DateTimeLocalField
11
+ from wtforms.fields.datetime import MonthField
12
+ from wtforms.fields.datetime import TimeField
13
+ from wtforms.fields.datetime import WeekField
14
+ from wtforms.fields.form import FormField
15
+ from wtforms.fields.list import FieldList
16
+ from wtforms.fields.numeric import DecimalField
17
+ from wtforms.fields.numeric import DecimalRangeField
18
+ from wtforms.fields.numeric import FloatField
19
+ from wtforms.fields.numeric import IntegerField
20
+ from wtforms.fields.numeric import IntegerRangeField
21
+ from wtforms.fields.simple import BooleanField
22
+ from wtforms.fields.simple import ColorField
23
+ from wtforms.fields.simple import EmailField
24
+ from wtforms.fields.simple import FileField
25
+ from wtforms.fields.simple import HiddenField
26
+ from wtforms.fields.simple import MultipleFileField
27
+ from wtforms.fields.simple import PasswordField
28
+ from wtforms.fields.simple import SearchField
29
+ from wtforms.fields.simple import StringField
30
+ from wtforms.fields.simple import SubmitField
31
+ from wtforms.fields.simple import TelField
32
+ from wtforms.fields.simple import TextAreaField
33
+ from wtforms.fields.simple import URLField
34
+ from wtforms.utils import unset_value as _unset_value
35
+
36
+ __all__ = [
37
+ "Field",
38
+ "Flags",
39
+ "Label",
40
+ "SelectField",
41
+ "SelectMultipleField",
42
+ "SelectFieldBase",
43
+ "RadioField",
44
+ "DateTimeField",
45
+ "DateField",
46
+ "TimeField",
47
+ "MonthField",
48
+ "DateTimeLocalField",
49
+ "WeekField",
50
+ "FormField",
51
+ "IntegerField",
52
+ "DecimalField",
53
+ "FloatField",
54
+ "IntegerRangeField",
55
+ "DecimalRangeField",
56
+ "BooleanField",
57
+ "TextAreaField",
58
+ "PasswordField",
59
+ "FileField",
60
+ "MultipleFileField",
61
+ "HiddenField",
62
+ "SearchField",
63
+ "SubmitField",
64
+ "StringField",
65
+ "TelField",
66
+ "URLField",
67
+ "EmailField",
68
+ "ColorField",
69
+ "FieldList",
70
+ "_unset_value",
71
+ ]
@@ -1,6 +1,5 @@
1
1
  import inspect
2
2
  import itertools
3
- import warnings
4
3
 
5
4
  from markupsafe import escape
6
5
  from markupsafe import Markup
@@ -131,17 +130,6 @@ class Field:
131
130
  for v in itertools.chain(self.validators, [self.widget]):
132
131
  flags = getattr(v, "field_flags", {})
133
132
 
134
- # check for legacy format, remove eventually
135
- if isinstance(flags, tuple): # pragma: no cover
136
- warnings.warn(
137
- "Flags should be stored in dicts and not in tuples. "
138
- "The next version of WTForms will abandon support "
139
- "for flags in tuples.",
140
- DeprecationWarning,
141
- stacklevel=2,
142
- )
143
- flags = {flag_name: True for flag_name in flags}
144
-
145
133
  for k, v in flags.items():
146
134
  setattr(self.flags, k, v)
147
135
 
@@ -181,14 +169,14 @@ class Field:
181
169
  for validator in validators:
182
170
  if not callable(validator):
183
171
  raise TypeError(
184
- "{} is not a valid validator because it is not "
185
- "callable".format(validator)
172
+ f"{validator} is not a valid validator because it is not "
173
+ "callable"
186
174
  )
187
175
 
188
176
  if inspect.isclass(validator):
189
177
  raise TypeError(
190
- "{} is not a valid validator because it is a class, "
191
- "it should be an instance".format(validator)
178
+ f"{validator} is not a valid validator because it is a class, "
179
+ "it should be an instance"
192
180
  )
193
181
 
194
182
  def gettext(self, string):
@@ -399,8 +387,10 @@ class UnboundField:
399
387
  return self.field_class(*self.args, **kw)
400
388
 
401
389
  def __repr__(self):
402
- return "<UnboundField({}, {!r}, {!r})>".format(
403
- self.field_class.__name__, self.args, self.kwargs
390
+ return (
391
+ "<UnboundField("
392
+ f"{self.field_class.__name__}, {self.args!r}, {self.kwargs!r}"
393
+ ")>"
404
394
  )
405
395
 
406
396
 
@@ -425,7 +415,8 @@ class Flags:
425
415
  for name in dir(self)
426
416
  if not name.startswith("_")
427
417
  )
428
- return "<wtforms.fields.Flags: {%s}>" % ", ".join(flags)
418
+ flags = ", ".join(flags)
419
+ return f"<wtforms.fields.Flags: {{{flags}}}>"
429
420
 
430
421
 
431
422
  class Label:
@@ -34,7 +34,8 @@ class DateTimeField(Field):
34
34
  def _value(self):
35
35
  if self.raw_data:
36
36
  return " ".join(self.raw_data)
37
- return self.data and self.data.strftime(self.format[0]) or ""
37
+ format = self.format[0]
38
+ return self.data and self.data.strftime(format) or ""
38
39
 
39
40
  def process_formdata(self, valuelist):
40
41
  if not valuelist:
@@ -1,6 +1,7 @@
1
+ from wtforms.utils import unset_value
2
+
1
3
  from .. import widgets
2
4
  from .core import Field
3
- from wtforms.utils import unset_value
4
5
 
5
6
  __all__ = ("FormField",)
6
7
 
@@ -1,9 +1,10 @@
1
1
  import itertools
2
2
 
3
+ from wtforms.utils import unset_value
4
+
3
5
  from .. import widgets
4
6
  from .core import Field
5
7
  from .core import UnboundField
6
- from wtforms.utils import unset_value
7
8
 
8
9
  __all__ = ("FieldList",)
9
10
 
@@ -30,6 +30,7 @@ class BaseForm:
30
30
  prefix += "-"
31
31
 
32
32
  self.meta = meta
33
+ self._form_error_key = ""
33
34
  self._prefix = prefix
34
35
  self._fields = OrderedDict()
35
36
 
@@ -113,7 +114,7 @@ class BaseForm:
113
114
  for name, field in self._fields.items():
114
115
  field_extra_filters = filters.get(name, [])
115
116
 
116
- inline_filter = getattr(self, "filter_%s" % name, None)
117
+ inline_filter = getattr(self, f"filter_{name}", None)
117
118
  if inline_filter is not None:
118
119
  field_extra_filters.append(inline_filter)
119
120
 
@@ -155,7 +156,7 @@ class BaseForm:
155
156
  def errors(self):
156
157
  errors = {name: f.errors for name, f in self._fields.items() if f.errors}
157
158
  if self.form_errors:
158
- errors[None] = self.form_errors
159
+ errors[self._form_error_key] = self.form_errors
159
160
  return errors
160
161
 
161
162
 
@@ -7,7 +7,7 @@ msgid ""
7
7
  msgstr ""
8
8
  "Project-Id-Version: WTForms 2.0dev\n"
9
9
  "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
10
- "POT-Creation-Date: 2023-10-05 13:42+0200\n"
10
+ "POT-Creation-Date: 2024-01-11 08:20+0100\n"
11
11
  "PO-Revision-Date: 2015-04-08 20:59+0100\n"
12
12
  "Last-Translator: Jalal Maqdisi <jalal.maqdisi@gmail.com>\n"
13
13
  "Language-Team: ar <LL@li.org>\n"
@@ -123,11 +123,11 @@ msgstr "قيمة غير صالحة، يجب أن تكون اي من: %(values)s.
123
123
  #: src/wtforms/validators.py:698
124
124
  #, fuzzy
125
125
  #| msgid "This field is required."
126
- msgid "This field cannot be edited"
126
+ msgid "This field cannot be edited."
127
127
  msgstr "هذا الحقل مطلوب."
128
128
 
129
129
  #: src/wtforms/validators.py:714
130
- msgid "This field is disabled and cannot have a value"
130
+ msgid "This field is disabled and cannot have a value."
131
131
  msgstr ""
132
132
 
133
133
  #: src/wtforms/csrf/core.py:96
@@ -146,23 +146,23 @@ msgstr "CSRF قد فشل."
146
146
  msgid "CSRF token expired."
147
147
  msgstr "انتهت صلاحية رمز CSRF."
148
148
 
149
- #: src/wtforms/fields/choices.py:135
149
+ #: src/wtforms/fields/choices.py:142
150
150
  msgid "Invalid Choice: could not coerce."
151
151
  msgstr "اختيار غير صالح: لا يمكن الاجبار."
152
152
 
153
- #: src/wtforms/fields/choices.py:139 src/wtforms/fields/choices.py:192
153
+ #: src/wtforms/fields/choices.py:149 src/wtforms/fields/choices.py:203
154
154
  msgid "Choices cannot be None."
155
155
  msgstr ""
156
156
 
157
- #: src/wtforms/fields/choices.py:148
157
+ #: src/wtforms/fields/choices.py:155
158
158
  msgid "Not a valid choice."
159
159
  msgstr "اختيار غير صحيح."
160
160
 
161
- #: src/wtforms/fields/choices.py:185
161
+ #: src/wtforms/fields/choices.py:193
162
162
  msgid "Invalid choice(s): one or more data inputs could not be coerced."
163
163
  msgstr "اختيارات غير صالحة: واحدة او اكثر من الادخالات لا يمكن اجبارها."
164
164
 
165
- #: src/wtforms/fields/choices.py:204
165
+ #: src/wtforms/fields/choices.py:214
166
166
  #, fuzzy, python-format
167
167
  #| msgid "'%(value)s' is not a valid choice for this field."
168
168
  msgid "'%(value)s' is not a valid choice for this field."