def __call__(self): """ Create a new revision based on an existing item IRevisionFile """ revisionfile_info = IRevisionFileInfo(self.context) revision_folder = revisionfile_info.revision_folder() revision_info = IRevisionInfo(revision_folder) next_code = revision_info.next_code() try: _copy(revision_folder, self.context, revision_folder, self.context.getId(), next_code) cloned_revision = getattr(revision_folder, next_code) member = getMultiAdapter((self.context, self.request), name=u'plone_portal_state').member() creator = member.getId() cloned_revision.setCreators([creator]) plone_utils = getToolByName(self.context, 'plone_utils') plone_utils.changeOwnershipOf(cloned_revision, member.getId()) cloned_revision.setRelatedItems(self.context.getRelatedItems()) cloned_revision.setEffectiveDate(None) cloned_revision.reindexObject() cloned_revision.reindexObjectSecurity() except ConflictError: raise except Exception: IStatusMessage(self.request).addStatusMessage(_(u'cloned_revision_error', default=u'Error'), type='error') else: IStatusMessage(self.request).addStatusMessage(_(u'cloned_revision_ok', default=u'Revision cloned correctly'), type='info') self.request.response.redirect("/".join(revision_folder.getPhysicalPath()))
def test_revision_info_adapter(self): """ """ from redomino.revision.interfaces import IRevisionInfo revision1_info = self._revision1_info() self.assertTrue(IRevisionInfo.providedBy(revision1_info)) from redomino.revision.content.revision import RevisionInfo self.assertIsInstance(revision1_info, RevisionInfo) self.assertTrue(IRevisionInfo.implementedBy(RevisionInfo))
def __call__(self): """ Create a new revision folder based on an existing item """ context_id = self.context.getId() parent = getMultiAdapter((self.context, self.request), name=u'plone_context_state').parent() try: uniqueid = parent.generateUniqueId('Folder') uniqueid = parent.invokeFactory('Folder', uniqueid) folderish_obj = getattr(parent, uniqueid) folderish_obj.setTitle(self.context.Title()) alsoProvides(folderish_obj, IRevision) revision_info = IRevisionInfo(folderish_obj) next_code = revision_info.next_code() transaction.savepoint(optimistic=True) _move(parent, self.context, folderish_obj, context_id, next_code) revisionfile = getattr(folderish_obj, next_code) alsoProvides(revisionfile, IRevisionFile) _move(parent, folderish_obj, parent, uniqueid, context_id) newcontext = getattr(parent, context_id) ppw = getToolByName(newcontext, 'portal_placeful_workflow', None) if ppw: portal_type = self.context.portal_type priority_utility = queryUtility(IRevisionWorkflowUtility, name=portal_type) priority_utility = not priority_utility and queryUtility(IRevisionWorkflowUtility) policy_id = priority_utility and priority_utility.policy_id() if policy_id and ppw.isValidPolicyName(policy_id): old_sm = SecurityManagement.getSecurityManager() try: SecurityManagement.newSecurityManager(None, SpecialUsers.system) newcontext.manage_addProduct['CMFPlacefulWorkflow'].manage_addWorkflowPolicyConfig() config = ppw.getWorkflowPolicyConfig(newcontext) config.setPolicyIn(policy=policy_id) config.setPolicyBelow(policy=policy_id, update_security=True) finally: SecurityManagement.setSecurityManager(old_sm) newcontext.reindexObject() newcontext.reindexObjectSecurity() except ConflictError: raise except Exception: view_url = getMultiAdapter((self.context, self.request), name=u'plone_context_state').view_url() self.request.response.redirect(view_url) IStatusMessage(self.request).addStatusMessage(_(u'enabled_revision_error', default=u'Error'), type='error') else: view_url = getMultiAdapter((folderish_obj, self.request), name=u'plone_context_state').view_url() self.request.response.redirect(view_url) IStatusMessage(self.request).addStatusMessage(_(u'enabled_revision_ok', default=u'Revision created correctly'), type='info')
def revisionfile_deleted(obj, event): """ Reindex the revision folder item """ if obj is not event.object: return revisionfile_info = IRevisionFileInfo(obj) revision_folder = revisionfile_info.revision_folder() revision_info = IRevisionInfo(revision_folder) for revisionfile in revision_info.revisionfiles(): revisionfile.reindexObject() revision_folder.reindexObject()
def test_enable_revision(self): """ """ from DateTime import DateTime portal = self.layer['portal'] setRoles(portal, TEST_USER_ID, ['Manager']) portal.invokeFactory('File', 'test.pdf') obj = portal['test.pdf'] obj.setTitle('title') obj.setDescription('description') obj.setSubject(['keyword1']) obj.setRelatedItems([self._revision1()]) obj.setEffectiveDate(DateTime()) obj_title = obj.Title() obj_description = obj.Description() obj_subject = obj.Subject() obj_relateditems = obj.getRelatedItems() obj_effective = obj.effective() self.assertEquals('test.pdf', obj.getId()) self.assertEquals('File', obj.portal_type) from zope.component import getMultiAdapter view = getMultiAdapter((obj, obj.REQUEST), name='enable_revision') view() obj = portal['test.pdf'] self.assertEquals('test.pdf', obj.getId()) self.assertEquals('Folder', obj.portal_type) self.assertTrue('1' in obj.objectIds()) from redomino.revision.interfaces import IRevision self.assertTrue(IRevision.providedBy(obj)) from redomino.revision.interfaces import IRevisionInfo revision_info = IRevisionInfo(obj) latest = revision_info.latest() # metadata ok? self.assertEquals(obj_title, latest.Title()) self.assertEquals(obj_description, latest.Description()) self.assertEquals(obj_subject, latest.Subject()) self.assertEquals(obj_relateditems, latest.getRelatedItems()) self.assertEquals(obj_effective, latest.effective()) setRoles(portal, TEST_USER_ID, ['Member'])
class RevisionListViewlet(ViewletBase): index = ViewPageTemplateFile('templates/revisionlist_viewlet.pt') def update(self): super(RevisionListViewlet, self).update() self.revisionfile_info = IRevisionFileInfo(self.context) self.revision_info = IRevisionInfo(self.revisionfile_info.revision_folder()) self.revisions = sorted(self.revision_info.revisionfiles_info(), key = lambda o: o['obj_info'].code(), reverse = True)
def revisionfile_workflow(obj, event): """ Workflow state changed """ priority_utility = queryUtility(IRevisionWorkflowUtility, name=obj.portal_type) priority_utility = not priority_utility and queryUtility(IRevisionWorkflowUtility) priority_map = priority_utility and priority_utility.priority_map() if priority_map: revisionfile_info = IRevisionFileInfo(obj) revision = revisionfile_info.revision_folder() revision_info = IRevisionInfo(revision) latest = revision_info.latest() obj_status = revisionfile_info.status() latestfile_info = IRevisionFileInfo(latest) latest_status = latestfile_info.status() if priority_map.get(obj_status, {}).get('priority', -1) >= priority_map.get(latest_status, {}).get('priority', -1): # set status workflow = event.workflow workflow.setStatusOf(workflow.getId(), revision, {'action': event.action, 'review_state': obj_status, 'comments': '', 'actor': '', 'time': DateTime()}) workflow.updateRoleMappingsFor(revision) revision.reindexObject() revision.reindexObjectSecurity()
def _latest(revision): revision_info = IRevisionInfo(revision) latest = revision_info.latest() return latest
def test_enable_revision2(self): """ """ from DateTime import DateTime portal = self.layer['portal'] setRoles(portal, TEST_USER_ID, ['Manager']) portal.invokeFactory('File', 'test.pdf') obj = portal['test.pdf'] obj.setTitle('title') obj.setDescription('description') obj.setSubject(['keyword1']) obj.setEffectiveDate(DateTime()) obj_title = obj.Title() obj_description = obj.Description() obj_subject = obj.Subject() obj_effective = obj.effective() self.assertEquals('test.pdf', obj.getId()) self.assertEquals('File', obj.portal_type) from zope.component import getMultiAdapter view = getMultiAdapter((obj, obj.REQUEST), name='enable_revision') view() self.assertTrue(portal.hasObject('test.pdf')) obj = portal['test.pdf'] self.assertEquals('test.pdf', obj.getId()) self.assertEquals('Folder', obj.portal_type) self.assertTrue('1' in obj.objectIds()) from redomino.revision.interfaces import IRevision self.assertTrue(IRevision.providedBy(obj)) from redomino.revision.interfaces import IRevisionInfo revision_info = IRevisionInfo(obj) latest = revision_info.latest() # metadata ok? self.assertEquals(obj_title, latest.Title()) self.assertEquals(obj_description, latest.Description()) self.assertEquals(obj_subject, latest.Subject()) self.assertEquals(obj_effective, latest.effective()) revision1 = portal['test.pdf'] revision1_info = IRevisionInfo(revision1) revision11 = revision1['1'] portal_workflow = portal.portal_workflow self.assertEquals(portal_workflow.getInfoFor(revision1, 'review_state'), 'internal') revision11.content_status_modify('submit') revision11.content_status_modify('publish_internally') self.assertFalse('2' in revision1.objectIds()) # clone revision view = getMultiAdapter((revision11, revision11.REQUEST), name='clone_revision') view() self.assertEquals('3', revision1_info.next_code()) self.assertTrue('2' in revision1.objectIds()) ppw = getToolByName(revision1, 'portal_placeful_workflow') from redomino.revision.interfaces import IRevisionWorkflowUtility portal_type = revision11.portal_type from zope.component import queryUtility priority_utility = queryUtility(IRevisionWorkflowUtility, name=portal_type) priority_utility = not priority_utility and queryUtility(IRevisionWorkflowUtility) policy_id = priority_utility.policy_id() config = ppw.getWorkflowPolicyConfig(revision1) self.assertEquals(config.getPolicyIn().getId(), policy_id) self.assertEquals(config.getPolicyBelow().getId(), policy_id) revision12 = revision1['2'] revision12.content_status_modify('submit') revision12.reindexObject() self.assertEquals(revision11, revision1_info.latest()) self.assertEquals(portal_workflow.getInfoFor(revision1, 'review_state'), 'internally_published') # new revision12 become pending, new current revision revision12.content_status_modify('publish_internally') revision1_info.latest() IRevisionInfo(revision1).latest() self.assertEquals(revision12, revision1_info.latest()) self.assertEquals(portal_workflow.getInfoFor(revision1, 'review_state'), 'internally_published') setRoles(portal, TEST_USER_ID, ['Member'])
def update(self): super(RevisionListViewlet, self).update() self.revisionfile_info = IRevisionFileInfo(self.context) self.revision_info = IRevisionInfo(self.revisionfile_info.revision_folder()) self.revisions = sorted(self.revision_info.revisionfiles_info(), key = lambda o: o['obj_info'].code(), reverse = True)
def is_latest(self): """ Is the latest revision? """ revision_folder = self.revision_folder() revision_folder_info = IRevisionInfo(revision_folder) return aq_inner(self.context) == revision_folder_info.latest()