Skip to content

Commit 2def36e

Browse files
committed
Manipulate file directly
1 parent c15002e commit 2def36e

File tree

5 files changed

+47
-6
lines changed

5 files changed

+47
-6
lines changed

testing/settings.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
import os
22

3+
PROJECT_ROOT = os.path.dirname(os.path.realpath(__file__))
4+
35
DEBUG = True
46

57
AUTHNET_LOGIN_ID = ''
@@ -48,3 +50,7 @@
4850

4951
USE_I18N = True
5052

53+
MEDIA_ROOT = os.path.join(PROJECT_ROOT, 'media')
54+
55+
MEDIA_URL = '/media/'
56+

validatedfile/models.py

Lines changed: 21 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,23 @@
1-
from django.db import models
1+
from django.db.models import FileField
22

3-
class ValidatedFileField(models.FileField):
4-
pass
3+
class ValidatedFileField(FileField):
4+
def __init__(self, *args, **kwargs):
5+
self.content_types = kwargs.pop("content_types")
6+
self.max_upload_size = kwargs.pop("max_upload_size")
7+
super(ValidatedFileField, self).__init__(*args, **kwargs)
58

9+
def clean(self, *args, **kwargs):
10+
data = super(ValidatedFileField, self).clean(*args, **kwargs)
11+
12+
file = data.file
13+
try:
14+
content_type = file.content_type
15+
if content_type in self.content_types:
16+
if file._size > self.max_upload_size:
17+
raise forms.ValidationError(_('Please keep filesize under %s. Current filesize %s') % (filesizeformat(self.max_upload_size), filesizeformat(file._size)))
18+
else:
19+
raise forms.ValidationError(_('Filetype not supported.'))
20+
except AttributeError:
21+
pass
22+
23+
return data

validatedfile/tests/__init__.py

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,22 @@
11
from django.test import TestCase
2+
from django.core.files import File
23

34
from models import TestModel
45

56
class ValidatedFileFieldTest(TestCase):
67

7-
def test_create_instance(self):
8-
instance = TestModel()
8+
def test_create_empty_instance(self):
9+
instance = TestModel.objects.create()
910
instance.save()
1011

12+
def test_create_instance_with_file(self):
13+
instance = TestModel.objects.create(
14+
the_file = File(open('validatedfile/tests/image2k.png'), 'the_file.png')
15+
)
16+
instance.save()
17+
18+
self.assertEqual(instance.the_file.url, '/media/testfile/the_file.png')
19+
20+
instance.the_file.delete()
21+
instance.delete()
22+

validatedfile/tests/image2k.png

2.07 KB
Loading

validatedfile/tests/models.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,5 +3,10 @@
33
from ..models import *
44

55
class TestModel(models.Model):
6-
the_file = ValidatedFileField(upload_to = 'testfile')
6+
the_file = ValidatedFileField(
7+
null = True,
8+
blank = True,
9+
upload_to = 'testfile',
10+
content_types = 'image/png',
11+
max_upload_size = 10240)
712

0 commit comments

Comments
 (0)