wagtail 7.2.1__py3-none-any.whl → 7.3rc1__py3-none-any.whl

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 (312) hide show
  1. wagtail/__init__.py +1 -1
  2. wagtail/actions/copy_for_translation.py +4 -2
  3. wagtail/admin/action_menu.py +4 -1
  4. wagtail/admin/api/actions/convert_alias.py +2 -2
  5. wagtail/admin/api/actions/copy.py +2 -2
  6. wagtail/admin/api/actions/copy_for_translation.py +2 -2
  7. wagtail/admin/api/actions/create_alias.py +2 -2
  8. wagtail/admin/api/actions/delete.py +1 -1
  9. wagtail/admin/api/actions/move.py +1 -1
  10. wagtail/admin/api/actions/publish.py +2 -2
  11. wagtail/admin/api/actions/revert_to_page_revision.py +2 -2
  12. wagtail/admin/api/actions/unpublish.py +1 -1
  13. wagtail/admin/api/filters.py +2 -2
  14. wagtail/admin/compare.py +22 -0
  15. wagtail/admin/forms/account.py +52 -1
  16. wagtail/admin/forms/comments.py +53 -0
  17. wagtail/admin/forms/models.py +36 -0
  18. wagtail/admin/forms/pages.py +7 -0
  19. wagtail/admin/forms/workflows.py +5 -2
  20. wagtail/admin/icons.py +4 -3
  21. wagtail/admin/locale/ar/LC_MESSAGES/django.mo +0 -0
  22. wagtail/admin/locale/ar/LC_MESSAGES/django.po +35 -0
  23. wagtail/admin/locale/en/LC_MESSAGES/django.po +262 -234
  24. wagtail/admin/locale/en/LC_MESSAGES/djangojs.po +72 -43
  25. wagtail/admin/locale/it/LC_MESSAGES/django.mo +0 -0
  26. wagtail/admin/locale/it/LC_MESSAGES/django.po +566 -6
  27. wagtail/admin/locale/it/LC_MESSAGES/djangojs.mo +0 -0
  28. wagtail/admin/locale/it/LC_MESSAGES/djangojs.po +40 -2
  29. wagtail/admin/locale/nl/LC_MESSAGES/django.mo +0 -0
  30. wagtail/admin/locale/nl/LC_MESSAGES/django.po +2 -2
  31. wagtail/admin/locale/sv/LC_MESSAGES/django.mo +0 -0
  32. wagtail/admin/locale/sv/LC_MESSAGES/django.po +330 -15
  33. wagtail/admin/locale/sv/LC_MESSAGES/djangojs.mo +0 -0
  34. wagtail/admin/locale/sv/LC_MESSAGES/djangojs.po +3 -2
  35. wagtail/admin/panels/comment_panel.py +1 -51
  36. wagtail/admin/panels/title_field_panel.py +3 -1
  37. wagtail/admin/static/wagtailadmin/css/core.css +1 -1
  38. wagtail/admin/static/wagtailadmin/js/bulk-actions.js +1 -1
  39. wagtail/admin/static/wagtailadmin/js/comments.js +1 -1
  40. wagtail/admin/static/wagtailadmin/js/core.js +1 -1
  41. wagtail/admin/static/wagtailadmin/js/core.js.LICENSE.txt +1 -1
  42. wagtail/admin/static/wagtailadmin/js/draftail.js +1 -1
  43. wagtail/admin/static/wagtailadmin/js/privacy-switch.js +1 -1
  44. wagtail/admin/static/wagtailadmin/js/sidebar.js +1 -1
  45. wagtail/admin/static/wagtailadmin/js/telepath/blocks.js +1 -1
  46. wagtail/admin/static/wagtailadmin/js/userbar.js +1 -1
  47. wagtail/admin/static/wagtailadmin/js/userbar.js.LICENSE.txt +1 -1
  48. wagtail/admin/static/wagtailadmin/js/vendor.js +1 -1
  49. wagtail/admin/static/wagtailadmin/js/wagtailadmin.js +1 -1
  50. wagtail/admin/templates/wagtailadmin/base.html +1 -1
  51. wagtail/admin/templates/wagtailadmin/generic/edit_partials.html +100 -0
  52. wagtail/admin/templates/wagtailadmin/generic/form.html +26 -5
  53. wagtail/admin/templates/wagtailadmin/generic/includes/_loaded_revision_inputs.html +3 -0
  54. wagtail/admin/templates/wagtailadmin/generic/listing_results.html +1 -17
  55. wagtail/admin/templates/wagtailadmin/pages/create.html +14 -4
  56. wagtail/admin/templates/wagtailadmin/pages/edit.html +16 -3
  57. wagtail/admin/templates/wagtailadmin/pages/edit_partials.html +31 -0
  58. wagtail/admin/templates/wagtailadmin/pages/index_results.html +1 -9
  59. wagtail/admin/templates/wagtailadmin/shared/autosave/indicator.html +36 -0
  60. wagtail/admin/templates/wagtailadmin/shared/breadcrumbs.html +1 -1
  61. wagtail/admin/templates/wagtailadmin/shared/editing_sessions/list.html +2 -2
  62. wagtail/admin/templates/wagtailadmin/shared/editing_sessions/module.html +19 -3
  63. wagtail/admin/templates/wagtailadmin/shared/headers/_actions.html +5 -0
  64. wagtail/admin/templates/wagtailadmin/shared/headers/_history_icon_link.html +2 -2
  65. wagtail/admin/templates/wagtailadmin/shared/headers/slim_header.html +8 -9
  66. wagtail/admin/templates/wagtailadmin/shared/listing/filter_partials.html +19 -0
  67. wagtail/admin/templates/wagtailadmin/shared/side_panel_toggle.html +3 -3
  68. wagtail/admin/templates/wagtailadmin/shared/side_panels/includes/side_panel.html +3 -0
  69. wagtail/admin/templates/wagtailadmin/shared/side_panels/includes/status/privacy.html +18 -6
  70. wagtail/admin/templates/wagtailadmin/shared/side_panels/includes/status/usage.html +11 -4
  71. wagtail/admin/templates/wagtailadmin/shared/side_panels/includes/status/workflow.html +22 -1
  72. wagtail/admin/templates/wagtailadmin/shared/side_panels/preview.html +1 -0
  73. wagtail/admin/templates/wagtailadmin/shared/side_panels.html +1 -2
  74. wagtail/admin/templates/wagtailadmin/shared/unsaved_changes_warning.html +20 -20
  75. wagtail/admin/templates/wagtailadmin/userbar/base.html +2 -0
  76. wagtail/admin/templates/wagtailadmin/userbar/item_accessibility.html +1 -1
  77. wagtail/admin/templatetags/wagtailadmin_tags.py +6 -14
  78. wagtail/admin/tests/pages/test_create_page.py +298 -1
  79. wagtail/admin/tests/pages/test_custom_listing.py +48 -2
  80. wagtail/admin/tests/pages/test_edit_page.py +721 -7
  81. wagtail/admin/tests/pages/test_explorer_view.py +9 -5
  82. wagtail/admin/tests/pages/test_page_search.py +15 -0
  83. wagtail/admin/tests/pages/test_revisions.py +4 -0
  84. wagtail/admin/tests/test_account_management.py +88 -2
  85. wagtail/admin/tests/test_collections_views.py +15 -15
  86. wagtail/admin/tests/test_compare.py +34 -0
  87. wagtail/admin/tests/test_editing_sessions.py +230 -8
  88. wagtail/admin/tests/test_forms.py +192 -1
  89. wagtail/admin/tests/test_icon_sprite.py +22 -2
  90. wagtail/admin/tests/test_page_chooser.py +13 -13
  91. wagtail/admin/tests/test_reports_views.py +4 -1
  92. wagtail/admin/tests/test_userbar.py +69 -5
  93. wagtail/admin/tests/test_views_generic.py +5 -5
  94. wagtail/admin/tests/test_workflows.py +14 -12
  95. wagtail/admin/tests/viewsets/test_model_viewset.py +13 -0
  96. wagtail/admin/ui/autosave.py +5 -0
  97. wagtail/admin/ui/editing_sessions.py +3 -0
  98. wagtail/admin/ui/side_panels.py +19 -20
  99. wagtail/admin/userbar.py +48 -27
  100. wagtail/admin/views/bulk_action/dispatcher.py +2 -2
  101. wagtail/admin/views/chooser.py +6 -6
  102. wagtail/admin/views/editing_sessions.py +20 -7
  103. wagtail/admin/views/generic/__init__.py +1 -0
  104. wagtail/admin/views/generic/chooser.py +5 -5
  105. wagtail/admin/views/generic/mixins.py +143 -26
  106. wagtail/admin/views/generic/models.py +157 -27
  107. wagtail/admin/views/generic/ordering.py +1 -1
  108. wagtail/admin/views/generic/preview.py +4 -4
  109. wagtail/admin/views/home.py +3 -1
  110. wagtail/admin/views/pages/create.py +77 -29
  111. wagtail/admin/views/pages/edit.py +160 -34
  112. wagtail/admin/views/pages/preview.py +4 -4
  113. wagtail/admin/views/pages/revisions.py +3 -0
  114. wagtail/admin/views/pages/search.py +4 -4
  115. wagtail/admin/views/pages/usage.py +2 -2
  116. wagtail/admin/views/tags.py +2 -2
  117. wagtail/admin/views/workflows.py +73 -54
  118. wagtail/admin/viewsets/model.py +34 -8
  119. wagtail/admin/widgets/button.py +11 -4
  120. wagtail/admin/widgets/chooser.py +6 -4
  121. wagtail/admin/widgets/slug.py +1 -1
  122. wagtail/api/v2/filters.py +27 -21
  123. wagtail/api/v2/pagination.py +4 -4
  124. wagtail/api/v2/views.py +7 -7
  125. wagtail/blocks/list_block.py +0 -8
  126. wagtail/blocks/migrations/migrate_operation.py +8 -1
  127. wagtail/blocks/stream_block.py +2 -10
  128. wagtail/blocks/struct_block.py +192 -12
  129. wagtail/compat.py +2 -2
  130. wagtail/contrib/forms/locale/en/LC_MESSAGES/django.po +1 -1
  131. wagtail/contrib/forms/locale/it/LC_MESSAGES/django.mo +0 -0
  132. wagtail/contrib/forms/locale/it/LC_MESSAGES/django.po +40 -2
  133. wagtail/contrib/frontend_cache/backends/azure.py +6 -6
  134. wagtail/contrib/frontend_cache/backends/cloudfront.py +2 -2
  135. wagtail/contrib/frontend_cache/utils.py +1 -1
  136. wagtail/contrib/redirects/forms.py +1 -1
  137. wagtail/contrib/redirects/locale/en/LC_MESSAGES/django.po +14 -14
  138. wagtail/contrib/redirects/locale/it/LC_MESSAGES/django.mo +0 -0
  139. wagtail/contrib/redirects/locale/it/LC_MESSAGES/django.po +15 -2
  140. wagtail/contrib/redirects/locale/sv/LC_MESSAGES/django.mo +0 -0
  141. wagtail/contrib/redirects/locale/sv/LC_MESSAGES/django.po +16 -3
  142. wagtail/contrib/redirects/middleware.py +11 -7
  143. wagtail/contrib/redirects/models.py +17 -1
  144. wagtail/contrib/redirects/tests/test_import_admin_views.py +3 -3
  145. wagtail/contrib/redirects/tests/test_redirects.py +56 -8
  146. wagtail/contrib/search_promotions/locale/en/LC_MESSAGES/django.po +6 -6
  147. wagtail/contrib/search_promotions/locale/it/LC_MESSAGES/django.mo +0 -0
  148. wagtail/contrib/search_promotions/locale/it/LC_MESSAGES/django.po +43 -2
  149. wagtail/contrib/search_promotions/tests.py +1 -1
  150. wagtail/contrib/search_promotions/views/settings.py +24 -25
  151. wagtail/contrib/settings/jinja2tags.py +2 -2
  152. wagtail/contrib/settings/locale/en/LC_MESSAGES/django.po +2 -2
  153. wagtail/contrib/settings/locale/it/LC_MESSAGES/django.mo +0 -0
  154. wagtail/contrib/settings/locale/it/LC_MESSAGES/django.po +6 -2
  155. wagtail/contrib/settings/locale/sv/LC_MESSAGES/django.mo +0 -0
  156. wagtail/contrib/settings/locale/sv/LC_MESSAGES/django.po +3 -2
  157. wagtail/contrib/settings/tests/generic/test_admin.py +118 -2
  158. wagtail/contrib/settings/tests/site_specific/test_admin.py +78 -15
  159. wagtail/contrib/settings/tests/site_specific/test_model.py +2 -2
  160. wagtail/contrib/settings/views.py +7 -0
  161. wagtail/contrib/simple_translation/locale/en/LC_MESSAGES/django.po +1 -1
  162. wagtail/contrib/simple_translation/locale/it/LC_MESSAGES/django.mo +0 -0
  163. wagtail/contrib/simple_translation/locale/it/LC_MESSAGES/django.po +5 -2
  164. wagtail/contrib/styleguide/locale/en/LC_MESSAGES/django.po +7 -7
  165. wagtail/contrib/styleguide/tests.py +2 -0
  166. wagtail/contrib/styleguide/views.py +4 -5
  167. wagtail/contrib/table_block/locale/ar/LC_MESSAGES/django.mo +0 -0
  168. wagtail/contrib/table_block/locale/ar/LC_MESSAGES/django.po +5 -1
  169. wagtail/contrib/table_block/locale/en/LC_MESSAGES/django.po +1 -1
  170. wagtail/contrib/table_block/locale/it/LC_MESSAGES/django.mo +0 -0
  171. wagtail/contrib/table_block/locale/it/LC_MESSAGES/django.po +5 -2
  172. wagtail/contrib/typed_table_block/blocks.py +37 -0
  173. wagtail/contrib/typed_table_block/locale/en/LC_MESSAGES/django.po +10 -10
  174. wagtail/contrib/typed_table_block/locale/sv/LC_MESSAGES/django.mo +0 -0
  175. wagtail/contrib/typed_table_block/locale/sv/LC_MESSAGES/django.po +4 -3
  176. wagtail/contrib/typed_table_block/tests.py +108 -0
  177. wagtail/coreutils.py +4 -4
  178. wagtail/documents/__init__.py +4 -4
  179. wagtail/documents/locale/en/LC_MESSAGES/django.po +15 -15
  180. wagtail/documents/locale/it/LC_MESSAGES/django.mo +0 -0
  181. wagtail/documents/locale/it/LC_MESSAGES/django.po +32 -2
  182. wagtail/documents/locale/sv/LC_MESSAGES/django.mo +0 -0
  183. wagtail/documents/locale/sv/LC_MESSAGES/django.po +32 -4
  184. wagtail/documents/models.py +1 -1
  185. wagtail/documents/tests/test_admin_views.py +19 -4
  186. wagtail/documents/tests/test_search.py +0 -2
  187. wagtail/documents/tests/test_views.py +6 -4
  188. wagtail/documents/views/bulk_actions/add_tags.py +1 -1
  189. wagtail/embeds/finders/facebook.py +3 -3
  190. wagtail/embeds/finders/instagram.py +3 -3
  191. wagtail/embeds/finders/oembed.py +7 -2
  192. wagtail/embeds/locale/en/LC_MESSAGES/django.po +1 -1
  193. wagtail/embeds/oembed_providers.py +8 -0
  194. wagtail/embeds/tests/test_embeds.py +35 -0
  195. wagtail/images/__init__.py +4 -4
  196. wagtail/images/admin_urls.py +3 -3
  197. wagtail/images/blocks.py +1 -1
  198. wagtail/images/formats.py +2 -2
  199. wagtail/images/image_operations.py +2 -2
  200. wagtail/images/locale/en/LC_MESSAGES/django.po +44 -40
  201. wagtail/images/locale/it/LC_MESSAGES/django.mo +0 -0
  202. wagtail/images/locale/it/LC_MESSAGES/django.po +50 -4
  203. wagtail/images/locale/nl/LC_MESSAGES/django.mo +0 -0
  204. wagtail/images/locale/nl/LC_MESSAGES/django.po +3 -3
  205. wagtail/images/locale/sv/LC_MESSAGES/django.mo +0 -0
  206. wagtail/images/locale/sv/LC_MESSAGES/django.po +49 -6
  207. wagtail/images/models.py +11 -10
  208. wagtail/images/templates/wagtailimages/images/index_results.html +1 -1
  209. wagtail/images/templates/wagtailimages/images/url_generator.html +17 -38
  210. wagtail/images/templates/wagtailimages/images/url_generator_output.html +28 -0
  211. wagtail/images/templatetags/wagtailimages_tags.py +4 -4
  212. wagtail/images/tests/test_admin_views.py +432 -59
  213. wagtail/images/tests/test_image_operations.py +2 -2
  214. wagtail/images/tests/test_models.py +0 -2
  215. wagtail/images/views/bulk_actions/add_tags.py +1 -1
  216. wagtail/images/views/images.py +72 -39
  217. wagtail/locale/en/LC_MESSAGES/django.po +103 -105
  218. wagtail/locale/it/LC_MESSAGES/django.mo +0 -0
  219. wagtail/locale/it/LC_MESSAGES/django.po +105 -2
  220. wagtail/locale/sv/LC_MESSAGES/django.mo +0 -0
  221. wagtail/locale/sv/LC_MESSAGES/django.po +95 -12
  222. wagtail/locales/locale/en/LC_MESSAGES/django.po +1 -1
  223. wagtail/locales/locale/it/LC_MESSAGES/django.mo +0 -0
  224. wagtail/locales/locale/it/LC_MESSAGES/django.po +13 -2
  225. wagtail/locales/locale/sv/LC_MESSAGES/django.mo +0 -0
  226. wagtail/locales/locale/sv/LC_MESSAGES/django.po +4 -3
  227. wagtail/locales/tests.py +5 -5
  228. wagtail/models/i18n.py +4 -6
  229. wagtail/models/media.py +18 -0
  230. wagtail/models/pages.py +65 -11
  231. wagtail/models/reference_index.py +15 -0
  232. wagtail/models/revisions.py +40 -12
  233. wagtail/models/workflows.py +0 -3
  234. wagtail/permission_policies/base.py +2 -2
  235. wagtail/permission_policies/collections.py +2 -2
  236. wagtail/project_template/requirements.txt +2 -2
  237. wagtail/search/locale/en/LC_MESSAGES/django.po +1 -1
  238. wagtail/signal_handlers.py +1 -0
  239. wagtail/sites/locale/en/LC_MESSAGES/django.po +1 -1
  240. wagtail/sites/locale/sv/LC_MESSAGES/django.mo +0 -0
  241. wagtail/sites/locale/sv/LC_MESSAGES/django.po +3 -2
  242. wagtail/sites/tests.py +7 -7
  243. wagtail/snippets/action_menu.py +2 -1
  244. wagtail/snippets/locale/en/LC_MESSAGES/django.po +23 -13
  245. wagtail/snippets/locale/sv/LC_MESSAGES/django.mo +0 -0
  246. wagtail/snippets/locale/sv/LC_MESSAGES/django.po +12 -1
  247. wagtail/snippets/tests/test_chooser_block.py +197 -0
  248. wagtail/snippets/tests/test_chooser_panel.py +149 -0
  249. wagtail/snippets/tests/test_chooser_views.py +375 -0
  250. wagtail/snippets/tests/test_chooser_widget.py +22 -0
  251. wagtail/snippets/tests/test_compare_revisions_view.py +167 -0
  252. wagtail/snippets/tests/test_copy_view.py +38 -0
  253. wagtail/snippets/tests/test_create_view.py +1159 -0
  254. wagtail/snippets/tests/test_delete_view.py +225 -0
  255. wagtail/snippets/tests/test_edit_view.py +2882 -0
  256. wagtail/snippets/tests/test_history_view.py +182 -0
  257. wagtail/snippets/tests/test_index_view.py +105 -0
  258. wagtail/snippets/tests/test_list_view.py +786 -0
  259. wagtail/snippets/tests/test_locking.py +28 -0
  260. wagtail/snippets/tests/test_permissions.py +167 -0
  261. wagtail/snippets/tests/test_preview.py +3 -3
  262. wagtail/snippets/tests/test_revert_view.py +343 -0
  263. wagtail/snippets/tests/test_snippet_models.py +112 -0
  264. wagtail/snippets/tests/test_unpublish_view.py +228 -0
  265. wagtail/snippets/tests/test_unschedule_view.py +151 -0
  266. wagtail/snippets/tests/test_viewset.py +38 -5
  267. wagtail/snippets/views/snippets.py +78 -30
  268. wagtail/snippets/widgets.py +2 -2
  269. wagtail/templatetags/wagtailcore_tags.py +2 -2
  270. wagtail/test/dummy_external_storage.py +1 -1
  271. wagtail/test/testapp/fixtures/test.json +22 -0
  272. wagtail/test/testapp/fixtures/test_empty.json +2 -0
  273. wagtail/test/testapp/fixtures/test_explorable_pages.json +10 -0
  274. wagtail/test/testapp/fixtures/test_specific.json +9 -0
  275. wagtail/test/testapp/migrations/0059_nopromotepage.py +25 -0
  276. wagtail/test/testapp/models.py +7 -0
  277. wagtail/test/testapp/views.py +5 -0
  278. wagtail/test/utils/page_tests.py +7 -7
  279. wagtail/test/utils/wagtail_factories/builder.py +2 -2
  280. wagtail/tests/streamfield_migrations/test_migrations.py +35 -0
  281. wagtail/tests/test_blocks.py +321 -61
  282. wagtail/tests/test_collection_model.py +12 -0
  283. wagtail/tests/test_page_model.py +190 -1
  284. wagtail/tests/test_page_privacy.py +5 -0
  285. wagtail/tests/test_reference_index.py +42 -0
  286. wagtail/tests/test_revision_model.py +118 -1
  287. wagtail/tests/test_utils.py +2 -2
  288. wagtail/users/locale/en/LC_MESSAGES/django.po +14 -14
  289. wagtail/users/locale/id_ID/LC_MESSAGES/django.mo +0 -0
  290. wagtail/users/locale/id_ID/LC_MESSAGES/django.po +6 -2
  291. wagtail/users/locale/it/LC_MESSAGES/django.mo +0 -0
  292. wagtail/users/locale/it/LC_MESSAGES/django.po +14 -2
  293. wagtail/users/locale/sv/LC_MESSAGES/django.mo +0 -0
  294. wagtail/users/locale/sv/LC_MESSAGES/django.po +48 -17
  295. wagtail/users/tests/test_admin_views.py +39 -25
  296. wagtail/users/utils.py +4 -1
  297. wagtail/users/views/groups.py +19 -5
  298. wagtail/users/wagtail_hooks.py +1 -1
  299. wagtail/utils/loading.py +2 -2
  300. wagtail-7.3rc1.data/data/AGENTS.md +21 -0
  301. wagtail-7.3rc1.data/data/CHANGELOG.txt +4941 -0
  302. wagtail-7.3rc1.data/data/CODE_OF_CONDUCT.md +71 -0
  303. wagtail-7.3rc1.data/data/CONTRIBUTORS.md +999 -0
  304. wagtail-7.3rc1.data/data/SPONSORS.md +55 -0
  305. {wagtail-7.2.1.dist-info → wagtail-7.3rc1.dist-info}/METADATA +6 -6
  306. {wagtail-7.2.1.dist-info → wagtail-7.3rc1.dist-info}/RECORD +310 -280
  307. {wagtail-7.2.1.dist-info → wagtail-7.3rc1.dist-info}/WHEEL +1 -1
  308. wagtail/images/static/wagtailimages/js/image-url-generator.js +0 -1
  309. wagtail/snippets/tests/test_snippets.py +0 -6377
  310. {wagtail-7.2.1.dist-info → wagtail-7.3rc1.dist-info}/entry_points.txt +0 -0
  311. {wagtail-7.2.1.dist-info → wagtail-7.3rc1.dist-info}/licenses/LICENSE +0 -0
  312. {wagtail-7.2.1.dist-info → wagtail-7.3rc1.dist-info}/top_level.txt +0 -0
@@ -4,6 +4,7 @@
4
4
  #
5
5
  # Translators:
6
6
  # Jim Brouzoulis <jim.brouzoulis@chalmers.se>, 2017
7
+ # Jonathan Lindén, 2025
7
8
  # Martin Sandström <martin@marteinn.se>, 2020-2021,2024
8
9
  # Philip Andersen <renegadevi@codeofmagi.net>, 2018-2019
9
10
  # Thomas Kunambi <kunambi@gmail.com>, 2015,2017,2021-2023
@@ -13,7 +14,7 @@ msgstr ""
13
14
  "Report-Msgid-Bugs-To: \n"
14
15
  "POT-Creation-Date: 2025-10-23 16:45+0100\n"
15
16
  "PO-Revision-Date: 2014-02-19 11:54+0000\n"
16
- "Last-Translator: Jim Brouzoulis <jim.brouzoulis@chalmers.se>, 2017\n"
17
+ "Last-Translator: Jonathan Lindén, 2025\n"
17
18
  "Language-Team: Swedish (http://app.transifex.com/torchbox/wagtail/language/"
18
19
  "sv/)\n"
19
20
  "MIME-Version: 1.0\n"
@@ -73,31 +74,31 @@ msgid "You cannot have multiple permission records for the same page."
73
74
  msgstr "Du kan inte ha flera rättighetsinställningar för samma sida."
74
75
 
75
76
  msgid "submitted notifications"
76
- msgstr "Inskickade notifieringar"
77
+ msgstr "notifikationer för inlämning"
77
78
 
78
79
  msgid "Receive notification when a page is submitted for moderation"
79
- msgstr "Emotta notis när sida är inlämnad för moderering"
80
+ msgstr "Ta emot notifikation när en sida blir inlämnad för moderering"
80
81
 
81
82
  msgid "approved notifications"
82
- msgstr "Godkända notifieringar"
83
+ msgstr "notifikationer för godkännande"
83
84
 
84
85
  msgid "Receive notification when your page edit is approved"
85
- msgstr "Emotta notis när din sideditering har godkänts"
86
+ msgstr "Ta emot notifikation när din sidredigering blir godkänd"
86
87
 
87
88
  msgid "rejected notifications"
88
- msgstr "Nekande notifieringar"
89
+ msgstr "notifikationer för avvisande"
89
90
 
90
91
  msgid "Receive notification when your page edit is rejected"
91
- msgstr "Emotta notis när din sideditering är avvisad"
92
+ msgstr "Ta emot notifikation när din sidredigering blir avvisad"
92
93
 
93
94
  msgid "updated comments notifications"
94
- msgstr "uppdaterade kommentarnotifieringar"
95
+ msgstr "notifikationer för uppdaterade kommentarer"
95
96
 
96
97
  msgid ""
97
98
  "Receive notification when comments have been created, resolved, or deleted "
98
99
  "on a page that you have subscribed to receive comment notifications on"
99
100
  msgstr ""
100
- "Ta emot notifieringar när kommentarer har skapats, lösts, eller raderats på "
101
+ "Ta emot notifikationer när kommentarer har skapats, lösts, eller raderats på "
101
102
  "en sida som du har prenumererat att få kommentarnotifikationer från"
102
103
 
103
104
  msgid "preferred language"
@@ -127,12 +128,29 @@ msgstr "Mörkt"
127
128
  msgid "admin theme"
128
129
  msgstr "admintema"
129
130
 
131
+ msgid "More contrast"
132
+ msgstr "Mer kontrast"
133
+
134
+ msgid "contrast"
135
+ msgstr "kontrast"
136
+
130
137
  msgid "Default"
131
138
  msgstr "Standard"
132
139
 
140
+ msgid "Snug"
141
+ msgstr "Kompakt"
142
+
143
+ #. Translators: "Density" is the term used to describe the amount of space
144
+ #. between elements in the user interface
145
+ msgid "density"
146
+ msgstr "densitet"
147
+
133
148
  msgid "Keyboard shortcuts"
134
149
  msgstr "Kortkommandon"
135
150
 
151
+ msgid "Enable custom keyboard shortcuts specific to Wagtail."
152
+ msgstr "Aktivera tangentbordsgenvägar specifika för Wagtail."
153
+
136
154
  msgid "user profile"
137
155
  msgstr "användarprofil"
138
156
 
@@ -153,8 +171,8 @@ msgstr "Är du säker på att du vill tilldela denna roll till dessa användare?
153
171
 
154
172
  msgid "You don't have permission to edit this user"
155
173
  msgid_plural "You don't have permission to edit these users"
156
- msgstr[0] "Du saknar rättigheter att editera denna användare"
157
- msgstr[1] "Du saknar rättigheter att editera dessa användare"
174
+ msgstr[0] "Du saknar rättigheter att redigera denna användare"
175
+ msgstr[1] "Du saknar rättigheter att redigera dessa användare"
158
176
 
159
177
  msgid "Yes, assign"
160
178
  msgstr "Ja, tilldela"
@@ -245,13 +263,16 @@ msgid "Toggle all"
245
263
  msgstr "Växla alla"
246
264
 
247
265
  msgid "Toggle all add permissions"
248
- msgstr "Växla alla lägg till rättigheter"
266
+ msgstr "Växla alla rättigheter för att lägga till"
249
267
 
250
268
  msgid "Toggle all change permissions"
251
- msgstr "Växla alla redigera rättigheter"
269
+ msgstr "Växla alla rättigheter för att redigera"
252
270
 
253
271
  msgid "Toggle all delete permissions"
254
- msgstr "Växla alla radera rättigheter"
272
+ msgstr "Växla alla rättigheter för att radera"
273
+
274
+ msgid "Toggle all custom permissions"
275
+ msgstr "Växla alla anpassade rättigheter"
255
276
 
256
277
  msgid "Other permissions"
257
278
  msgstr "Andra rättigheter"
@@ -286,6 +307,9 @@ msgstr "Roller"
286
307
  msgid "Select all users in listing"
287
308
  msgstr "Välj alla användare i lista"
288
309
 
310
+ msgid "Sorry, no users match your query"
311
+ msgstr "Ledsen, inga användare matchar din sökning"
312
+
289
313
  #, python-format
290
314
  msgid ""
291
315
  "There are no users configured. Why not <a "
@@ -294,12 +318,15 @@ msgstr ""
294
318
  "Det finns inga användare konfigurerade. Varför inte <a "
295
319
  "href=\"%(wagtailusers_add_url)s\">skapa några</a>?"
296
320
 
321
+ msgid "Can view"
322
+ msgstr "Kan visa"
323
+
297
324
  #, python-format
298
325
  msgid "user %(id)s (deleted)"
299
326
  msgstr "användare %(id)s (raderad)"
300
327
 
301
328
  msgid "Assign role to selected users"
302
- msgstr "Tilldela roll valda användare"
329
+ msgstr "Tilldela roll till valda användare"
303
330
 
304
331
  #, python-format
305
332
  msgid "%(num_parent_objects)d user has been assigned as %(role)s"
@@ -361,7 +388,7 @@ msgid "Group '%(object)s' updated."
361
388
  msgstr "Grupp '%(object)s' uppdaterad."
362
389
 
363
390
  msgid "The group could not be saved due to errors."
364
- msgstr "Gruppen kunde inte sparas p.g.a. fel."
391
+ msgstr "Gruppen kunde inte sparas grund av fel."
365
392
 
366
393
  msgid "View users in this group"
367
394
  msgstr "Visa användare i denna grupp"
@@ -394,6 +421,10 @@ msgstr "Administratör"
394
421
  msgid "Access level"
395
422
  msgstr "Behörighetsnivå"
396
423
 
424
+ #, python-format
425
+ msgid "More options for '%(title)s'"
426
+ msgstr "Fler alternativ för '%(title)s'"
427
+
397
428
  #, python-format
398
429
  msgid "User '%(object)s' created."
399
430
  msgstr "Användare '%(object)s' skapad."
@@ -406,7 +437,7 @@ msgid "User '%(object)s' updated."
406
437
  msgstr "Användaren '%(object)s' uppdaterad."
407
438
 
408
439
  msgid "The user could not be saved due to errors."
409
- msgstr "Användaren kunde inte sparas p.g.a. fel."
440
+ msgstr "Användaren kunde inte sparas grund av fel."
410
441
 
411
442
  msgid "Delete user"
412
443
  msgstr "Radera användare"
@@ -79,7 +79,7 @@ class TestUserIndexView(AdminTemplateTestUtils, WagtailTestUtils, TestCase):
79
79
  )
80
80
  self.user = self.login()
81
81
 
82
- def get(self, params={}):
82
+ def get(self, params=None):
83
83
  return self.client.get(reverse("wagtailusers_users:index"), params)
84
84
 
85
85
  def test_simple(self):
@@ -460,6 +460,20 @@ class TestUserIndexView(AdminTemplateTestUtils, WagtailTestUtils, TestCase):
460
460
  "Show profile",
461
461
  )
462
462
 
463
+ def test_bulk_action_rendered(self):
464
+ response = self.get()
465
+ self.assertEqual(response.status_code, 200)
466
+ # Should render bulk actions markup
467
+ bulk_actions_js = versioned_static("wagtailadmin/js/bulk-actions.js")
468
+ soup = self.get_soup(response.content)
469
+ script = soup.select_one(f"script[src='{bulk_actions_js}']")
470
+ self.assertIsNotNone(script)
471
+ bulk_actions = soup.select("[data-bulk-action-button]")
472
+ self.assertTrue(bulk_actions)
473
+ # 'next' parameter is constructed client-side later based on filters state
474
+ for action in bulk_actions:
475
+ self.assertNotIn("next=", action["href"])
476
+
463
477
 
464
478
  class TestUserIndexResultsView(AdminTemplateTestUtils, WagtailTestUtils, TestCase):
465
479
  def setUp(self):
@@ -473,7 +487,7 @@ class TestUserIndexResultsView(AdminTemplateTestUtils, WagtailTestUtils, TestCas
473
487
  )
474
488
  self.login()
475
489
 
476
- def get(self, params={}):
490
+ def get(self, params=None):
477
491
  return self.client.get(reverse("wagtailusers_users:index_results"), params)
478
492
 
479
493
  def test_simple(self):
@@ -504,10 +518,10 @@ class TestUserCreateView(AdminTemplateTestUtils, WagtailTestUtils, TestCase):
504
518
  }
505
519
  )
506
520
 
507
- def get(self, params={}):
521
+ def get(self, params=None):
508
522
  return self.client.get(reverse("wagtailusers_users:add"), params)
509
523
 
510
- def post(self, post_data={}, follow=False):
524
+ def post(self, post_data=None, follow=False):
511
525
  return self.client.post(
512
526
  reverse("wagtailusers_users:add"), post_data, follow=follow
513
527
  )
@@ -768,12 +782,12 @@ class TestUserDeleteView(AdminTemplateTestUtils, WagtailTestUtils, TestCase):
768
782
  )
769
783
  self.current_user = self.login()
770
784
 
771
- def get(self, params={}):
785
+ def get(self, params=None):
772
786
  return self.client.get(
773
787
  reverse("wagtailusers_users:delete", args=(self.test_user.pk,)), params
774
788
  )
775
789
 
776
- def post(self, post_data={}, follow=False):
790
+ def post(self, post_data=None, follow=False):
777
791
  return self.client.post(
778
792
  reverse("wagtailusers_users:delete", args=(self.test_user.pk,)),
779
793
  post_data,
@@ -1030,13 +1044,13 @@ class TestUserEditView(AdminTemplateTestUtils, WagtailTestUtils, TestCase):
1030
1044
  # Login
1031
1045
  self.current_user = self.login()
1032
1046
 
1033
- def get(self, params={}, user_id=None):
1047
+ def get(self, params=None, user_id=None):
1034
1048
  return self.client.get(
1035
1049
  reverse("wagtailusers_users:edit", args=(user_id or self.test_user.pk,)),
1036
1050
  params,
1037
1051
  )
1038
1052
 
1039
- def post(self, post_data={}, user_id=None, follow=False):
1053
+ def post(self, post_data=None, user_id=None, follow=False):
1040
1054
  return self.client.post(
1041
1055
  reverse("wagtailusers_users:edit", args=(user_id or self.test_user.pk,)),
1042
1056
  post_data,
@@ -1633,7 +1647,7 @@ class TestGroupIndexView(AdminTemplateTestUtils, WagtailTestUtils, TestCase):
1633
1647
  def setUp(self):
1634
1648
  self.login()
1635
1649
 
1636
- def get(self, params={}):
1650
+ def get(self, params=None):
1637
1651
  return self.client.get(reverse("wagtailusers_groups:index"), params)
1638
1652
 
1639
1653
  def test_simple(self):
@@ -1666,7 +1680,7 @@ class TestGroupIndexResultsView(AdminTemplateTestUtils, WagtailTestUtils, TestCa
1666
1680
  def setUp(self):
1667
1681
  self.login()
1668
1682
 
1669
- def get(self, params={}):
1683
+ def get(self, params=None):
1670
1684
  return self.client.get(reverse("wagtailusers_groups:index_results"), params)
1671
1685
 
1672
1686
  def test_simple(self):
@@ -1692,10 +1706,10 @@ class TestGroupCreateView(AdminTemplateTestUtils, WagtailTestUtils, TestCase):
1692
1706
  content_type__app_label="wagtaildocs", codename="change_document"
1693
1707
  )
1694
1708
 
1695
- def get(self, params={}):
1709
+ def get(self, params=None):
1696
1710
  return self.client.get(reverse("wagtailusers_groups:add"), params)
1697
1711
 
1698
- def post(self, post_data={}):
1712
+ def post(self, post_data=None):
1699
1713
  post_defaults = {
1700
1714
  "page_permissions-TOTAL_FORMS": ["0"],
1701
1715
  "page_permissions-MAX_NUM_FORMS": ["1000"],
@@ -2080,14 +2094,14 @@ class TestGroupEditView(AdminTemplateTestUtils, WagtailTestUtils, TestCase):
2080
2094
  # Login
2081
2095
  self.user = self.login()
2082
2096
 
2083
- def get(self, params={}, group_id=None):
2097
+ def get(self, params=None, group_id=None):
2084
2098
  return self.client.get(
2085
2099
  reverse("wagtailusers_groups:edit", args=(group_id or self.test_group.pk,)),
2086
2100
  params,
2087
2101
  )
2088
2102
 
2089
- def post(self, post_data={}, group_id=None):
2090
- post_defaults = {
2103
+ def post(self, post_data=None, group_id=None):
2104
+ post_data_final = {
2091
2105
  "name": "test group",
2092
2106
  "permissions": [self.existing_permission.pk],
2093
2107
  "page_permissions-TOTAL_FORMS": ["1"],
@@ -2107,11 +2121,11 @@ class TestGroupEditView(AdminTemplateTestUtils, WagtailTestUtils, TestCase):
2107
2121
  "collection_permissions-MAX_NUM_FORMS": ["1000"],
2108
2122
  "collection_permissions-INITIAL_FORMS": ["0"],
2109
2123
  }
2110
- for k, v in post_defaults.items():
2111
- post_data[k] = post_data.get(k, v)
2124
+ if post_data:
2125
+ post_data_final.update(post_data)
2112
2126
  return self.client.post(
2113
2127
  reverse("wagtailusers_groups:edit", args=(group_id or self.test_group.pk,)),
2114
- post_data,
2128
+ post_data_final,
2115
2129
  )
2116
2130
 
2117
2131
  def add_non_registered_perm(self):
@@ -2835,7 +2849,7 @@ class TestAuthorisationIndexView(WagtailTestUtils, TestCase):
2835
2849
  self._user.user_permissions.add(Permission.objects.get(codename="access_admin"))
2836
2850
  self.login(username="auth_user", password="password")
2837
2851
 
2838
- def get(self, params={}):
2852
+ def get(self, params=None):
2839
2853
  return self.client.get(reverse("wagtailusers_users:index"))
2840
2854
 
2841
2855
  def test_simple(self):
@@ -2882,10 +2896,10 @@ class TestAuthorisationCreateView(WagtailTestUtils, TestCase):
2882
2896
  }
2883
2897
  )
2884
2898
 
2885
- def get(self, params={}):
2899
+ def get(self, params=None):
2886
2900
  return self.client.get(reverse("wagtailusers_users:add"), params)
2887
2901
 
2888
- def post(self, post_data={}):
2902
+ def post(self, post_data=None):
2889
2903
  return self.client.post(reverse("wagtailusers_users:add"), post_data)
2890
2904
 
2891
2905
  def gain_permissions(self):
@@ -2959,13 +2973,13 @@ class TestAuthorisationEditView(WagtailTestUtils, TestCase):
2959
2973
  }
2960
2974
  )
2961
2975
 
2962
- def get(self, params={}, user_id=None):
2976
+ def get(self, params=None, user_id=None):
2963
2977
  return self.client.get(
2964
2978
  reverse("wagtailusers_users:edit", args=(user_id or self.test_user.pk,)),
2965
2979
  params,
2966
2980
  )
2967
2981
 
2968
- def post(self, post_data={}, user_id=None):
2982
+ def post(self, post_data=None, user_id=None):
2969
2983
  return self.client.post(
2970
2984
  reverse("wagtailusers_users:edit", args=(user_id or self.test_user.pk,)),
2971
2985
  post_data,
@@ -3026,12 +3040,12 @@ class TestAuthorisationDeleteView(WagtailTestUtils, TestCase):
3026
3040
  password="password",
3027
3041
  )
3028
3042
 
3029
- def get(self, params={}):
3043
+ def get(self, params=None):
3030
3044
  return self.client.get(
3031
3045
  reverse("wagtailusers_users:delete", args=(self.test_user.pk,)), params
3032
3046
  )
3033
3047
 
3034
- def post(self, post_data={}):
3048
+ def post(self, post_data=None):
3035
3049
  return self.client.post(
3036
3050
  reverse("wagtailusers_users:delete", args=(self.test_user.pk,)), post_data
3037
3051
  )
wagtail/users/utils.py CHANGED
@@ -27,7 +27,7 @@ def user_can_delete_user(current_user, user_to_delete):
27
27
  return True
28
28
 
29
29
 
30
- def get_gravatar_url(email, size=50, default_params={"d": "mp"}):
30
+ def get_gravatar_url(email, size=50, default_params=None):
31
31
  """
32
32
  See https://gravatar.com/site/implement/images/ for Gravatar image options.
33
33
 
@@ -50,6 +50,9 @@ def get_gravatar_url(email, size=50, default_params={"d": "mp"}):
50
50
  it will be overridden by the provider URL's query parameter.
51
51
  """
52
52
 
53
+ if default_params is None:
54
+ default_params = {"d": "mp"}
55
+
53
56
  gravatar_provider_url = getattr(
54
57
  settings, "WAGTAIL_GRAVATAR_PROVIDER_URL", "//www.gravatar.com/avatar"
55
58
  )
@@ -42,19 +42,33 @@ class PermissionPanelFormsMixin:
42
42
 
43
43
  return kwargs
44
44
 
45
- def get_permission_panel_forms(self):
45
+ @cached_property
46
+ def permission_panel_forms(self):
46
47
  return [
47
48
  cls(**self.get_permission_panel_form_kwargs(cls))
48
49
  for cls in get_permission_panel_classes()
49
50
  ]
50
51
 
52
+ def is_valid(self, form):
53
+ """
54
+ Check if the form and all permission panel forms are valid.
55
+ """
56
+ if not super().is_valid(form):
57
+ return False
58
+
59
+ for panel in self.permission_panel_forms:
60
+ if not panel.is_valid():
61
+ self.produced_error_message = self.get_error_message()
62
+ return False
63
+
64
+ return True
65
+
51
66
  def process_form(self):
52
67
  form = self.get_form()
53
- permission_panels = self.get_permission_panel_forms()
54
- if form.is_valid() and all(panel.is_valid() for panel in permission_panels):
68
+ if self.is_valid(form):
55
69
  response = self.form_valid(form)
56
70
 
57
- for panel in permission_panels:
71
+ for panel in self.permission_panel_forms:
58
72
  panel.save()
59
73
 
60
74
  return response
@@ -63,7 +77,7 @@ class PermissionPanelFormsMixin:
63
77
 
64
78
  def get_context_data(self, **kwargs):
65
79
  if "permission_panels" not in kwargs:
66
- kwargs["permission_panels"] = self.get_permission_panel_forms()
80
+ kwargs["permission_panels"] = self.permission_panel_forms
67
81
 
68
82
  context = super().get_context_data(**kwargs)
69
83
 
@@ -16,7 +16,7 @@ def get_viewset_cls(app_config, viewset_name):
16
16
  except (AttributeError, ImportError) as e:
17
17
  raise ImproperlyConfigured(
18
18
  f"Invalid setting for {app_config.__class__.__name__}.{viewset_name}: {e}"
19
- )
19
+ ) from e
20
20
  return viewset_cls
21
21
 
22
22
 
wagtail/utils/loading.py CHANGED
@@ -7,8 +7,8 @@ def get_custom_form(form_setting):
7
7
  """Return custom form class if defined and available"""
8
8
  try:
9
9
  return import_string(getattr(settings, form_setting))
10
- except ImportError:
10
+ except ImportError as e:
11
11
  raise ImproperlyConfigured(
12
12
  "%s refers to a form '%s' that is not available"
13
13
  % (form_setting, getattr(settings, form_setting))
14
- )
14
+ ) from e
@@ -0,0 +1,21 @@
1
+ # AGENTS Instruction
2
+
3
+ The main developer documentation for Wagtail lives in the `docs/contributing` directory. Here is additional guidance for agents.
4
+
5
+ ## Pull request guidelines
6
+
7
+ - Describe the "why" of the changes, why the proposed solution is the right one.
8
+ - Highlight areas of the proposed changes that require careful review.
9
+ - Always add a disclaimer to the PR description mentioning how AI agents are involved with the contribution.
10
+
11
+ ### AI/Agent disclosure template (copy/paste & edit):
12
+
13
+ **If human review has *not yet* occurred (use this initially):**
14
+ > This pull request includes code written with the assistance of AI.
15
+ > The code has **not yet been reviewed** by a human.
16
+
17
+ ## Wagtail-specific pitfalls for AI agents
18
+
19
+ ### StreamField and StreamBlock template access
20
+
21
+ - Wagtail's StreamBlock and StreamField use the same template syntax, but they differ from standard Django field access. When you use StreamField and other custom block types in Wagtail templates, you usually need to use the value property in your data variables.