Browse Source

Add locale selector to snippet create

Karl Hobley 4 years ago
parent
commit
588deb93d3

+ 24 - 3
wagtail/snippets/templates/wagtailsnippets/snippets/create.html

@@ -2,10 +2,31 @@
 {% load i18n wagtailadmin_tags %}
 {% block titletag %}{% blocktrans with snippet_type_name=model_opts.verbose_name %}New  {{ snippet_type_name }}{% endblocktrans %}{% endblock %}
 {% block content %}
-    {% trans "New" as new_str %}
-    {% include "wagtailadmin/shared/header.html" with title=new_str subtitle=model_opts.verbose_name icon="snippet" tabbed=1 merged=1 %}
+    <header class="merged tab-merged">
+        <div class="row">
+            <div class="left">
+                <div class="col header-title">
+                    <h1>{% icon name="snippet" class_name="header-title-icon" %}
+                    {% trans "New" %} <span>{{ model_opts.verbose_name }}</span></h1>
+                </div>
+            </div>
+            <div class="right col">
+                <form>  {# HACK Removes list-style-type #}
+                    <ul class="fields row rowflush">
+                        {% if locale %}
+                            <li class="col">
+                                <div class="field">
+                                    {% include 'wagtailadmin/shared/locale_selector.html' with class='c-dropdown--large' %}
+                                </div>
+                            </li>
+                        {% endif %}
+                    </ul>
+                </form>
+            </div>
+        </div>
+    </header>
 
-    <form action="{% url 'wagtailsnippets:add' model_opts.app_label model_opts.model_name %}" method="POST" novalidate{% if form.is_multipart %} enctype="multipart/form-data"{% endif %}>
+    <form action="{% url 'wagtailsnippets:add' model_opts.app_label model_opts.model_name %}{% if locale %}?locale={{ locale.language_code }}{% endif %}" method="POST" novalidate{% if form.is_multipart %} enctype="multipart/form-data"{% endif %}>
         {% csrf_token %}
         {{ edit_handler.render_form_content }}
 

+ 8 - 1
wagtail/snippets/templates/wagtailsnippets/snippets/results.html

@@ -19,6 +19,13 @@
          <p role="alert">{% blocktrans %}Sorry, no snippets match "<em>{{ query_string }}</em>"{% endblocktrans %}</p>
     {% else %}
         {% url 'wagtailsnippets:add' model_opts.app_label model_opts.model_name as wagtailsnippets_create_url %}
-        <p class="no-results-message">{% blocktrans with snippet_type_name_plural=model_opts.verbose_name_plural %}No {{ snippet_type_name_plural }} have been created. Why not <a href="{{ wagtailsnippets_create_url }}">add one</a>?{% endblocktrans %}</p>
+
+        {# NOTE: The two strings in the following messages are exactly the same #}
+        {# The difference is that the first variant appends '?locale={{ locale.language_code}}' to 'wagtailsnippets_create_url' #}
+        {% if locale %}
+            <p class="no-results-message">{% blocktrans with snippet_type_name_plural=model_opts.verbose_name_plural wagtailsnippets_create_url=wagtailsnippets_create_url|add:'?locale='|add:locale.language_code %}No {{ snippet_type_name_plural }} have been created. Why not <a href="{{ wagtailsnippets_create_url }}">add one</a>?{% endblocktrans %}</p>
+        {% else %}
+            <p class="no-results-message">{% blocktrans with snippet_type_name_plural=model_opts.verbose_name_plural %}No {{ snippet_type_name_plural }} have been created. Why not <a href="{{ wagtailsnippets_create_url }}">add one</a>?{% endblocktrans %}</p>
+        {% endif %}
     {% endif %}
 {% endif %}

+ 1 - 1
wagtail/snippets/templates/wagtailsnippets/snippets/type_index.html

@@ -63,7 +63,7 @@
                         {% endif %}
                         {% if can_add_snippet %}
                             <li class="col">
-                                <a href="{% url 'wagtailsnippets:add' model_opts.app_label model_opts.model_name %}" class="button bicolor button--icon">
+                                <a href="{% url 'wagtailsnippets:add' model_opts.app_label model_opts.model_name %}{% if locale %}?locale={{ locale.language_code }}{% endif %}" class="button bicolor button--icon">
                                     {% icon name="plus" wrapped=1 %}
                                     {% blocktrans with snippet_type_name=model_opts.verbose_name %}Add {{ snippet_type_name }}{% endblocktrans %}</a>
                                 {# TODO: figure out a way of saying "Add a/an [foo]" #}

+ 50 - 2
wagtail/snippets/tests.py

@@ -160,6 +160,11 @@ class TestLocaleSelectorOnList(TestCase, WagtailTestUtils):
         switch_to_french_url = reverse('wagtailsnippets:list', args=['snippetstests', 'translatablesnippet']) + '?locale=fr'
         self.assertContains(response, f'<a href="{switch_to_french_url}" aria-label="French" class="u-link is-live">')
 
+        # Check that the add URLs include the locale
+        add_url = reverse('wagtailsnippets:add', args=['snippetstests', 'translatablesnippet']) + '?locale=en'
+        self.assertContains(response, f'<a href="{add_url}" class="button bicolor button--icon">')
+        self.assertContains(response, f'No translatable snippets have been created. Why not <a href="{add_url}">add one</a>')
+
     @override_settings(WAGTAIL_I18N_ENABLED=False)
     def test_locale_selector_not_present_when_i18n_disabled(self):
         response = self.client.get(
@@ -169,13 +174,22 @@ class TestLocaleSelectorOnList(TestCase, WagtailTestUtils):
         switch_to_french_url = reverse('wagtailsnippets:list', args=['snippetstests', 'translatablesnippet']) + '?locale=fr'
         self.assertNotContains(response, f'<a href="{switch_to_french_url}" aria-label="French" class="u-link is-live">')
 
+        # Check that the add URLs don't include the locale
+        add_url = reverse('wagtailsnippets:add', args=['snippetstests', 'translatablesnippet'])
+        self.assertContains(response, f'<a href="{add_url}" class="button bicolor button--icon">')
+        self.assertContains(response, f'No translatable snippets have been created. Why not <a href="{add_url}">add one</a>')
+
     def test_locale_selector_not_present_on_non_translatable_snippet(self):
         response = self.client.get(
             reverse('wagtailsnippets:list', args=['tests', 'advert'])
         )
 
-        switch_to_french_url = reverse('wagtailsnippets:list', args=['tests', 'advert']) + '?locale=fr'
-        self.assertNotContains(response, f'<a href="{switch_to_french_url}" aria-label="French" class="u-link is-live">')
+        self.assertNotContains(response, 'French')
+
+        # Check that the add URLs don't include the locale
+        add_url = reverse('wagtailsnippets:add', args=['tests', 'advert'])
+        self.assertContains(response, f'<a href="{add_url}" class="button bicolor button--icon">')
+        self.assertContains(response, f'No adverts have been created. Why not <a href="{add_url}">add one</a>')
 
 
 class TestModelOrdering(TestCase, WagtailTestUtils):
@@ -443,6 +457,40 @@ class TestSnippetCreateView(TestCase, WagtailTestUtils):
         self.assertNotContains(response, 'Save')
 
 
+@override_settings(WAGTAIL_I18N_ENABLED=True)
+class TestLocaleSelectorOnCreate(TestCase, WagtailTestUtils):
+    fixtures = ['test.json']
+
+    def setUp(self):
+        self.fr_locale = Locale.objects.create(language_code='fr')
+        self.user = self.login()
+
+    def test_locale_selector(self):
+        response = self.client.get(
+            reverse('wagtailsnippets:add', args=['snippetstests', 'translatablesnippet'])
+        )
+
+        switch_to_french_url = reverse('wagtailsnippets:add', args=['snippetstests', 'translatablesnippet']) + '?locale=fr'
+        self.assertContains(response, f'<a href="{switch_to_french_url}" aria-label="French" class="u-link is-live">')
+
+    @override_settings(WAGTAIL_I18N_ENABLED=False)
+    def test_locale_selector_not_present_when_i18n_disabled(self):
+        response = self.client.get(
+            reverse('wagtailsnippets:add', args=['snippetstests', 'translatablesnippet'])
+        )
+
+        switch_to_french_url = reverse('wagtailsnippets:add', args=['snippetstests', 'translatablesnippet']) + '?locale=fr'
+        self.assertNotContains(response, f'<a href="{switch_to_french_url}" aria-label="French" class="u-link is-live">')
+
+    def test_locale_selector_not_present_on_non_translatable_snippet(self):
+        response = self.client.get(
+            reverse('wagtailsnippets:add', args=['tests', 'advert'])
+        )
+
+        switch_to_french_url = reverse('wagtailsnippets:add', args=['tests', 'advert']) + '?locale=fr'
+        self.assertNotContains(response, f'<a href="{switch_to_french_url}" aria-label="French" class="u-link is-live">')
+
+
 class BaseTestSnippetEditView(TestCase, WagtailTestUtils):
 
     def get(self, params={}):

+ 33 - 3
wagtail/snippets/views/snippets.py

@@ -179,6 +179,16 @@ def create(request, app_label, model_name):
             return result
 
     instance = model()
+
+    # Set locale of the new instance
+    if issubclass(model, TranslatableMixin):
+        selected_locale = request.GET.get('locale')
+        if selected_locale:
+            instance.locale = get_object_or_404(Locale, language_code=selected_locale)
+        else:
+            instance.locale = Locale.get_default()
+
+    # Make edit handler
     edit_handler = get_snippet_edit_handler(model)
     edit_handler = edit_handler.bind_to(request=request)
     form_class = edit_handler.get_form_class()
@@ -207,7 +217,11 @@ def create(request, app_label, model_name):
                 if hasattr(result, 'status_code'):
                     return result
 
-            return redirect('wagtailsnippets:list', app_label, model_name)
+            urlquery = ''
+            if isinstance(instance, TranslatableMixin) and instance.locale is not Locale.get_default():
+                urlquery = '?locale=' + instance.locale.language_code
+
+            return redirect(reverse('wagtailsnippets:list', args=[app_label, model_name]) + urlquery)
         else:
             messages.validation_error(
                 request, _("The snippet could not be created due to errors."), form
@@ -217,12 +231,28 @@ def create(request, app_label, model_name):
 
     edit_handler = edit_handler.bind_to(instance=instance, form=form)
 
-    return TemplateResponse(request, 'wagtailsnippets/snippets/create.html', {
+    context = {
         'model_opts': model._meta,
         'edit_handler': edit_handler,
         'form': form,
         'action_menu': SnippetActionMenu(request, view='create', model=model),
-    })
+        'locale': None,
+        'translations': [],
+    }
+
+    if getattr(settings, 'WAGTAIL_I18N_ENABLED', False) and issubclass(model, TranslatableMixin):
+        context.update({
+            'locale': instance.locale,
+            'translations': [
+                {
+                    'locale': locale,
+                    'url': reverse('wagtailsnippets:add', args=[app_label, model_name]) + '?locale=' + locale.language_code
+                }
+                for locale in Locale.objects.all().exclude(id=instance.locale.id)
+            ],
+        })
+
+    return TemplateResponse(request, 'wagtailsnippets/snippets/create.html', context)
 
 
 def edit(request, app_label, model_name, pk):