convert external addresses (e.g. file names) with special characters smoothly to/from unicode

git-svn-id: svn://svn.cy55.de/Zope3/src/loops/trunk@4042 fd906abe-77d9-0310-91a1-e0d9ade77398
This commit is contained in:
helmutm 2010-10-14 12:40:33 +00:00
parent 77085d7f3c
commit 499f86848b

View file

@ -1,5 +1,5 @@
# #
# Copyright (c) 2008 Helmut Merz helmutm@cy55.de # Copyright (c) 2010 Helmut Merz helmutm@cy55.de
# #
# This program is free software; you can redistribute it and/or modify # This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by # it under the terms of the GNU General Public License as published by
@ -25,6 +25,7 @@ $Id$
from zope.interface import Interface, Attribute from zope.interface import Interface, Attribute
from zope.i18nmessageid import MessageFactory from zope.i18nmessageid import MessageFactory
from zope import schema from zope import schema
from zope.schema._bootstrapinterfaces import StopValidation
from zope.app.container.constraints import contains, containers from zope.app.container.constraints import contains, containers
from zope.app.container.interfaces import IContainer, IOrderedContainer from zope.app.container.interfaces import IContainer, IOrderedContainer
from zope.app.file.interfaces import IImage as IBaseAsset from zope.app.file.interfaces import IImage as IBaseAsset
@ -33,6 +34,7 @@ from zope.size.interfaces import ISized
from cybertools.relation.interfaces import IDyadicRelation from cybertools.relation.interfaces import IDyadicRelation
from cybertools.tracking.interfaces import ITrackingStorage from cybertools.tracking.interfaces import ITrackingStorage
from cybertools.util.format import toStr, toUnicode
from loops import util from loops import util
from loops.util import _ from loops.util import _
@ -747,6 +749,27 @@ class IFile(IResourceAdapter, IResourceSchema):
localFilename = Attribute('Filename provided during upload.') localFilename = Attribute('Filename provided during upload.')
# external file stuff
class ExternalAddressField(schema.TextLine):
def __init__(self, *args, **kw):
self.encoding = kw.pop('encoding', 'UTF-8')
super(ExternalAddressField, self).__init__(*args, **kw)
def get(self, obj):
value = super(ExternalAddressField, self).get(obj)
return toUnicode(value, self.encoding)
def set(self, obj, value):
value = toStr(value, self.encoding)
super(ExternalAddressField, self).set(obj, value)
def fromUnicode(self, value):
return toStr(value, self.encoding)
class IStorageInfo(Interface): class IStorageInfo(Interface):
storageName = schema.BytesLine( storageName = schema.BytesLine(
@ -765,11 +788,11 @@ class IStorageInfo(Interface):
missing_value='', missing_value='',
required=False) required=False)
externalAddress = schema.BytesLine( externalAddress = ExternalAddressField(
title=_(u'External Address'), title=_(u'External Address'),
description=_(u'The full address for accessing the object ' description=_(u'The full address for accessing the object '
'on the external storage, e.g. a filename or path.'), 'on the external storage, e.g. a filename or path.'),
default='', default=u'',
missing_value='', missing_value='',
required=False) required=False)
@ -786,11 +809,11 @@ class IExternalFile(IFile):
missing_value='', missing_value='',
required=False) required=False)
externalAddress = schema.BytesLine( externalAddress = ExternalAddressField(
title=_(u'External Address'), title=_(u'External Address'),
description=_(u'The full address for accessing the object ' description=_(u'The full address for accessing the object '
'on the external storage, e.g. a filename or path.'), 'on the external storage, e.g. a filename or path.'),
default='', default=u'',
missing_value='', missing_value='',
required=False) required=False)
@ -803,6 +826,9 @@ class IExternalFile(IFile):
""" """
# specialized resources
class IImage(IResourceAdapter): class IImage(IResourceAdapter):
""" A media asset that may be embedded in a (web) page as an image. """ A media asset that may be embedded in a (web) page as an image.
""" """