source: main/waeup.sirp/trunk/src/waeup/sirp/image/schema.py @ 6156

Last change on this file since 6156 was 6066, checked in by uli, 13 years ago

Support restricting file size for images.

File size: 2.9 KB
RevLine 
[5693]1##
2## schema.py
3## Login : <uli@pu.smp.net>
4## Started on  Mon Sep 13 10:31:43 2010 Uli Fouquet
5## $Id$
6##
7## Copyright (C) 2010 Uli Fouquet
8## This program is free software; you can redistribute it and/or modify
9## it under the terms of the GNU General Public License as published by
10## the Free Software Foundation; either version 2 of the License, or
11## (at your option) any later version.
12##
13## This program is distributed in the hope that it will be useful,
14## but WITHOUT ANY WARRANTY; without even the implied warranty of
15## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16## GNU General Public License for more details.
17##
18## You should have received a copy of the GNU General Public License
19## along with this program; if not, write to the Free Software
20## Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
21##
22"""Image file schemas.
23"""
24from zope.interface import implements
[6066]25from zope.schema import MinMaxLen
26from zope.schema.interfaces import TooBig, TooSmall
[5693]27from hurry.file.schema import File
28from waeup.sirp.image.interfaces import IImageFile
[5979]29from waeup.sirp.image.image import WAeUPImageFile
[5693]30
[6066]31class MinMaxSize(object):
32    """Expresses constraints on the size of an object.
33
34    The 'size' of an object is determined by its `size` method or
35    attribute. If an object has no such 'size' then it cannot be
36    validated by this mixin.
37
38    Please do not confuse `MinMaxSize` with `MinMaxLen`, for instance
39    supported by ordinary text fields. These test on ``len(obj)``
40    which is not necessary possible for file-like objects.
41
42    Therefore we distinguish 'size' from 'len' here.
43    """
44    min_size = None
45    max_size = None
46
47    def __init__(self, min_size=None, max_size=None, **kw):
48        self.min_size = min_size
49        self.max_size = max_size
50        super(MinMaxSize, self).__init__(**kw)
51
52    def _validate(self, value):
53        super(MinMaxSize, self)._validate(value)
54        if self.max_size is not None and value.size > self.max_size:
55            raise TooBig(
56                value.filename,
57                "%s bytes (max: %s bytes)" % (value.size, self.max_size))
58
59        if self.min_size is not None and value.size < self.min_size:
60            raise TooSmall(
61                value.filename,
62                "%s bytes (min: %s bytes)" % (value.size, self.min_size))
63
64   
65class ImageFile(MinMaxSize, File):
[5979]66    """An image file field.
67
68    Suitable for interfaces that wish to store image files in an
69    attribute.
[6066]70
71    This field type supports `MinMaxSize` so that you can set
72    `min_size` or `max_size` for all `ImageFile` fields in your
73    interfaces like this:
74
75      class MyInterface(Interface):
76         image = ImageFile(
77             title = u'The image',
78             description = u'The nice image',
79             max_size = 1024 * 10,
80             )
81
82    to restrict the file size of stored images to 10 KBytes.
83
84    By default no such restriction is set.
[5693]85    """
86    implements(IImageFile)
[5972]87
[5979]88    _type = WAeUPImageFile
Note: See TracBrowser for help on using the repository browser.