diff --git a/README.txt b/README.txt index 9ea2212..e72ee3f 100755 --- a/README.txt +++ b/README.txt @@ -122,7 +122,7 @@ type manager. >>> from loops.concept import ConceptTypeSourceList >>> types = ConceptTypeSourceList(cc1) >>> sorted(t.title for t in types) - [u'Domain', u'Predicate', u'Query', u'Topic', u'Type', u'Unknown Type'] + [u'Customer', u'Domain', u'Predicate', u'Query', u'Topic', u'Type', u'Unknown Type'] Using a PredicateSourceList we can retrieve a list of the available predicates. @@ -195,7 +195,8 @@ types and predicates. >>> component.provideAdapter(LoopsTerms, (IIterableSource, IBrowserRequest), ITerms) >>> sorted((t.title, t.token) for t in view.conceptTypes()) - [(u'Domain', '.loops/concepts/domain'), + [(u'Customer', '.loops/concepts/customer'), + (u'Domain', '.loops/concepts/domain'), (u'Predicate', '.loops/concepts/predicate'), (u'Query', '.loops/concepts/query'), (u'Topic', '.loops/concepts/topic'), @@ -490,8 +491,8 @@ view; these views we have to provide as multi-adapters: >>> view = ConfigureView(m111, TestRequest(form = form)) >>> tt = view.targetTypes() >>> len(tt) - 9 - >>> sorted((t.token, t.title) for t in view.targetTypes())[0] + 10 + >>> sorted((t.token, t.title) for t in view.targetTypes())[1] ('.loops/concepts/domain', u'Domain') >>> view.update() True @@ -718,7 +719,7 @@ or resource. >>> from loops.view import NodeTraverser - >>> magic = '.target' + util.getUidForObject(note) + >>> magic = '.target' + util.getUidForObject(resources['d001.txt']) >>> url = 'http://127.0.0.1/loops/views/m1/m11/m111/' + magic + '/@@node.html' >>> #request = TestRequest(environ=dict(SERVER_URL=url)) >>> request = TestRequest() @@ -740,7 +741,7 @@ target object's view here: [] >>> action = view.virtualTarget.getActions()[0] >>> action.url - 'http://127.0.0.1/loops/views/m1/m11/m111/.target57' + 'http://127.0.0.1/loops/views/m1/m11/m111/.target23' Import/Export diff --git a/integrator/README.txt b/integrator/README.txt index 662dc50..75a497e 100644 --- a/integrator/README.txt +++ b/integrator/README.txt @@ -42,7 +42,7 @@ and methods of the external collect object. >>> from loops.integrator.collection import ExternalCollectionAdapter >>> tExternalCollection = concepts['extcollection'] >>> coll01 = addObject(concepts, Concept, 'coll01', - ... title=u'Collection One', type=tExternalCollection) + ... title=u'Collection One', conceptType=tExternalCollection) >>> aColl01 = ExternalCollectionAdapter(coll01) An external collection carries a set of attributes that control the access diff --git a/integrator/collection.py b/integrator/collection.py index b978706..1be017c 100644 --- a/integrator/collection.py +++ b/integrator/collection.py @@ -36,7 +36,7 @@ from loops.interfaces import IResource, IConcept from loops.integrator.interfaces import IExternalCollection from loops.integrator.interfaces import IExternalCollectionProvider from loops.resource import Resource -from loops.setup import addObject +from loops.setup import addAndConfigureObject from loops.type import TypeInterfaceSourceList @@ -70,13 +70,12 @@ class DirectoryCollectionProvider(object): def collect(self, client): directory = self.getDirectory(client) pattern = re.compile(client.pattern or '.*') - result = [] for path, dirs, files in os.walk(directory): - if files: - result.extend(os.path.join(path[len(directory)+1:], f) - for f in files - if pattern.match(f)) - return result + if '.svn' in dirs: + del dirs[dirs.index('.svn')] + for f in files: + if pattern.match(f): + yield os.path.join(path[len(directory)+1:], f) def createExtFileObjects(self, client, addresses, extFileType=None): if extFileType is None: @@ -85,8 +84,10 @@ class DirectoryCollectionProvider(object): directory = self.getDirectory(client) for addr in addresses: name = addr - obj = addObject(rm, Resource, name, - title=addr.decode('UTF-8'), type=extFileType, + obj = addAndConfigureObject( + rm, Resource, name, + title=addr.decode('UTF-8'), + type=extFileType, externalAddress=addr, storage='fullpath', storageParams=dict(subdirectory=directory)) diff --git a/integrator/testsetup.py b/integrator/testsetup.py index 4677b04..1b491cd 100644 --- a/integrator/testsetup.py +++ b/integrator/testsetup.py @@ -13,7 +13,7 @@ from loops.concept import Concept from loops.resource import Resource from loops.integrator.interfaces import IExternalCollection from loops.knowledge.setup import SetupManager as KnowledgeSetupManager -from loops.setup import SetupManager, addObject +from loops.setup import SetupManager, addAndConfigureObject from loops.tests.setup import TestSite as BaseTestSite dataDir = os.path.join(os.path.dirname(__file__), 'testdata') @@ -29,11 +29,11 @@ class TestSite(BaseTestSite): concepts, resources, views = self.baseSetup() tType = concepts.getTypeConcept() - tExtFile = addObject(concepts, Concept, 'extfile', - title=u'External File', type=tType, + tExtFile = addAndConfigureObject(concepts, Concept, 'extfile', + title=u'External File', conceptType=tType, typeInterface=IExternalFile) - tExtCollection = addObject(concepts, Concept, 'extcollection', - title=u'External Collection', type=tType, + tExtCollection = addAndConfigureObject(concepts, Concept, 'extcollection', + title=u'External Collection', conceptType=tType, typeInterface=IExternalCollection) self.indexAll(concepts, resources) diff --git a/resource.py b/resource.py index dbda046..8ee01db 100644 --- a/resource.py +++ b/resource.py @@ -231,12 +231,13 @@ class Resource(Image, Contained): newTi = removeSecurityProxy(newType.typeInterface) newOptions = {} if newTi is not None: - newAdapted = newTi(context) - # make sure we use options of new type: - newOptions = newType.optionsDict - object.__setattr__(newAdapted, 'options', newOptions) + newAdapted = newTi(context, None) + if newAdapted is not None: + # make sure we use options of new type: + newOptions = newType.optionsDict + object.__setattr__(newAdapted, 'options', newOptions) #print 'migrateStorage:', newAdapted, newOptions, oldAdapted, oldAdapted.storageName - if newOptions.get('storage') != oldAdapted.storageName: + if newAdapted is not None and newOptions.get('storage') != oldAdapted.storageName: data = oldAdapted.data #print 'data', data oldAdapted.data = '' # clear old storage diff --git a/setup.py b/setup.py index 9946f46..35d894d 100644 --- a/setup.py +++ b/setup.py @@ -28,6 +28,7 @@ from zope import component from zope.component import adapts from zope.interface import implements, Interface +from cybertools.typology.interfaces import IType from loops.interfaces import ILoops, ITypeConcept from loops.interfaces import IFile, IImage, ITextDocument, INote from loops.concept import ConceptManager, Concept @@ -90,7 +91,7 @@ class SetupManager(object): #ITypeConcept(image).typeInterface = IImage ITypeConcept(textdocument).typeInterface = ITextDocument ITypeConcept(note).typeInterface = INote - #ITypeConcept(note).viewName = 'note.html' + ITypeConcept(note).viewName = 'note.html' # leads to error in DocTest hasType.conceptType = predicate standard.conceptType = predicate @@ -107,3 +108,15 @@ def addObject(container, class_, name, **kw): notify(ObjectCreatedEvent(obj)) notify(ObjectModifiedEvent(obj)) return obj + +def addAndConfigureObject(container, class_, name, **kw): + basicAttributes = ('title', 'description', 'conceptType', 'resourceType') + basicKw = dict([(k, kw[k]) for k in kw if k in basicAttributes]) + obj = addObject(container, class_, name, **basicKw) + ti = IType(obj).typeInterface + adapted = ti is not None and ti(obj) or obj + adapterAttributes = [k for k in kw if k not in basicAttributes] + for attr in adapterAttributes: + setattr(obj, attr, kw[attr]) + notify(ObjectModifiedEvent(obj)) + return obj diff --git a/tests/setup.py b/tests/setup.py index 72edf3d..86035d8 100644 --- a/tests/setup.py +++ b/tests/setup.py @@ -70,17 +70,17 @@ class TestSite(object): tFile = concepts['file'] tCustomer = addObject(concepts, Concept, 'customer', title=u'Customer', - type=tType) + conceptType=tType) dProjects = addObject(concepts, Concept, 'projects', - title=u'Project Domain', type=tDomain) + title=u'Project Domain', conceptType=tDomain) tCustomer.assignParent(dProjects) d001 = addObject(resources, Resource, 'd001.txt', - title=u'Doc 001', type=tTextDocument) + title=u'Doc 001', resourceType=tTextDocument) d002 = addObject(resources, Resource, 'd002.txt', - title=u'Doc 002', type=tTextDocument) + title=u'Doc 002', resourceType=tTextDocument) d003 = addObject(resources, Resource, 'd003.txt', - title=u'Doc 003', type=tTextDocument) + title=u'Doc 003', resourceType=tTextDocument) self.indexAll(concepts, resources) return concepts, resources, views diff --git a/versioning/testsetup.py b/versioning/testsetup.py index b33c4b8..6ec9246 100644 --- a/versioning/testsetup.py +++ b/versioning/testsetup.py @@ -67,25 +67,25 @@ class TestSite(object): tTextDocument = concepts['textdocument'] tCustomer = addObject(concepts, Concept, 'customer', title=u'Customer', - type=tType) + conceptType=tType) dProjects = addObject(concepts, Concept, 'projects', - title=u'Project Domain', type=tDomain) + title=u'Project Domain', conceptType=tDomain) tCustomer.assignParent(dProjects) cust1 = addObject(concepts, Concept, 'cust1', - title=u'Customer 1', type=tCustomer) + title=u'Customer 1', conceptType=tCustomer) cust2 = addObject(concepts, Concept, 'cust2', - title=u'Customer 2', type=tCustomer) + title=u'Customer 2', conceptType=tCustomer) cust3 = addObject(concepts, Concept, 'cust3', - title=u'Customer 3', type=tCustomer) + title=u'Customer 3', conceptType=tCustomer) d001 = addObject(resources, Resource, 'd001.txt', - title=u'Doc 001', type=tTextDocument) + title=u'Doc 001', resouceType=tTextDocument) d001.assignConcept(cust1) d002 = addObject(resources, Resource, 'd002.txt', - title=u'Doc 002', type=tTextDocument) + title=u'Doc 002', resouceType=tTextDocument) d002.assignConcept(cust3) d003 = addObject(resources, Resource, 'd003.txt', - title=u'Doc 003', type=tTextDocument) + title=u'Doc 003', resouceType=tTextDocument) d003.assignConcept(cust1) for c in concepts.values():