Ensure snippet forms allow file uploads

pull/2518/head
Tim Heap 2016-03-30 18:07:27 +11:00 zatwierdzone przez Matt Westcott
rodzic 44198daaf6
commit 9c670c646b
6 zmienionych plików z 109 dodań i 36 usunięć

Wyświetl plik

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

Wyświetl plik

@ -66,3 +66,8 @@ class StandardSnippet(models.Model):
@register_snippet @register_snippet
class FancySnippet(models.Model): class FancySnippet(models.Model):
base_form_class = FancySnippetForm base_form_class = FancySnippetForm
@register_snippet
class FileUploadSnippet(models.Model):
file = models.FileField()

Wyświetl plik

@ -5,7 +5,7 @@
{% trans "New" as new_str %} {% 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 %} {% include "wagtailadmin/shared/header.html" with title=new_str subtitle=model_opts.verbose_name icon="snippet" tabbed=1 merged=1 %}
<form action="{% url 'wagtailsnippets:add' model_opts.app_label model_opts.model_name %}" method="POST"> <form action="{% url 'wagtailsnippets:add' model_opts.app_label model_opts.model_name %}" method="POST"{% if form.is_multipart %} enctype="multipart/form-data"{% endif %}>
{% csrf_token %} {% csrf_token %}
{{ edit_handler.render_form_content }} {{ edit_handler.render_form_content }}

Wyświetl plik

@ -5,7 +5,7 @@
{% trans "Editing" as editing_str %} {% 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 %} {% include "wagtailadmin/shared/header.html" with title=editing_str subtitle=instance icon="snippet" usage_object=instance tabbed=1 merged=1 %}
<form action="{% url 'wagtailsnippets:edit' model_opts.app_label model_opts.model_name instance.id %}" method="POST"> <form action="{% url 'wagtailsnippets:edit' model_opts.app_label model_opts.model_name instance.id %}" method="POST"{% if form.is_multipart %} enctype="multipart/form-data"{% endif %}>
{% csrf_token %} {% csrf_token %}
{{ edit_handler.render_form_content }} {{ edit_handler.render_form_content }}

Wyświetl plik

@ -3,6 +3,8 @@ from __future__ import absolute_import, unicode_literals
from django.contrib.auth import get_user_model from django.contrib.auth import get_user_model
from django.contrib.auth.models import Permission from django.contrib.auth.models import Permission
from django.core.exceptions import ImproperlyConfigured 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.core.urlresolvers import reverse
from django.test import TestCase from django.test import TestCase
from django.test.utils import override_settings 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.forms import FancySnippetForm
from wagtail.tests.snippets.models import ( from wagtail.tests.snippets.models import (
AlphaSnippet, FancySnippet, RegisterDecorator, RegisterFunction, SearchableSnippet, AlphaSnippet, FancySnippet, FileUploadSnippet, RegisterDecorator, RegisterFunction,
StandardSnippet, ZuluSnippet) SearchableSnippet, StandardSnippet, ZuluSnippet)
from wagtail.tests.testapp.models import Advert, AdvertWithTabbedInterface, SnippetChooserModel from wagtail.tests.testapp.models import Advert, AdvertWithTabbedInterface, SnippetChooserModel
from wagtail.tests.utils import WagtailTestUtils from wagtail.tests.utils import WagtailTestUtils
from wagtail.wagtailadmin.forms import WagtailAdminModelForm from wagtail.wagtailadmin.forms import WagtailAdminModelForm
@ -117,15 +119,13 @@ class TestSnippetCreateView(TestCase, WagtailTestUtils):
def setUp(self): def setUp(self):
self.login() self.login()
def get(self, params={}): def get(self, params={}, model=Advert):
return self.client.get(reverse('wagtailsnippets:add', args = (model._meta.app_label, model._meta.model_name)
args=('tests', 'advert')), return self.client.get(reverse('wagtailsnippets:add', args=args), params)
params)
def post(self, post_data={}): def post(self, post_data={}, model=Advert):
return self.client.post(reverse('wagtailsnippets:add', args = (model._meta.app_label, model._meta.model_name)
args=('tests', 'advert')), return self.client.post(reverse('wagtailsnippets:add', args=args), post_data)
post_data)
def test_simple(self): def test_simple(self):
response = self.get() response = self.get()
@ -176,24 +176,40 @@ class TestSnippetCreateView(TestCase, WagtailTestUtils):
list(snippet.tags.order_by('name')), list(snippet.tags.order_by('name')),
expected_tags) 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'] fixtures = ['test.json']
def setUp(self): def setUp(self):
super(TestSnippetEditView, self).setUp()
self.test_snippet = Advert.objects.get(id=1) 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): def test_simple(self):
response = self.get() response = self.get()
@ -203,16 +219,6 @@ class TestSnippetEditView(TestCase, WagtailTestUtils):
self.assertNotContains(response, '<a href="#advert" class="active">Advert</a>', html=True) self.assertNotContains(response, '<a href="#advert" class="active">Advert</a>', html=True)
self.assertNotContains(response, '<a href="#other" class="">Other</a>', html=True) self.assertNotContains(response, '<a href="#other" class="">Other</a>', 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, '<ul class="tab-nav merged">')
self.assertContains(response, '<a href="#advert" class="active">Advert</a>', html=True)
self.assertContains(response, '<a href="#other" class="">Other</a>', html=True)
def test_non_existant_model(self): def test_non_existant_model(self):
response = self.client.get(reverse('wagtailsnippets:edit', args=('tests', 'foo', self.test_snippet.id))) response = self.client.get(reverse('wagtailsnippets:edit', args=('tests', 'foo', self.test_snippet.id)))
self.assertEqual(response.status_code, 404) self.assertEqual(response.status_code, 404)
@ -253,6 +259,44 @@ class TestSnippetEditView(TestCase, WagtailTestUtils):
expected_tags) expected_tags)
class TestEditTabbedSnippet(BaseTestSnippetEditView):
def setUp(self):
super(TestEditTabbedSnippet, self).setUp()
self.test_snippet = AdvertWithTabbedInterface.objects.create(
text="test_advert",
url="http://www.example.com",
something_else="Model with tabbed interface")
def test_snippet_with_tabbed_interface(self):
response = self.get()
self.assertEqual(response.status_code, 200)
self.assertTemplateUsed(response, 'wagtailsnippets/snippets/edit.html')
self.assertContains(response, '<ul class="tab-nav merged">')
self.assertContains(response, '<a href="#advert" class="active">Advert</a>', html=True)
self.assertContains(response, '<a href="#other" class="">Other</a>', html=True)
class TestEditFileUploadSnippet(BaseTestSnippetEditView):
def setUp(self):
super(TestEditFileUploadSnippet, self).setUp()
self.test_snippet = FileUploadSnippet.objects.create(
file=ContentFile(b"Simple text document", 'test.txt'))
def test_edit_file_upload_multipart(self):
response = self.get()
self.assertContains(response, 'enctype="multipart/form-data"')
response = self.post(post_data={
'file': SimpleUploadedFile('replacement.txt', b"Replacement document")})
self.assertRedirects(response, reverse('wagtailsnippets:list',
args=('snippetstests', 'fileuploadsnippet')))
snippet = FileUploadSnippet.objects.get()
self.assertEqual(snippet.file.read(), b"Replacement document")
class TestSnippetDelete(TestCase, WagtailTestUtils): class TestSnippetDelete(TestCase, WagtailTestUtils):
fixtures = ['test.json'] fixtures = ['test.json']

Wyświetl plik

@ -157,6 +157,7 @@ def create(request, app_label, model_name):
return render(request, 'wagtailsnippets/snippets/create.html', { return render(request, 'wagtailsnippets/snippets/create.html', {
'model_opts': model._meta, 'model_opts': model._meta,
'edit_handler': edit_handler, 'edit_handler': edit_handler,
'form': form,
}) })
@ -200,7 +201,8 @@ def edit(request, app_label, model_name, id):
return render(request, 'wagtailsnippets/snippets/edit.html', { return render(request, 'wagtailsnippets/snippets/edit.html', {
'model_opts': model._meta, 'model_opts': model._meta,
'instance': instance, 'instance': instance,
'edit_handler': edit_handler 'edit_handler': edit_handler,
'form': form,
}) })