[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