Example #1
0
    def _validate(self, value):
        if (IFileDataNoValue.providedBy(value) or not value) and self.required:
            raise RequiredMissing()

        if IFileDataClear.providedBy(value) or \
                IFileDataNoValue.providedBy(value):
            return

        super(ImageField, self)._validate(value)

        if not (IImage.providedBy(value) or IFileData.providedBy(value)):
            raise WrongType(value, (IImage, IFileData))

        if self.mimeTypes:
            if value.mimeType not in self.mimeTypes:
                raise NotAllowedFileType(value.mimeType, self.mimeTypes)

        if not self.scale and (self.maxWidth > 0 or self.maxHeight > 0):
            if IImage.providedBy(value):
                width, height = value.width, value.height
            else:
                width, height = getImageSize(value.data)

            if self.maxWidth > 0 and width > self.maxWidth:
                raise ImageDimensionExceeded(width, ('width', self.maxWidth))

            if self.maxHeight > 0 and height > self.maxHeight:
                raise ImageDimensionExceeded(
                    height, ('height', self.maxHeight))
Example #2
0
    def get(self, object, _getattr=getattr, _setattr=setattr):
        value = _getattr(object, self.__name__, None)
        if IImage.providedBy(value):
            return value
        elif IFile.providedBy(value):
            self.set(object, value.data, _getattr, _setattr)
            return self.get(object, _getattr, _setattr)
        elif value is None:
            value = u''

        self.set(object, value, _getattr, _setattr)
        return self.get(object, _getattr, _setattr)
Example #3
0
    def set(self, object, value, _getattr=getattr, _setattr=setattr):
        if self.readonly:
            raise TypeError("Can't set values on read-only fields "
                            "(name=%s, class=%s.%s)"
                            % (self.__name__,
                               object.__class__.__module__,
                               object.__class__.__name__))

        if IImage.providedBy(value):
            _setattr(object, self.__name__, value)
        elif IFileData.providedBy(value):
            data = _getattr(object, self.__name__, None)
            if not IImage.providedBy(data):
                data = Image()
                data.data = value.data
                data.mimeType = value.mimeType
                data.filename = value.filename
                _setattr(object, self.__name__, data)
            else:
                data = removeSecurityProxy(data)
                data.data = value.data
                data.mimeType = value.mimeType
                data.filename = value.filename
                _setattr(object, self.__name__, data)

            if self.scale and (self.maxWidth < data.width or
               self.maxHeight < data.height):
                data.scale(self.maxWidth, self.maxHeight)

        elif IFileDataClear.providedBy(value):
            data = _getattr(object, self.__name__, None)
            if IImage.providedBy(data):
                data.clear()
            else:
                _setattr(object, self.__name__, Image())
        elif IFileDataNoValue.providedBy(value):
            pass
        else:
            self.set(object, FileData(value), _getattr, _setattr)
    def __call__(self, context):
        while not IExtensible.providedBy(context):
            context = getattr(context, '__parent__', None)
            if context is None:
                return SimpleVocabulary(())

        extension = IAttachmentsExtension(context)

        terms = []
        for attach in extension.values():
            if IImage.providedBy(attach) and attach.data.size:
                name = attach.__name__
                if attach.title:
                    title = u'%s (%s)'%(attach.title, name)
                else:
                    title = name
                terms.append((title, name, SimpleTerm(name, name, title)))

        terms.sort()
        return Vocabulary([term for t,n,term in terms])