integrator: Python3 fixes
This commit is contained in:
parent
5e5e9aedfc
commit
bf1fda008c
11 changed files with 81 additions and 233 deletions
|
@ -4,8 +4,6 @@ loops - Linked Objects for Organization and Processing Services
|
||||||
|
|
||||||
Integration of external sources.
|
Integration of external sources.
|
||||||
|
|
||||||
($Id$)
|
|
||||||
|
|
||||||
|
|
||||||
Setting up a loops Site and Utilities
|
Setting up a loops Site and Utilities
|
||||||
=====================================
|
=====================================
|
||||||
|
@ -46,7 +44,7 @@ and methods of the external collect object.
|
||||||
>>> from loops.integrator.collection import ExternalCollectionAdapter
|
>>> from loops.integrator.collection import ExternalCollectionAdapter
|
||||||
>>> tExternalCollection = concepts['extcollection']
|
>>> tExternalCollection = concepts['extcollection']
|
||||||
>>> coll01 = addObject(concepts, Concept, 'coll01',
|
>>> coll01 = addObject(concepts, Concept, 'coll01',
|
||||||
... title=u'Collection One', conceptType=tExternalCollection)
|
... title='Collection One', conceptType=tExternalCollection)
|
||||||
>>> aColl01 = ExternalCollectionAdapter(coll01)
|
>>> aColl01 = ExternalCollectionAdapter(coll01)
|
||||||
|
|
||||||
An external collection carries a set of attributes that control the access
|
An external collection carries a set of attributes that control the access
|
||||||
|
@ -58,7 +56,7 @@ to the external system:
|
||||||
>>> aColl01.baseAddress = dataDir
|
>>> aColl01.baseAddress = dataDir
|
||||||
>>> aColl01.address = 'topics'
|
>>> aColl01.address = 'topics'
|
||||||
|
|
||||||
>>> aColl01.metaInfo = u'Photograph taken by...'
|
>>> aColl01.metaInfo = 'Photograph taken by...'
|
||||||
>>> aColl01.overwriteMetaInfo is None
|
>>> aColl01.overwriteMetaInfo is None
|
||||||
True
|
True
|
||||||
|
|
||||||
|
@ -91,9 +89,9 @@ Let's now create the corresponding resource objects.
|
||||||
2
|
2
|
||||||
>>> xf1 = res[0]
|
>>> xf1 = res[0]
|
||||||
>>> xf1.__name__
|
>>> xf1.__name__
|
||||||
u'programming_beautifulprogram.pdf'
|
'programming_beautifulprogram.pdf'
|
||||||
>>> xf1.title
|
>>> xf1.title
|
||||||
u'BeautifulProgram'
|
'BeautifulProgram'
|
||||||
>>> xf1.contentType
|
>>> xf1.contentType
|
||||||
'application/pdf'
|
'application/pdf'
|
||||||
|
|
||||||
|
@ -115,8 +113,8 @@ Working with the External Collection
|
||||||
>>> len(res)
|
>>> len(res)
|
||||||
2
|
2
|
||||||
>>> sorted((r.__name__, r.title, r._storageName) for r in res)
|
>>> sorted((r.__name__, r.title, r._storageName) for r in res)
|
||||||
[(u'programming_beautifulprogram.pdf', u'BeautifulProgram', 'fullpath'),
|
[('programming_beautifulprogram.pdf', 'BeautifulProgram', 'fullpath'),
|
||||||
(u'programming_zope_zope3.txt', u'zope3', 'fullpath')]
|
('programming_zope_zope3.txt', 'zope3', 'fullpath')]
|
||||||
|
|
||||||
We may update the collection after having changed the storage params.
|
We may update the collection after having changed the storage params.
|
||||||
This should also change the settings for existing objects if they still
|
This should also change the settings for existing objects if they still
|
||||||
|
@ -133,7 +131,7 @@ can be found.
|
||||||
('fullpath', {'subdirectory': '...programming'}, 'BeautifulProgram.pdf')
|
('fullpath', {'subdirectory': '...programming'}, 'BeautifulProgram.pdf')
|
||||||
|
|
||||||
>>> aXf1.metaInfo
|
>>> aXf1.metaInfo
|
||||||
u'Photograph taken by...'
|
'Photograph taken by...'
|
||||||
|
|
||||||
But if one of the referenced objects is not found any more it will be deleted.
|
But if one of the referenced objects is not found any more it will be deleted.
|
||||||
|
|
||||||
|
@ -153,14 +151,14 @@ Mail Collections
|
||||||
>>> tType = concepts['type']
|
>>> tType = concepts['type']
|
||||||
>>> from loops.integrator.mail.interfaces import IMailCollection, IMailResource
|
>>> from loops.integrator.mail.interfaces import IMailCollection, IMailResource
|
||||||
>>> tMailCollection = addAndConfigureObject(concepts, Concept, 'mailcollection',
|
>>> tMailCollection = addAndConfigureObject(concepts, Concept, 'mailcollection',
|
||||||
... title=u'Mail Collection', conceptType=tType,
|
... title='Mail Collection', conceptType=tType,
|
||||||
... typeInterface=IMailCollection)
|
... typeInterface=IMailCollection)
|
||||||
>>> tMailResource = addAndConfigureObject(concepts, Concept, 'email',
|
>>> tMailResource = addAndConfigureObject(concepts, Concept, 'email',
|
||||||
... title=u'Mail Resource', conceptType=tType,
|
... title='Mail Resource', conceptType=tType,
|
||||||
... typeInterface=IMailResource)
|
... typeInterface=IMailResource)
|
||||||
|
|
||||||
>>> mailColl = addObject(concepts, Concept, 'mails.user1',
|
>>> mailColl = addObject(concepts, Concept, 'mails.user1',
|
||||||
... title=u'My Mails (User1)', conceptType=tMailCollection)
|
... title='My Mails (User1)', conceptType=tMailCollection)
|
||||||
|
|
||||||
>>> from loops.integrator.mail.collection import MailCollectionAdapter
|
>>> from loops.integrator.mail.collection import MailCollectionAdapter
|
||||||
>>> aMailColl = MailCollectionAdapter(mailColl)
|
>>> aMailColl = MailCollectionAdapter(mailColl)
|
||||||
|
@ -168,10 +166,10 @@ Mail Collections
|
||||||
An external collection carries a set of attributes that control the access
|
An external collection carries a set of attributes that control the access
|
||||||
to the external system:
|
to the external system:
|
||||||
|
|
||||||
>>> aMailColl.userName = u'jim'
|
>>> aMailColl.userName = 'jim'
|
||||||
>>> (aMailColl.providerName, aMailColl.baseAddress, aMailColl.address,
|
>>> (aMailColl.providerName, aMailColl.baseAddress, aMailColl.address,
|
||||||
... aMailColl.pattern, aMailColl.userName)
|
... aMailColl.pattern, aMailColl.userName)
|
||||||
(u'imap', None, None, None, u'jim')
|
('imap', None, None, None, 'jim')
|
||||||
|
|
||||||
>>> from loops.integrator.mail import testing
|
>>> from loops.integrator.mail import testing
|
||||||
|
|
||||||
|
@ -187,9 +185,9 @@ to the external system:
|
||||||
>>> aMail.date, aMail.sender, aMail.receiver, aMail.title
|
>>> aMail.date, aMail.sender, aMail.receiver, aMail.title
|
||||||
(datetime.datetime(...), 'ceo@cy55.de', 'ceo@example.org', 'Blogging from Munich')
|
(datetime.datetime(...), 'ceo@cy55.de', 'ceo@example.org', 'Blogging from Munich')
|
||||||
>>> aMail.data
|
>>> aMail.data
|
||||||
u'<p><b>Blogging from ...</b><br />\n'
|
'<p><b>Blogging from ...</b><br />\n'
|
||||||
>>> aMail.externalAddress
|
>>> aMail.externalAddress
|
||||||
u'imap://jim@.../20081208171745.e4ce2xm96cco80cg@cy55.de'
|
'imap://jim@.../20081208171745.e4ce2xm96cco80cg@cy55.de'
|
||||||
|
|
||||||
|
|
||||||
Uploading Resources with HTTP PUT Requests
|
Uploading Resources with HTTP PUT Requests
|
||||||
|
@ -217,9 +215,9 @@ Uploading Resources with HTTP PUT Requests
|
||||||
*** resources.PUT .data local/user/filesystem/testing/data/file1.txt
|
*** resources.PUT .data local/user/filesystem/testing/data/file1.txt
|
||||||
|
|
||||||
>>> getName(resource)
|
>>> getName(resource)
|
||||||
u'local_user_filesystem_testing_data_file1.txt'
|
'local_user_filesystem_testing_data_file1.txt'
|
||||||
>>> resource.title
|
>>> resource.title
|
||||||
u'file1'
|
'file1'
|
||||||
|
|
||||||
|
|
||||||
Extracting Document Properties from MS Office Files
|
Extracting Document Properties from MS Office Files
|
||||||
|
@ -234,7 +232,7 @@ Extracting Document Properties from MS Office Files
|
||||||
23561...
|
23561...
|
||||||
|
|
||||||
>>> officeFile = addAndConfigureObject(resources, Resource, 'test.docx',
|
>>> officeFile = addAndConfigureObject(resources, Resource, 'test.docx',
|
||||||
... title=u'Example Word File', resourceType=tOfficeFile,
|
... title='Example Word File', resourceType=tOfficeFile,
|
||||||
... storageParams=dict(subdirectory=path))
|
... storageParams=dict(subdirectory=path))
|
||||||
>>> aOfficeFile = adapted(officeFile)
|
>>> aOfficeFile = adapted(officeFile)
|
||||||
>>> aOfficeFile.externalAddress = 'example.docx'
|
>>> aOfficeFile.externalAddress = 'example.docx'
|
||||||
|
@ -245,6 +243,7 @@ Extracting Document Properties from MS Office Files
|
||||||
|
|
||||||
Clean up:
|
Clean up:
|
||||||
>>> shutil.copy(fn + '.sav', fn)
|
>>> shutil.copy(fn + '.sav', fn)
|
||||||
|
'.../example.docx'
|
||||||
|
|
||||||
|
|
||||||
Fin de partie
|
Fin de partie
|
||||||
|
|
|
@ -1,23 +1,6 @@
|
||||||
#
|
# loops.integrator.collection
|
||||||
# Copyright (c) 2012 Helmut Merz helmutm@cy55.de
|
|
||||||
#
|
|
||||||
# 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
|
|
||||||
# the Free Software Foundation; either version 2 of the License, or
|
|
||||||
# (at your option) any later version.
|
|
||||||
#
|
|
||||||
# This program is distributed in the hope that it will be useful,
|
|
||||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
# GNU General Public License for more details.
|
|
||||||
#
|
|
||||||
# You should have received a copy of the GNU General Public License
|
|
||||||
# along with this program; if not, write to the Free Software
|
|
||||||
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|
||||||
#
|
|
||||||
|
|
||||||
"""
|
""" Concept adapter(s) for external collections, e.g. a directory in the
|
||||||
Concept adapter(s) for external collections, e.g. a directory in the
|
|
||||||
file system.
|
file system.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
@ -26,15 +9,15 @@ from logging import getLogger
|
||||||
import os, re, stat
|
import os, re, stat
|
||||||
import transaction
|
import transaction
|
||||||
|
|
||||||
from zope.app.container.interfaces import INameChooser
|
from zope.container.interfaces import INameChooser
|
||||||
from zope.app.container.contained import ObjectRemovedEvent
|
from zope.container.contained import ObjectRemovedEvent
|
||||||
from zope.cachedescriptors.property import Lazy
|
from zope.cachedescriptors.property import Lazy
|
||||||
from zope import component
|
from zope import component
|
||||||
from zope.component import adapts
|
from zope.component import adapts
|
||||||
from zope.contenttype import guess_content_type
|
from zope.contenttype import guess_content_type
|
||||||
from zope.event import notify
|
from zope.event import notify
|
||||||
from zope.lifecycleevent import ObjectModifiedEvent
|
from zope.lifecycleevent import ObjectModifiedEvent
|
||||||
from zope.interface import implements, Attribute
|
from zope.interface import implementer, Attribute
|
||||||
from zope.schema.interfaces import IField
|
from zope.schema.interfaces import IField
|
||||||
from zope.traversing.api import getName, getParent
|
from zope.traversing.api import getName, getParent
|
||||||
|
|
||||||
|
@ -56,12 +39,12 @@ TypeInterfaceSourceList.typeInterfaces += (IExternalCollection,)
|
||||||
logger = getLogger('loops.integrator.collection')
|
logger = getLogger('loops.integrator.collection')
|
||||||
|
|
||||||
|
|
||||||
|
@implementer(IExternalCollection)
|
||||||
class ExternalCollectionAdapter(AdapterBase):
|
class ExternalCollectionAdapter(AdapterBase):
|
||||||
""" A concept adapter for accessing an external collection.
|
""" A concept adapter for accessing an external collection.
|
||||||
May delegate access to a named utility.
|
May delegate access to a named utility.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
implements(IExternalCollection)
|
|
||||||
adapts(IConcept)
|
adapts(IConcept)
|
||||||
|
|
||||||
_adapterAttributes = AdapterBase._adapterAttributes + (
|
_adapterAttributes = AdapterBase._adapterAttributes + (
|
||||||
|
@ -84,16 +67,16 @@ class ExternalCollectionAdapter(AdapterBase):
|
||||||
if self.useVersioning:
|
if self.useVersioning:
|
||||||
for obj in old.values():
|
for obj in old.values():
|
||||||
for vaddr, vobj, vid in self.getVersions(obj):
|
for vaddr, vobj, vid in self.getVersions(obj):
|
||||||
print '###', vaddr, vobj, vid
|
print('###', vaddr, vobj, vid)
|
||||||
versions.add(vaddr)
|
versions.add(vaddr)
|
||||||
new = []
|
new = []
|
||||||
oldFound = set([])
|
oldFound = set([])
|
||||||
provider = component.getUtility(IExternalCollectionProvider,
|
provider = component.getUtility(IExternalCollectionProvider,
|
||||||
name=self.providerName or '')
|
name=self.providerName or '')
|
||||||
#print '*** old', old, versions, self.lastUpdated
|
#print('*** old', old, versions, self.lastUpdated)
|
||||||
changeCount = 0
|
changeCount = 0
|
||||||
for addr, mdate in provider.collect(self):
|
for addr, mdate in provider.collect(self):
|
||||||
#print '***', addr, mdate
|
#print('***', addr, mdate)
|
||||||
if addr in versions:
|
if addr in versions:
|
||||||
continue
|
continue
|
||||||
if addr in old:
|
if addr in old:
|
||||||
|
@ -170,12 +153,11 @@ class ExternalCollectionAdapter(AdapterBase):
|
||||||
if IVersionable(v).parent is not None]
|
if IVersionable(v).parent is not None]
|
||||||
|
|
||||||
|
|
||||||
|
@implementer(IExternalCollectionProvider)
|
||||||
class DirectoryCollectionProvider(object):
|
class DirectoryCollectionProvider(object):
|
||||||
""" A utility that provides access to files in a directory.
|
""" A utility that provides access to files in a directory.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
implements(IExternalCollectionProvider)
|
|
||||||
|
|
||||||
extFileTypeMapping = {
|
extFileTypeMapping = {
|
||||||
'image/*': 'media_asset',
|
'image/*': 'media_asset',
|
||||||
'*/*': 'extfile',
|
'*/*': 'extfile',
|
||||||
|
@ -256,7 +238,7 @@ class DirectoryCollectionProvider(object):
|
||||||
base, ext = title.rsplit('.', 1)
|
base, ext = title.rsplit('.', 1)
|
||||||
if ext.lower() in mimetypes.extensions.values():
|
if ext.lower() in mimetypes.extensions.values():
|
||||||
title = base
|
title = base
|
||||||
if not isinstance(title, unicode):
|
if isinstance(title, bytes):
|
||||||
try:
|
try:
|
||||||
title = title.decode('UTF-8')
|
title = title.decode('UTF-8')
|
||||||
except UnicodeDecodeError:
|
except UnicodeDecodeError:
|
||||||
|
|
|
@ -1,32 +1,13 @@
|
||||||
#
|
# loops.integrator.mail.collection
|
||||||
# Copyright (c) 2009 Helmut Merz helmutm@cy55.de
|
|
||||||
#
|
|
||||||
# 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
|
|
||||||
# the Free Software Foundation; either version 2 of the License, or
|
|
||||||
# (at your option) any later version.
|
|
||||||
#
|
|
||||||
# This program is distributed in the hope that it will be useful,
|
|
||||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
# GNU General Public License for more details.
|
|
||||||
#
|
|
||||||
# You should have received a copy of the GNU General Public License
|
|
||||||
# along with this program; if not, write to the Free Software
|
|
||||||
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|
||||||
#
|
|
||||||
|
|
||||||
"""
|
""" Concept adapter(s) for external collections, e.g. a directory in the
|
||||||
Concept adapter(s) for external collections, e.g. a directory in the
|
|
||||||
file system.
|
file system.
|
||||||
|
|
||||||
$Id$
|
|
||||||
"""
|
"""
|
||||||
|
|
||||||
from zope.cachedescriptors.property import Lazy
|
from zope.cachedescriptors.property import Lazy
|
||||||
from zope import component
|
from zope import component
|
||||||
from zope.component import adapts
|
from zope.component import adapts
|
||||||
from zope.interface import implements
|
from zope.interface import implementer
|
||||||
|
|
||||||
from loops.integrator.collection import ExternalCollectionAdapter
|
from loops.integrator.collection import ExternalCollectionAdapter
|
||||||
from loops.integrator.mail.interfaces import IMailCollection
|
from loops.integrator.mail.interfaces import IMailCollection
|
||||||
|
@ -36,13 +17,12 @@ from loops.type import TypeInterfaceSourceList
|
||||||
TypeInterfaceSourceList.typeInterfaces += (IMailCollection,)
|
TypeInterfaceSourceList.typeInterfaces += (IMailCollection,)
|
||||||
|
|
||||||
|
|
||||||
|
@implementer(IMailCollection)
|
||||||
class MailCollectionAdapter(ExternalCollectionAdapter):
|
class MailCollectionAdapter(ExternalCollectionAdapter):
|
||||||
""" A concept adapter for accessing a mail collection.
|
""" A concept adapter for accessing a mail collection.
|
||||||
May delegate access to a named utility.
|
May delegate access to a named utility.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
implements(IMailCollection)
|
|
||||||
|
|
||||||
_adapterAttributes = ExternalCollectionAdapter._adapterAttributes + (
|
_adapterAttributes = ExternalCollectionAdapter._adapterAttributes + (
|
||||||
'providerName', '_collectedObjects')
|
'providerName', '_collectedObjects')
|
||||||
_contextAttributes = list(IMailCollection)
|
_contextAttributes = list(IMailCollection)
|
||||||
|
|
|
@ -1,42 +1,23 @@
|
||||||
#
|
# loops.integrator.mail.imap
|
||||||
# Copyright (c) 2010 Helmut Merz helmutm@cy55.de
|
|
||||||
#
|
|
||||||
# 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
|
|
||||||
# the Free Software Foundation; either version 2 of the License, or
|
|
||||||
# (at your option) any later version.
|
|
||||||
#
|
|
||||||
# This program is distributed in the hope that it will be useful,
|
|
||||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
# GNU General Public License for more details.
|
|
||||||
#
|
|
||||||
# You should have received a copy of the GNU General Public License
|
|
||||||
# along with this program; if not, write to the Free Software
|
|
||||||
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|
||||||
#
|
|
||||||
|
|
||||||
"""
|
""" Concept adapter(s) for external collections, e.g. a directory in the
|
||||||
Concept adapter(s) for external collections, e.g. a directory in the
|
|
||||||
file system.
|
file system.
|
||||||
|
|
||||||
$Id$
|
|
||||||
"""
|
"""
|
||||||
|
|
||||||
from datetime import datetime
|
from datetime import datetime
|
||||||
import email, email.Header
|
import email, email.header, email.utils
|
||||||
from logging import getLogger
|
from logging import getLogger
|
||||||
import os
|
import os
|
||||||
import time
|
import time
|
||||||
|
|
||||||
from zope.app.container.interfaces import INameChooser
|
|
||||||
from zope.cachedescriptors.property import Lazy
|
from zope.cachedescriptors.property import Lazy
|
||||||
from zope import component
|
from zope import component
|
||||||
from zope.component import adapts
|
from zope.component import adapts
|
||||||
|
from zope.container.interfaces import INameChooser
|
||||||
from zope.event import notify
|
from zope.event import notify
|
||||||
from zope.lifecycleevent import ObjectCreatedEvent, ObjectModifiedEvent
|
from zope.lifecycleevent import ObjectCreatedEvent, ObjectModifiedEvent
|
||||||
from zope.event import notify
|
from zope.event import notify
|
||||||
from zope.interface import implements
|
from zope.interface import implementer
|
||||||
from zope.traversing.api import getName, getParent
|
from zope.traversing.api import getName, getParent
|
||||||
|
|
||||||
from loops.common import AdapterBase, adapted
|
from loops.common import AdapterBase, adapted
|
||||||
|
@ -47,12 +28,11 @@ from loops.resource import Resource
|
||||||
from loops.setup import addAndConfigureObject
|
from loops.setup import addAndConfigureObject
|
||||||
|
|
||||||
|
|
||||||
|
@implementer(IExternalCollectionProvider)
|
||||||
class IMAPCollectionProvider(object):
|
class IMAPCollectionProvider(object):
|
||||||
""" A utility that provides access to an IMAP folder.
|
""" A utility that provides access to an IMAP folder.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
implements(IExternalCollectionProvider)
|
|
||||||
|
|
||||||
def collect(self, client):
|
def collect(self, client):
|
||||||
client._collectedObjects = {}
|
client._collectedObjects = {}
|
||||||
hostName = client.baseAddress
|
hostName = client.baseAddress
|
||||||
|
@ -90,7 +70,7 @@ class IMAPCollectionProvider(object):
|
||||||
#raw_date = msg['Date'].rsplit(' ', 1)[0]
|
#raw_date = msg['Date'].rsplit(' ', 1)[0]
|
||||||
#fmt = '%a, %d %b %Y %H:%M:%S'
|
#fmt = '%a, %d %b %Y %H:%M:%S'
|
||||||
#date = datetime(*(time.strptime(raw_date, fmt)[0:6]))
|
#date = datetime(*(time.strptime(raw_date, fmt)[0:6]))
|
||||||
date = datetime(*(email.Utils.parsedate(msg['Date'])[0:6]))
|
date = datetime(*(email.utils.parsedate(msg['Date'])[0:6]))
|
||||||
parts = getPayload(msg)
|
parts = getPayload(msg)
|
||||||
if 'html' in parts:
|
if 'html' in parts:
|
||||||
text = '<br /><br /><hr /><br /><br />'.join(parts['html'])
|
text = '<br /><br /><hr /><br /><br />'.join(parts['html'])
|
||||||
|
@ -117,7 +97,7 @@ class IMAPCollectionProvider(object):
|
||||||
|
|
||||||
def decodeHeader(h):
|
def decodeHeader(h):
|
||||||
result = []
|
result = []
|
||||||
for v, dec in email.Header.decode_header(h):
|
for v, dec in email.header.decode_header(h):
|
||||||
if dec:
|
if dec:
|
||||||
v = v.decode(dec)
|
v = v.decode(dec)
|
||||||
result.append(v)
|
result.append(v)
|
||||||
|
|
|
@ -1,25 +1,6 @@
|
||||||
#
|
# loops.integrator.mail.interfaces
|
||||||
# Copyright (c) 2009 Helmut Merz helmutm@cy55.de
|
|
||||||
#
|
|
||||||
# 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
|
|
||||||
# the Free Software Foundation; either version 2 of the License, or
|
|
||||||
# (at your option) any later version.
|
|
||||||
#
|
|
||||||
# This program is distributed in the hope that it will be useful,
|
|
||||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
# GNU General Public License for more details.
|
|
||||||
#
|
|
||||||
# You should have received a copy of the GNU General Public License
|
|
||||||
# along with this program; if not, write to the Free Software
|
|
||||||
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|
||||||
#
|
|
||||||
|
|
||||||
"""
|
""" Integrator interfaces for email representation.
|
||||||
Integrator interfaces for email representation.
|
|
||||||
|
|
||||||
$Id$
|
|
||||||
"""
|
"""
|
||||||
|
|
||||||
from zope.interface import Interface, Attribute
|
from zope.interface import Interface, Attribute
|
||||||
|
@ -69,8 +50,8 @@ class IMailResource(ITextDocument):
|
||||||
title=_(u'External Address'),
|
title=_(u'External Address'),
|
||||||
description=_(u'The full address of the email in the external '
|
description=_(u'The full address of the email in the external '
|
||||||
u'email system.'),
|
u'email system.'),
|
||||||
default='',
|
default=b'',
|
||||||
missing_value='',
|
missing_value=b'',
|
||||||
required=False)
|
required=False)
|
||||||
sender = schema.TextLine(
|
sender = schema.TextLine(
|
||||||
title=_(u'Sender'),
|
title=_(u'Sender'),
|
||||||
|
|
|
@ -1,31 +1,12 @@
|
||||||
#
|
# loops.integrator.mail.resouurce
|
||||||
# Copyright (c) 2009 Helmut Merz helmutm@cy55.de
|
|
||||||
#
|
|
||||||
# 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
|
|
||||||
# the Free Software Foundation; either version 2 of the License, or
|
|
||||||
# (at your option) any later version.
|
|
||||||
#
|
|
||||||
# This program is distributed in the hope that it will be useful,
|
|
||||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
# GNU General Public License for more details.
|
|
||||||
#
|
|
||||||
# You should have received a copy of the GNU General Public License
|
|
||||||
# along with this program; if not, write to the Free Software
|
|
||||||
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|
||||||
#
|
|
||||||
|
|
||||||
"""
|
""" Adapter for mail resources.
|
||||||
Adapter for mail resources.
|
|
||||||
|
|
||||||
$Id$
|
|
||||||
"""
|
"""
|
||||||
|
|
||||||
from zope.cachedescriptors.property import Lazy
|
from zope.cachedescriptors.property import Lazy
|
||||||
from zope import component
|
from zope import component
|
||||||
from zope.component import adapts
|
from zope.component import adapts
|
||||||
from zope.interface import implements
|
from zope.interface import implementer
|
||||||
|
|
||||||
from loops.integrator.mail.interfaces import IMailResource
|
from loops.integrator.mail.interfaces import IMailResource
|
||||||
from loops.resource import TextDocumentAdapter
|
from loops.resource import TextDocumentAdapter
|
||||||
|
@ -35,11 +16,10 @@ from loops.type import TypeInterfaceSourceList
|
||||||
TypeInterfaceSourceList.typeInterfaces += (IMailResource,)
|
TypeInterfaceSourceList.typeInterfaces += (IMailResource,)
|
||||||
|
|
||||||
|
|
||||||
|
@implementer(IMailResource)
|
||||||
class MailResource(TextDocumentAdapter):
|
class MailResource(TextDocumentAdapter):
|
||||||
""" A concept adapter for accessing a mail collection.
|
""" A concept adapter for accessing a mail collection.
|
||||||
May delegate access to a named utility.
|
May delegate access to a named utility.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
implements(IMailResource)
|
|
||||||
|
|
||||||
_contextAttributes = list(IMailResource)
|
_contextAttributes = list(IMailResource)
|
||||||
|
|
|
@ -1,23 +1,6 @@
|
||||||
#
|
# loops.integrator.office.base
|
||||||
# Copyright (c) 2014 Helmut Merz helmutm@cy55.de
|
|
||||||
#
|
|
||||||
# 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
|
|
||||||
# the Free Software Foundation; either version 2 of the License, or
|
|
||||||
# (at your option) any later version.
|
|
||||||
#
|
|
||||||
# This program is distributed in the hope that it will be useful,
|
|
||||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
# GNU General Public License for more details.
|
|
||||||
#
|
|
||||||
# You should have received a copy of the GNU General Public License
|
|
||||||
# along with this program; if not, write to the Free Software
|
|
||||||
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|
||||||
#
|
|
||||||
|
|
||||||
"""
|
""" Resource adapter(s) for MS Office files.
|
||||||
Resource adapter(s) for MS Office files.
|
|
||||||
"""
|
"""
|
||||||
|
|
||||||
from datetime import date, datetime, timedelta
|
from datetime import date, datetime, timedelta
|
||||||
|
@ -30,7 +13,7 @@ from zipfile import ZipFile, BadZipfile
|
||||||
from zope.cachedescriptors.property import Lazy
|
from zope.cachedescriptors.property import Lazy
|
||||||
from zope import component
|
from zope import component
|
||||||
from zope.component import adapts
|
from zope.component import adapts
|
||||||
from zope.interface import implements
|
from zope.interface import implementer
|
||||||
from zope.traversing.api import getName, getParent
|
from zope.traversing.api import getName, getParent
|
||||||
|
|
||||||
from cybertools.storage.interfaces import IExternalStorage
|
from cybertools.storage.interfaces import IExternalStorage
|
||||||
|
@ -45,13 +28,12 @@ from loops.versioning.interfaces import IVersionable
|
||||||
TypeInterfaceSourceList.typeInterfaces += (IOfficeFile,)
|
TypeInterfaceSourceList.typeInterfaces += (IOfficeFile,)
|
||||||
|
|
||||||
|
|
||||||
|
@implementer(IOfficeFile)
|
||||||
class OfficeFile(ExternalFileAdapter):
|
class OfficeFile(ExternalFileAdapter):
|
||||||
""" An external file that references a MS Office (2007/2010) file.
|
""" An external file that references a MS Office (2007/2010) file.
|
||||||
It provides access to the document content and properties.
|
It provides access to the document content and properties.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
implements(IOfficeFile)
|
|
||||||
|
|
||||||
_adapterAttributes = (ExternalFileAdapter._adapterAttributes +
|
_adapterAttributes = (ExternalFileAdapter._adapterAttributes +
|
||||||
('documentPropertiesAccessible',))
|
('documentPropertiesAccessible',))
|
||||||
|
|
||||||
|
@ -98,7 +80,7 @@ class OfficeFile(ExternalFileAdapter):
|
||||||
try:
|
try:
|
||||||
zf = ZipFile(fn, 'r')
|
zf = ZipFile(fn, 'r')
|
||||||
self.documentPropertiesAccessible = True
|
self.documentPropertiesAccessible = True
|
||||||
except (IOError, BadZipfile), e:
|
except (IOError, BadZipfile) as e:
|
||||||
from logging import getLogger
|
from logging import getLogger
|
||||||
self.logger.warn(e)
|
self.logger.warn(e)
|
||||||
self.documentPropertiesAccessible = False
|
self.documentPropertiesAccessible = False
|
||||||
|
|
|
@ -1,37 +1,18 @@
|
||||||
#
|
# loops.integrator.put
|
||||||
# Copyright (c) 2007 Helmut Merz helmutm@cy55.de
|
|
||||||
#
|
|
||||||
# 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
|
|
||||||
# the Free Software Foundation; either version 2 of the License, or
|
|
||||||
# (at your option) any later version.
|
|
||||||
#
|
|
||||||
# This program is distributed in the hope that it will be useful,
|
|
||||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
# GNU General Public License for more details.
|
|
||||||
#
|
|
||||||
# You should have received a copy of the GNU General Public License
|
|
||||||
# along with this program; if not, write to the Free Software
|
|
||||||
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|
||||||
#
|
|
||||||
|
|
||||||
"""
|
""" Traversal adapter for PUT requests, e.g. coming from loops.agent.
|
||||||
Traversal adapter for PUT requests, e.g. coming from loops.agent.
|
|
||||||
|
|
||||||
$Id$
|
|
||||||
"""
|
"""
|
||||||
|
|
||||||
from zope import interface, component
|
from zope import interface, component
|
||||||
from zope.interface import implements
|
|
||||||
from zope.component import adapts
|
|
||||||
from zope.app.catalog.interfaces import ICatalog
|
|
||||||
from zope.app.container.interfaces import INameChooser
|
|
||||||
from zope.app.container.traversal import ContainerTraverser, ItemTraverser
|
|
||||||
from zope.contenttype import guess_content_type
|
|
||||||
from zope.cachedescriptors.property import Lazy
|
from zope.cachedescriptors.property import Lazy
|
||||||
|
from zope.catalog.interfaces import ICatalog
|
||||||
|
from zope.component import adapts
|
||||||
|
from zope.container.interfaces import INameChooser
|
||||||
|
from zope.container.traversal import ContainerTraverser, ItemTraverser
|
||||||
|
from zope.contenttype import guess_content_type
|
||||||
from zope.event import notify
|
from zope.event import notify
|
||||||
from zope.filerepresentation.interfaces import IWriteFile
|
from zope.filerepresentation.interfaces import IWriteFile
|
||||||
|
from zope.interface import implementer
|
||||||
from zope.lifecycleevent import ObjectCreatedEvent, ObjectModifiedEvent
|
from zope.lifecycleevent import ObjectCreatedEvent, ObjectModifiedEvent
|
||||||
from zope.publisher.interfaces import IPublishTraverse
|
from zope.publisher.interfaces import IPublishTraverse
|
||||||
|
|
||||||
|
@ -42,9 +23,9 @@ from loops.interfaces import IResourceManager
|
||||||
from loops.resource import Resource
|
from loops.resource import Resource
|
||||||
|
|
||||||
|
|
||||||
|
@implementer(IPublishTraverse)
|
||||||
class ResourceManagerTraverser(ItemTraverser):
|
class ResourceManagerTraverser(ItemTraverser):
|
||||||
|
|
||||||
implements(IPublishTraverse)
|
|
||||||
adapts(IResourceManager)
|
adapts(IResourceManager)
|
||||||
|
|
||||||
def publishTraverse(self, request, name):
|
def publishTraverse(self, request, name):
|
||||||
|
@ -61,8 +42,8 @@ class ResourceManagerTraverser(ItemTraverser):
|
||||||
for i in range(len(stack)):
|
for i in range(len(stack)):
|
||||||
# prevent further traversal
|
# prevent further traversal
|
||||||
stack.pop()
|
stack.pop()
|
||||||
#print '*** resources.PUT', name, path, machine, user, app
|
#print('*** resources.PUT', name, path, machine, user, app)
|
||||||
print '*** resources.PUT', name, path
|
print('*** resources.PUT', name, path)
|
||||||
resource = self.findResource(path)
|
resource = self.findResource(path)
|
||||||
if resource is None:
|
if resource is None:
|
||||||
resource = self.createResource(path)
|
resource = self.createResource(path)
|
||||||
|
@ -118,9 +99,11 @@ class ResourceManagerTraverser(ItemTraverser):
|
||||||
base, ext = name.rsplit('.', 1)
|
base, ext = name.rsplit('.', 1)
|
||||||
if ext.lower() in mimetypes.extensions.values():
|
if ext.lower() in mimetypes.extensions.values():
|
||||||
name = base
|
name = base
|
||||||
return name.decode('UTF-8')
|
return name
|
||||||
|
#return name.decode('UTF-8')
|
||||||
|
|
||||||
|
|
||||||
|
@implementer(IWriteFile)
|
||||||
class MetadataProxy(object):
|
class MetadataProxy(object):
|
||||||
""" Processes a metadata file for an associated resource.
|
""" Processes a metadata file for an associated resource.
|
||||||
"""
|
"""
|
||||||
|
@ -128,19 +111,16 @@ class MetadataProxy(object):
|
||||||
def __init__(self, resource):
|
def __init__(self, resource):
|
||||||
self.resource = resource
|
self.resource = resource
|
||||||
|
|
||||||
implements(IWriteFile)
|
|
||||||
|
|
||||||
def write(self, text):
|
def write(self, text):
|
||||||
# TODO: provide/change concept assignments based on metadata
|
# TODO: provide/change concept assignments based on metadata
|
||||||
print '*** metadata', repr(text)
|
print('*** metadata', repr(text))
|
||||||
|
|
||||||
|
|
||||||
|
@implementer(IWriteFile)
|
||||||
class DummyResource(object):
|
class DummyResource(object):
|
||||||
""" Just for testing
|
""" Just for testing
|
||||||
"""
|
"""
|
||||||
|
|
||||||
implements(IWriteFile)
|
|
||||||
|
|
||||||
def write(self, text):
|
def write(self, text):
|
||||||
print '*** content', repr(text)
|
print('*** content', repr(text))
|
||||||
|
|
||||||
|
|
|
@ -1,28 +1,11 @@
|
||||||
#
|
# loops.integrator.source
|
||||||
# Copyright (c) 2017 Helmut Merz helmutm@cy55.de
|
|
||||||
#
|
|
||||||
# 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
|
|
||||||
# the Free Software Foundation; either version 2 of the License, or
|
|
||||||
# (at your option) any later version.
|
|
||||||
#
|
|
||||||
# This program is distributed in the hope that it will be useful,
|
|
||||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
# GNU General Public License for more details.
|
|
||||||
#
|
|
||||||
# You should have received a copy of the GNU General Public License
|
|
||||||
# along with this program; if not, write to the Free Software
|
|
||||||
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|
||||||
#
|
|
||||||
|
|
||||||
"""
|
""" Managing information form objects provided by external sources, e.g. loops.agent.
|
||||||
Managing information form objects provided by external sources, e.g. loops.agent.
|
|
||||||
"""
|
"""
|
||||||
|
|
||||||
from persistent.mapping import PersistentMapping
|
from persistent.mapping import PersistentMapping
|
||||||
from zope import interface, component
|
from zope import interface, component
|
||||||
from zope.interface import implements
|
from zope.interface import implementer
|
||||||
from zope.component import adapts
|
from zope.component import adapts
|
||||||
|
|
||||||
from loops.common import adapted, AdapterBase
|
from loops.common import adapted, AdapterBase
|
||||||
|
@ -33,9 +16,9 @@ from loops.integrator.interfaces import IExternalSourceInfo
|
||||||
sourceInfoAttrName = '__loops_integrator_sourceinfo__'
|
sourceInfoAttrName = '__loops_integrator_sourceinfo__'
|
||||||
|
|
||||||
|
|
||||||
|
@implementer(IExternalSourceInfo)
|
||||||
class ExternalSourceInfo(object):
|
class ExternalSourceInfo(object):
|
||||||
|
|
||||||
implements(IExternalSourceInfo)
|
|
||||||
adapts(ILoopsObject)
|
adapts(ILoopsObject)
|
||||||
|
|
||||||
def __init__(self, context):
|
def __init__(self, context):
|
||||||
|
|
|
@ -1,11 +1,12 @@
|
||||||
"""
|
# loops.integrator.testsetup
|
||||||
Set up a loops site for testing.
|
|
||||||
|
""" Set up a loops site for testing.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
import os
|
import os
|
||||||
from zope import component
|
from zope import component
|
||||||
from zope.app.catalog.interfaces import ICatalog
|
from zope.catalog.interfaces import ICatalog
|
||||||
from zope.app.catalog.field import FieldIndex
|
from zope.catalog.field import FieldIndex
|
||||||
|
|
||||||
from cybertools.storage.interfaces import IExternalStorage
|
from cybertools.storage.interfaces import IExternalStorage
|
||||||
from cybertools.storage.filesystem import fullPathStorage
|
from cybertools.storage.filesystem import fullPathStorage
|
||||||
|
|
|
@ -276,7 +276,7 @@ class Resource(Image, Contained):
|
||||||
if newAdapted is not None and newOptions.get('storage') != oldAdapted.storageName:
|
if newAdapted is not None and newOptions.get('storage') != oldAdapted.storageName:
|
||||||
data = oldAdapted.data
|
data = oldAdapted.data
|
||||||
#print 'data', data
|
#print 'data', data
|
||||||
oldAdapted.data = '' # clear old storage
|
oldAdapted.data = b'' # clear old storage
|
||||||
context._storageName = None # let's take storage from new type options
|
context._storageName = None # let's take storage from new type options
|
||||||
context._storageParams = None # "
|
context._storageParams = None # "
|
||||||
if data: # do not write empty files
|
if data: # do not write empty files
|
||||||
|
|
Loading…
Add table
Reference in a new issue