test_forms.py 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
  1. from django.forms import CheckboxInput, HiddenInput
  2. from django.test import TestCase, override_settings
  3. from wagtail.contrib.simple_translation.forms import SubmitTranslationForm
  4. from wagtail.core.models import Locale, Page
  5. from wagtail.tests.i18n.models import TestPage
  6. from wagtail.tests.utils import WagtailTestUtils
  7. @override_settings(
  8. LANGUAGES=[
  9. ("en", "English"),
  10. ("fr", "French"),
  11. ("de", "German"),
  12. ],
  13. WAGTAIL_CONTENT_LANGUAGES=[
  14. ("en", "English"),
  15. ("fr", "French"),
  16. ("de", "German"),
  17. ],
  18. )
  19. class TestSubmitPageTranslation(WagtailTestUtils, TestCase):
  20. def setUp(self):
  21. self.en_locale = Locale.objects.first()
  22. self.fr_locale = Locale.objects.create(language_code="fr")
  23. self.de_locale = Locale.objects.create(language_code="de")
  24. self.en_homepage = Page.objects.get(depth=2)
  25. self.fr_homepage = self.en_homepage.copy_for_translation(self.fr_locale)
  26. self.de_homepage = self.en_homepage.copy_for_translation(self.de_locale)
  27. self.en_blog_index = TestPage(title="Blog", slug="blog")
  28. self.en_homepage.add_child(instance=self.en_blog_index)
  29. self.en_blog_post = TestPage(title="Blog post", slug="blog-post")
  30. self.en_blog_index.add_child(instance=self.en_blog_post)
  31. def test_include_subtree(self):
  32. form = SubmitTranslationForm(instance=self.en_blog_post)
  33. self.assertIsInstance(form.fields["include_subtree"].widget, HiddenInput)
  34. form = SubmitTranslationForm(instance=self.en_blog_index)
  35. self.assertIsInstance(form.fields["include_subtree"].widget, CheckboxInput)
  36. self.assertEqual(
  37. form.fields["include_subtree"].label, "Include subtree (1 page)"
  38. )
  39. form = SubmitTranslationForm(instance=self.en_homepage)
  40. self.assertEqual(
  41. form.fields["include_subtree"].label, "Include subtree (2 pages)"
  42. )
  43. def test_locales_queryset(self):
  44. # Homepage is translated to all locales.
  45. form = SubmitTranslationForm(instance=self.en_homepage)
  46. self.assertEqual(
  47. list(
  48. form.fields["locales"].queryset.values_list("language_code", flat=True)
  49. ),
  50. [],
  51. )
  52. # Blog index can be translated to `de` and `fr`.
  53. form = SubmitTranslationForm(instance=self.en_blog_index)
  54. self.assertEqual(
  55. list(
  56. form.fields["locales"].queryset.values_list("language_code", flat=True)
  57. ),
  58. ["de", "fr"],
  59. )
  60. # Blog post can be translated to `de` and `fr`.
  61. form = SubmitTranslationForm(instance=self.en_blog_post)
  62. self.assertEqual(
  63. list(
  64. form.fields["locales"].queryset.values_list("language_code", flat=True)
  65. ),
  66. ["de", "fr"],
  67. )
  68. def test_select_all(self):
  69. form = SubmitTranslationForm(instance=self.en_homepage)
  70. # Homepage is translated to all locales.
  71. self.assertIsInstance(form.fields["select_all"].widget, HiddenInput)
  72. form = SubmitTranslationForm(instance=self.en_blog_index)
  73. # Blog post can be translated to `de` and `fr`.
  74. self.assertIsInstance(form.fields["select_all"].widget, CheckboxInput)
  75. def test_locale_disabled(self):
  76. form = SubmitTranslationForm(instance=self.en_blog_post)
  77. # The parent (blog_index) is translated to English.
  78. # German and French are disabled.
  79. self.assertEqual(
  80. list(form.fields["locales"].widget.disabled_values),
  81. [self.de_locale.id, self.fr_locale.id],
  82. )
  83. label = f"""
  84. <label class="disabled">
  85. <input type="checkbox" name="None" value="{self.de_locale.id}" disabled>
  86. German
  87. </label>
  88. """
  89. self.assertInHTML(label, form.fields["locales"].widget.render(None, None))
  90. def test_locale_help_text(self):
  91. # German and French are disabled.
  92. # The help_text is plural
  93. form = SubmitTranslationForm(instance=self.en_blog_post)
  94. help_text = f"""
  95. Some locales are disabled because some parent pages are not translated.
  96. <br>
  97. <a href="/admin/translation/submit/page/{self.en_blog_index.id}/">
  98. Translate the parent pages.
  99. </a>
  100. """
  101. self.assertHTMLEqual(form.fields["locales"].help_text, help_text)
  102. # Add German translation
  103. self.en_blog_index.copy_for_translation(self.de_locale)
  104. # French is disabled.
  105. # The help_text is singular.
  106. form = SubmitTranslationForm(instance=self.en_blog_post)
  107. help_text = f"""
  108. A locale is disabled because a parent page is not translated.
  109. <br>
  110. <a href="/admin/translation/submit/page/{self.en_blog_index.id}/">
  111. Translate the parent page.
  112. </a>
  113. """
  114. self.assertHTMLEqual(form.fields["locales"].help_text, help_text)
  115. def test_hide_submit(self):
  116. # German and French are disabled.
  117. # There are no other pages to be translated.
  118. # Submit is hidden.
  119. form = SubmitTranslationForm(instance=self.en_blog_post)
  120. self.assertFalse(form.show_submit)
  121. # A parent is translated
  122. self.en_blog_index.copy_for_translation(self.de_locale)
  123. form = SubmitTranslationForm(instance=self.en_blog_post)
  124. self.assertTrue(form.show_submit)