Skip to content

Commit 6e8a1a9

Browse files
committed
Some refactor
1 parent 93001db commit 6e8a1a9

File tree

3 files changed

+116
-30
lines changed

3 files changed

+116
-30
lines changed

validatedfile/models.py

Lines changed: 55 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -34,29 +34,66 @@ def clean(self, *args, **kwargs):
3434

3535

3636
class FileQuota(object):
37-
def __init__(self, items = [], file_attr_name = None):
38-
self.items = items
39-
self.file_attr_name = file_attr_name
40-
41-
def current_usage(self):
42-
usage = 0
43-
for item in self.items:
44-
the_file = getattr(item, self.file_attr_name, None)
37+
38+
def __init__(self, max_usage = -1):
39+
self.current_usage = 0
40+
self.max_usage = max_usage
41+
42+
def update(self, items, attr_name):
43+
self.current_usage = 0
44+
for item in items:
45+
the_file = getattr(item, attr_name, None)
4546
if the_file:
46-
usage += the_file.size
47-
return usage
47+
self.current_usage += the_file.size
48+
49+
def exceeds(self, size = 0):
50+
if self.max_usage >= 0:
51+
return (self.current_usage + size > self.max_usage)
52+
else:
53+
return False
54+
4855

4956
class QuotaValidator(object):
57+
5058
def __init__(self, max_usage):
51-
self.quota = FileQuota()
52-
self.max_usage = max_usage
59+
self.quota = FileQuota(max_usage)
5360

54-
def set_quota(self, quota):
55-
self.quota = quota
61+
def update_quota(self, items, attr_name):
62+
self.quota.update(items, attr_name)
5663

5764
def __call__(self, file):
58-
tried_usage = self.quota.current_usage() + file.size
59-
if tried_usage > self.max_usage:
65+
file_size = file.size
66+
if self.quota.exceeds(file_size):
6067
raise forms.ValidationError(_('Please keep the total uploaded files under %s. With this file, the total would be %s' %
61-
(filesizeformat(self.max_usage), filesizeformat(tried_usage))))
62-
68+
(filesizeformat(self.quota.max_usage),
69+
filesizeformat(self.quota.current_usage + file_size))))
70+
71+
72+
#
73+
#
74+
# def __init__(self, items = [], file_attr_name = None):
75+
# self.items = items
76+
# self.file_attr_name = file_attr_name
77+
#
78+
# def current_usage(self):
79+
# usage = 0
80+
# for item in self.items:
81+
# the_file = getattr(item, self.file_attr_name, None)
82+
# if the_file:
83+
# usage += the_file.size
84+
# return usage
85+
#
86+
#class QuotaValidator(object):
87+
# def __init__(self, max_usage):
88+
# self.quota = FileQuota()
89+
# self.max_usage = max_usage
90+
#
91+
# def set_quota(self, quota):
92+
# self.quota = quota
93+
#
94+
# def __call__(self, file):
95+
# tried_usage = self.quota.current_usage() + file.size
96+
# if tried_usage > self.max_usage:
97+
# raise forms.ValidationError(_('Please keep the total uploaded files under %s. With this file, the total would be %s' %
98+
# (filesizeformat(self.max_usage), filesizeformat(tried_usage))))
99+
#

validatedfile/tests/__init__.py

Lines changed: 53 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -123,8 +123,10 @@ def test_form_null_file(self):
123123
def test_quota_empty(self):
124124
container = TestContainer.objects.create(name = 'container1')
125125

126-
quota = FileQuota(container.test_elements.all(), 'the_file')
127-
self.assertEqual(quota.current_usage(), 0)
126+
quota = FileQuota()
127+
quota.update(container.test_elements.all(), 'the_file')
128+
self.assertEqual(quota.current_usage, 0)
129+
self.assertFalse(quota.exceeds())
128130

129131
container.delete()
130132

@@ -136,8 +138,10 @@ def test_quota_one_file(self):
136138
the_file = File(self._get_sample_file('image2k.png'), 'the_file.png')
137139
)
138140

139-
quota = FileQuota(container.test_elements.all(), 'the_file')
140-
self.assertEqual(quota.current_usage(), 2120)
141+
quota = FileQuota()
142+
quota.update(container.test_elements.all(), 'the_file')
143+
self.assertEqual(quota.current_usage, 2120)
144+
self.assertFalse(quota.exceeds())
141145

142146
element.the_file.delete()
143147
element.delete()
@@ -160,8 +164,10 @@ def test_quota_several_files_several_containers(self):
160164
the_file = File(self._get_sample_file('document15k.pdf'), 'the_file3.pdf')
161165
)
162166

163-
quota = FileQuota(container1.test_elements.all(), 'the_file')
164-
self.assertEqual(quota.current_usage(), 16706)
167+
quota = FileQuota(max_usage = 20000)
168+
quota.update(container1.test_elements.all(), 'the_file')
169+
self.assertEqual(quota.current_usage, 16706)
170+
self.assertFalse(quota.exceeds())
165171

166172
element1.the_file.delete()
167173
element2.the_file.delete()
@@ -173,18 +179,57 @@ def test_quota_several_files_several_containers(self):
173179
container2.delete()
174180

175181

182+
def test_quota_exceeds(self):
183+
quota = FileQuota(max_usage = 1000)
184+
185+
container = TestContainer.objects.create(name = 'container1')
186+
quota.update(container.test_elements.all(), 'the_file')
187+
self.assertEqual(quota.current_usage, 0)
188+
self.assertFalse(quota.exceeds())
189+
self.assertTrue(quota.exceeds(2120))
190+
191+
element = TestElement.objects.create(
192+
container = container,
193+
the_file = File(self._get_sample_file('image2k.png'), 'the_file.png')
194+
)
195+
quota.update(container.test_elements.all(), 'the_file')
196+
self.assertEqual(quota.current_usage, 2120)
197+
self.assertTrue(quota.exceeds())
198+
199+
element.the_file.delete()
200+
element.delete()
201+
container.delete()
202+
203+
204+
def test_form_quota_check(self):
205+
container = TestContainer.objects.create(name = 'container1')
206+
207+
form1 = TestElementForm(container = container)
208+
self.assertFalse(form1.exceeds_quota())
209+
210+
element = TestElement.objects.create(
211+
container = container,
212+
the_file = File(self._get_sample_file('image15k.png'), 'the_file.png')
213+
)
214+
215+
form2 = TestElementForm(container = container)
216+
self.assertTrue(form2.exceeds_quota())
217+
218+
element.the_file.delete()
219+
element.delete()
220+
container.delete()
221+
222+
176223
def test_form_quota_ok(self):
177224
container = TestContainer.objects.create(name = 'container1')
178225

179-
quota = FileQuota(container.test_elements.all(), 'the_file')
180226
uploaded_file = SimpleUploadedFile(
181227
name = 'the_file.png',
182228
content = self._get_sample_file('image2k.png').read(),
183229
content_type = 'image/png',
184230
)
185231
form = TestElementForm(
186232
container = container,
187-
quota = quota,
188233
data = {},
189234
files = {'the_file': uploaded_file}
190235
)
@@ -201,15 +246,13 @@ def test_form_quota_exceeded(self):
201246
the_file = File(self._get_sample_file('image2k.png'), 'the_file.png')
202247
)
203248

204-
quota = FileQuota(container.test_elements.all(), 'the_file')
205249
uploaded_file = SimpleUploadedFile(
206250
name = 'the_file.png',
207251
content = self._get_sample_file('image15k.png').read(),
208252
content_type = 'image/png',
209253
)
210254
form = TestElementForm(
211255
container = container,
212-
quota = quota,
213256
data = {},
214257
files = {'the_file': uploaded_file}
215258
)

validatedfile/tests/forms.py

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,10 +23,16 @@ class Meta:
2323
model = TestElement
2424
fields = ['the_file']
2525

26-
def __init__(self, container, quota, *args, **kwargs):
26+
def __init__(self, container, *args, **kwargs):
2727
super(TestElementForm, self).__init__(*args, **kwargs)
2828
self.container = container
29-
self.fields['the_file'].validators[0].set_quota(quota)
29+
self.fields['the_file'].validators[0].update_quota(
30+
items = self.container.test_elements.all(),
31+
attr_name = 'the_file',
32+
)
33+
34+
def exceeds_quota(self):
35+
return self.fields['the_file'].validators[0].quota.exceeds()
3036

3137
def save(self, *args, **kwargs):
3238
element = super(TestElementForm, self).save(commit = False)

0 commit comments

Comments
 (0)