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.

Reply via email to