[Checkins] SVN: z3c.reference/branches/flash/ added back references

Johannes Faigle johannes.faigle at lovelysystems.com
Wed Aug 22 09:41:12 EDT 2007


Log message for revision 79123:
  added back references

Changed:
  U   z3c.reference/branches/flash/CHANGES.txt
  U   z3c.reference/branches/flash/setup.py
  U   z3c.reference/branches/flash/src/z3c/reference/README.txt
  U   z3c.reference/branches/flash/src/z3c/reference/browser/tests.py
  U   z3c.reference/branches/flash/src/z3c/reference/interfaces.py
  U   z3c.reference/branches/flash/src/z3c/reference/reference.py
  U   z3c.reference/branches/flash/src/z3c/reference/tests.py

-=-
Modified: z3c.reference/branches/flash/CHANGES.txt
===================================================================
--- z3c.reference/branches/flash/CHANGES.txt	2007-08-22 13:37:53 UTC (rev 79122)
+++ z3c.reference/branches/flash/CHANGES.txt	2007-08-22 13:41:11 UTC (rev 79123)
@@ -5,5 +5,7 @@
 Before first release
 ====================
 
+- added tests for back references
+- added back reference support
 - buildoutify
 

Modified: z3c.reference/branches/flash/setup.py
===================================================================
--- z3c.reference/branches/flash/setup.py	2007-08-22 13:37:53 UTC (rev 79122)
+++ z3c.reference/branches/flash/setup.py	2007-08-22 13:41:11 UTC (rev 79123)
@@ -30,7 +30,8 @@
         'zope.interface',
         'zope.location',
         'zope.schema',
-        'zope.traversing'
+        'zope.traversing',
+        'lovely.relation'
         ],
     dependency_links = ['http://download.zope.org/distribution']
     )

Modified: z3c.reference/branches/flash/src/z3c/reference/README.txt
===================================================================
--- z3c.reference/branches/flash/src/z3c/reference/README.txt	2007-08-22 13:37:53 UTC (rev 79122)
+++ z3c.reference/branches/flash/src/z3c/reference/README.txt	2007-08-22 13:41:11 UTC (rev 79123)
@@ -94,4 +94,46 @@
   >>> c.img.target is img
   True
 
+Back references
+===============
 
+We need a referenced object which can be back referenced.
+
+  >>> from z3c.reference.interfaces import (IViewReference,
+  ...                                      IReferenced)
+  >>> from lovely.relation.property import (FieldRelationManager,
+  ...                                       RelationPropertyOut,
+  ...                                       RelationPropertyIn)
+  >>> viewReferenceRelated = FieldRelationManager(IViewReference['target'],
+  ...                                             IReferenced['viewReferences'])
+  >>> class OWithBackRef(Contained):
+  ...     interface.implements(IReferenced)
+  ...     viewReferences = RelationPropertyIn(viewReferenceRelated)
+  ...     def __init__(self,title):
+  ...         if title is not None:
+  ...             self.title = title
+
+Create an object and reference to it.
+
+  >>> t = OWithBackRef(u'target')
+  >>> r1 = ViewReference(target=t);
+
+Check if object has a back reference.
+
+  >>> t.viewReferences
+  [<z3c.reference.reference.ViewReference ...>]
+  >>> t.viewReferences[0] is r1
+  True
+
+Add another reference. Check length.
+
+  >>> r2 = ViewReference(target=t);
+  >>> len(t.viewReferences)
+  2
+
+Try to remove a backreference. Not allowed.
+
+  >>> t.viewReferences = [r1]
+  Traceback (most recent call last):
+  ...
+  ValueError: ('viewReferences', 'field is readonly')

Modified: z3c.reference/branches/flash/src/z3c/reference/browser/tests.py
===================================================================
--- z3c.reference/branches/flash/src/z3c/reference/browser/tests.py	2007-08-22 13:37:53 UTC (rev 79122)
+++ z3c.reference/branches/flash/src/z3c/reference/browser/tests.py	2007-08-22 13:41:11 UTC (rev 79123)
@@ -2,6 +2,8 @@
 import unittest
 from zope.testing.doctestunit import DocFileSuite, DocTestSuite
 from zope.app.testing import setup
+from zope.app.intid import IntIds
+from zope.app.intid.interfaces import IIntIds
 from zope import component
 from zope.dublincore.annotatableadapter import ZDCAnnotatableAdapter
 from zope.dublincore.interfaces import IWriteZopeDublinCore
@@ -11,6 +13,7 @@
 from z3c.reference.interfaces import IViewReference
 from zope.traversing.browser.absoluteurl import AbsoluteURL
 from zope.publisher.browser import BrowserPage
+from lovely.relation import configurator
 
 from views import ViewReferenceAbsoluteURL
 
@@ -20,10 +23,16 @@
         return "testpage"
 
 def setUp(test):
-    test.globs['site'] = setup.placefulSetUp(True)
+    site = setup.placefulSetUp(True)
+    test.globs['site'] = site
+    util = configurator.SetUpO2OStringTypeRelationships(site)
+    util({})
+
     component.provideAdapter(SimpleKeyReference)
     component.provideAdapter(ZDCAnnotatableAdapter,
                              provides=IWriteZopeDublinCore)
+    intids = IntIds()
+    component.provideUtility(intids, IIntIds)
     browserView(IViewReference, '', ViewReferenceAbsoluteURL,
                 providing=IAbsoluteURL)
     browserView(None,'index.html',TestPage)

Modified: z3c.reference/branches/flash/src/z3c/reference/interfaces.py
===================================================================
--- z3c.reference/branches/flash/src/z3c/reference/interfaces.py	2007-08-22 13:37:53 UTC (rev 79122)
+++ z3c.reference/branches/flash/src/z3c/reference/interfaces.py	2007-08-22 13:41:11 UTC (rev 79123)
@@ -9,10 +9,18 @@
     view. If the target is None, the view name is supposed to be an
     absolute url to an external target"""
 
-    target = schema.Object(ILocation,required=False,
+    target = schema.Object(ILocation,required=True,
                            title=u'Target Object')
     view = schema.TextLine(required=False,title=u'View')
 
+class IReferenced(interface.Interface):
+    """backrefs"""
+    viewReferences = schema.List(title=u"View references",
+                           value_type=schema.Object(IViewReference),
+                           required=False,
+                           readonly=True,
+                           default=[])
+
 class IViewReferenceField(schema.interfaces.IObject):
     """a view reference field"""
 

Modified: z3c.reference/branches/flash/src/z3c/reference/reference.py
===================================================================
--- z3c.reference/branches/flash/src/z3c/reference/reference.py	2007-08-22 13:37:53 UTC (rev 79122)
+++ z3c.reference/branches/flash/src/z3c/reference/reference.py	2007-08-22 13:41:11 UTC (rev 79123)
@@ -7,27 +7,22 @@
 from zope import interface
 from zope.traversing.browser.absoluteurl import absoluteURL
 import urlparse,cgi
+from lovely.relation.property import (FieldRelationManager,
+                                      RelationPropertyOut)
+viewReferenceRelated = FieldRelationManager(IViewReference['target'],
+                                            IReferenced['viewReferences'])
 
+
 class ViewReference(Persistent):
 
     interface.implements(IViewReference)
-    _key = None
     view = FieldProperty(IViewReference['view'])
+    target = RelationPropertyOut(viewReferenceRelated)
     
     def __init__(self,target=None,view=None):
         if target is not None:
             self.target = target
         self.view = view
-        
-    @apply
-    def target():
-        def fget(self):
-            if self._key is not None:
-                return self._key()
-            return None
-        def fset(self, value):
-            self._key = IKeyReference(value)
-        return property(**locals())
 
     def __eq__(self,other):
         if not other:

Modified: z3c.reference/branches/flash/src/z3c/reference/tests.py
===================================================================
--- z3c.reference/branches/flash/src/z3c/reference/tests.py	2007-08-22 13:37:53 UTC (rev 79122)
+++ z3c.reference/branches/flash/src/z3c/reference/tests.py	2007-08-22 13:41:11 UTC (rev 79123)
@@ -2,15 +2,25 @@
 import unittest
 from zope.testing.doctestunit import DocFileSuite, DocTestSuite
 from zope.app.testing import setup
+from zope.app.intid import IntIds
+from zope.app.intid.interfaces import IIntIds
 from zope import component
 from zope.dublincore.annotatableadapter import ZDCAnnotatableAdapter
 from zope.dublincore.interfaces import IWriteZopeDublinCore
 from zope.app.keyreference.testing import SimpleKeyReference
+from lovely.relation import configurator
+
+
 def setUp(test):
-    setup.placefulSetUp()
+    root = setup.placefulSetUp(True)
+    test.globs['root'] = root
+    util = configurator.SetUpO2OStringTypeRelationships(root)
+    util({})
     component.provideAdapter(SimpleKeyReference)
     component.provideAdapter(ZDCAnnotatableAdapter,
                              provides=IWriteZopeDublinCore)
+    intids = IntIds()
+    component.provideUtility(intids, IIntIds)
 
 def tearDown(test):
     setup.placefulTearDown()



More information about the Checkins mailing list