def set_contact_worflow(): portal = api.portal.get() portal_workflow = api.portal.get_tool('portal_workflow') workflow = portal_workflow.getWorkflowsFor('organization') if len(workflow) > 1: logger.info(u'To much workflow for contacts.') return if len(workflow) == 0: logger.info(u'No workflow for contacts.') return workflow_id = workflow[0].id if workflow_id == 'cpskin_collective_contact_workflow': logger.info(u'cpskin_collective_contact_workflow already set.') return chain = ('cpskin_collective_contact_workflow',) types = ('held_position', 'organization', 'person', 'position') state_map = {'active': 'active', 'deactivated': 'deactivated'} remap_workflow(portal, type_ids=types, chain=chain, state_map=state_map) util = queryUtility(IRAMCache) if util is not None: util.invalidateAll()
def test_remap_to_no_workflow(self): view_at_d1 = [ r['name'] for r in self.portal.d1.rolesOfPermission('View') if r['selected'] ] self.assertTrue('Anonymous' in view_at_d1) remap_workflow(self.portal, type_ids=( 'Document', 'News Item', ), chain=()) self.assertEqual(self._chain(self.portal.d1), ()) self.assertEqual(self._chain(self.portal.d2), ()) self.assertEqual(self._chain(self.portal.n1), ()) view_at_d1 = [ r['name'] for r in self.portal.d1.rolesOfPermission('View') if r['selected'] ] self.assertFalse('Anonymous' in view_at_d1) self.assertTrue(self.portal.d1.acquiredRolesAreUsedBy('View'))
def upgrade_timeslot_workflow(context, logger=None): """ Upgrade workflow of timeslots and days """ if logger is None: # Called as upgrade step: define our own logger. logger = logging.getLogger('uwosh.timeslot') #Run the workflow setup setup = getToolByName(context, 'portal_setup') setup.runImportStepFromProfile(PROFILE_ID, 'workflow') remap_workflow(context, type_ids=('Day', 'Time Slot'), chain='(Default)', state_map={'hidden': 'private'} ) remap_workflow(context, type_ids=('Day', 'Time Slot'), chain=('uwosh_timeslot_hidden_workflow',), state_map={'private': 'open', 'pending': 'open', 'published': 'open'} ) return
def test_remap_from_no_workflow(self): remap_workflow(self.portal, type_ids=('Image', ), chain=('plone_workflow', )) self.assertEqual(self._chain(self.portal.i1), ('plone_workflow', )) self.assertEqual(self._state(self.portal.i1), 'visible')
def test_remap_from_no_workflow(self): remap_workflow(self.portal, type_ids=('Image', ), chain=('plone_workflow', )) self.assertEquals(self._chain(self.portal.i1), ('plone_workflow', )) self.assertEquals(self._state(self.portal.i1), 'visible')
def _replaceProjectWorkflow(self): """ Replace the project workflow by new ones """ from plone.app.workflow.remap import remap_workflow pw = self.portal.portal_workflow # pstaction if 'pst_action_workflow' not in pw.getChainForPortalType('pstaction'): mapping = { 'created': 'created', 'ongoing': 'ongoing', 'stopped': 'stopped', 'terminated': 'terminated', 'to_be_scheduled': 'to_be_scheduled' } remap_workflow(self.context, ['pstaction'], ['pst_action_workflow'], state_map=mapping) # objectives if 'pst_objective_workflow' not in pw.getChainForPortalType( 'operationalobjective'): mapping = { 'created': 'created', 'ongoing': 'ongoing', 'stopped': 'achieved', 'terminated': 'achieved', 'to_be_scheduled': 'ongoing' } remap_workflow(self.context, ['strategicobjective', 'operationalobjective'], ['pst_objective_workflow'], state_map=mapping)
def test_remap_to_no_workflow(self): view_at_d1 = [ r['name'] for r in self.portal.d1.rolesOfPermission('View') if r['selected'] ] self.assertIn('Anonymous', view_at_d1) remap_workflow( self.portal, type_ids=('Document', 'News Item', ), chain=(), ) self.assertEqual(self._chain(self.portal.d1), ()) self.assertEqual(self._chain(self.portal.d2), ()) self.assertEqual(self._chain(self.portal.n1), ()) view_at_d1 = [ r['name'] for r in self.portal.d1.rolesOfPermission('View') if r['selected'] ] self.assertFalse('Anonymous' in view_at_d1) self.assertTrue(self.portal.d1.acquiredRolesAreUsedBy('View'))
def _remapSubscriberWorkflow(context): type_ids = ('Subscriber',) chain = ('subscriber_workflow',) state_map = {'published': 'published'} logger.info('Remapping Subscriber workflow') remap_workflow(context, type_ids=type_ids, chain=chain, state_map=state_map) logger.info('Subscriber workflow remapped')
def test_remap_to_default(self): self.workflow.setDefaultChain('plone_workflow') remap_workflow( self.portal, type_ids=('Image', ), chain='(Default)', ) self.assertEqual(self._chain(self.portal.i1), ('plone_workflow', ))
def simulateCommunityWF(self): """Make minimal changes to simulate the 2.5 style WF defaults""" from plone.app.workflow.remap import remap_workflow # remap_workflow(self.portal, type_ids=('PressRoom', 'Topic'), # chain=('plone_workflow',)) remap_workflow(self.portal, type_ids=('Folder',), chain=('folder_workflow',)) workflow = getToolByName(self.portal, 'portal_workflow') workflow.setDefaultChain('plone_workflow')
def test_remap_multiple_no_state_map(self): remap_workflow(self.portal, type_ids=("Document", "News Item"), chain=("plone_workflow",)) self.assertEquals(self._chain(self.portal.d1), ("plone_workflow",)) self.assertEquals(self._chain(self.portal.d2), ("plone_workflow",)) self.assertEquals(self._chain(self.portal.n1), ("plone_workflow",)) self.assertEquals(self._state(self.portal.d1), "visible") self.assertEquals(self._state(self.portal.d2), "visible") self.assertEquals(self._state(self.portal.n1), "visible")
def test_remap_multiple_no_state_map(self): remap_workflow(self.portal, type_ids=('Document', 'News Item', ), chain=('plone_workflow', )) self.assertEquals(self._chain(self.portal.d1), ('plone_workflow', )) self.assertEquals(self._chain(self.portal.d2), ('plone_workflow', )) self.assertEquals(self._chain(self.portal.n1), ('plone_workflow', )) self.assertEquals(self._state(self.portal.d1), 'visible') self.assertEquals(self._state(self.portal.d2), 'visible') self.assertEquals(self._state(self.portal.n1), 'visible')
def test_remap_multiple_no_state_map(self): remap_workflow(self.portal, type_ids=('Document', 'News Item', ), chain=('plone_workflow', )) self.assertEqual(self._chain(self.portal.d1), ('plone_workflow', )) self.assertEqual(self._chain(self.portal.d2), ('plone_workflow', )) self.assertEqual(self._chain(self.portal.n1), ('plone_workflow', )) self.assertEqual(self._state(self.portal.d1), 'visible') self.assertEqual(self._state(self.portal.d2), 'visible') self.assertEqual(self._state(self.portal.n1), 'visible')
def from_2_x_to_3_0(context): log = logging.getLogger('FacultyStaffDirectory') context.runImportStepFromProfile('profile-Products.FacultyStaffDirectory:default','workflow') try: remap_workflow(context, ('FSDFacultyStaffDirectory',), ('fsd_directory_workflow',), {}) except Exception, message: log.error(message) raise
def test_remap_with_partial_state_map(self): remap_workflow(self.portal, type_ids=('Document', 'News Item', ), chain=('plone_workflow', ), state_map={'published': 'published'}) self.assertEqual(self._chain(self.portal.d1), ('plone_workflow', )) self.assertEqual(self._chain(self.portal.d2), ('plone_workflow', )) self.assertEqual(self._chain(self.portal.n1), ('plone_workflow', )) self.assertEqual(self._state(self.portal.d1), 'published') self.assertEqual(self._state(self.portal.d2), 'visible') self.assertEqual(self._state(self.portal.n1), 'published')
def test_remap_with_partial_state_map(self): remap_workflow(self.portal, type_ids=('Document', 'News Item', ), chain=('plone_workflow', ), state_map={'published': 'published'}) self.assertEquals(self._chain(self.portal.d1), ('plone_workflow', )) self.assertEquals(self._chain(self.portal.d2), ('plone_workflow', )) self.assertEquals(self._chain(self.portal.n1), ('plone_workflow', )) self.assertEquals(self._state(self.portal.d1), 'published') self.assertEquals(self._state(self.portal.d2), 'visible') self.assertEquals(self._state(self.portal.n1), 'published')
def to_one(context): context.runImportStepFromProfile('profile-cpskin.workflow:to1', 'workflow') chain = ('cpskin_collective_contact_workflow',) types = ('held_position', 'organization', 'person', 'position') state_map = {'active': 'active', 'deactivated': 'deactivated'} remap_workflow(context, type_ids=types, chain=chain, state_map=state_map) util = queryUtility(IRAMCache) if util is not None: util.invalidateAll()
def test_remap_to_no_workflow(self): view_at_d1 = [r["name"] for r in self.portal.d1.rolesOfPermission("View") if r["selected"]] self.failUnless("Anonymous" in view_at_d1) remap_workflow(self.portal, type_ids=("Document", "News Item"), chain=()) self.assertEquals(self._chain(self.portal.d1), ()) self.assertEquals(self._chain(self.portal.d2), ()) self.assertEquals(self._chain(self.portal.n1), ()) view_at_d1 = [r["name"] for r in self.portal.d1.rolesOfPermission("View") if r["selected"]] self.failIf("Anonymous" in view_at_d1) self.failUnless(self.portal.d1.acquiredRolesAreUsedBy("View"))
def _remapContactsWokflows(self): """Use 'plonemeeting_activity_managers_workflow' instead 'collective_contact_core_workflow' for person and held_position portal_types.""" logger.info( "Changing workflow for person and held_position portal_types...") person_wf = self.wfTool.getWorkflowsFor('person')[0] if person_wf.getId() != 'plonemeeting_activity_managers_workflow': remap_workflow(context=self.portal, type_ids=['person', 'held_position'], chain=['plonemeeting_activity_managers_workflow'], state_map={ 'active': 'active', 'deactivated': 'inactive' }) logger.info('Done.')
def test_remap_with_partial_state_map(self): remap_workflow( self.portal, type_ids=("Document", "News Item"), chain=("plone_workflow",), state_map={"published": "published"}, ) self.assertEquals(self._chain(self.portal.d1), ("plone_workflow",)) self.assertEquals(self._chain(self.portal.d2), ("plone_workflow",)) self.assertEquals(self._chain(self.portal.n1), ("plone_workflow",)) self.assertEquals(self._state(self.portal.d1), "published") self.assertEquals(self._state(self.portal.d2), "visible") self.assertEquals(self._state(self.portal.n1), "published")
def set_contact_worflow(self): portal = api.portal.get() workflow_id = self.get_workflow_id('organization') if workflow_id == 'cpskin_collective_contact_workflow': self._redirect('cpskin_collective_contact_workflow already set.') chain = ('cpskin_collective_contact_workflow', ) types = ('held_position', 'organization', 'person', 'position') state_map = {'active': 'active', 'deactivated': 'deactivated'} remap_workflow(portal, type_ids=types, chain=chain, state_map=state_map) util = queryUtility(IRAMCache) if util is not None: util.invalidateAll() self._redirect('cpskin_collective_contact_workflow set.')
def from_2_x_to_3_0(context): log = logging.getLogger('FacultyStaffDirectory') context.runImportStepFromProfile('profile-Products.FacultyStaffDirectory:default','workflow') try: remap_workflow(context, ('FSDFacultyStaffDirectory',), ('fsd_directory_workflow',), {}) except Exception as message: log.error(message) raise # log it log = logging.getLogger("FacultyStaffDirectory") log.info("Upgraded version 2 to version 3.0b1")
def add_cpskin_collective_contact_workflow(context): context.runImportStepFromProfile('profile-cpskin.workflow:to1', 'workflow') chain = ('cpskin_collective_contact_workflow',) types = ('held_position', 'organization', 'person', 'position') state_map = {'active': 'active', 'deactivated': 'deactivated'} remap_workflow(context, type_ids=types, chain=chain, state_map=state_map) util = queryUtility(IRAMCache) if util is not None: util.invalidateAll() # set a workflow version context.runAllImportStepsFromProfile('profile-cpskin.workflow:default')
def set_contact_worflow(self): portal = api.portal.get() workflow_id = self.get_workflow_id('organization') if workflow_id == 'cpskin_collective_contact_workflow': self._redirect('cpskin_collective_contact_workflow already set.') chain = ('cpskin_collective_contact_workflow',) types = ('held_position', 'organization', 'person', 'position') state_map = {'active': 'active', 'deactivated': 'deactivated'} remap_workflow(portal, type_ids=types, chain=chain, state_map=state_map) util = queryUtility(IRAMCache) if util is not None: util.invalidateAll() self._redirect('cpskin_collective_contact_workflow set.')
def set_contact_worflow(): portal = api.portal.get() portal_workflow = api.portal.get_tool("portal_workflow") workflow = portal_workflow.getWorkflowsFor("organization") if len(workflow) > 1: logger.info(u"To much workflow for contacts.") return if len(workflow) == 0: logger.info(u"No workflow for contacts.") return workflow_id = workflow[0].id if workflow_id == "cpskin_collective_contact_workflow": logger.info(u"cpskin_collective_contact_workflow already set.") return chain = ("cpskin_collective_contact_workflow",) types = ("held_position", "organization", "person", "position") state_map = {"active": "active", "deactivated": "deactivated"} remap_workflow(portal, type_ids=types, chain=chain, state_map=state_map) util = queryUtility(IRAMCache) if util is not None: util.invalidateAll()
def __call__(self): self.errors = {} state = self.selected_state transitions = self.available_transitions state_id = state.id self.is_using_state = False for transition in transitions: if transition.new_state_id == state_id: self.is_using_state = True break if self.request.get('form.actions.delete', False): self.authorize() if self.is_using_state: replacement = self.request.get('replacement-state', self.available_states[0].id) for transition in self.available_transitions: if state_id == transition.new_state_id: transition.new_state_id = replacement chains = self.portal_workflow.listChainOverrides() types_ids = [c[0] for c in chains if self.selected_workflow.id in c[1]] remap_workflow(self.context, types_ids, (self.selected_workflow.id, ), {state_id: replacement}) self.selected_workflow.states.deleteStates([state_id]) return self.handle_response( message=_('msg_state_deleted', default=u'"${id}" state has been successfully deleted.', mapping={'id': state_id})) elif self.request.get('form.actions.cancel', False) == 'Cancel': return self.handle_response( message=_('msg_state_deletion_canceled', default=u'Deleting the "${id}" state has been canceled.', mapping={'id': state_id})) else: return self.handle_response(tmpl=self.template)
def test_remap_to_default(self): remap_workflow(self.portal, type_ids=('Folder', ), chain='(Default)') self.assertEquals(self._chain(self.portal.i1), ('plone_workflow', ))
def test_remap_to_default(self): remap_workflow(self.portal, type_ids=("Folder",), chain="(Default)") self.assertEquals(self._chain(self.portal.i1), ("plone_workflow",))
def test_remap_from_no_workflow(self): remap_workflow(self.portal, type_ids=("Image",), chain=("plone_workflow",)) self.assertEquals(self._chain(self.portal.i1), ("plone_workflow",)) self.assertEquals(self._state(self.portal.i1), "visible")
def __call__(self): """Perform the update and redirect if necessary, or render the page """ postback = True context = aq_inner(self.context) form = self.request.form submitted = form.get('form.submitted', False) save_button = form.get('form.button.Save', None) is not None cancel_button = form.get('form.button.Cancel', None) is not None type_id = form.get('old_type_id', None) if submitted and not cancel_button: if type_id: portal_types = getToolByName(self.context, 'portal_types') portal_repository = getToolByName(self.context, 'portal_repository') fti = getattr(portal_types, type_id) # Set FTI properties addable = form.get('addable', False) allow_discussion = form.get('allow_discussion', False) fti.manage_changeProperties( global_allow=bool(addable), allow_discussion=bool(allow_discussion) ) version_policy = form.get('versionpolicy', "off") if version_policy != self.current_versioning_policy(): newpolicy = [ p for p in VERSION_POLICIES if p["id"] == version_policy][0] versionable_types = list( portal_repository.getVersionableContentTypes() ) if not newpolicy["policy"]: # check if we need to remove if type_id in versionable_types: versionable_types.remove(type_id) self.remove_versioning_behavior(fti) else: # check if we should add if type_id not in versionable_types: versionable_types.append(safe_unicode(type_id)) self.add_versioning_behavior(fti) for policy in portal_repository.listPolicies(): policy_id = policy.getId() if policy_id in newpolicy["policy"]: portal_repository.addPolicyForContentType( type_id, policy_id ) else: portal_repository.removePolicyFromContentType( type_id, policy_id ) portal_repository.setVersionableContentTypes( versionable_types ) # Set Registry-entries registry = getUtility(IRegistry) searchable = form.get('searchable', False) site_settings = registry.forInterface( ISearchSchema, prefix="plone") blacklisted = [i for i in site_settings.types_not_searched] if searchable and type_id in blacklisted: blacklisted.remove(type_id) elif not searchable and type_id not in blacklisted: blacklisted.append(type_id) site_settings.types_not_searched = tuple(blacklisted) default_page_type = form.get('default_page_type', False) types_settings = registry.forInterface( ITypesSchema, prefix="plone") default_page_types = [ safe_unicode(i) for i in types_settings.default_page_types] if default_page_type and type_id not in default_page_types: default_page_types.append(safe_unicode(type_id)) elif not default_page_type and type_id in default_page_types: default_page_types.remove(type_id) types_settings.default_page_types = default_page_types redirect_links = form.get('redirect_links', False) types_settings.redirect_links = redirect_links # Update workflow if self.have_new_workflow() \ and form.get('form.workflow.submitted', False) \ and save_button: if self.new_workflow_is_different(): new_wf = self.new_workflow() if new_wf == '[none]': chain = () elif new_wf == '(Default)': chain = new_wf else: chain = (new_wf,) state_map = dict([ (s['old_state'], s['new_state']) for s in form.get('new_wfstates', []) ]) if '[none]' in state_map: state_map[None] = state_map['[none]'] del state_map['[none]'] if type_id: type_ids = (type_id,) else: wt = getToolByName(self.context, 'portal_workflow') tt = getToolByName(self.context, 'portal_types') nondefault = [ info[0] for info in wt.listChainOverrides() ] type_ids = [ type for type in tt.listContentTypes() if type not in nondefault ] wt.setChainForPortalTypes( type_ids, wt.getDefaultChain() ) wt.setDefaultChain(','.join(chain)) chain = '(Default)' remap_workflow(context, type_ids=type_ids, chain=chain, state_map=state_map) data = {'workflow': new_wf} notify(ConfigurationChangedEvent(self, data)) else: portal_workflow = getToolByName(context, 'portal_workflow') if self.new_workflow() == '(Default)': # The WorkflowTool API can not handle this sanely cbt = portal_workflow._chains_by_type if type_id in cbt: del cbt[type_id] else: portal_workflow.setChainForPortalTypes( (type_id,), self.new_workflow() ) self.request.response.redirect( '%s/@@content-controlpanel?type_id=%s' % ( context.absolute_url(), type_id ) ) postback = False elif cancel_button: self.request.response.redirect( self.context.absolute_url() + '/@@overview-controlpanel') postback = False if postback: return self.template()
def test_remap_to_default(self): remap_workflow(self.portal, type_ids=('Folder', ), chain='(Default)') self.assertEqual(self._chain(self.portal.i1), ('plone_workflow', ))
def __call__(self): """Perform the update and redirect if necessary, or render the page """ postback = True context = aq_inner(self.context) form = self.request.form submitted = form.get('form.submitted', False) save_button = form.get('form.button.Save', None) is not None cancel_button = form.get('form.button.Cancel', None) is not None type_id = form.get('old_type_id', None) if submitted and not cancel_button: if type_id: portal_types = getToolByName(self.context, 'portal_types') portal_repository = getToolByName(self.context, 'portal_repository') portal_properties = getToolByName(self.context, 'portal_properties') site_properties = getattr(portal_properties, 'site_properties') fti = getattr(portal_types, type_id) # Set FTI properties addable = form.get('addable', False) allow_discussion = form.get('allow_discussion', False) fti.manage_changeProperties( global_allow=bool(addable), allow_discussion=bool(allow_discussion)) version_policy = form.get('versionpolicy', "off") if version_policy != self.current_versioning_policy(): newpolicy = [ p for p in VERSION_POLICIES if p["id"] == version_policy ][0] versionable_types = list( portal_repository.getVersionableContentTypes()) if not newpolicy["policy"]: if type_id in versionable_types: versionable_types.remove(type_id) else: if type_id not in versionable_types: versionable_types.append(type_id) for policy in portal_repository.listPolicies(): policy_id = policy.getId() if policy_id in newpolicy["policy"]: portal_repository.addPolicyForContentType( type_id, policy_id) else: portal_repository.removePolicyFromContentType( type_id, policy_id) portal_repository.setVersionableContentTypes( versionable_types) searchable = form.get('searchable', False) blacklisted = list( site_properties.getProperty('types_not_searched')) if searchable and type_id in blacklisted: blacklisted.remove(type_id) elif not searchable and type_id not in blacklisted: blacklisted.append(type_id) site_properties.manage_changeProperties(types_not_searched = \ blacklisted) if type_id == 'Link': redirect_links = form.get('redirect_links', False) site_properties.manage_changeProperties(redirect_links = \ redirect_links) # Update workflow if self.have_new_workflow() and \ form.get('form.workflow.submitted', False) and \ save_button: if self.new_workflow_is_different(): new_wf = self.new_workflow() if new_wf == '[none]': chain = () elif new_wf == '(Default)': chain = new_wf else: chain = (new_wf, ) state_map = dict([(s['old_state'], s['new_state']) for s in \ form.get('new_wfstates', [])]) if state_map.has_key('[none]'): state_map[None] = state_map['[none]'] del state_map['[none]'] if type_id: type_ids = (type_id, ) else: wt = getToolByName(self.context, 'portal_workflow') tt = getToolByName(self.context, 'portal_types') nondefault = [ info[0] for info in wt.listChainOverrides() ] type_ids = [ type for type in tt.listContentTypes() if type not in nondefault ] wt.setChainForPortalTypes(type_ids, wt.getDefaultChain()) wt.setDefaultChain(','.join(chain)) chain = '(Default)' remap_workflow(context, type_ids=type_ids, chain=chain, state_map=state_map) data = {'workflow': new_wf} notify(ConfigurationChangedEvent(self, data)) else: portal_workflow = getToolByName(context, 'portal_workflow') if self.new_workflow() == '(Default)': # The WorkflowTool API can not handle this sanely cbt = portal_workflow._chains_by_type if cbt.has_key(type_id): del cbt[type_id] else: portal_workflow.setChainForPortalTypes( (type_id, ), self.new_workflow()) self.request.response.redirect('%s/@@types-controlpanel?\ type_id=%s' % (context.absolute_url(), type_id)) postback = False elif cancel_button: self.request.response.redirect(self.context.absolute_url() + \ '/plone_control_panel') postback = False if postback: return self.template()
def __call__(self): """Perform the update and redirect if necessary, or render the page """ postback = True context = aq_inner(self.context) form = self.request.form submitted = form.get('form.submitted', False) save_button = form.get('form.button.Save', None) is not None cancel_button = form.get('form.button.Cancel', None) is not None type_id = form.get('old_type_id', None) if submitted and not cancel_button: if type_id: portal_types = getToolByName(self.context, 'portal_types') portal_repository = getToolByName(self.context, 'portal_repository') fti = getattr(portal_types, type_id) # Set FTI properties addable = form.get('addable', False) allow_discussion = form.get('allow_discussion', False) fti.manage_changeProperties( global_allow=bool(addable), allow_discussion=bool(allow_discussion)) version_policy = form.get('versionpolicy', "off") if version_policy != self.current_versioning_policy(): newpolicy = [ p for p in VERSION_POLICIES if p["id"] == version_policy ][0] versionable_types = list( portal_repository.getVersionableContentTypes()) if not newpolicy["policy"]: # check if we need to remove if type_id in versionable_types: versionable_types.remove(type_id) self.remove_versioning_behavior(fti) else: # check if we should add if type_id not in versionable_types: versionable_types.append(safe_unicode(type_id)) self.add_versioning_behavior(fti) for policy in portal_repository.listPolicies(): policy_id = policy.getId() if policy_id in newpolicy["policy"]: portal_repository.addPolicyForContentType( type_id, policy_id) else: portal_repository.removePolicyFromContentType( type_id, policy_id) portal_repository.setVersionableContentTypes( versionable_types) # Set Registry-entries registry = getUtility(IRegistry) searchable = form.get('searchable', False) site_settings = registry.forInterface(ISearchSchema, prefix="plone") blacklisted = [i for i in site_settings.types_not_searched] if searchable and type_id in blacklisted: blacklisted.remove(type_id) elif not searchable and type_id not in blacklisted: blacklisted.append(type_id) site_settings.types_not_searched = tuple(blacklisted) default_page_type = form.get('default_page_type', False) types_settings = registry.forInterface(ITypesSchema, prefix="plone") default_page_types = [ safe_unicode(i) for i in types_settings.default_page_types ] if default_page_type and type_id not in default_page_types: default_page_types.append(safe_unicode(type_id)) elif not default_page_type and type_id in default_page_types: default_page_types.remove(type_id) types_settings.default_page_types = default_page_types redirect_links = form.get('redirect_links', False) types_settings.redirect_links = redirect_links # Update workflow if self.have_new_workflow() \ and form.get('form.workflow.submitted', False) \ and save_button: if self.new_workflow_is_different(): new_wf = self.new_workflow() if new_wf == '[none]': chain = () elif new_wf == '(Default)': chain = new_wf else: chain = (new_wf, ) state_map = dict([(s['old_state'], s['new_state']) for s in form.get('new_wfstates', [])]) if '[none]' in state_map: state_map[None] = state_map['[none]'] del state_map['[none]'] if type_id: type_ids = (type_id, ) else: wt = getToolByName(self.context, 'portal_workflow') tt = getToolByName(self.context, 'portal_types') nondefault = [ info[0] for info in wt.listChainOverrides() ] type_ids = [ type for type in tt.listContentTypes() if type not in nondefault ] wt.setChainForPortalTypes(type_ids, wt.getDefaultChain()) wt.setDefaultChain(','.join(chain)) chain = '(Default)' remap_workflow(context, type_ids=type_ids, chain=chain, state_map=state_map) data = {'workflow': new_wf} notify(ConfigurationChangedEvent(self, data)) else: portal_workflow = getToolByName(context, 'portal_workflow') if self.new_workflow() == '(Default)': # The WorkflowTool API can not handle this sanely cbt = portal_workflow._chains_by_type if type_id in cbt: del cbt[type_id] else: portal_workflow.setChainForPortalTypes( (type_id, ), self.new_workflow()) self.request.response.redirect( '%s/@@content-controlpanel?type_id=%s' % (context.absolute_url(), type_id)) postback = False elif cancel_button: self.request.response.redirect(self.context.absolute_url() + '/@@overview-controlpanel') postback = False if postback: return self.template()
def __call__(self): """Perform the update and redirect if necessary, or render the page """ postback = True context = aq_inner(self.context) form = self.request.form submitted = form.get('form.submitted', False) save_button = form.get('form.button.Save', None) is not None cancel_button = form.get('form.button.Cancel', None) is not None type_id = form.get('old_type_id', None) if submitted and not cancel_button: if type_id: portal_types = getToolByName(self.context, 'portal_types') portal_repository = getToolByName(self.context, 'portal_repository') portal_properties = getToolByName(self.context, 'portal_properties') site_properties = getattr(portal_properties, 'site_properties') fti = getattr(portal_types, type_id) # Set FTI properties addable = form.get('addable', False) allow_discussion = form.get('allow_discussion', False) fti.manage_changeProperties(global_allow = bool(addable), allow_discussion = bool(allow_discussion)) version_policy = form.get('versionpolicy', "off") if version_policy!=self.current_versioning_policy(): newpolicy=[p for p in VERSION_POLICIES if p["id"]==version_policy][0] versionable_types = list(portal_repository.getVersionableContentTypes()) if not newpolicy["policy"]: if type_id in versionable_types: versionable_types.remove(type_id) else: if type_id not in versionable_types: versionable_types.append(type_id) for policy in portal_repository.listPolicies(): policy_id = policy.getId() if policy_id in newpolicy["policy"]: portal_repository.addPolicyForContentType(type_id, policy_id) else: portal_repository.removePolicyFromContentType(type_id, policy_id) portal_repository.setVersionableContentTypes(versionable_types) searchable = form.get('searchable', False) blacklisted = list(site_properties.getProperty('types_not_searched')) if searchable and type_id in blacklisted: blacklisted.remove(type_id) elif not searchable and type_id not in blacklisted: blacklisted.append(type_id) site_properties.manage_changeProperties(types_not_searched = \ blacklisted) redirect_links = form.get('redirect_links', False) site_properties.manage_changeProperties(redirect_links = \ redirect_links) # Update workflow if self.have_new_workflow() and \ form.get('form.workflow.submitted', False) and \ save_button: if self.new_workflow_is_different(): new_wf = self.new_workflow() if new_wf == '[none]': chain = () elif new_wf == '(Default)': chain = new_wf else: chain = (new_wf,) state_map = dict([(s['old_state'], s['new_state']) for s in \ form.get('new_wfstates', [])]) if state_map.has_key('[none]'): state_map[None] = state_map['[none]'] del state_map['[none]'] if type_id: type_ids=(type_id,) else: wt = getToolByName(self.context, 'portal_workflow') tt = getToolByName(self.context, 'portal_types') nondefault = [info[0] for info in wt.listChainOverrides()] type_ids = [type for type in tt.listContentTypes() if type not in nondefault] wt.setChainForPortalTypes(type_ids, wt.getDefaultChain()) wt.setDefaultChain(','.join(chain)) chain='(Default)' remap_workflow(context, type_ids=type_ids, chain=chain, state_map=state_map) data = {'workflow': new_wf} notify(ConfigurationChangedEvent(self, data)) else: portal_workflow = getToolByName(context, 'portal_workflow') if self.new_workflow()=='(Default)': # The WorkflowTool API can not handle this sanely cbt=portal_workflow._chains_by_type if cbt.has_key(type_id): del cbt[type_id] else: portal_workflow.setChainForPortalTypes((type_id,), self.new_workflow()) self.request.response.redirect('%s/@@types-controlpanel?\ type_id=%s' % (context.absolute_url() , type_id)) postback = False elif cancel_button: self.request.response.redirect(self.context.absolute_url() + \ '/plone_control_panel') postback = False if postback: return self.template()
def restore_links_workflow(context): portal = api.portal.get() remap_workflow(portal, type_ids=("Link", ), chain="(Default)")