def test_featureletsNotRemoved(self): # there was a bug where edits on the container that were not # from the edit template would cause all of the featurelets to # be uninstalled; this demonstrates that the bug has been # fixed flet_id = 'listen' content_id = 'lists' supporter = IFeatureletSupporter(self.proj) flet = getAdapter(supporter, IFeaturelet, flet_id) supporter.installFeaturelet(flet) self.failUnless(content_id in self.proj.objectIds()) # unset the "don't recurse" flag req = self.proj.REQUEST req.set('flet_recurse_flag', None) zope.event.notify(objectevent.ObjectModifiedEvent(self.proj)) self.failUnless(flet_id in supporter.getInstalledFeatureletIds())
def test_removeFeaturelet(self): featurelet = ListenFeaturelet(self.project) fletsupporter = IFeatureletSupporter(self.project) fletsupporter.installFeaturelet(featurelet) fletsupporter.removeFeaturelet(featurelet) list_folder_id = featurelet._info['content'][0]['id'] self.failIf(list_folder_id in self.project.objectIds()) request = self.project.REQUEST try: view = getMultiAdapter((self.project, request), Interface, ListenFeaturelet.config_view) except ComponentLookupError: pass else: self.fail("Config view shouldn't be available after the " "featurelet has been removed.")
def test_addFeaturelet(self): featurelet = ListenFeaturelet(self.project) team = makeContent(self.portal.portal_teams, 'Team', 'OpenTeam') self.project.setSpaceTeams([team]) self.assertEqual(list(self.project.objectIds()), []) request = self.project.REQUEST try: view = getMultiAdapter((self.project, request), Interface, ListenFeaturelet.config_view) except ComponentLookupError: pass else: self.fail("Config view shouldn't be available until the " "featurelet is installed.") fletsupporter = IFeatureletSupporter(self.project) fletsupporter.installFeaturelet(featurelet) list_folder_id = featurelet._info['content'][0]['id'] self.failUnless(list_folder_id in self.project.objectIds())
def save_featurelets(obj, event=None, request=None): """ IObjectModified event subscriber that installs the appropriate featurelets. """ if IContainerModifiedEvent.providedBy(event): # we only care about direct edits return if not request: request = obj.REQUEST if event and request.get('__initialize_project__', None): # bail if project isn't actuated yet and we are used via an # IObjectModifiedEvent event return if request.get('set_flets') is None: # don't do anything unless we're actually coming from the # project edit screen return # XXX there must be a better way... :-| if request.get('flet_recurse_flag') is not None: return request.set('flet_recurse_flag', True) supporter = IFeatureletSupporter(obj) flets = dict(getAdapters((supporter,), IFeaturelet)) desired = request.form.get('featurelets') if desired is None: desired = tuple() desired = set(desired) installed = set([name for name, flet in flets.items() if flet.installed]) needed = desired.difference(installed) for flet_id in needed: supporter.installFeaturelet(flets[flet_id]) removed = installed.difference(desired) for flet_id in removed: supporter.removeFeaturelet(flets[flet_id])