[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