From 35dceda12f2d2e27a12433d24c0b6532e03acbae Mon Sep 17 00:00:00 2001 From: helmutm Date: Sun, 24 Aug 2008 11:31:18 +0000 Subject: [PATCH] more on virtual attributes git-svn-id: svn://svn.cy55.de/Zope3/src/loops/trunk@2850 fd906abe-77d9-0310-91a1-e0d9ade77398 --- common.py | 62 ++++++++++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 57 insertions(+), 5 deletions(-) diff --git a/common.py b/common.py index a608939..a78d247 100644 --- a/common.py +++ b/common.py @@ -36,8 +36,8 @@ from zope.traversing.api import getName from cybertools.storage.interfaces import IStorageInfo from cybertools.typology.interfaces import IType -from loops.interfaces import ILoopsObject, ILoopsContained, IConcept, IResource -from loops.interfaces import IResourceAdapter +from loops.interfaces import ILoopsObject, ILoopsContained +from loops.interfaces import IConcept, IResource, IResourceAdapter # convenience functions @@ -215,9 +215,44 @@ class NameChooser(BaseNameChooser): '\xdc': 'Ue', '\xfc': 'ue', '\xdf': 'ss'} -# relation set: use relations of a certain predicate as a collection attribute +# virtual attributes -class ParentRelationSet(object): +class ContainerAttribute(object): + """ Use objects within a ConceptManager object for a collection attribute. + """ + + def __init__(self, context, typeName, idAttr='name', prefix=''): + self.context = context + self.typeName = typeName + self.idAttr = idAttr + self.prefix = prefix + + @Lazy + def typeConcept(self): + return self.context[self.typeName] + + def create(self, id, **kw): + from loops.concept import Concept + from loops.setup import addAndConfigureObject + if self.idAttr != 'name' and self.idAttr not in kw: + kw[self.idAttr] = id + c = addAndConfigureObject(self.context, Concept, self.prefix + id, + conceptType=self.typeConcept, **kw) + return adapted(c) + + def remove(self, id): + del self.context[self.prefix + id] + + def get(self, id, default=None, langInfo=None): + return adapted(self.context.get(self.prefix + id, default), langInfo=langInfo) + + def __iter__(self): + for c in self.typeConcept.getChildren([self.context.getTypePredicate()]): + yield adapted(c) + + +class RelationSet(object): + """ Use relations of a certain predicate for a collection attribute.""" def __init__(self, context, predicateName): self.adapted = context @@ -239,17 +274,34 @@ class ParentRelationSet(object): def predicate(self): return self.conceptManager[self.predicateName] + +class ParentRelationSet(RelationSet): + + def add(self, related): + if isinstance(related, AdapterBase): + related = related.context + self.context.assignParent(related, self.predicate) + + def remove(self, related): + if isinstance(related, AdapterBase): + related = related.context + self.context.deassignParent(related, [self.predicate]) + def __iter__(self): for c in self.context.getParents([self.predicate]): yield adapted(c) -class ChildRelationSet(ParentRelationSet): +class ChildRelationSet(RelationSet): def add(self, related): + if isinstance(related, AdapterBase): + related = related.context self.context.assignChild(related, self.predicate) def remove(self, related): + if isinstance(related, AdapterBase): + related = related.context self.context.deassignChild(related, [self.predicate]) def __iter__(self):