Author: rmarianski
Date: 2007-11-05 00:27:46 -0500 (Mon, 05 Nov 2007)
New Revision: 10455
Added:
opencore/branches/featurelet-refactor/opencore/featurelets/interfaces.py
Modified:
opencore/branches/featurelet-refactor/Products/OpenPlans/__init__.py
opencore/branches/featurelet-refactor/opencore/listen/configure.zcml
opencore/branches/featurelet-refactor/opencore/listen/featurelet.py
opencore/branches/featurelet-refactor/opencore/nui/project/view.py
opencore/branches/featurelet-refactor/opencore/nui/setup.py
opencore/branches/featurelet-refactor/opencore/project/configure.zcml
opencore/branches/featurelet-refactor/opencore/project/handler.py
opencore/branches/featurelet-refactor/opencore/tasktracker/configure.zcml
opencore/branches/featurelet-refactor/opencore/tasktracker/featurelet.py
opencore/branches/featurelet-refactor/opencore/wordpress/configure.zcml
opencore/branches/featurelet-refactor/opencore/wordpress/featurelet.py
Log:
rely on featurelet adapters for functionality
* remove references to IFeatureletRegistry
* create stub interfaces in opencore.featurelets.interfaces for legacy purposes
* project views use adapter querying for pulling featurelet data
* create initial setup widget for interface migrations (doesn't work)
* add method to IFeaturelet to check if particular featurelet is installed
* project save event handlers uses adapter calls instead of registry
Modified: opencore/branches/featurelet-refactor/Products/OpenPlans/__init__.py
===================================================================
--- opencore/branches/featurelet-refactor/Products/OpenPlans/__init__.py
2007-11-05 01:49:12 UTC (rev 10454)
+++ opencore/branches/featurelet-refactor/Products/OpenPlans/__init__.py
2007-11-05 05:27:46 UTC (rev 10455)
@@ -21,8 +21,6 @@
from Products.Archetypes import public as atapi
from Products.listen.permissions import AddMailingList
-from topp.featurelets.interfaces import IFeatureletRegistry
-
from opencore.nui import indexing
from opencore.auth import remoteauthplugin
@@ -85,10 +83,6 @@
fti = ftis,
).initialize(context)
- flet_registry = getUtility(IFeatureletRegistry)
- flet_registry.registerFeaturelet(ListenFeaturelet())
- flet_registry.registerFeaturelet(TaskTrackerFeaturelet())
-
from opencore.auth import SignedCookieAuthHelper
from AccessControl.Permissions import add_user_folders
context.registerClass( SignedCookieAuthHelper.SignedCookieAuthHelper,
Added: opencore/branches/featurelet-refactor/opencore/featurelets/interfaces.py
===================================================================
--- opencore/branches/featurelet-refactor/opencore/featurelets/interfaces.py
(rev 0)
+++ opencore/branches/featurelet-refactor/opencore/featurelets/interfaces.py
2007-11-05 05:27:46 UTC (rev 10455)
@@ -0,0 +1,19 @@
+from zope.interface import Interface
+
+#BBB this module exists because the old pickled projects in the zodb expect
them to be here
+# new code imports them from their rightful location
+# it was difficult to write a migration to move them out into their separate
pacakges
+# I encourage anybody that knows how, to do so
+# there is some sample code (which doesn't work) for this in opencre.nui.setup
+
+class IListenFeatureletInstalled(Interface):
+ """marker for supporters with the listen featurelet installed"""
+
+class ITaskTrackerFeatureletInstalled(Interface):
+ """marker for supporters with the tasktracker featurelet installed"""
+
+class IWordPressFeatureletInstalled(Interface):
+ """marker for supporters with the wordpress featurelet installed"""
+
+class IListenContainer(Interface):
+ """marker interface to specify that a folder can support mailing lists"""
Modified: opencore/branches/featurelet-refactor/opencore/listen/configure.zcml
===================================================================
--- opencore/branches/featurelet-refactor/opencore/listen/configure.zcml
2007-11-05 01:49:12 UTC (rev 10454)
+++ opencore/branches/featurelet-refactor/opencore/listen/configure.zcml
2007-11-05 05:27:46 UTC (rev 10455)
@@ -17,4 +17,11 @@
handler=".events.mailinglist_changed"
/>
+ <adapter
+ for="topp.featurelets.interfaces.IFeatureletSupporter"
+ provides="topp.featurelets.interfaces.IFeaturelet"
+ factory=".featurelet.ListenFeaturelet"
+ name="listen"
+ />
+
</configure>
Modified: opencore/branches/featurelet-refactor/opencore/listen/featurelet.py
===================================================================
--- opencore/branches/featurelet-refactor/opencore/listen/featurelet.py
2007-11-05 01:49:12 UTC (rev 10454)
+++ opencore/branches/featurelet-refactor/opencore/listen/featurelet.py
2007-11-05 05:27:46 UTC (rev 10455)
@@ -3,12 +3,13 @@
from zope.interface import alsoProvides
from zope.component import getMultiAdapter
+from zope.component import adapts
from topp.featurelets.interfaces import IFeaturelet
from topp.featurelets.interfaces import IFeatureletSupporter
from topp.featurelets.base import BaseFeaturelet
-from interfaces import IListenFeatureletInstalled
+from opencore.listen.interfaces import IListenFeatureletInstalled
from interfaces import IListenContainer
from opencore.interfaces import IProject
@@ -18,6 +19,7 @@
A featurelet that installs a folder for managing listen based
mailing lists.
"""
+ adapts(IFeatureletSupporter)
implements(IFeaturelet)
id = "listen"
Modified: opencore/branches/featurelet-refactor/opencore/nui/project/view.py
===================================================================
--- opencore/branches/featurelet-refactor/opencore/nui/project/view.py
2007-11-05 01:49:12 UTC (rev 10454)
+++ opencore/branches/featurelet-refactor/opencore/nui/project/view.py
2007-11-05 05:27:46 UTC (rev 10455)
@@ -2,11 +2,13 @@
import string
from zope import event
+from zope.interface import implements
+from zope.component import getAdapters, queryAdapter
from zope.component import getMultiAdapter
from zope.component import getUtility
from Acquisition import aq_parent
-from topp.featurelets.interfaces import IFeatureletRegistry
+from topp.featurelets.interfaces import IFeaturelet, IFeatureletSupporter
from Products.Five.browser.pagetemplatefile import ZopeTwoPageTemplateFile
from Products.CMFCore.utils import getToolByName
@@ -21,7 +23,6 @@
AfterSubProjectAddedEvent
from opencore.interfaces.workflow import IReadWorkflowPolicySupport
-from opencore.project.utils import get_featurelets
from opencore.tasktracker import uri as tt_uri
from opencore.nui import formhandler
from opencore.nui.base import BaseView, _
@@ -31,7 +32,6 @@
_marker = object()
-
class ProjectBaseView(BaseView):
@memoizedproperty
@@ -47,11 +47,7 @@
return self._has_featurelet('blog')
def _has_featurelet(self, flet_id):
- flets = get_featurelets(self.context)
- for flet in flets:
- if flet['name'] == flet_id:
- return True
- return False
+ return queryAdapter(IFeatureletSupporter(self.context), IFeaturelet,
name=flet_id)
class ProjectContentsView(ProjectBaseView, OctopoLite):
@@ -396,11 +392,14 @@
_(u'psm_security_changed', u"The security policy has been
changed.") : old_workflow_policy != self.request.form['workflow_policy'],
}
- old_featurelets = set([(x['name'], x['title']) for x in
get_featurelets(self.context)])
+ supporter = IFeatureletSupporter(self.context)
+ flets = [f for n, f in getAdapters((supporter,), IFeaturelet)]
+
+ old_featurelets = set([(f.id, f.title) for f in flets if f.installed])
self.request.form = new_form
self.context.processForm(REQUEST=self.request, metadata=1)
- featurelets = set([(x['name'], x['title']) for x in
get_featurelets(self.context)])
+ featurelets = set([(f.id, f.title) for f in flets if f.installed])
for flet in featurelets:
if flet not in old_featurelets:
@@ -434,8 +433,9 @@
return IHomePage(self.context).home_page.split('/')[-1]
def featurelets(self, include_wiki=False):
- all_flets = getUtility(IFeatureletRegistry).getFeaturelets()
- installed_flets = [f['name'] for f in get_featurelets(self.context)]
+ supporter = IFeatureletSupporter(self.context)
+ all_flets = [flet for name, flet in getAdapters((supporter,),
IFeaturelet)]
+ installed_flets = [flet.id for flet in all_flets if flet.installed]
flet_data = [dict(id=f.id,
title=f.title,
url=f._info['menu_items'][0]['action'],
@@ -534,13 +534,20 @@
event.notify(AfterProjectAddedEvent(project, self.request))
def featurelets(self, include_wiki=False):
- flets = getUtility(IFeatureletRegistry).getFeaturelets()
+ # create a stub object that provides IFeatureletSupporter
+ # is there a better way to get the list of adapters without having
+ # the "for" object?
+ class DummyFeatureletSupporter(object):
+ implements(IFeatureletSupporter)
+
+ obj = DummyFeatureletSupporter()
+ flets = getAdapters((obj,), IFeaturelet)
flet_data = [dict(id=f.id,
title=f.title,
url=f._info['menu_items'][0]['action'],
checked=False,
)
- for f in flets]
+ for name, f in flets]
if include_wiki:
flet_data.insert(0, dict(id='wiki',
title='Wiki pages',
Modified: opencore/branches/featurelet-refactor/opencore/nui/setup.py
===================================================================
--- opencore/branches/featurelet-refactor/opencore/nui/setup.py 2007-11-05
01:49:12 UTC (rev 10454)
+++ opencore/branches/featurelet-refactor/opencore/nui/setup.py 2007-11-05
05:27:46 UTC (rev 10455)
@@ -1,4 +1,4 @@
-import os
+import os, sys
from logging import getLogger, INFO
from pprint import pprint
@@ -88,7 +88,6 @@
from Products.Five.utilities.marker import erase
from zope.interface import alsoProvides
from opencore.interfaces.adding import IAddProject
- import sys
import opencore
sys.modules['Products.OpenPlans.interfaces.adding'] =
opencore.interfaces.adding
pf = portal.projects
@@ -273,6 +272,43 @@
if not INewsItem.providedBy(ni):
alsoProvides(ni, INewsItem)
+def move_featurelet_markings(portal):
+ """DOES NOT WORK PROPERLY
+ unmark and remark all installed featurelet markings on projects
+ because their locations moved"""
+
+ # seems that this doesn't work because the alias is difficult to set up
+ # the installed marker interfaces used to be in opencore.featurelets
+ # now they are moved to separate packages
+ # which is problematic for creating an alias
+
+ # first, aliases need to be set up so the projects can be retrieved from
+ # the zodb
+ from opencore.listen.interfaces import IListenFeatureletInstalled
+ from opencore.tasktracker.interfaces import ITaskTrackerFeatureletInstalled
+ from opencore.wordpress.interfaces import IWordPressFeatureletInstalled
+ import opencore
+ # map the marker with the interfaces location
+ mapping = {
+ IListenFeatureletInstalled: opencore.listen.interfaces,
+ ITaskTrackerFeatureletInstalled: opencore.tasktracker.interfaces,
+ IWordPressFeatureletInstalled: opencore.wordpress.interfaces,
+ }
+
+ # now we take away the project featurelet markings
+ # and re-add them so that their locations will be correct
+ from Products.Five.utilities.marker import erase
+ projs = portal.projects
+ for proj_id in projs.objectIds():
+ if proj_id == '.wf_policy_config':
+ continue
+ proj = projs._getOb(proj_id)
+ for iface, module in mapping.items():
+ sys.modules['opencore.featurelet.interfaces'] = module
+ if iface.providedBy(proj):
+ erase(proj, iface)
+ alsoProvides(proj, iface)
+
from Products.Archetypes.utils import OrderedDict
# make rest of names readable (maybe use config system)
@@ -316,6 +352,7 @@
nui_functions['markNewsItems'] = markNewsItems
nui_functions['Install OpenCore Remote Auth Plugin'] = \
convertFunc(install_remote_auth_plugin)
+nui_functions['Move featurelet markings'] = move_featurelet_markings
def run_nui_setup(portal):
pm = portal.portal_migration
Modified: opencore/branches/featurelet-refactor/opencore/project/configure.zcml
===================================================================
--- opencore/branches/featurelet-refactor/opencore/project/configure.zcml
2007-11-05 01:49:12 UTC (rev 10454)
+++ opencore/branches/featurelet-refactor/opencore/project/configure.zcml
2007-11-05 05:27:46 UTC (rev 10455)
@@ -11,7 +11,9 @@
<implements
interface="opencore.interfaces.IEditProject
zope.app.annotation.interfaces.IAttributeAnnotatable
- Products.ploneundelete.interfaces.IUndeleteContainer" />
+ Products.ploneundelete.interfaces.IUndeleteContainer
+ "
+ />
</content>
Modified: opencore/branches/featurelet-refactor/opencore/project/handler.py
===================================================================
--- opencore/branches/featurelet-refactor/opencore/project/handler.py
2007-11-05 01:49:12 UTC (rev 10454)
+++ opencore/branches/featurelet-refactor/opencore/project/handler.py
2007-11-05 05:27:46 UTC (rev 10455)
@@ -1,10 +1,9 @@
-from zope.component import adapter, getUtility
+from zope.component import adapter, getUtility, getAdapter, getAdapters
from zope.app.event.interfaces import IObjectCreatedEvent
from zope.app.event.interfaces import IObjectModifiedEvent
from zope.app.container.interfaces import IContainerModifiedEvent
-from topp.featurelets.interfaces import IFeatureletSupporter
-from topp.featurelets.interfaces import IFeatureletRegistry
+from topp.featurelets.interfaces import IFeatureletSupporter, IFeaturelet
from opencore.interfaces.event import IAfterProjectAddedEvent, \
IAfterSubProjectAddedEvent
@@ -124,24 +123,22 @@
return
request.set('flet_recurse_flag', True)
- registry = getUtility(IFeatureletRegistry)
supporter = IFeatureletSupporter(obj)
+ flets = dict(getAdapters((supporter,), IFeaturelet))
desired = request.form.get('featurelets')
if desired is None:
desired = tuple()
desired = set(desired)
- installed = set(supporter.getInstalledFeatureletIds())
+ installed = set([name for name, flet in flets.items() if flet.installed])
needed = desired.difference(installed)
for flet_id in needed:
- flet = registry.getFeaturelet(flet_id)
- supporter.installFeaturelet(flet)
+ supporter.installFeaturelet(flets[flet_id])
removed = installed.difference(desired)
for flet_id in removed:
- flet = registry.getFeaturelet(flet_id)
- supporter.removeFeaturelet(flet)
+ supporter.removeFeaturelet(flets[flet_id])
def add_redirection_hooks(container, ignore=[]):
for obj in container.objectValues():
Modified:
opencore/branches/featurelet-refactor/opencore/tasktracker/configure.zcml
===================================================================
--- opencore/branches/featurelet-refactor/opencore/tasktracker/configure.zcml
2007-11-05 01:49:12 UTC (rev 10454)
+++ opencore/branches/featurelet-refactor/opencore/tasktracker/configure.zcml
2007-11-05 05:27:46 UTC (rev 10455)
@@ -6,5 +6,12 @@
<opencore:tasktracker
uri="http://localhost:5050"
external_uri="tasks" />
+
+ <adapter
+ for="topp.featurelets.interfaces.IFeatureletSupporter"
+ provides="topp.featurelets.interfaces.IFeaturelet"
+ factory=".featurelet.TaskTrackerFeaturelet"
+ name="tasks"
+ />
</configure>
Modified:
opencore/branches/featurelet-refactor/opencore/tasktracker/featurelet.py
===================================================================
--- opencore/branches/featurelet-refactor/opencore/tasktracker/featurelet.py
2007-11-05 01:49:12 UTC (rev 10454)
+++ opencore/branches/featurelet-refactor/opencore/tasktracker/featurelet.py
2007-11-05 05:27:46 UTC (rev 10455)
@@ -1,4 +1,5 @@
from zope.component import getUtility
+from zope.component import adapts
from zope.interface import implements
from Products.CMFCore.utils import getToolByName
@@ -7,6 +8,7 @@
from topp.featurelets.base import BaseFeaturelet
from topp.featurelets.interfaces import IFeaturelet
+from topp.featurelets.interfaces import IFeatureletSupporter
from opencore.interfaces import IProject
@@ -21,6 +23,7 @@
A featurelet that installs a Task Tracker
"""
+ adapts(IFeatureletSupporter)
implements(IFeaturelet)
id = "tasks"
Modified:
opencore/branches/featurelet-refactor/opencore/wordpress/configure.zcml
===================================================================
--- opencore/branches/featurelet-refactor/opencore/wordpress/configure.zcml
2007-11-05 01:49:12 UTC (rev 10454)
+++ opencore/branches/featurelet-refactor/opencore/wordpress/configure.zcml
2007-11-05 05:27:46 UTC (rev 10455)
@@ -45,5 +45,12 @@
name="sync-wordpress-users"
attribute="sync"
/>
+
+ <adapter
+ for="topp.featurelets.interfaces.IFeatureletSupporter"
+ provides="topp.featurelets.interfaces.IFeaturelet"
+ factory=".featurelet.WordPressFeaturelet"
+ name="blog"
+ />
</configure>
Modified: opencore/branches/featurelet-refactor/opencore/wordpress/featurelet.py
===================================================================
--- opencore/branches/featurelet-refactor/opencore/wordpress/featurelet.py
2007-11-05 01:49:12 UTC (rev 10454)
+++ opencore/branches/featurelet-refactor/opencore/wordpress/featurelet.py
2007-11-05 05:27:46 UTC (rev 10455)
@@ -5,6 +5,7 @@
from zope.interface import implements
from zope.component import getUtility
+from zope.component import adapts
from Products.CMFCore.utils import getToolByName
from Products.Five.browser.pagetemplatefile import ZopeTwoPageTemplateFile
@@ -23,6 +24,7 @@
"""
A featurelet that installs a WordPress blog
"""
+ adapts(IFeatureletSupporter)
implements(IFeaturelet)
id = "blog"
--
Archive:
http://www.openplans.org/projects/opencore/lists/openplans-svn/archive/2007/11/1194240467762
To unsubscribe send an email with subject unsubscribe to [EMAIL PROTECTED]
Please contact [EMAIL PROTECTED] for questions.