コード例 #1
0
    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())
コード例 #2
0
    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.")
コード例 #3
0
    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())
コード例 #4
0
ファイル: handler.py プロジェクト: socialplanning/opencore
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])
コード例 #5
0
ファイル: utils.py プロジェクト: socialplanning/opencore
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
コード例 #6
0
ファイル: menus.py プロジェクト: socialplanning/opencore
    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)
コード例 #7
0
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()
コード例 #8
0
ファイル: listen.py プロジェクト: socialplanning/opencore
 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
コード例 #9
0
def handle_flet_uninstall(project, event=None):
    supporter = IFeatureletSupporter(project)
    for flet_id in supporter.getInstalledFeatureletIds():
        supporter.removeFeaturelet(flet_id, raise_error=False)