浏览代码

Move 'create' form handling into its own view that only renders that one tab

Matt Westcott 3 年之前
父节点
当前提交
d8b81df487

+ 4 - 0
client/src/entrypoints/admin/task-chooser-modal.js

@@ -131,6 +131,10 @@ const TASK_CHOOSER_MODAL_ONLOAD_HANDLERS = {
   task_chosen(modal, jsonData) {
     modal.respond('taskChosen', jsonData.result);
     modal.close();
+  },
+  reshow_create_tab(modal, jsonData) {
+    $('#new', modal.body).html(jsonData.htmlFragment);
+    ajaxifyTaskCreateTab(modal, jsonData);
   }
 };
 window.TASK_CHOOSER_MODAL_ONLOAD_HANDLERS = TASK_CHOOSER_MODAL_ONLOAD_HANDLERS;

+ 1 - 1
wagtail/admin/templates/wagtailadmin/workflows/task_chooser/includes/create_form.html

@@ -4,7 +4,7 @@
 {{ form.media.js }}
 
 {% if task_types|length > 1 %}
-    <a href="{% url 'wagtailadmin_workflows:task_chooser' %}" class="choose-different-task-type">{% trans "Choose a different task type" %}</a>
+    <a href="{% url 'wagtailadmin_workflows:task_chooser_create' %}" class="choose-different-task-type">{% trans "Choose a different task type" %}</a>
 {% endif %}
 
 <form class="task-create no-float-elements" action="{{ add_url }}" enctype="multipart/form-data" method="POST" novalidate>

+ 1 - 1
wagtail/admin/templates/wagtailadmin/workflows/task_chooser/includes/select_task_type.html

@@ -8,7 +8,7 @@
             <li>
                 <div class="row row-flush">
                     <div class="col6">
-                        <a href="{% url 'wagtailadmin_workflows:task_chooser' %}?create_model={{ app_label|urlencode }}.{{ model_name|urlencode }}" class="icon icon-plus-inverse icon-larger task-type-choice">{{ verbose_name }}</a>
+                        <a href="{% url 'wagtailadmin_workflows:task_chooser_create' %}?create_model={{ app_label|urlencode }}.{{ model_name|urlencode }}" class="icon icon-plus-inverse icon-larger task-type-choice">{{ verbose_name }}</a>
                     </div>
                     <div class="col6">
                         {{ description }}

+ 9 - 11
wagtail/admin/tests/test_workflows.py

@@ -1633,24 +1633,22 @@ class TestTaskChooserView(TestCase, WagtailTestUtils):
         self.assertFalse(response.context['searchform'].is_searching())
 
     def test_get_with_create_model_selected(self):
-        response = self.client.get(reverse('wagtailadmin_workflows:task_chooser') + '?create_model=wagtailcore.GroupApprovalTask')
+        response = self.client.get(reverse('wagtailadmin_workflows:task_chooser_create') + '?create_model=wagtailcore.GroupApprovalTask')
 
         self.assertEqual(response.status_code, 200)
 
-        self.assertTemplateUsed(response, "wagtailadmin/workflows/task_chooser/chooser.html")
-
-        # Check that the "create" view was shown in the "new" tab
+        # Check that the "create" view was returned
         self.assertTemplateUsed(response, "wagtailadmin/workflows/task_chooser/includes/create_form.html")
         self.assertTemplateNotUsed(response, "wagtailadmin/workflows/task_chooser/includes/select_task_type.html")
 
     def test_get_with_non_task_create_model_selected(self):
-        response = self.client.get(reverse('wagtailadmin_workflows:task_chooser') + '?create_model=wagtailcore.Page')
+        response = self.client.get(reverse('wagtailadmin_workflows:task_chooser_create') + '?create_model=wagtailcore.Page')
 
         self.assertEqual(response.status_code, 404)
 
     def test_get_with_base_task_create_model_selected(self):
         # Task is technically a subclass of itself so we need an extra test for it
-        response = self.client.get(reverse('wagtailadmin_workflows:task_chooser') + '?create_model=wagtailcore.Task')
+        response = self.client.get(reverse('wagtailadmin_workflows:task_chooser_create') + '?create_model=wagtailcore.Task')
 
         self.assertEqual(response.status_code, 404)
 
@@ -1678,7 +1676,7 @@ class TestTaskChooserView(TestCase, WagtailTestUtils):
         }
 
     def test_post_with_create_model_selected(self):
-        response = self.client.post(reverse('wagtailadmin_workflows:task_chooser') + '?create_model=wagtailcore.GroupApprovalTask', self.get_post_data())
+        response = self.client.post(reverse('wagtailadmin_workflows:task_chooser_create') + '?create_model=wagtailcore.GroupApprovalTask', self.get_post_data())
 
         self.assertEqual(response.status_code, 200)
 
@@ -1700,7 +1698,7 @@ class TestTaskChooserView(TestCase, WagtailTestUtils):
         # When a single task type exists there's no need to specify create_model
         get_task_types.return_value = [GroupApprovalTask]
 
-        response = self.client.post(reverse('wagtailadmin_workflows:task_chooser'), self.get_post_data())
+        response = self.client.post(reverse('wagtailadmin_workflows:task_chooser_create'), self.get_post_data())
 
         self.assertEqual(response.status_code, 200)
 
@@ -1718,7 +1716,7 @@ class TestTaskChooserView(TestCase, WagtailTestUtils):
         })
 
     def test_post_without_create_model_selected(self):
-        response = self.client.post(reverse('wagtailadmin_workflows:task_chooser'), self.get_post_data())
+        response = self.client.post(reverse('wagtailadmin_workflows:task_chooser_create'), self.get_post_data())
 
         self.assertEqual(response.status_code, 400)
 
@@ -1726,7 +1724,7 @@ class TestTaskChooserView(TestCase, WagtailTestUtils):
         self.assertFalse(Task.objects.filter(name="Editor approval task", active=True).exists())
 
     def test_post_with_non_task_create_model_selected(self):
-        response = self.client.post(reverse('wagtailadmin_workflows:task_chooser') + '?create_model=wagtailcore.Page', self.get_post_data())
+        response = self.client.post(reverse('wagtailadmin_workflows:task_chooser_create') + '?create_model=wagtailcore.Page', self.get_post_data())
 
         self.assertEqual(response.status_code, 404)
 
@@ -1735,7 +1733,7 @@ class TestTaskChooserView(TestCase, WagtailTestUtils):
 
     def test_post_with_base_task_create_model_selected(self):
         # Task is technically a subclass of itself so we need an extra test for it
-        response = self.client.post(reverse('wagtailadmin_workflows:task_chooser') + '?create_model=wagtailcore.Task', self.get_post_data())
+        response = self.client.post(reverse('wagtailadmin_workflows:task_chooser_create') + '?create_model=wagtailcore.Task', self.get_post_data())
 
         self.assertEqual(response.status_code, 404)
 

+ 1 - 0
wagtail/admin/urls/workflows.py

@@ -21,5 +21,6 @@ urlpatterns = [
     path('tasks/enable/<int:pk>/', workflows.enable_task, name='enable_task'),
     path('task_chooser/', workflows.TaskChooserView.as_view(), name='task_chooser'),
     path('task_chooser/results/', workflows.TaskChooserResultsView.as_view(), name='task_chooser_results'),
+    path('task_chooser/create/', workflows.TaskChooserCreateView.as_view(), name='task_chooser_create'),
     path('task_chooser/<int:task_id>/', workflows.task_chosen, name='task_chosen'),
 ]

+ 56 - 20
wagtail/admin/views/workflows.py

@@ -5,6 +5,7 @@ from django.db import transaction
 from django.db.models.functions import Lower
 from django.http import Http404, HttpResponseBadRequest
 from django.shortcuts import get_object_or_404, redirect, render
+from django.template.loader import render_to_string
 from django.template.response import TemplateResponse
 from django.urls import reverse
 from django.utils.functional import cached_property
@@ -560,6 +561,12 @@ class BaseTaskChooserView(View):
         task_type_choices.sort(key=lambda task_type: task_type[1].lower())
         return task_type_choices
 
+    def get_form_js_context(self):
+        return {
+            'error_label': _("Server Error"),
+            'error_message': _("Report this error to your webmaster with the following information:"),
+        }
+
 
 class TaskChooserView(BaseTaskChooserView):
     def get(self, request):
@@ -571,19 +578,6 @@ class TaskChooserView(BaseTaskChooserView):
 
         return self.render_to_response()
 
-    def post(self, request):
-        create_form_class = self.get_create_form_class()
-        if not create_form_class:
-            return HttpResponseBadRequest()
-
-        self.createform = create_form_class(request.POST, request.FILES, prefix='create-task')
-
-        if self.createform.is_valid():
-            task = self.createform.save()
-            return get_task_chosen_response(request, task)
-        else:
-            return self.render_to_response()
-
     def render_to_response(self):
         searchform = TaskChooserSearchForm(task_type_choices=self.get_task_type_filter_choices())
         tasks = searchform.task_model.objects.filter(active=True).order_by(Lower('name'))
@@ -596,21 +590,63 @@ class TaskChooserView(BaseTaskChooserView):
             'searchform': searchform,
             'createform': self.createform,
             'can_create': self.can_create,
-            'add_url': reverse('wagtailadmin_workflows:task_chooser') + '?' + self.request.GET.urlencode() if self.create_model else None
+            'add_url': reverse('wagtailadmin_workflows:task_chooser_create') + '?' + self.request.GET.urlencode() if self.create_model else None
         }
 
         if not self.createform:
             chooser_html_context['task_types'] = self.get_task_type_options()
 
-        chooser_js_context = {
-            'step': 'chooser',
-            'error_label': _("Server Error"),
-            'error_message': _("Report this error to your webmaster with the following information:"),
-        }
+        js_context = self.get_form_js_context()
+        js_context['step'] = 'chooser'
 
         return render_modal_workflow(
             self.request, 'wagtailadmin/workflows/task_chooser/chooser.html', None,
-            chooser_html_context, json_data=chooser_js_context
+            chooser_html_context, json_data=js_context
+        )
+
+
+class TaskChooserCreateView(BaseTaskChooserView):
+    def get(self, request):
+        create_form_class = self.get_create_form_class()
+        if create_form_class:
+            self.createform = create_form_class(prefix='create-task')
+        else:
+            self.createform = None
+
+        return self.render_to_response()
+
+    def post(self, request):
+        create_form_class = self.get_create_form_class()
+        if not create_form_class:
+            return HttpResponseBadRequest()
+
+        self.createform = create_form_class(request.POST, request.FILES, prefix='create-task')
+
+        if self.createform.is_valid():
+            task = self.createform.save()
+            return get_task_chosen_response(request, task)
+        else:
+            return self.render_to_response()
+
+    def render_to_response(self):
+        if self.createform:
+            tab_html = render_to_string("wagtailadmin/workflows/task_chooser/includes/create_form.html", {
+                'form': self.createform,
+                'add_url': reverse('wagtailadmin_workflows:task_chooser_create') + '?' + self.request.GET.urlencode() if self.create_model else None,
+                'task_types': self.get_task_type_options(),
+            }, self.request)
+        else:
+            tab_html = render_to_string("wagtailadmin/workflows/task_chooser/includes/select_task_type.html", {
+                'task_types': self.get_task_type_options(),
+            }, self.request)
+
+        js_context = self.get_form_js_context()
+        js_context['step'] = 'reshow_create_tab'
+        js_context['htmlFragment'] = tab_html
+
+        return render_modal_workflow(
+            self.request, None, None, None,
+            json_data=js_context
         )