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)
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))
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))
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())