diff --git a/common.py b/common.py index affbc83..0857ce8 100644 --- a/common.py +++ b/common.py @@ -236,7 +236,11 @@ def normalizeName(baseName): try: c = c.encode('ISO8859-15') except UnicodeEncodeError: - # skip all characters not representable in ISO encoding + # replace all characters not representable in ISO encoding + result.append('_') + continue + except UnicodeDecodeError: + result.append('_') continue if c in '._': # separator and special characters to keep diff --git a/integrator/collection.py b/integrator/collection.py index 054751f..ae247e9 100644 --- a/integrator/collection.py +++ b/integrator/collection.py @@ -41,7 +41,7 @@ from zope.traversing.api import getName, getParent from cybertools.meta.interfaces import IOptions from cybertools.text import mimetypes from cybertools.typology.interfaces import IType -from loops.common import AdapterBase, adapted +from loops.common import AdapterBase, adapted, normalizeName from loops.interfaces import IResource, IConcept from loops.integrator.interfaces import IExternalCollection from loops.integrator.interfaces import IExternalCollectionProvider @@ -112,7 +112,7 @@ class ExternalCollectionAdapter(AdapterBase): for r in self.newResources: self.context.assignResource(r) for addr in old: - if addr not in oldFound: + if str(addr) not in oldFound: # not part of the collection any more # TODO: only remove from collection but keep object? self.remove(old[addr]) @@ -204,7 +204,7 @@ class DirectoryCollectionProvider(object): def getDirectory(self, client): baseAddress = client.baseAddress or '' address = client.address or '' - return os.path.join(baseAddress, address) + return str(os.path.join(baseAddress, address)) def generateName(self, container, name): name = INameChooser(container).chooseName(name, None) @@ -217,5 +217,8 @@ class DirectoryCollectionProvider(object): if ext.lower() in mimetypes.extensions.values(): title = base if not isinstance(title, unicode): - title = title.decode('UTF-8') + try: + title = title.decode('UTF-8') + except UnicodeDecodeError: + title = title.decode('CP852') return title diff --git a/integrator/office/base.py b/integrator/office/base.py index e8e2e27..304ba87 100644 --- a/integrator/office/base.py +++ b/integrator/office/base.py @@ -127,6 +127,8 @@ class OfficeFile(ExternalFileAdapter): def parseDate(s): + if not s: + return None dt = datetime(*strptime(s, '%Y-%m-%dT%H:%M:%SZ')[:6]) + timedelta(hours=2) return date(dt.year, dt.month, dt.day) #return date(*strptime(s, '%Y-%m-%dT%H:%M:%SZ')[:3]) diff --git a/interfaces.py b/interfaces.py index 52a092f..88fc435 100644 --- a/interfaces.py +++ b/interfaces.py @@ -361,6 +361,14 @@ class IResource(ILoopsObject, IPotentialTarget): available via a view or a concept. """ + resourceType = schema.Choice( + title=_(u'Resource Type'), + description=_(u"The type of the resource, specified by a relation to " + "a concept of type 'type'."), + default=None, + source="loops.resourceTypeSource", + required=False) + class IDocumentSchema(IResourceSchema):