[Checkins] SVN: Products.CMFDefault/trunk/Products/CMFDefault/ SyndicationInfo is an zope.annotations adapter for Folderish objects.

Charlie Clark charlie at begeistert.org
Tue Nov 15 11:59:31 UTC 2011


Log message for revision 123350:
  SyndicationInfo is an zope.annotations adapter for Folderish objects.
  Syndication settings can no longer be set using ZMI.

Changed:
  U   Products.CMFDefault/trunk/Products/CMFDefault/SyndicationInfo.py
  U   Products.CMFDefault/trunk/Products/CMFDefault/SyndicationTool.py
  U   Products.CMFDefault/trunk/Products/CMFDefault/browser/admin/configure.zcml
  U   Products.CMFDefault/trunk/Products/CMFDefault/browser/admin/syndication.pt
  U   Products.CMFDefault/trunk/Products/CMFDefault/browser/admin/syndication.py
  U   Products.CMFDefault/trunk/Products/CMFDefault/browser/admin/tests/test_syndication.py
  U   Products.CMFDefault/trunk/Products/CMFDefault/configure.zcml
  U   Products.CMFDefault/trunk/Products/CMFDefault/content.zcml
  U   Products.CMFDefault/trunk/Products/CMFDefault/tests/test_SyndicationInfo.py
  U   Products.CMFDefault/trunk/Products/CMFDefault/tests/test_SyndicationTool.py

-=-
Modified: Products.CMFDefault/trunk/Products/CMFDefault/SyndicationInfo.py
===================================================================
--- Products.CMFDefault/trunk/Products/CMFDefault/SyndicationInfo.py	2011-11-15 11:28:32 UTC (rev 123349)
+++ Products.CMFDefault/trunk/Products/CMFDefault/SyndicationInfo.py	2011-11-15 11:59:31 UTC (rev 123350)
@@ -13,17 +13,27 @@
 """ SyndicationInfo is an adapter for IFolderish objects.
 """
 
+from datetime import datetime
+
 from OFS.SimpleItem import SimpleItem
+from zope.annotation.interfaces import IAnnotations
 from zope.component import adapts
 from zope.component import getUtility
+from zope.component import getAdapter
 from zope.interface import alsoProvides
 from zope.interface import implements
+from zope.interface import Interface
 from zope.interface import noLongerProvides
+from zope.schema import Bool, Choice, Datetime, Int
+from zope.schema.vocabulary import SimpleVocabulary
 
 from Products.CMFCore.interfaces import IFolderish
 from Products.CMFCore.interfaces import ISyndicatable
 from Products.CMFCore.interfaces import ISyndicationInfo
 from Products.CMFCore.interfaces import ISyndicationTool
+from Products.CMFDefault.formlib.vocabulary import SimpleVocabulary
+from Products.CMFDefault.SyndicationTool import SyndicationTool
+from Products.CMFDefault.utils import Message as _
 
 
 class SyndicationInformation(SimpleItem):
@@ -36,18 +46,57 @@
     id='syndication_information'
     meta_type='SyndicationInformation'
 
+available_periods = (
+    (u'hourly', 'hourly', _(u'Hourly')),
+    (u'daily', 'daily', _(u'Daily')),
+    (u'weekly', 'weekly', _(u'Weekly')),
+    (u'monthly', 'monthly', _(u'Monthly')),
+    (u'yearly', 'yearly', _(u'Yearly')))
 
+
+class ISyndicationInfo(ISyndicationInfo):
+
+    period = Choice(
+        title=_(u"Update period"),
+        vocabulary=SimpleVocabulary.fromTitleItems(available_periods),
+    )
+
+    frequency = Int(
+        title=_(u"Update frequency"),
+        description=_(u"This is a multiple of the update period. An"
+                      u" update frequency of '3' and an update period"
+                      u" of 'Monthly' will mean an update every three months."),
+    )
+
+    base = Datetime(
+        title=_(u"Update base"),
+        description=_(u""),
+        default=datetime.now()
+    )
+
+    max_items = Int(
+        title=_(u"Maximum number of items"),
+        description=_(u""),
+        default=15
+    )
+
+    enabled = Bool(
+        required=False,
+    )
+
+
 class SyndicationInfo(object):
     """
-    Annotations style adapter.
+    Annotations adapter.
     Folders which can be syndicated are given the ISyndicatable interface
-    Local syndication information is stored as a dictionary on the
-    _syndication_info attribute of the folder
+    Local syndication information is stored as a dictionary under the
+    __cmf.syndication_info key of the annotations
     """
 
+    __slots__ = ("context", "period", "frequency", "base", "max_items")
     implements(ISyndicationInfo)
     adapts(IFolderish)
-    key = "_syndication_info"
+    key = "__cmf.SyndicationInfo"
 
     def __init__(self, context):
         self.context = context
@@ -57,38 +106,66 @@
         """Get site syndication tool"""
         return getUtility(ISyndicationTool)
 
-    def get_info(self):
+    @property
+    def allowed(self):
+        return self.site_settings.enabled
+
+    def _get_property(self, attr):
         """
-        Return syndication settings for the folder or from global site
-        settings if there are none for the folder
+        Get a value from the annotation or site settings.
         """
-        info = getattr(self.context, self.key, None)
-        if info is None:
-            values = {'period': self.site_settings.syUpdatePeriod,
-                     'frequency':self.site_settings.syUpdateFrequency,
-                     'base': self.site_settings.syUpdateBase,
-                     'max_items': self.site_settings.max_items}
-            return values
-        return info
+        annotations = getAdapter(self.context, IAnnotations)
+        annotation = annotations.get(self.key, None)
+        if annotation is None:
+            return getattr(self.site_settings, attr)
+        return annotation.get(attr, getattr(self.site_settings, attr))
 
-    def set_info(self, period=None, frequency=None, base=None,
-                max_items=None):
-        """Folder has local values"""
-        values = {'period': period, 'frequency': frequency,
-                  'base': base, 'max_items': max_items}
-        setattr(self.context, self.key, values)
+    def _set_property(self, attr, value):
+        """
+        Set a value on the annotation
+        """
+        annotations = getAdapter(self.context, IAnnotations)
+        if not annotations.get(self.key):
+            annotations[self.key] = {}
+        annotation = annotations.get(self.key, None)
+        annotation[attr] = value
 
-    def revert(self):
-        """Remove local values"""
-        try:
-            delattr(self.context, self.key)
-        except AttributeError:
-            pass
+    def get_period(self):
+        return self._get_property('period')
 
+    def set_period(self, value):
+        self._set_property('period', value)
+
+    period = property(get_period, set_period)
+
+    def get_frequency(self):
+        return self._get_property('frequency')
+
+    def set_frequency(self, value):
+        self._set_property('frequency', value)
+
+    frequency = property(get_frequency, set_frequency)
+
+    def get_base(self):
+        return self._get_property('base')
+
+    def set_base(self, value):
+        return self._set_property('base', value)
+
+    base = property(get_base, set_base)
+
+    def get_max_items(self):
+        return self._get_property('max_items')
+
+    def set_max_items(self, value):
+        self._set_property('max_items', value)
+
+    max_items = property(get_max_items, set_max_items)
+
     @property
     def enabled(self):
         """Is syndication available for the site and a folder"""
-        return self.site_settings.isAllowed \
+        return self.site_settings.enabled \
                and ISyndicatable.providedBy(self.context)
 
     def enable(self):
@@ -99,3 +176,11 @@
         """Disable syndication for a folder"""
         self.revert()
         noLongerProvides(self.context, ISyndicatable)
+
+    def revert(self):
+        """Remove local values"""
+        annotations = getAdapter(self.context, IAnnotations)
+        try:
+            del annotations[self.key]
+        except KeyError:
+            pass

Modified: Products.CMFDefault/trunk/Products/CMFDefault/SyndicationTool.py
===================================================================
--- Products.CMFDefault/trunk/Products/CMFDefault/SyndicationTool.py	2011-11-15 11:28:32 UTC (rev 123349)
+++ Products.CMFDefault/trunk/Products/CMFDefault/SyndicationTool.py	2011-11-15 11:59:31 UTC (rev 123350)
@@ -15,6 +15,7 @@
 Manage outbound RSS syndication of folder content.
 """
 
+from datetime import datetime
 from warnings import warn
 
 from AccessControl.SecurityInfo import ClassSecurityInfo
@@ -36,7 +37,6 @@
 from Products.CMFDefault.exceptions import AccessControl_Unauthorized
 from Products.CMFDefault.permissions import ManagePortal
 from Products.CMFDefault.permissions import ManageProperties
-from Products.CMFDefault.SyndicationInfo import SyndicationInformation
 from Products.CMFDefault.utils import _dtmldir
 
 
@@ -57,10 +57,10 @@
     security = ClassSecurityInfo()
 
     #Default Sitewide Values
-    isAllowed = False
-    syUpdatePeriod = 'daily'
-    syUpdateFrequency = 1
-    syUpdateBase = DateTime()
+    isAllowed = enabled = False
+    syUpdatePeriod = period = 'daily'
+    syUpdateFrequency = frequency = 1
+    syUpdateBase = base = datetime.now()
     max_items = 15
 
     #ZMI Methods
@@ -75,56 +75,6 @@
     security.declareProtected(ManagePortal, 'overview')
     overview = HTMLFile('synOverview', _dtmldir)
 
-    security.declareProtected(ManagePortal, 'editProperties')
-    def editProperties( self
-                      , updatePeriod=None
-                      , updateFrequency=None
-                      , updateBase=None
-                      , isAllowed=None
-                      , max_items=None
-                      , REQUEST=None
-                      ):
-        """
-        Edit the properties for the SystemWide defaults on the
-        SyndicationTool.
-        """
-        if isAllowed is not None:
-            self.isAllowed = isAllowed
-
-        if updatePeriod is not None:
-            self.syUpdatePeriod = updatePeriod
-        else:
-            try:
-                del self.syUpdatePeriod
-            except (AttributeError, KeyError):
-                pass
-
-        if updateFrequency is not None:
-            self.syUpdateFrequency = int(updateFrequency)
-        else:
-            try:
-                del self.syUpdateFrequency
-            except (AttributeError, KeyError):
-                pass
-
-        if updateBase is not None:
-            if not hasattr(updateBase, 'ISO'):
-                updateBase = DateTime( updateBase )
-            self.syUpdateBase = updateBase
-        else:
-            try:
-                del self.syUpdateBase
-            except (AttributeError, KeyError):
-                pass
-
-        if max_items is not None:
-            self.max_items = int(max_items)
-        else:
-            try:
-                del self.max_items
-            except (AttributeError, KeyError):
-                pass
-
     def _syndication_info(self, obj):
         """Get a SyndicationInfo adapter for managing object
         syndication settings
@@ -148,23 +98,16 @@
         These are held on the syndication_information object.
         Not Sitewide Properties.
         """
-        info = self._syndication_info(obj)
+        info = self.getSyndicationInfo(obj)
 
         if not info.enabled:
             raise SyndicationError('Syndication is Disabled')
 
-        updatePeriod = updatePeriod or self.syUpdatePeriod
-        updateFrequency = updateFrequency or self.syUpdateFrequency
-        updateBase = updateBase or self.syUpdateBase
-        max_items = max_items or self.max_items
-        if updateBase is not None:
-            if not hasattr(updateBase, 'ISO'):
-                updateBase = DateTime( updateBase )
+        info.period = updatePeriod or self.period
+        info.frequency = updateFrequency or self.frequency
+        info.base = updateBase or self.base
+        info.max_items = max_items or self.max_items
 
-        values = {'period': updatePeriod, 'frequency': int(updateFrequency),
-                  'base': updateBase, 'max_items': int(max_items)}
-        info.set_info(**values)
-
     security.declareProtected(ManageProperties, 'enableSyndication')
     def enableSyndication(self, obj):
         """
@@ -215,7 +158,7 @@
         """
         Return sitewide syndication policy
         """
-        return self.isAllowed
+        return self.enabled
 
     security.declarePublic('isSyndicationAllowed')
     def isSyndicationAllowed(self, obj=None):
@@ -231,7 +174,7 @@
             info = self._syndication_info(obj)
         except SyndicationError:
             return False
-        return info.enabled
+        return getattr(info, 'enabled', False)
 
     security.declarePublic('getSyndicationInfo')
     def getSyndicationInfo(self, obj):
@@ -241,7 +184,7 @@
         info = self._syndication_info(obj)
         if not info.enabled:
             raise SyndicationError('Syndication is not allowed')
-        return info.get_info()
+        return info
 
     security.declarePublic('getUpdatePeriod')
     def getUpdatePeriod( self, obj=None ):
@@ -253,7 +196,7 @@
 
         NOTE:  Need to add checks for sitewide policies!!!
         """
-        return self.getSyndicationInfo(obj)['period']
+        return self.getSyndicationInfo(obj).period
 
     security.declarePublic('getUpdateFrequency')
     def getUpdateFrequency(self, obj=None):
@@ -265,7 +208,7 @@
 
         Note:  Need to add checks for sitewide policies!!!
         """
-        return self.getSyndicationInfo(obj)['frequency']
+        return self.getSyndicationInfo(obj).frequency
 
     security.declarePublic('getUpdateBase')
     def getUpdateBase(self, obj=None):
@@ -280,7 +223,7 @@
         Additionally, sitewide policy checks might have a place
         here...
         """
-        return self.getSyndicationInfo(obj)['base'].ISO()
+        return self.getSyndicationInfo(obj).base.isoformat()
 
     security.declarePublic('getHTML4UpdateBase')
     def getHTML4UpdateBase(self, obj=None):
@@ -296,7 +239,7 @@
         """
         Return the max_items to be displayed in the syndication
         """
-        return self.getSyndicationInfo(obj)['max_items']
+        return self.getSyndicationInfo(obj).max_items
 
 InitializeClass(SyndicationTool)
 registerToolInterface('portal_syndication', ISyndicationTool)

Modified: Products.CMFDefault/trunk/Products/CMFDefault/browser/admin/configure.zcml
===================================================================
--- Products.CMFDefault/trunk/Products/CMFDefault/browser/admin/configure.zcml	2011-11-15 11:28:32 UTC (rev 123349)
+++ Products.CMFDefault/trunk/Products/CMFDefault/browser/admin/configure.zcml	2011-11-15 11:59:31 UTC (rev 123350)
@@ -2,8 +2,6 @@
     xmlns="http://namespaces.zope.org/zope"
     xmlns:browser="http://namespaces.zope.org/browser">
 
-  <adapter factory=".syndication.SyndicationToolSchemaAdapter"/>
-
   <browser:page
       for="Products.CMFCore.interfaces.ISiteRoot"
       layer="Products.CMFDefault.interfaces.ICMFDefaultSkin"
@@ -24,7 +22,7 @@
       for="Products.CMFCore.interfaces.IFolderish"
       layer="Products.CMFDefault.interfaces.ICMFDefaultSkin"
       name="syndicate.html"
-      class=".syndication.Syndicate"
+      class=".syndication.Folder"
       permission="cmf.ManagePortal"
       />
 

Modified: Products.CMFDefault/trunk/Products/CMFDefault/browser/admin/syndication.pt
===================================================================
--- Products.CMFDefault/trunk/Products/CMFDefault/browser/admin/syndication.pt	2011-11-15 11:28:32 UTC (rev 123349)
+++ Products.CMFDefault/trunk/Products/CMFDefault/browser/admin/syndication.pt	2011-11-15 11:59:31 UTC (rev 123350)
@@ -11,11 +11,10 @@
 
 <h1 tal:content="view/label">Folder Syndication</h1>
 
-<p class="errors" tal:condition="not: view/allowed"
+<p class="errors" tal:condition="view/disabled"
                   i18n:translate="">Portal syndication is currently disabled</p>
 
 <form action="." method="post"
-      tal:condition="view/allowed"
       tal:attributes="action request/ACTUAL_URL">
 
     <fieldset tal:repeat="widget view/widgets">

Modified: Products.CMFDefault/trunk/Products/CMFDefault/browser/admin/syndication.py
===================================================================
--- Products.CMFDefault/trunk/Products/CMFDefault/browser/admin/syndication.py	2011-11-15 11:28:32 UTC (rev 123349)
+++ Products.CMFDefault/trunk/Products/CMFDefault/browser/admin/syndication.py	2011-11-15 11:59:31 UTC (rev 123350)
@@ -12,91 +12,30 @@
 ##############################################################################
 """Syndication configuration views.
 """
-
-from datetime import datetime
-
-from Products.Five.browser.pagetemplatefile import ViewPageTemplateFile
+from zope.annotation.interfaces import IAnnotations
 from zope.component import getAdapter
 from zope.component import getUtility
 from zope.component import adapts
+from zope.interface import alsoProvides
 from zope.formlib import form
-from zope.interface import Interface
 from zope.interface import implements
-from zope.schema import Choice
-from zope.schema import Datetime
-from zope.schema import Int
 
-from Products.CMFCore.interfaces import ISyndicationInfo
 from Products.CMFCore.interfaces import ISyndicationTool
 from Products.CMFCore.interfaces import IFolderish
 from Products.CMFDefault.SyndicationTool import SyndicationTool
+from Products.CMFDefault.SyndicationInfo import ISyndicationInfo
 from Products.CMFDefault.browser.utils import memoize
-from Products.CMFDefault.formlib.form import EditFormBase, SettingsEditFormBase
+from Products.CMFDefault.formlib.form import SettingsEditFormBase, EditFormBase
 from Products.CMFDefault.formlib.schema import ProxyFieldProperty
 from Products.CMFDefault.formlib.schema import SchemaAdapterBase
-from Products.CMFDefault.formlib.vocabulary import SimpleVocabulary
 from Products.CMFDefault.utils import Message as _
 
-available_periods = (
-    (u'hourly', 'hourly', _(u'Hourly')),
-    (u'daily', 'daily', _(u'Daily')),
-    (u'weekly', 'weekly', _(u'Weekly')),
-    (u'monthly', 'monthly', _(u'Monthly')),
-    (u'yearly', 'yearly', _(u'Yearly')))
 
-
-class ISyndicationSchema(Interface):
-
-    """Syndication form schema"""
-
-    period = Choice(
-        title=_(u"Update period"),
-        vocabulary=SimpleVocabulary.fromTitleItems(available_periods),
-        default=SyndicationTool.syUpdatePeriod
-    )
-
-    frequency = Int(
-        title=_(u"Update frequency"),
-        description=_(u"This is a multiple of the update period. An"
-                      u" update frequency of '3' and an update period"
-                      u" of 'Monthly' will mean an update every three months."),
-        default=1
-    )
-
-    base = Datetime(
-        title=_(u"Update base"),
-        description=_(u""),
-        default=datetime.now()
-    )
-
-    max_items = Int(
-        title=_(u"Maximum number of items"),
-        description=_(u""),
-        default=15
-    )
-
-
-class SyndicationToolSchemaAdapter(SchemaAdapterBase):
-
-    """Adapter for ISyndicationTool.
-    """
-
-    adapts(IFolderish)
-    implements(ISyndicationSchema)
-
-    period  = ProxyFieldProperty(ISyndicationSchema['period'], 'syUpdatePeriod')
-    frequency = ProxyFieldProperty(ISyndicationSchema['frequency'], 'syUpdateFrequency')
-    base = ProxyFieldProperty(ISyndicationSchema['base'], 'syUpdateBase')
-    max_items = ProxyFieldProperty(ISyndicationSchema['max_items'])
-
-
 class Site(SettingsEditFormBase):
 
     """Enable or disable syndication for a site."""
 
-    form_fields = form.FormFields(ISyndicationSchema)
-    template = ViewPageTemplateFile("syndication.pt")
-    allowed = True
+    form_fields = form.FormFields(ISyndicationInfo)
     label = _(u"Configure Portal Syndication")
 
     actions = form.Actions(
@@ -120,35 +59,27 @@
         )
     )
 
-    @property
     @memoize
-    def syndtool(self):
-        return getUtility(ISyndicationTool)
-
-    @property
-    @memoize
     def enabled(self, action=None):
-        return self.syndtool.isAllowed
+        return self.getContent().enabled
 
-    @property
     @memoize
     def disabled(self, action=None):
-        return not self.syndtool.isAllowed
+        return not self.getContent().enabled
 
     @memoize
     def getContent(self):
         syndtool = getUtility(ISyndicationTool)
-        return SyndicationToolSchemaAdapter(syndtool)
+        return syndtool
 
     def setUpWidgets(self, ignore_request=False):
         self.adapters = {}
-        fields = self.form_fields
-        if self.disabled:
-            fields = form.FormFields()
         super(Site, self).setUpWidgets(ignore_request)
+        self.widgets['enabled'].hide = True
 
     def handle_enable(self, action, data):
-        self.syndtool.isAllowed = True
+        self.getContent().enabled = True
+        self._handle_success(action, data)
         self.status = _(u"Syndication enabled.")
         self._setRedirect("portal_actions", "global/syndication")
 
@@ -158,26 +89,24 @@
         self._setRedirect("portal_actions", "global/syndication")
 
     def handle_disable(self, action, data):
-        self.syndtool.isAllowed = False
+        self.getContent().enabled = False
         self.status = _(u"Syndication disabled.")
         self._setRedirect("portal_actions", "global/syndication")
 
 
-# XXX: Don't use this form, it might corrupt your settings!
-class Syndicate(SettingsEditFormBase):
+class Folder(SettingsEditFormBase):
 
     """Enable, disable and customise syndication settings for a folder.
     """
 
-    form_fields = form.FormFields(ISyndicationSchema)
-    template = ViewPageTemplateFile("syndication.pt")
+    form_fields = form.FormFields(ISyndicationInfo)
     label = _(u"Configure Folder Syndication")
 
     actions = form.Actions(
         form.Action(
             name="enable",
             label=_(u"Enable Syndication"),
-            condition="disabled",
+            condition="allowed",
             success="handle_enable",
             ),
         form.Action(
@@ -200,38 +129,42 @@
         )
     )
 
-    @property
     @memoize
-    def adapter(self):
+    def getContent(self):
         return getAdapter(self.context, ISyndicationInfo)
 
-    def setUpWidgets(self, ignore_request=False):
-        fields = self.form_fields
-        if self.disabled():
-            fields = form.FormFields()
-        super(Syndicate, self).setUpWidgets(ignore_request)
+    @memoize
+    def disabled(self, action=None):
+        return not self.enabled()
 
     @memoize
     def enabled(self, action=None):
-        return self.adapter.enabled
+        return self.getContent().enabled
 
-    @memoize
-    def disabled(self, action=None):
-        return not self.adapter.enabled
+    def setUpWidgets(self, ignore_request=False):
+        if not self.allowed():
+            self.form_fields = form.FormFields()
+            self.widgets = {}
+            return
+        super(Folder, self).setUpWidgets(ignore_request)
+        self.widgets['enabled'].hide = True
 
-    @property
     @memoize
-    def allowed(self):
-        syndtool = getUtility(ISyndicationTool)
-        return syndtool.isSiteSyndicationAllowed()
+    def allowed(self, action=None):
+        return self.getContent().allowed
 
+    def applyChanges(self, data):
+        return form.applyData(self.context, self.form_fields, data,
+                          self.adapters)
+
     def handle_enable(self, action, data):
-        self.adapter.enable()
+        self.getContent().enable()
+        self._handle_success(action, data)
         self.status = _(u"Syndication enabled.")
         self._setRedirect("portal_actions", "object/syndication")
 
     def handle_disable(self, action, data):
-        self.adapter.disable()
+        self.getContent().disable()
         self.status = _(u"Syndication disabled.")
         self._setRedirect("portal_actions", "object/syndication")
 
@@ -241,6 +174,6 @@
         self._setRedirect("portal_actions", "object/syndication")
 
     def handle_revert(self, action, data):
-        self.adapter.revert()
+        self.getContent().revert()
         self.status = _(u"Syndication reset to site default.")
         self._setRedirect("portal_actions", "object/syndication")

Modified: Products.CMFDefault/trunk/Products/CMFDefault/browser/admin/tests/test_syndication.py
===================================================================
--- Products.CMFDefault/trunk/Products/CMFDefault/browser/admin/tests/test_syndication.py	2011-11-15 11:28:32 UTC (rev 123349)
+++ Products.CMFDefault/trunk/Products/CMFDefault/browser/admin/tests/test_syndication.py	2011-11-15 11:59:31 UTC (rev 123350)
@@ -25,7 +25,6 @@
 from Products.CMFCore.interfaces import IFolderish
 from Products.CMFCore.interfaces import IPropertiesTool
 from Products.CMFCore.interfaces import IMembershipTool
-from Products.CMFCore.interfaces import ISyndicationInfo
 from Products.CMFCore.interfaces import ISyndicationTool
 from Products.CMFCore.interfaces import IURLTool
 from Products.CMFCore.tests.base.dummy import DummyFolder
@@ -36,55 +35,29 @@
 
 class DummySyndicationTool(object):
 
-    isAllowed = False
-    syUpdatePeriod = updatePeriod = "daily"
-    syUpdateFrequency = updateFrequency = 1
-    syUpdateBase = updateBase = ""
+    enabled = False
+    period = updatePeriod = "daily"
+    frequency = updateFrequency = 1
+    base = updateBase = ""
     max_items = 15
 
-    def getProperty(self, key, default):
-        return getattr(self, key, default)
-
-    def editProperties(self, **kw):
-        for k, v in kw.items():
-            setattr(self, k, v)
-
     def isSiteSyndicationAllowed(self):
-        return self.isAllowed
+        return self.enabled
 
-    def hasProperty(self, key):
-        return getattr(self, key)
 
-    def _updateProperty(self, key, value):
-        setattr(self, key, value)
+class SiteSyndicationTests(unittest.TestCase):
 
-
-class DummySyndicationAdapter(object):
-
-    def __init__(self, context):
-        self.context = context
-
-
-class DummyPropertiesTool(DummyTool):
-
-    def getProperty(self, key, default):
-        return getattr(self, key, default)
-
-
-class SyndicationViewTests(unittest.TestCase):
-
     def setUp(self):
         """Setup a site"""
         self.site = DummySite('site')
-        alsoProvides(self.site, IPropertiesTool)
         sm = getSiteManager()
-        sm.registerUtility(DummySyndicationTool(), ISyndicationTool)
+        from Products.CMFDefault.SyndicationInfo import ISyndicationInfo
+        syndtool = DummySyndicationTool()
+        alsoProvides(syndtool, ISyndicationInfo)
+        sm.registerUtility(syndtool, ISyndicationTool)
         sm.registerUtility(DummyTool(), IActionsTool)
         sm.registerUtility(DummyTool(), IMembershipTool)
         sm.registerUtility(DummyTool().__of__(self.site), IURLTool)
-        sm.registerUtility(DummyPropertiesTool(), IPropertiesTool)
-        from Products.CMFDefault.browser.admin.syndication import ISyndicationSchema
-        sm.registerAdapter(self._getTargetAdapter(), (IFolderish, ), ISyndicationSchema)
 
     def tearDown(self):
         cleanUp()
@@ -95,22 +68,19 @@
         alsoProvides(request, IUserPreferredCharsets)
         return Site(self.site, request)
 
-    def _getTargetAdapter(self):
-        from Products.CMFDefault.browser.admin.syndication import SyndicationToolSchemaAdapter
-        return SyndicationToolSchemaAdapter
-
     def test_enabled(self):
         view = self._getTargetClass()
-        self.assertFalse(view.enabled)
+        self.assertFalse(view.enabled())
 
     def test_disabled(self):
         view = self._getTargetClass()
-        self.assertTrue(view.disabled)
+        self.assertTrue(view.disabled())
 
     def test_handle_enable(self):
         view = self._getTargetClass()
+        view.adapters = {}
         view.handle_enable("enable", {})
-        self.assertTrue(view.enabled)
+        self.assertTrue(view.enabled())
         self.assertEqual(view.status, u"Syndication enabled.")
         self.assertEqual(view.request.RESPONSE.location,
             "http://www.foobar.com/bar/site?portal_status_message="
@@ -120,7 +90,7 @@
         import datetime
         today = datetime.datetime.now()
         view = self._getTargetClass()
-        view.adapters = {DummySyndicationAdapter: ISyndicationInfo}
+        view.adapters = {}
         self.assertEqual(view.getContent().period, 'daily')
         self.assertEqual(view.getContent().frequency, 1)
         self.assertEqual(view.getContent().base, "")
@@ -128,10 +98,8 @@
         data = {'frequency':3, 'period':'weekly', 'base':today,
                 'max_items':10}
         view.handle_change("change", data)
-        self.assertEqual(view.getContent().period, 'weekly')
-        self.assertEqual(view.getContent().frequency, 3)
-        self.assertEqual(view.getContent().base, today)
-        self.assertEqual(view.getContent().max_items, 10)
+        for k, v in data.items():
+            self.assertEqual(getattr(view.getContent(), k), v)
         self.assertEqual(view.status, u"Syndication settings changed.")
         self.assertEqual(view.request.RESPONSE.location,
             "http://www.foobar.com/bar/site?portal_status_message="
@@ -139,10 +107,10 @@
 
     def test_handle_disable(self):
         view = self._getTargetClass()
-        view.syndtool.isAllowed = True
-        self.assertTrue(view.enabled)
+        view.getContent().enabled = True
+        self.assertTrue(view.enabled())
         view.handle_disable("disable", {})
-        self.assertTrue(view.disabled)
+        self.assertTrue(view.disabled())
         self.assertEqual(view.status, u"Syndication disabled.")
         self.assertEqual(view.request.RESPONSE.location,
             "http://www.foobar.com/bar/site?portal_status_message="
@@ -153,13 +121,16 @@
 
     def setUp(self):
         """Setup a site"""
-        from Products.CMFDefault.SyndicationInfo import SyndicationInfo
-
         self.site = DummySite('site')
         self.syndtool = DummySyndicationTool()
         sm = getSiteManager()
         sm.registerUtility(self.syndtool, ISyndicationTool)
+        from Products.CMFDefault.SyndicationInfo import ISyndicationInfo
+        from Products.CMFDefault.SyndicationInfo import SyndicationInfo
         sm.registerAdapter(SyndicationInfo, [IFolderish], ISyndicationInfo)
+        from zope.annotation.interfaces import IAnnotations
+        from zope.annotation.attribute import AttributeAnnotations
+        sm.registerAdapter(AttributeAnnotations, [IFolderish], IAnnotations)
         sm.registerUtility(DummyTool(), IActionsTool)
         sm.registerUtility(DummyTool(), IMembershipTool)
         sm.registerUtility(DummyTool().__of__(self.site), IURLTool)
@@ -168,21 +139,16 @@
         cleanUp()
 
     def _getTargetClass(self):
-        from Products.CMFDefault.browser.admin.syndication import Syndicate
-        self.site._setObject('folder', DummyFolder('Folder'))
+        from Products.CMFDefault.browser.admin.syndication import Folder
         alsoProvides(self.site, IFolderish)
         request = DummyRequest(ACTUAL_URL="http://example.com")
         alsoProvides(request, IUserPreferredCharsets)
-        return Syndicate(self.site, request)
+        return Folder(self.site, request)
 
     def test_allowed(self):
         view = self._getTargetClass()
-        self.assertFalse(view.allowed)
+        self.assertFalse(view.allowed())
 
-    def test_adapter(self):
-        view = self._getTargetClass()
-        self.assertTrue(ISyndicationInfo.providedBy(view.adapter))
-
     def test_enabled(self):
         view = self._getTargetClass()
         self.assertFalse(view.enabled())
@@ -192,8 +158,9 @@
         self.assertTrue(view.disabled())
 
     def test_handle_enable(self):
-        self.syndtool.isAllowed = 1
+        self.syndtool.enabled = True
         view = self._getTargetClass()
+        view.adapters = {}
         view.handle_enable("enable", {})
         self.assertTrue(view.enabled())
         self.assertEqual(view.status, u"Syndication enabled.")
@@ -202,9 +169,10 @@
             "Syndication%20enabled.")
 
     def test_handle_disable(self):
-        self.syndtool.isAllowed = 1
+        self.syndtool.enabled = False
         view = self._getTargetClass()
-        view.adapter.enable()
+        view.adapters = {}
+        view.getContent().enable()
         view.handle_disable("disable", {})
         self.assertFalse(view.enabled())
         self.assertEqual(view.status, u"Syndication disabled.")
@@ -212,32 +180,36 @@
             "http://www.foobar.com/bar/site?portal_status_message="
             "Syndication%20disabled.")
 
-    #def test_handle_change(self):
-        #view = self._getTargetClass()
-        #values = {'frequency': 4, 'period': 'weekly', 'base': '2010-01-01',
-                  #'max_items': 25}
-        #view.handle_change("change", values)
-        #self.assertEqual(view.adapter.get_info(), values)
-        #self.assertEqual(view.status, u"Syndication settings changed.")
-        #self.assertEqual(view.request.RESPONSE.location,
-            #"http://www.foobar.com/bar/site?portal_status_message="
-            #"Syndication%20settings%20changed.")
+    def test_handle_change(self):
+        view = self._getTargetClass()
+        view.adapters = {}
+        values = {'frequency': 4, 'period': 'weekly', 'base': '2010-01-01',
+                  'max_items': 25}
+        view.handle_change("change", values)
+        for k, v in values.items():
+            self.assertEqual(getattr(view.getContent(), k), v)
+        self.assertEqual(view.status, u"Syndication settings changed.")
+        self.assertEqual(view.request.RESPONSE.location,
+            "http://www.foobar.com/bar/site?portal_status_message="
+            "Syndication%20settings%20changed.")
 
-    #def test_handle_revert(self):
-        #view = self._getTargetClass()
-        #values = {'frequency': 4, 'period': 'weekly', 'base': '2010-01-01',
-                  #'max_items': 25}
-        #view.handle_change("change", values)
-        #view.handle_revert("", values)
-        #self.assertNotEqual(view.adapter.get_info(), values)
-        #self.assertEqual(view.status, u"Syndication reset to site default.")
-        #self.assertEqual(view.request.RESPONSE.location,
-            #"http://www.foobar.com/bar/site?portal_status_message="
-            #"Syndication%20reset%20to%20site%20default.")
+    def test_handle_revert(self):
+        view = self._getTargetClass()
+        view.adapters = {}
+        values = {'frequency': 4, 'period': 'weekly', 'base': '2010-01-01',
+                  'max_items': 25}
+        view.handle_change("change", values)
+        view.handle_revert("", values)
+        for k, v in values.items():
+            self.assertNotEqual(getattr(view.getContent(), k), v)
+        self.assertEqual(view.status, u"Syndication reset to site default.")
+        self.assertEqual(view.request.RESPONSE.location,
+            "http://www.foobar.com/bar/site?portal_status_message="
+            "Syndication%20reset%20to%20site%20default.")
 
 
 def test_suite():
     suite = unittest.TestSuite()
-    suite.addTest(unittest.makeSuite(SyndicationViewTests))
+    suite.addTest(unittest.makeSuite(SiteSyndicationTests))
     suite.addTest(unittest.makeSuite(FolderSyndicationTests))
     return suite

Modified: Products.CMFDefault/trunk/Products/CMFDefault/configure.zcml
===================================================================
--- Products.CMFDefault/trunk/Products/CMFDefault/configure.zcml	2011-11-15 11:28:32 UTC (rev 123349)
+++ Products.CMFDefault/trunk/Products/CMFDefault/configure.zcml	2011-11-15 11:59:31 UTC (rev 123350)
@@ -3,6 +3,8 @@
 
   <include package="zope.formlib"/>
 
+  <include package="zope.annotation"/>
+
   <!--<include package="five.pt"/>-->
 
   <include package=".skin"/>
@@ -21,6 +23,12 @@
 
   <include file="directories.zcml"/>
 
+  <class class=".SyndicationTool.SyndicationTool">
+   <implements
+     interface=".SyndicationInfo.ISyndicationInfo"
+   />
+  </class>
+
   <adapter
       factory = ".SyndicationInfo.SyndicationInfo"
       />

Modified: Products.CMFDefault/trunk/Products/CMFDefault/content.zcml
===================================================================
--- Products.CMFDefault/trunk/Products/CMFDefault/content.zcml	2011-11-15 11:28:32 UTC (rev 123349)
+++ Products.CMFDefault/trunk/Products/CMFDefault/content.zcml	2011-11-15 11:59:31 UTC (rev 123350)
@@ -95,4 +95,12 @@
       name="cmf.folder.skinned"
       />
 
+  <include package="zope.annotation" />
+
+  <class class="Products.CMFCore.PortalFolder.PortalFolder">
+
+    <implements interface="zope.annotation.interfaces.IAttributeAnnotatable" />
+
+  </class>
+
 </configure>

Modified: Products.CMFDefault/trunk/Products/CMFDefault/tests/test_SyndicationInfo.py
===================================================================
--- Products.CMFDefault/trunk/Products/CMFDefault/tests/test_SyndicationInfo.py	2011-11-15 11:28:32 UTC (rev 123349)
+++ Products.CMFDefault/trunk/Products/CMFDefault/tests/test_SyndicationInfo.py	2011-11-15 11:59:31 UTC (rev 123350)
@@ -13,11 +13,13 @@
 """ Unit tests for the SyndicationInfo adapter.
 """
 
+from datetime import datetime
 import unittest
 import Testing
 
-from DateTime.DateTime import DateTime
+from zope.annotation.interfaces import IAnnotations
 from zope.component import getSiteManager
+from zope.component import getAdapter
 from zope.interface.verify import verifyClass
 
 from Products.CMFCore.interfaces import ISyndicationTool
@@ -27,13 +29,17 @@
 class SyndicationInfoTests(TransactionalTest):
 
     def setUp(self):
+        from zope.annotation.attribute import AttributeAnnotations
+        from Products.CMFCore.interfaces import IFolderish
         from Products.CMFCore.PortalFolder import PortalFolder
 
         super(SyndicationInfoTests, self).setUp()
         self.app._setObject('portal', PortalFolder('portal'))
         self.portal = self.app.portal
         self.syndtool = DummySyndicationTool()
-        getSiteManager().registerUtility(self.syndtool, ISyndicationTool)
+        sm = getSiteManager()
+        sm.registerUtility(self.syndtool, ISyndicationTool)
+        sm.registerAdapter(AttributeAnnotations, [IFolderish], IAnnotations)
 
     def _getTargetClass(self):
         from Products.CMFDefault.SyndicationInfo import SyndicationInfo
@@ -41,56 +47,64 @@
         return SyndicationInfo
 
     def _makeOne(self):
+        from zope.interface import alsoProvides
         from Products.CMFCore.PortalFolder import PortalFolder
+        folder = PortalFolder('folder')
 
-        self.portal._setObject('folder', PortalFolder('folder'))
-        return self._getTargetClass()(self.portal.folder)
-    
+        self.portal._setObject('folder', folder)
+        alsoProvides(folder, IAnnotations)
+
+        return self._getTargetClass()(folder)
+
     def test_interfaces(self):
         from Products.CMFCore.interfaces import ISyndicationInfo
 
         verifyClass(ISyndicationInfo, self._getTargetClass())
-    
+
     def test_site_settings(self):
         adapter = self._makeOne()
         self.assertTrue(adapter.site_settings is self.syndtool)
-    
-    def test_get_info(self):
+
+    def test_set(self):
         adapter = self._makeOne()
-        self.assertEqual(adapter.get_info(),
-                        {'max_items': 15, 'frequency': 1, 'period': 'daily',
-                        'base': DateTime('2010/10/03 12:00:00 GMT+0')})
-    
-    def test_set_info(self):
-        adapter = self._makeOne()
         settings = {'max_items': 10, 'frequency': 7, 'period': 'daily',
-        'base': DateTime()}
-        self.assertNotEqual(adapter.get_info(), settings)
-        adapter.set_info(**settings)
-        self.assertEqual(adapter.get_info(), settings)
-    
+                    'base': datetime.today()}
+        annotations = getAdapter(adapter.context, IAnnotations)
+        self.assertFalse(annotations.has_key(adapter.key))
+        annotations[adapter.key] = settings
+        for k, v in settings.items():
+            self.assertEqual(getattr(adapter, k), v)
+
     def revert(self):
         adapter = self._makeOne()
         settings = {'max_items': 20, 'frequency': 1, 'period': 'monthly',
-        'base': DateTime()}
-        adapter.set_info(**settings)
-        self.assertEqual(adapter.get_info(), settings)
+                    'base': datetime.today()}
+        setattr(adapter.context, adapter.key, settings)
+        self.assertEqual(getattr(adapter.context, adapter.key, settings))
         adapter.revert()
-        self.assertNotEqual(adapter.get_info(), settings)
-    
-    def test_enabled(self):
+        self.assertNotEqual(getattr(adapter.context, adapter.key, settings))
+
+    def test_not_enabled_by_default(self):
         adapter = self._makeOne()
         self.assertFalse(adapter.enabled)
-    
+
     def test_enable(self):
         adapter = self._makeOne()
-        self.syndtool.isAllowed = 1
+        self.syndtool.enabled = True
         adapter.enable()
         self.assertTrue(adapter.enabled)
-    
+
+    def test_get_default_values(self):
+        adapter = self._makeOne()
+        self.assertFalse(hasattr(adapter.context, adapter.key))
+        self.assertEqual(adapter.period, self.syndtool.period)
+        self.assertEqual(adapter.frequency, self.syndtool.frequency)
+        self.assertEqual(adapter.base, self.syndtool.base)
+        self.assertEqual(adapter.max_items, self.syndtool.max_items)
+
     def test_disable(self):
         adapter = self._makeOne()
-        self.syndtool.isAllowed = 1
+        self.syndtool.enabled = True
         adapter.enable()
         self.assertTrue(adapter.enabled)
         adapter.disable()
@@ -98,16 +112,14 @@
 
 
 class DummySyndicationTool(object):
-    
-    isAllowed = 0
-    syUpdatePeriod = 'daily'
-    syUpdateFrequency = 1
-    syUpdateBase = DateTime('2010/10/03 12:00:00 GMT+0')
+
+    enabled  = 0
+    period = 'daily'
+    frequency = 1
+    base = datetime(2010, 10, 3, 12, 0, 0)
     max_items = 15
-    
-    def manage_fixupOwnershipAfterAdd(self):
-        pass
 
+
 def test_suite():
     return unittest.TestSuite((
         unittest.makeSuite(SyndicationInfoTests),

Modified: Products.CMFDefault/trunk/Products/CMFDefault/tests/test_SyndicationTool.py
===================================================================
--- Products.CMFDefault/trunk/Products/CMFDefault/tests/test_SyndicationTool.py	2011-11-15 11:28:32 UTC (rev 123349)
+++ Products.CMFDefault/trunk/Products/CMFDefault/tests/test_SyndicationTool.py	2011-11-15 11:59:31 UTC (rev 123350)
@@ -12,7 +12,8 @@
 ##############################################################################
 """ Unit tests for SyndicationTool module.
 """
-
+from datetime import datetime
+from datetime import timedelta
 import unittest
 import Testing
 
@@ -29,11 +30,16 @@
 
 class Dummy:
 
+    period = None
+    frequency = None
+    base = None
+    max_items = None
+
     def getId(self):
         return 'dummy'
 
 
-class DummyInfo:
+class DummyInfo(object):
 
     def __init__(self, context):
         self.context = context
@@ -41,6 +47,38 @@
     def __call__(self):
         pass
 
+    def set_f(self, frequency):
+        self.context.frequency = frequency
+
+    def get_f(self):
+        return self.context.frequency
+
+    frequency = property(get_f, set_f)
+
+    def get_p(self):
+        return self.context.period
+
+    def set_p(self, period):
+        self.context.period = period
+
+    period = property(get_p, set_p)
+
+    def get_b(self):
+        return self.context.base
+
+    def set_b(self, base):
+        self.context.base = base
+
+    base = property(get_b, set_b)
+
+    def get_m(self):
+        return self.context.max_items
+
+    def set_m(self, max_items):
+        self.context.max_items = max_items
+
+    max_items = property(get_m, set_m)
+
     @property
     def enabled(self):
         if hasattr(self.context, 'enabled'):
@@ -53,21 +91,7 @@
     def disable(self):
         self.context.enabled = False
 
-    def set_info(self, **kw):
-        for k, v in kw.items():
-            setattr(self.context, k, v)
 
-    def get_info(self):
-        if hasattr(self.context, 'frequency'):
-            # values set on context
-            return {'frequency': self.context.frequency,
-                    'period': self.context.period,
-                    'base': self.context.base,
-                    'max_items': self.context.max_items}
-        #values from syndication tool
-        return {'frequency': '1', 'period': 'daily',
-                'base': DateTime('2010/10/04 12:00:00 GMT'), 'max_items': 15}
-
 class SyndicationToolTests(SecurityTest):
 
     def _getTargetClass(self):
@@ -95,56 +119,16 @@
         verifyClass(ISyndicationTool, self._getTargetClass())
 
     def test_empty(self):
-        ONE_MINUTE = (24.0 * 60.0) / 86400
+        ONE_MINUTE = timedelta(0, 61, 0)
 
         tool = self._makeOne()
 
-        self.assertEqual(tool.syUpdatePeriod, 'daily')
-        self.assertEqual(tool.syUpdateFrequency, 1)
-        self.failUnless(DateTime() - tool.syUpdateBase < ONE_MINUTE)
-        self.failIf(tool.isAllowed)
+        self.assertEqual(tool.period, 'daily')
+        self.assertEqual(tool.frequency, 1)
+        self.failUnless(datetime.now() - tool.base < ONE_MINUTE)
+        self.failIf(tool.enabled)
         self.assertEqual(tool.max_items, 15)
 
-    def test_editProperties_normal(self):
-        PERIOD = 'hourly'
-        FREQUENCY = 4
-        NOW = DateTime()
-        MAX_ITEMS = 42
-
-        tool = self._makeOne()
-        tool.editProperties(updatePeriod=PERIOD,
-                            updateFrequency=FREQUENCY,
-                            updateBase=NOW,
-                            isAllowed=True,
-                            max_items=MAX_ITEMS,
-                           )
-
-        self.assertEqual(tool.syUpdatePeriod, PERIOD)
-        self.assertEqual(tool.syUpdateFrequency, FREQUENCY)
-        self.assertEqual(tool.syUpdateBase, NOW)
-        self.failUnless(tool.isAllowed)
-        self.assertEqual(tool.max_items, MAX_ITEMS)
-
-    def test_editProperties_coercing(self):
-        PERIOD = 'hourly'
-        FREQUENCY = 4
-        NOW = DateTime()
-        MAX_ITEMS = 42
-
-        tool = self._makeOne()
-        tool.editProperties(updatePeriod=PERIOD,
-                            updateFrequency='%d' % FREQUENCY,
-                            updateBase=NOW.ISO(),
-                            isAllowed='True',
-                            max_items='%d' % MAX_ITEMS,
-                           )
-
-        self.assertEqual(tool.syUpdatePeriod, PERIOD)
-        self.assertEqual(tool.syUpdateFrequency, FREQUENCY)
-        self.assertEqual(tool.syUpdateBase, DateTime(NOW.ISO()))
-        self.failUnless(tool.isAllowed)
-        self.assertEqual(tool.max_items, MAX_ITEMS)
-
     def test_object_not_syndicatable(self):
         tool = self._makeOne()
         self.assertFalse(tool.isSyndicationAllowed(Dummy))
@@ -163,7 +147,7 @@
 
     def test_enable_object_syndication(self):
         tool = self._makeOne()
-        tool.isAllowed = True
+        tool.enabled = True
         context = self._makeContext()
         tool.enableSyndication(context)
         self.assertTrue(tool.isSyndicationAllowed(context))
@@ -171,11 +155,11 @@
     def test_editSyInformationProperties_normal(self):
         PERIOD = 'hourly'
         FREQUENCY = 4
-        NOW = DateTime()
+        NOW = datetime.now()
         MAX_ITEMS = 42
 
         tool = self._makeOne()
-        tool.isAllowed = True
+        tool.enabled = True
         context = self._makeContext()
         tool.enableSyndication(context)
 
@@ -185,41 +169,14 @@
                                          updateBase=NOW,
                                          max_items=MAX_ITEMS,
                                         )
-        self.assertEqual(tool.getSyndicationInfo(context),
-                             {'frequency': FREQUENCY, 'period': PERIOD,
-                              'base': NOW, 'max_items': MAX_ITEMS})
+        info = tool.getSyndicationInfo(context)
+        import pdb
+        #pdb.set_trace()
+        self.assertEqual(info.frequency, FREQUENCY)
+        self.assertEqual(info.period, PERIOD)
+        self.assertEqual(info.base, NOW)
+        self.assertEqual(info.max_items, MAX_ITEMS)
 
-    def test_editSyInformationProperties_coercing(self):
-        PERIOD = 'hourly'
-        FREQUENCY = 4
-        NOW = DateTime()
-        MAX_ITEMS = 42
-
-        tool = self._makeOne()
-        tool.isAllowed = True
-        context = self._makeContext()
-        tool.enableSyndication(context)
-
-        tool.editSyInformationProperties(context,
-                                         updatePeriod=PERIOD,
-                                         updateFrequency='%d' % FREQUENCY,
-                                         updateBase=NOW.ISO(),
-                                         max_items='%d' % MAX_ITEMS,
-                                        )
-        self.assertEqual(tool.getSyndicationInfo(context),
-                             {'frequency': FREQUENCY, 'period': PERIOD,
-                              'base': DateTime(NOW.ISO()),
-                              'max_items': MAX_ITEMS})
-
-    def test_editProperties_isAllowedOnly(self):
-        # Zope 2.8 crashes if we don't edit all properties.
-        # This is because Zope now raises AttributeError
-        # instead of KeyError in editProperties().
-        tool = self._makeOne()
-        tool.editProperties(isAllowed=1)
-
-        self.failUnless(tool.isAllowed)
-
     def test_getSyndicatableContent(self):
         # http://www.zope.org/Collectors/CMF/369
         # Make sure we use a suitable base class call when determining
@@ -230,19 +187,18 @@
 
         PERIOD = 'hourly'
         FREQUENCY = 4
-        NOW = DateTime()
+        NOW = datetime.now()
         MAX_ITEMS = 42
 
         getSiteManager().registerUtility(TypesTool(), ITypesTool)
         self.app._setObject('pf', PortalFolder('pf'))
         self.app._setObject('bf', CMFBTreeFolder('bf'))
         tool = self._makeOne()
-        tool.editProperties(updatePeriod=PERIOD,
-                            updateFrequency=FREQUENCY,
-                            updateBase=NOW,
-                            isAllowed=True,
-                            max_items=MAX_ITEMS,
-                           )
+        tool.period = PERIOD
+        tool.frequency = FREQUENCY
+        tool.base = NOW
+        tool.enabled = True
+        tool.max_items = MAX_ITEMS
 
         self.assertEqual(len(tool.getSyndicatableContent(self.app.pf)), 0)
         self.assertEqual(len(tool.getSyndicatableContent(self.app.bf)), 0)



More information about the checkins mailing list