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])
def get_featurelets(project): """ Returns a list of dicts representing the featurelets that are installed into the provided project. """ supporter = IFeatureletSupporter(project) flet_ids = supporter.getInstalledFeatureletIds() getfletdesc = supporter.getFeatureletDescriptor result = [] for id in flet_ids: flet_info = getfletdesc(id) if flet_info is None: # flet registered but non-functional continue menu_item = flet_info['menu_items'][0] result.append( {'name': id, 'url' : menu_item['action'], 'title': menu_item['title'], } ) return result
def addProjectView(self): projectInfoView = self.projectInfoView project = projectInfoView.project proj_home_url = project.absolute_url() self.addMenuItem('Project Home', proj_home_url) if self.mtool.checkPermission(CopyOrMove, project): self.addMenuItem('Contents', '%s/folder_contents' % proj_home_url) self.addMenuItem('Contact', '%s/contact_project_admins' % proj_home_url) supporter = IFeatureletSupporter(projectInfoView.project) for i in supporter.getInstalledFeatureletIds(): desc = supporter.getFeatureletDescriptor(i) self.addMenuItem(desc['menu_items'][0]['title'], '%s/%s' % (proj_home_url, desc['menu_items'][0]['action'])) if self.mtool.checkPermission(ModifyPortalContent, project): self.addMenuItem('Preferences', '%s/edit' % proj_home_url)
def rm_tasktracker_btree_storage(self): """extension method to remove tt storage where self is the portal""" projs_with_taskstorage_removed = [] projs_with_no_taskstorage = [] for pbrain in self.portal_catalog(portal_type='OpenProject'): proj = pbrain.getObject() fs = IFeatureletSupporter(proj) installed_storage_ids = fs.getInstalledFeatureletIds() if 'tasks' in installed_storage_ids: fs.storage.pop('tasks') projs_with_taskstorage_removed.append(proj.id) else: projs_with_no_taskstorage.append(proj.id) out = StringIO() out.write('Projects with no tasktracker btree storage:\n') out.write('\n'.join(projs_with_no_taskstorage)) out.write('\n\n') out.write('Projects with tasktracker btree storage removed:\n') out.write('\n'.join(projs_with_taskstorage_removed)) transaction.get().note('Removed tasktracker btree storage on %d items' % len(projs_with_taskstorage_removed)) return out.getvalue()
def lists(self): supporter = IFeatureletSupporter(self.context) descriptor = supporter.getFeatureletDescriptor(ListenFeaturelet.id) container = self.context._getOb(descriptor['content'][0]['id']) lists = container.objectValues(spec=MailingList.meta_type) return lists
def handle_flet_uninstall(project, event=None): supporter = IFeatureletSupporter(project) for flet_id in supporter.getInstalledFeatureletIds(): supporter.removeFeaturelet(flet_id, raise_error=False)