From 9c670c646b541f86bbd0c41939c03894705f341a Mon Sep 17 00:00:00 2001 From: Tim Heap Date: Wed, 30 Mar 2016 18:07:27 +1100 Subject: [PATCH] Ensure snippet forms allow file uploads --- .../migrations/0004_fileuploadsnippet.py | 22 ++++ wagtail/tests/snippets/models.py | 5 + .../wagtailsnippets/snippets/create.html | 2 +- .../wagtailsnippets/snippets/edit.html | 2 +- wagtail/wagtailsnippets/tests.py | 110 ++++++++++++------ wagtail/wagtailsnippets/views/snippets.py | 4 +- 6 files changed, 109 insertions(+), 36 deletions(-) create mode 100644 wagtail/tests/snippets/migrations/0004_fileuploadsnippet.py diff --git a/wagtail/tests/snippets/migrations/0004_fileuploadsnippet.py b/wagtail/tests/snippets/migrations/0004_fileuploadsnippet.py new file mode 100644 index 000000000..37af9fbbd --- /dev/null +++ b/wagtail/tests/snippets/migrations/0004_fileuploadsnippet.py @@ -0,0 +1,22 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.4 on 2016-03-31 00:30 +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('snippetstests', '0003_fancysnippet_standardsnippet'), + ] + + operations = [ + migrations.CreateModel( + name='FileUploadSnippet', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('file', models.FileField(upload_to='')), + ], + ), + ] diff --git a/wagtail/tests/snippets/models.py b/wagtail/tests/snippets/models.py index bd0b6be04..56d06be61 100644 --- a/wagtail/tests/snippets/models.py +++ b/wagtail/tests/snippets/models.py @@ -66,3 +66,8 @@ class StandardSnippet(models.Model): @register_snippet class FancySnippet(models.Model): base_form_class = FancySnippetForm + + +@register_snippet +class FileUploadSnippet(models.Model): + file = models.FileField() diff --git a/wagtail/wagtailsnippets/templates/wagtailsnippets/snippets/create.html b/wagtail/wagtailsnippets/templates/wagtailsnippets/snippets/create.html index 1c22a3b07..981e1e38b 100644 --- a/wagtail/wagtailsnippets/templates/wagtailsnippets/snippets/create.html +++ b/wagtail/wagtailsnippets/templates/wagtailsnippets/snippets/create.html @@ -5,7 +5,7 @@ {% 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 %} -
+ {% csrf_token %} {{ edit_handler.render_form_content }} diff --git a/wagtail/wagtailsnippets/templates/wagtailsnippets/snippets/edit.html b/wagtail/wagtailsnippets/templates/wagtailsnippets/snippets/edit.html index 63b1a2a21..c11085dfa 100644 --- a/wagtail/wagtailsnippets/templates/wagtailsnippets/snippets/edit.html +++ b/wagtail/wagtailsnippets/templates/wagtailsnippets/snippets/edit.html @@ -5,7 +5,7 @@ {% trans "Editing" as editing_str %} {% include "wagtailadmin/shared/header.html" with title=editing_str subtitle=instance icon="snippet" usage_object=instance tabbed=1 merged=1 %} - + {% csrf_token %} {{ edit_handler.render_form_content }} diff --git a/wagtail/wagtailsnippets/tests.py b/wagtail/wagtailsnippets/tests.py index 3d505d91a..95c9220f9 100644 --- a/wagtail/wagtailsnippets/tests.py +++ b/wagtail/wagtailsnippets/tests.py @@ -3,6 +3,8 @@ from __future__ import absolute_import, unicode_literals from django.contrib.auth import get_user_model from django.contrib.auth.models import Permission from django.core.exceptions import ImproperlyConfigured +from django.core.files.base import ContentFile +from django.core.files.uploadedfile import SimpleUploadedFile from django.core.urlresolvers import reverse from django.test import TestCase from django.test.utils import override_settings @@ -10,8 +12,8 @@ from taggit.models import Tag from wagtail.tests.snippets.forms import FancySnippetForm from wagtail.tests.snippets.models import ( - AlphaSnippet, FancySnippet, RegisterDecorator, RegisterFunction, SearchableSnippet, - StandardSnippet, ZuluSnippet) + AlphaSnippet, FancySnippet, FileUploadSnippet, RegisterDecorator, RegisterFunction, + SearchableSnippet, StandardSnippet, ZuluSnippet) from wagtail.tests.testapp.models import Advert, AdvertWithTabbedInterface, SnippetChooserModel from wagtail.tests.utils import WagtailTestUtils from wagtail.wagtailadmin.forms import WagtailAdminModelForm @@ -117,15 +119,13 @@ class TestSnippetCreateView(TestCase, WagtailTestUtils): def setUp(self): self.login() - def get(self, params={}): - return self.client.get(reverse('wagtailsnippets:add', - args=('tests', 'advert')), - params) + def get(self, params={}, model=Advert): + args = (model._meta.app_label, model._meta.model_name) + return self.client.get(reverse('wagtailsnippets:add', args=args), params) - def post(self, post_data={}): - return self.client.post(reverse('wagtailsnippets:add', - args=('tests', 'advert')), - post_data) + def post(self, post_data={}, model=Advert): + args = (model._meta.app_label, model._meta.model_name) + return self.client.post(reverse('wagtailsnippets:add', args=args), post_data) def test_simple(self): response = self.get() @@ -176,24 +176,40 @@ class TestSnippetCreateView(TestCase, WagtailTestUtils): list(snippet.tags.order_by('name')), expected_tags) + def test_create_file_upload_multipart(self): + response = self.get(model=FileUploadSnippet) + self.assertContains(response, 'enctype="multipart/form-data"') -class TestSnippetEditView(TestCase, WagtailTestUtils): + response = self.post(model=FileUploadSnippet, post_data={ + 'file': SimpleUploadedFile('test.txt', b"Uploaded file")}) + self.assertRedirects(response, reverse('wagtailsnippets:list', + args=('snippetstests', 'fileuploadsnippet'))) + snippet = FileUploadSnippet.objects.get() + self.assertEqual(snippet.file.read(), b"Uploaded file") + + +class BaseTestSnippetEditView(TestCase, WagtailTestUtils): + + def get(self, params={}): + snippet = self.test_snippet + args = (snippet._meta.app_label, snippet._meta.model_name, snippet.id) + return self.client.get(reverse('wagtailsnippets:edit', args=args), params) + + def post(self, post_data={}): + snippet = self.test_snippet + args = (snippet._meta.app_label, snippet._meta.model_name, snippet.id) + return self.client.post(reverse('wagtailsnippets:edit', args=args), post_data) + + def setUp(self): + self.login() + + +class TestSnippetEditView(BaseTestSnippetEditView): fixtures = ['test.json'] def setUp(self): + super(TestSnippetEditView, self).setUp() self.test_snippet = Advert.objects.get(id=1) - self.test_snippet_with_tabbed_interface = AdvertWithTabbedInterface.objects.get(id=1) - self.login() - - def get(self, params={}): - return self.client.get(reverse('wagtailsnippets:edit', - args=('tests', 'advert', self.test_snippet.id)), - params) - - def post(self, post_data={}): - return self.client.post(reverse('wagtailsnippets:edit', - args=('tests', 'advert', self.test_snippet.id)), - post_data) def test_simple(self): response = self.get() @@ -203,16 +219,6 @@ class TestSnippetEditView(TestCase, WagtailTestUtils): self.assertNotContains(response, 'Advert', html=True) self.assertNotContains(response, 'Other', html=True) - def test_snippet_with_tabbed_interface(self): - reverse_args = ('tests', 'advertwithtabbedinterface', self.test_snippet_with_tabbed_interface.id) - response = self.client.get(reverse('wagtailsnippets:edit', args=reverse_args)) - - self.assertEqual(response.status_code, 200) - self.assertTemplateUsed(response, 'wagtailsnippets/snippets/edit.html') - self.assertContains(response, '