def test_policyWriteRead(self):
        policy = 'open_policy'
        policy_writer = IWriteWorkflowPolicySupport(self.proj)
        policy_writer.setPolicy(policy)

        policy_reader = IReadWorkflowPolicySupport(self.proj)
        returned_policy = policy_reader.getCurrentPolicyId()
        self.failUnless(policy == returned_policy)
    def test_projectEditTriggersWFPolicyEdit(self):
        req = self.proj.REQUEST
        policy = 'closed_policy'
        req.form = {'workflow_policy': policy,
                    'title': 'Some New Title',
                    }
        self.proj.processForm(REQUEST=req)

        policy_reader = IReadWorkflowPolicySupport(self.proj)
        returned_policy = policy_reader.getCurrentPolicyId()
        self.failUnless(policy == returned_policy)
def migrate_project_workflow(self):
    out = []
    wftool = getToolByName(self, 'portal_workflow')
    cat = getToolByName(self, 'portal_catalog')
    proj_brains = cat(Type='OpenProject')
    for brain in proj_brains:
        proj = brain.getObject()
        policy_reader = IReadWorkflowPolicySupport(proj)
        policy = policy_reader.getCurrentPolicyId()
        transition = PLACEFUL_POLICIES[policy]['proj_trans']
        for available_trans in wftool.getTransitionsFor(proj):
            if transition == available_trans['id']:
                wftool.doActionFor(proj, transition)
                out.append('Changed status for %s using transition: %s' % \
                           (proj.getId(), transition))
                break
    return "\n".join(out)
Пример #4
0
    def save_project_metadata(self):
        self.status.progress_descr = _(u'Saving project team and metadata')
        project = self.context

        reader = IReadWorkflowPolicySupport(self.context)
        policy = reader.getCurrentPolicyId()

        hpcontext = IHomePage(self.context)
        homepage = hpcontext.home_page

        featurelets = self._get_featurelets(project)

        list_info = {
            'id': project.getId(),
            'title': project.Title(),
            'description': project.Description(),
            'creation_date': project.CreationDate(),
            'security_policy': policy,
            'homepage': homepage,
            'featurelets': featurelets,
            'team': {},
            }
        conf_path = '%s/project/settings.ini' % self.context_dirname
        self.zipfile.writestr(conf_path, project_metadata(list_info))
Пример #5
0
    def save_project_metadata(self):
        self.status.progress_descr = _(u'Saving project team and metadata')
        project = self.context

        reader = IReadWorkflowPolicySupport(self.context)
        policy = reader.getCurrentPolicyId()

        hpcontext = IHomePage(self.context)
        homepage = hpcontext.home_page

        featurelets = self._get_featurelets(project)

        project_info = {
            'id': project.getId(),
            'title': project.Title(),
            'created_on': str(project.created()),
            'modified_on': str(project.modified()),
            'creator': project.Creator(),
            'location': project.getLocation(),

            'description': project.Description(),
            'security_policy': policy,
            'homepage': homepage,
            'featurelets': ','.join(featurelets),

            }

        logo_info = {
            'logo_filename': None,
            'logo_created_on': None,
            'logo_modified_on': None,
            'logo_creator': None,
            'logo_zippath': None,
            }
        logo = project.getLogo()
        if logo is not None:
            logo_info['logo_filename'] = logo.filename
            logo_info['logo_created_on'] = str(logo.created())
            logo_info['logo_modified_on'] = str(logo.modified())
            logo_info['logo_creator'] = logo.Creator()

            import mimetypes
            extension = mimetypes.guess_extension(logo.content_type) or ''
            logo_info['logo_zippath'] = "%s/project/logo%s" % (self.context_dirname, extension)

        project_info.update(logo_info)

        conf_path = '%s/project/settings.ini' % self.context_dirname
        self.zipfile.writestr(conf_path, project_metadata(project_info))
        self.zipfile.writestr(
            "%s/project/description.txt" % self.context_dirname,
            project_info['description'])

        if logo is not None:
            logo_filepath = logo_info['logo_zippath']
            if isinstance(logo.data, basestring):
                self.zipfile.writestr(logo_filepath, logo.data)
            else:
                assert isinstance(logo.data.data, basestring)
                self.zipfile.writestr(logo_filepath, logo.data.data)

        view = project.restrictedTraverse("@@manage-team")

        team_data = {}

        local_roles = dict([(i[0], i[1]) for i in project.get_local_roles()])

        team_data['members'] = [
            {'user_id': mship['getId'],
             'role': mship['role_value'],
             'local_roles': local_roles.get(mship['getId']),
             'timestamp': str(mship['active_since']),
             'listed': mship['listed'],
             } for mship in view.active_mships]
        team_data['join_requests'] = [
            {'user_id': mship.getId,
             'timestamp': str(mship.lastWorkflowTransitionDate),
             } for mship in view.pending_requests]
        team_data['member_invites'] = [
            {'user_id': mship.getId,
             'timestamp': str(mship.lastWorkflowTransitionDate),
             } for mship in view.pending_invitations]
        team_data['email_invites'] = [
            {'email': mship['address'],
             'timestamp': str(mship['timestamp']),
             } for mship in view.pending_email_invites]

        team_data['unconfirmed_join_requests'] = []
        mems = self.context.portal_memberdata
        for mem in mems.keys():
            mreqs = IAnnotations(mems[mem]).get(
                "opencore.member.pending_requests", {})
            if self.context.getId() in mreqs:
                team_data['unconfirmed_join_requests'].append({
                        'user_id': mem, 'message': mreqs[self.context.getId()]})

        from pprint import pprint
        pprint(team_data)

        self.zipfile.writestr('%s/project/team.json' % self.context_dirname,
                              json.dumps(team_data, indent=2))
Пример #6
0
    def handle_request(self):
        # First do validation. We don't treat validation problems as
        # exceptions, because we want to warn user of as many problems
        # as possible, not just the first one that fails.  But this
        # also means this method needs to manually bail out after
        # validation failure, to avoid saving bad data.
        title = self.request.form.get('project_title', self.request.form.get('title'))
        title = text.strip_extra_whitespace(title)
        self.request.form['project_title'] = title
        if not text.valid_title(title):
            self.errors['project_title'] = _(u'err_project_name', u'The name must contain at least 2 characters with at least 1 letter or number.')

        # We're inventing a convention by which viewlets can extend
        # forms with more form data to validate: just provide a
        # validate() method.  (And then later we'll call a save()
        # method.)
        # XXX I'd prefer to just implicitly use viewlet.update(), and
        # not explicitly iterate over them at all; but this view's
        # need to validate *everything* first prevents me from doing
        # that. Maybe this view should be re-architected.
        viewlet_mgr = getMultiAdapter((self.context, self.request, self),
                                      name='opencore.proj_prefs')
        if not hasattr(viewlet_mgr, 'viewlets'):
            # This means it hasn't had update() called yet. only do that once.
            viewlet_mgr.update()
        for viewlet in viewlet_mgr.viewlets:
            if hasattr(viewlet, 'validate'):
                self.errors.update(viewlet.validate())

        if self.errors:
            self.add_status_message(_(u'psm_correct_errors_below', u'Please correct the errors indicated below.'))
            return

        # Validation passed, so we save the data and set status PSMs.

        # start w/ the viewlets, so they can munge the form if need be
        for viewlet in viewlet_mgr.viewlets:
            if hasattr(viewlet, 'save'):
                viewlet.save()

        allowed_params = set(['__initialize_project__', 'update', 'set_flets',
                              'project_title', 'description', 'logo', 'workflow_policy',
                              'featurelets', 'home-page',
                              'location',])
        new_form = {}
        for k in allowed_params:
            if k in self.request.form:
                if 'project_title' == k:
                    # Aarrgghh!! #*!&% plone snoops into the request, and reads the form variables directly,
                    # so we have to set the form variables with the same names as the schema
                    new_form['title'] = self.request.form[k]
                else:
                    new_form[k] = self.request.form[k]

        reader = IReadWorkflowPolicySupport(self.context)
        old_workflow_policy = reader.getCurrentPolicyId()

        logo = self.request.form.get('logo')
        logochanged = False
        if logo:
            try:
                self.set_logo(logo)
                logochanged = True
            except ValueError:
                pass
            del self.request.form['logo']

        #store change status of flet, security, title, description, logo...
        try:
            title_changed = self.context.title != self.request.form.get('project_title', self.context.title)
        except UnicodeDecodeError:
            title_changed = self.context.title != self.request.form.get('project_title', self.context.title).decode('utf-8','ignore')
 
        try:
            desc_changed = self.context.Description() != self.request.form.get('description', self.context.Description())
        except UnicodeDecodeError:
            desc_changed = self.context.Description() != self.request.form.get('description', self.context.Description()).decode('utf-8','ignore')
 
        changed = {
            _(u'psm_project_title_changed') : title_changed,
            _(u'psm_project_desc_changed') : desc_changed,
            _(u'psm_project_logo_changed') : logochanged,
            _(u'psm_security_changed') : old_workflow_policy != self.request.form.get('workflow_policy'),
            #_(u'psm_location_changed'): bool(locationchanged),
            }
        
        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])

        old_form = self.request.form
        self.request.form = new_form
        self.context.processForm(REQUEST=self.request, metadata=1)
        self.request.form = old_form
        
        featurelets = set([(f.id, f.title) for f in flets if f.installed])

        for flet in featurelets:
            if flet not in old_featurelets:
                changed[_(u'psm_featurelet_added', u'${flet} feature has been added.',
                          mapping={u'flet':flet[1].capitalize()})] = 1
        
        for flet in old_featurelets:
            if flet not in featurelets:
                changed[_(u'psm_featurelet_removed', u'${flet} feature has been removed.',
                          mapping={u'flet':flet[1].capitalize()})] = 1
        
        for field, changed in changed.items():
            if changed:
                self.add_status_message(field)
        #self.add_status_message('Your changes have been saved.')

        home_page = self.request.form.get('home-page', None)
        hpcontext = IHomePage(self.context)
        if home_page is not None:
            if hpcontext.home_page != home_page:
                hp_url = '%s/%s' % (self.context.absolute_url(), home_page)
                self.add_status_message(_(u'psm_proj_homepage_change', u'${project_noun} home page set to: <a href="${hp_url}">${homepage}</a>',
                                        mapping={u'homepage':home_page, u'hp_url':hp_url,
                                                 u'project_noun':self.project_noun.title(),
                                                 }))
                hpcontext.home_page = home_page


        self.redirect(self.context.absolute_url())