Skip to content

Commit e6f3dde

Browse files
committed
Check types in form
1 parent 2def36e commit e6f3dde

File tree

7 files changed

+67
-6
lines changed

7 files changed

+67
-6
lines changed

validatedfile/models.py

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
1-
from django.db.models import FileField
1+
from django.db import models
2+
from django import forms
3+
from django.utils.translation import ugettext as _
24

3-
class ValidatedFileField(FileField):
5+
class ValidatedFileField(models.FileField):
46
def __init__(self, *args, **kwargs):
57
self.content_types = kwargs.pop("content_types")
68
self.max_upload_size = kwargs.pop("max_upload_size")
@@ -16,7 +18,7 @@ def clean(self, *args, **kwargs):
1618
if file._size > self.max_upload_size:
1719
raise forms.ValidationError(_('Please keep filesize under %s. Current filesize %s') % (filesizeformat(self.max_upload_size), filesizeformat(file._size)))
1820
else:
19-
raise forms.ValidationError(_('Filetype not supported.'))
21+
raise forms.ValidationError(_('Filetype %s not supported.') % (file.content_type))
2022
except AttributeError:
2123
pass
2224

validatedfile/tests/__init__.py

Lines changed: 53 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,73 @@
11
from django.test import TestCase
22
from django.core.files import File
3+
from django.core.files.uploadedfile import SimpleUploadedFile
4+
from django.conf import settings
5+
6+
import os.path
37

48
from models import TestModel
9+
from forms import TestModelForm
510

611
class ValidatedFileFieldTest(TestCase):
712

13+
SAMPLE_FILES_PATH = 'validatedfile/tests/sample_files'
14+
15+
16+
def _get_sample_file(self, filename):
17+
path = os.path.join(self.SAMPLE_FILES_PATH, filename)
18+
return open(path)
19+
20+
21+
def _check_file_url(self, filefield, filename):
22+
url = os.path.join(settings.MEDIA_URL, filefield.field.upload_to, filename)
23+
self.assertEqual(filefield.url, url)
24+
25+
26+
def _get_file_url(self, filename):
27+
return os.path.join(MEDIA_ROOT, prefix, filename)
28+
29+
830
def test_create_empty_instance(self):
931
instance = TestModel.objects.create()
1032
instance.save()
1133

34+
1235
def test_create_instance_with_file(self):
1336
instance = TestModel.objects.create(
14-
the_file = File(open('validatedfile/tests/image2k.png'), 'the_file.png')
37+
the_file = File(self._get_sample_file('image2k.png'), 'the_file.png')
1538
)
1639
instance.save()
1740

18-
self.assertEqual(instance.the_file.url, '/media/testfile/the_file.png')
41+
self._check_file_url(instance.the_file, 'the_file.png')
1942

2043
instance.the_file.delete()
2144
instance.delete()
2245

46+
47+
def test_form(self):
48+
uploaded_file = SimpleUploadedFile(
49+
name = 'the_file.png',
50+
content = self._get_sample_file('image2k.png').read(),
51+
content_type = 'image/png',
52+
)
53+
form = TestModelForm(data = {}, files = {'the_file': uploaded_file})
54+
self.assertTrue(form.is_valid())
55+
instance = form.save()
56+
57+
self._check_file_url(instance.the_file, 'the_file.png')
58+
59+
instance.the_file.delete()
60+
instance.delete()
61+
62+
63+
def test_form_invalid_filetype(self):
64+
uploaded_file = SimpleUploadedFile(
65+
name = 'the_file.pdf',
66+
content = self._get_sample_file('document.pdf').read(),
67+
content_type = 'apllication/pdf',
68+
)
69+
form = TestModelForm(data = {}, files = {'the_file': uploaded_file})
70+
self.assertFalse(form.is_valid())
71+
self.assertEqual(len(form.errors), 1)
72+
self.assertEqual(len(form.errors['the_file']), 1)
73+

validatedfile/tests/forms.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
from django import forms
2+
from models import TestModel
3+
4+
class TestModelForm(forms.ModelForm):
5+
6+
class Meta:
7+
model = TestModel
8+

validatedfile/tests/models.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,6 @@ class TestModel(models.Model):
77
null = True,
88
blank = True,
99
upload_to = 'testfile',
10-
content_types = 'image/png',
10+
content_types = ['image/png'],
1111
max_upload_size = 10240)
1212

8.85 KB
Binary file not shown.
14.9 KB
Binary file not shown.

0 commit comments

Comments
 (0)