kopia lustrzana https://github.com/wagtail/wagtail
Ensure snippet forms allow file uploads
rodzic
44198daaf6
commit
9c670c646b
|
@ -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='')),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
]
|
|
@ -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()
|
||||||
|
|
|
@ -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 }}
|
||||||
|
|
||||||
|
|
|
@ -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 }}
|
||||||
|
|
||||||
|
|
|
@ -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']
|
||||||
|
|
||||||
|
|
|
@ -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,
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|
||||||
|
|
Ładowanie…
Reference in New Issue