[Checkins] SVN: lovely.relation/trunk/ Allow to specify the relType
when setting the relation property.
Juergen Kartnaller
juergen at kartnaller.at
Wed Sep 5 12:31:46 EDT 2007
Log message for revision 79483:
Allow to specify the relType when setting the relation property.
New version 1.1.0a1
Changed:
U lovely.relation/trunk/CHANGES.txt
U lovely.relation/trunk/setup.py
U lovely.relation/trunk/src/lovely/relation/property.py
U lovely.relation/trunk/src/lovely/relation/property.txt
-=-
Modified: lovely.relation/trunk/CHANGES.txt
===================================================================
--- lovely.relation/trunk/CHANGES.txt 2007-09-05 15:54:45 UTC (rev 79482)
+++ lovely.relation/trunk/CHANGES.txt 2007-09-05 16:31:46 UTC (rev 79483)
@@ -5,6 +5,12 @@
After
=====
+2007/09/05 1.1.0a1
+==================
+
+- Allow to specify the relType when setting the relation property.
+
+
2007/09/03 1.0.0
================
Modified: lovely.relation/trunk/setup.py
===================================================================
--- lovely.relation/trunk/setup.py 2007-09-05 15:54:45 UTC (rev 79482)
+++ lovely.relation/trunk/setup.py 2007-09-05 16:31:46 UTC (rev 79483)
@@ -21,7 +21,7 @@
from setuptools import setup, find_packages, Extension
setup(name='lovely.relation',
- version='1.0.0',
+ version='1.1.0a1',
url='http://svn.zope.org/lovely.relation',
license='ZPL 2.1',
description='Lovely Relation Packages for Zope3',
Modified: lovely.relation/trunk/src/lovely/relation/property.py
===================================================================
--- lovely.relation/trunk/src/lovely/relation/property.py 2007-09-05 15:54:45 UTC (rev 79482)
+++ lovely.relation/trunk/src/lovely/relation/property.py 2007-09-05 16:31:46 UTC (rev 79483)
@@ -61,31 +61,31 @@
return component.getUtility(interfaces.IO2OStringTypeRelationships,
name=self.utilName)
- def getSourceTokens(self, target):
+ def getSourceTokens(self, target, relType):
util = self.util
- return util.findSourceTokens(target, self.relType)
+ return util.findSourceTokens(target, relType)
- def getTargetTokens(self, source):
+ def getTargetTokens(self, source, relType):
util = self.util
- return util.findTargetTokens(source, self.relType)
+ return util.findTargetTokens(source, relType)
- def getSourceRelations(self, obj):
+ def getSourceRelations(self, obj, relType):
util = self.util
- return util.findSourceRelationships(obj, self.relType)
+ return util.findSourceRelationships(obj, relType)
- def getTargetRelations(self, obj):
+ def getTargetRelations(self, obj, relType):
util = self.util
- return util.findTargetRelationships(obj, self.relType)
+ return util.findTargetRelationships(obj, relType)
- def getSourceRelationTokens(self, obj):
+ def getSourceRelationTokens(self, obj, relType):
util = self.util
- return util.findSourceRelationshipTokens(obj, self.relType)
+ return util.findSourceRelationshipTokens(obj, relType)
- def getTargetRelationTokens(self, obj):
+ def getTargetRelationTokens(self, obj, relType):
util = self.util
- return util.findTargetRelationshipTokens(obj, self.relType)
+ return util.findTargetRelationshipTokens(obj, relType)
- def setTargets(self, source, targets):
+ def setTargets(self, source, targets, relType):
util = self.util
if targets is not None:
if not self.seqOut:
@@ -96,7 +96,7 @@
newTargetTokens = []
sourceToken = util.relationIndex.tokenizeValues([source],
'sources').next()
- oldTargetTokens = util.findTargetTokens(source, self.relType)
+ oldTargetTokens = util.findTargetTokens(source, relType)
newTT = set(newTargetTokens)
oldTT = set(oldTargetTokens)
addTT = newTT.difference(oldTT)
@@ -104,17 +104,17 @@
for tt in delTT:
rel = util.relationIndex.findRelationships(
{'sources': sourceToken,
- 'relations': self.relType,
+ 'relations': relType,
'targets': tt})
self.util.remove(rel.next())
for addT in list(
util.relationIndex.resolveValueTokens(addTT, 'targets')):
- rel = O2OStringTypeRelationship(source, [self.relType],
+ rel = O2OStringTypeRelationship(source, [relType],
addT)
self.util.add(rel)
- def setSources(self, target, sources):
+ def setSources(self, target, sources, relType):
util = self.util
if sources is not None:
if not self.seqIn:
@@ -126,7 +126,7 @@
targetToken = util.relationIndex.tokenizeValues([target],
'targets').next()
- oldSourceTokens = util.findSourceTokens(target, self.relType)
+ oldSourceTokens = util.findSourceTokens(target, relType)
newST = set(newSourceTokens)
oldST = set(oldSourceTokens)
addST = newST.difference(oldST)
@@ -134,13 +134,13 @@
for st in delST:
rel = util.relationIndex.findRelationships(
{'targets': targetToken,
- 'relations': self.relType,
+ 'relations': relType,
'sources': st})
self.util.remove(rel.next())
for addT in list(
util.relationIndex.resolveValueTokens(addST, 'sources')):
- rel = O2OStringTypeRelationship(addST, [self.relType],
+ rel = O2OStringTypeRelationship(addST, [relType],
target)
self.util.add(rel)
@@ -162,23 +162,30 @@
def getRelations(self):
manager = self._field._manager
if isinstance(self._field, RelationPropertyOut):
- return manager.getSourceRelations(self.context)
+ return manager.getSourceRelations(
+ self.context, self._field._relType)
else:
- return manager.getTargetRelations(self.context)
+ return manager.getTargetRelations(
+ self.context, self._field._relType)
def getRelationTokens(self):
manager = self._field._manager
if isinstance(self._field, RelationPropertyOut):
- return manager.getSourceRelationTokens(self.context)
+ return manager.getSourceRelationTokens(
+ self.context, self._field._relType)
else:
- return manager.getTargetRelationTokens(self.context)
+ return manager.getTargetRelationTokens(
+ self.context, self._field._relType)
class RelationPropertyBase(object):
- def __init__(self, manager, field, name=None, uids=False):
+ def __init__(self, manager, field, name=None, uids=False, relType=None):
if name is None:
name = field.__name__
+ if relType is None:
+ relType = manager.relType
+ self._relType = relType
self._manager = manager
self._name = name
self._field = field
@@ -206,16 +213,17 @@
class RelationPropertyOut(RelationPropertyBase):
- def __init__(self, manager, name=None, uids=False):
+ def __init__(self, manager, name=None, uids=False, relType=None):
super(RelationPropertyOut, self).__init__(manager,
manager.fOut,
name,
- uids)
+ uids,
+ relType)
def __get__(self, inst, klass):
if inst is None:
return self
- tokens = self._manager.getTargetTokens(inst)
+ tokens = self._manager.getTargetTokens(inst, self._relType)
if self._ordered:
tokens = self._sort(inst, tokens)
if not self._uids:
@@ -232,7 +240,7 @@
def __set__(self, inst, value):
if self._field.readonly:
raise ValueError(self._name, 'field is readonly')
- self._manager.setTargets(inst, value)
+ self._manager.setTargets(inst, value, self._relType)
if self._ordered:
inst.__dict__['_o_' + self._name] = \
list(self._manager.tokenizeValues(value, 'targets'))
@@ -240,16 +248,17 @@
class RelationPropertyIn(RelationPropertyBase):
- def __init__(self, manager, name=None, uids=False):
+ def __init__(self, manager, name=None, uids=False, relType=None):
super(RelationPropertyIn, self).__init__(manager,
manager.fIn,
name,
- uids)
+ uids,
+ relType)
def __get__(self, inst, klass):
if inst is None:
return self
- tokens = self._manager.getSourceTokens(inst)
+ tokens = self._manager.getSourceTokens(inst, self._relType)
if self._ordered:
tokens = self._sort(inst, tokens)
if not self._uids:
@@ -266,7 +275,7 @@
def __set__(self, inst, value):
if self._field.readonly:
raise ValueError(self._name, 'field is readonly')
- self._manager.setSources(inst, value)
+ self._manager.setSources(inst, value, self._relType)
if self._ordered:
inst.__dict__['_o_' + self._name] = \
list(self._manager.tokenizeValues(value, 'sources'))
Modified: lovely.relation/trunk/src/lovely/relation/property.txt
===================================================================
--- lovely.relation/trunk/src/lovely/relation/property.txt 2007-09-05 15:54:45 UTC (rev 79482)
+++ lovely.relation/trunk/src/lovely/relation/property.txt 2007-09-05 16:31:46 UTC (rev 79483)
@@ -73,10 +73,10 @@
Properties
==========
-Relationproperties are instanciated, with one argument. This can
-either be an object implementing IFieldRelationManager, or a string,
-which will be used too lookup a utility implementing
-IFieldRelationManager with that name.
+Relationproperties are instanciated, with the relation manager and optionally
+with a different relType. The relation manager can be provided with the
+manager instance or with the name of a utility implementing
+IFieldRelationManager.
For now we directly pass the manager objects to the constructor of the
properties.
@@ -86,6 +86,7 @@
>>> class Document(object):
... interface.implements(IDocument)
... teaser = RelationPropertyOut(documentTeaser)
+ ... featured = RelationPropertyOut(documentTeaser, relType='featured')
... related = RelationPropertyOut(documentRelated)
... backrefs = RelationPropertyIn(documentRelated)
... def __init__(self, name):
@@ -124,6 +125,23 @@
True
>>> doc1.teaser = img1
+Our featured attribute uses the same relation manager as the teaser but
+defines a different relType (see the definition in the class).
+
+ >>> featuredImage = Image(u'Featured Image')
+ >>> doc1.featured = featuredImage
+ >>> doc1.featured
+ <image u'Featured Image'>
+
+Our teaser is still the old one.
+
+ >>> doc1.teaser
+ <image u'Image One'>
+
+ >>> doc1.featured = None
+ >>> doc1.featured == None
+ True
+
The related property is a list because the field is defined as schema.List.
>>> doc1.related = [doc2, doc3]
More information about the Checkins
mailing list