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

pull/7867/head
Matt Westcott 2021-09-15 22:31:39 +01:00 zatwierdzone przez LB (Ben Johnston)
rodzic 5ce89f11ff
commit d8b81df487
6 zmienionych plików z 75 dodań i 36 usunięć

Wyświetl plik

@ -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;

Wyświetl plik

@ -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>

Wyświetl plik

@ -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 }}

Wyświetl plik

@ -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)

Wyświetl plik

@ -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'),
]

Wyświetl plik

@ -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,6 +578,43 @@ class TaskChooserView(BaseTaskChooserView):
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'))
paginator = Paginator(tasks, per_page=10)
tasks = paginator.get_page(self.request.GET.get('p'))
chooser_html_context = {
'tasks': tasks,
'searchform': searchform,
'createform': self.createform,
'can_create': self.can_create,
'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()
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=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:
@ -585,32 +629,24 @@ class TaskChooserView(BaseTaskChooserView):
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'))
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)
paginator = Paginator(tasks, per_page=10)
tasks = paginator.get_page(self.request.GET.get('p'))
chooser_html_context = {
'tasks': tasks,
'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
}
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'] = 'reshow_create_tab'
js_context['htmlFragment'] = tab_html
return render_modal_workflow(
self.request, 'wagtailadmin/workflows/task_chooser/chooser.html', None,
chooser_html_context, json_data=chooser_js_context
self.request, None, None, None,
json_data=js_context
)