Skip to content

Commit dac6d6d

Browse files
committed
Some more refactor
1 parent b83fa66 commit dac6d6d

File tree

6 files changed

+77
-76
lines changed

6 files changed

+77
-76
lines changed

README.rst

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ and a list of valid mime types that will be allowed. The list of all mime types
1919
here: http://www.iana.org/assignments/media-types/index.html::
2020

2121
from django.db import models
22-
from validatedfile.models import ValidatedFileField
22+
from validatedfile import ValidatedFileField
2323

2424
class TestModel(models.Model):
2525
the_file = ValidatedFileField(
@@ -42,7 +42,7 @@ This example also checks the total size of all files uploaded by one user::
4242

4343
from django.contrib.auth.models import User
4444
from django.db import models
45-
from validatedfile.models import ValidatedFileField
45+
from validatedfile import ValidatedFileField
4646

4747
class TestModel(models.Model):
4848
user = models.ForeignKey(
@@ -60,7 +60,7 @@ This example also checks the total size of all files uploaded by one user::
6060
(in forms.py)
6161

6262
from django import forms
63-
from validatedfile.models import QuotaValidator
63+
from validatedfile import QuotaValidator
6464
from models.py import TestModel
6565

6666
class TestModelForm(models.ModelForm):

validatedfile/__init__.py

Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1 +1,72 @@
11
__version__ = (0, 0, 1, "final", 0)
2+
3+
from django.db import models
4+
from django import forms
5+
from django.template.defaultfilters import filesizeformat
6+
from django.utils.translation import ugettext as _
7+
8+
import magic
9+
10+
class ValidatedFileField(models.FileField):
11+
def __init__(self, *args, **kwargs):
12+
self.content_types = kwargs.pop("content_types", [])
13+
self.max_upload_size = kwargs.pop("max_upload_size", 0)
14+
super(ValidatedFileField, self).__init__(*args, **kwargs)
15+
16+
def clean(self, *args, **kwargs):
17+
data = super(ValidatedFileField, self).clean(*args, **kwargs)
18+
file = data.file
19+
20+
if self.content_types:
21+
content_type_headers = getattr(file, 'content_type', '')
22+
23+
mg = magic.Magic(mime = True)
24+
content_type_magic = mg.from_buffer(file.read(1024))
25+
file.seek(0)
26+
27+
if not content_type_headers in self.content_types or not content_type_magic in self.content_types:
28+
raise forms.ValidationError(_('Filetype %s not supported.') % (content_type_magic))
29+
30+
if self.max_upload_size:
31+
if file._size > self.max_upload_size:
32+
raise forms.ValidationError(_('Please keep filesize under %s. Current filesize %s') %
33+
(filesizeformat(self.max_upload_size), filesizeformat(file._size)))
34+
35+
return data
36+
37+
38+
class FileQuota(object):
39+
40+
def __init__(self, max_usage = -1):
41+
self.current_usage = 0
42+
self.max_usage = max_usage
43+
44+
def update(self, items, attr_name):
45+
self.current_usage = 0
46+
for item in items:
47+
the_file = getattr(item, attr_name, None)
48+
if the_file:
49+
self.current_usage += the_file.size
50+
51+
def exceeds(self, size = 0):
52+
if self.max_usage >= 0:
53+
return (self.current_usage + size > self.max_usage)
54+
else:
55+
return False
56+
57+
58+
class QuotaValidator(object):
59+
60+
def __init__(self, max_usage):
61+
self.quota = FileQuota(max_usage)
62+
63+
def update_quota(self, items, attr_name):
64+
self.quota.update(items, attr_name)
65+
66+
def __call__(self, file):
67+
file_size = file.size
68+
if self.quota.exceeds(file_size):
69+
raise forms.ValidationError(_('Please keep the total uploaded files under %s. With this file, the total would be %s' %
70+
(filesizeformat(self.quota.max_usage),
71+
filesizeformat(self.quota.current_usage + file_size))))
72+

validatedfile/models.py

Lines changed: 0 additions & 70 deletions
This file was deleted.

validatedfile/tests/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55

66
import os.path
77

8-
from validatedfile.models import FileQuota
8+
from validatedfile import FileQuota
99

1010
from models import TestModel, TestModelNoValidate, TestContainer, TestElement
1111
from forms import TestModelForm, TestModelNoValidateForm, TestElementForm

validatedfile/tests/forms.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
from django import forms
22
from models import TestModel, TestModelNoValidate, TestContainer, TestElement
3-
from validatedfile.models import QuotaValidator
3+
from validatedfile import QuotaValidator
44

55
class TestModelForm(forms.ModelForm):
66

validatedfile/tests/models.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
from django.db import models
2-
from validatedfile.models import ValidatedFileField
2+
from validatedfile import ValidatedFileField
33

44
class TestModel(models.Model):
55
the_file = ValidatedFileField(

0 commit comments

Comments
 (0)