From: Philipp A. <zw...@us...> - 2004-05-28 01:29:56
|
Update of /cvsroot/archetypes/Archetypes In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv536 Modified Files: Tag: release-1_3-branch Field.py Referenceable.py Log Message: some changes after a discussion with ben and kapil: ReferenceField.get method: - if the ReferenceField is not multiValued, the accessor returns the object instance(or None for void reverences) and not an array with one object instance (attention, may break existing code, but not data) ReferenceField.set: - accept uids or objects as arguments - for singlevalued reference fields: accept single uid or object as parameter Referenceable and IReferenceable: - I added .getReferenceImpl and .getBReferenceImpl, returning the reference objects (e.g. for retrieving the metadata) - and created .getReferences and .getBreferences as alias to .getRefs and .getBRefs for future consistency (more expressive names) Index: Referenceable.py =================================================================== RCS file: /cvsroot/archetypes/Archetypes/Referenceable.py,v retrieving revision 1.22.2.4 retrieving revision 1.22.2.5 diff -u -d -r1.22.2.4 -r1.22.2.5 --- Referenceable.py 27 May 2004 00:56:21 -0000 1.22.2.4 +++ Referenceable.py 28 May 2004 01:29:44 -0000 1.22.2.5 @@ -63,6 +63,7 @@ return [ref.getTargetObject() for ref in refs] return [] + def getBRefs(self, relationship=None): """get all the back referenced objects for this object""" tool = getToolByName(self, config.REFERENCE_CATALOG) @@ -71,6 +72,26 @@ return [ref.getSourceObject() for ref in refs] return [] + #aliases + getReferences=getRefs + getBReferences=getBRefs + + def getReferenceImpl(self, relationship=None): + """get all the reference objects for this object """ + tool = getToolByName(self, config.REFERENCE_CATALOG) + refs = tool.getReferences(self, relationship) + if refs: + return refs + return [] + + def getBReferenceImpl(self, relationship=None): + """get all the back reference objects for this object""" + tool = getToolByName(self, config.REFERENCE_CATALOG) + refs = tool.getBackReferences(self, relationship) + if refs: + return refs + return [] + def _register(self, reference_manager=None): """register with the archetype tool for a unique id""" Index: Field.py =================================================================== RCS file: /cvsroot/archetypes/Archetypes/Field.py,v retrieving revision 1.183.2.24 retrieving revision 1.183.2.25 diff -u -d -r1.183.2.24 -r1.183.2.25 --- Field.py 26 May 2004 07:51:47 -0000 1.183.2.24 +++ Field.py 28 May 2004 01:29:44 -0000 1.183.2.25 @@ -1056,10 +1056,21 @@ }) - def get(self, instance, **kwargs): + def get(self, instance, aslist=0, **kwargs): """get() returns the list of objects referenced under the relationship """ - return instance.getRefs(relationship=self.relationship) + res=instance.getRefs(relationship=self.relationship) + + #singlevalued ref fields return only the object, not a list, + #unless explicitely specified by the aslist option + if not self.multiValued and not aslist: + if res: + assert len(res) == 1 + res=res[0] + else: + res=None + + return res def set(self, instance, value, **kwargs): """Mutator. @@ -1074,14 +1085,22 @@ targetUIDs = [ref.targetUID for ref in tool.getReferences(instance, self.relationship)] - #if not self.multiValued and value: - # value = (value,) + if not self.multiValued and value and type(value) not in (type(()),type([])): + value = (value,) if not value: value = () + + #convertobjects to uids if necessary + uids=[] + for v in value: + if type(v) in (type(''),type(u'')): + uids.append(v) + else: + uids.append(v.UID()) - add = [v for v in value if v and v not in targetUIDs] - sub = [t for t in targetUIDs if t not in value] + add = [v for v in uids if v and v not in targetUIDs] + sub = [t for t in targetUIDs if t not in uids] # tweak keyword arguments for addReference addRef_kw = kwargs.copy() |