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))
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)
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])