def test_statictime_wc_created(self): frozen_time = datetime(1950, 7, 31, 13, 45) statictime = StaticTime(created=frozen_time) statictime.start() doc1 = self.create_document("doc1") policy = ICheckinCheckoutPolicy(doc1) policy.checkout(self.portal) baseline, working_copy = WorkingCopyInfo(doc1).get_working_copy_info() self.assertEqual(json_compatible(frozen_time), working_copy["created"]) statictime.stop()
def test_control_cancel_on_original_does_not_delete_original(self): # checkout document doc = self.portal.docs.doc1 policy = ICheckinCheckoutPolicy(self.portal.docs.doc1, None) policy.checkout(self.portal.workarea) # get cancel browser view from plone.app.iterate.browser.cancel import Cancel cancel = Cancel(doc, self.layer['request']) self.layer['request'].form['form.button.Cancel'] = True # check if cancel on original raises the correct exception from plone.app.iterate.interfaces import CheckoutException with self.assertRaises(CheckoutException): cancel()
def _checkout(self): # NOTE: this code is copied from plone.app.iterate.browser.checkout context = aq_inner(self.context) # containers = list(self._containers()) location = self.context.aq_parent #containers[0]['name'] # We want to redirect to a specific template, else we might # end up downloading a file control = getMultiAdapter((context, self.request), name=u"iterate_control") if not control.checkout_allowed(): raise CheckoutException(u"Not allowed") policy = ICheckinCheckoutPolicy(context) wc = policy.checkout(location) transition(wc, to_state='sent') # we do this for metadata update side affects which will update lock info context.reindexObject('review_state') IStatusMessage(self.request).addStatusMessage(_("Check-out created"), type='info') #view_url = wc.restrictedTraverse("@@plone_context_state").view_url() return wc
def reply(self): # Disable CSRF protection if "IDisableCSRFProtection" in dir(plone.protect.interfaces): alsoProvides(self.request, plone.protect.interfaces.IDisableCSRFProtection) control = getMultiAdapter((self.context, self.request), name="iterate_control") if not control.checkout_allowed(): pm = getToolByName(self.context, "portal_membership") if bool(pm.isAnonymousUser()): return self._error(401, "Not authenticated", "Checkout not allowed") else: return self._error(403, "Not authorized", "Checkout not allowed") locator = None try: locator = [ c["locator"] for c in self.containers() if c["name"] == WC_LOCATION_MODE ][0] except IndexError: return self._error(500, "InternalServerError", "Cannot find checkout location") policy = ICheckinCheckoutPolicy(self.context) wc = policy.checkout(locator()) self.request.response.setStatus(201) self.request.response.setHeader("Location", self.context.absolute_url()) return {"@id": wc.absolute_url()}
def __call__(self): context = aq_inner(self.context) # We want to redirect to a specific template, else we might # end up downloading a file if self.request.form.has_key('form.button.Checkout'): control = getMultiAdapter((context, self.request), name=u"iterate_control") if not control.checkout_allowed(): raise CheckoutException(u"Not allowed") location = self.request.form.get('checkout_location', None) locator = None try: locator = [c['locator'] for c in self.containers() if c['name'] == location][0] except IndexError: IStatusMessage(self.request).addStatusMessage(_("Cannot find checkout location"), type='stop') view_url = context.restrictedTraverse("@@plone_context_state").view_url() self.request.response.redirect(view_url) return policy = ICheckinCheckoutPolicy(context) wc = policy.checkout(locator()) # we do this for metadata update side affects which will update lock info context.reindexObject('review_state') IStatusMessage(self.request).addStatusMessage(_("Check-out created"), type='info') view_url = wc.restrictedTraverse("@@plone_context_state").view_url() self.request.response.redirect(view_url) elif self.request.form.has_key('form.button.Cancel'): view_url = context.restrictedTraverse("@@plone_context_state").view_url() self.request.response.redirect(view_url) else: return self.index()
def _checkout(self): # NOTE: this code is copied from plone.app.iterate.browser.checkout context = aq_inner(self.context) containers = list(self._containers()) location = containers[0]["name"] # We want to redirect to a specific template, else we might # end up downloading a file control = getMultiAdapter((context, self.request), name=u"iterate_control") if not control.checkout_allowed(): raise CheckoutException(u"Not allowed") locator = None try: locator = [c["locator"] for c in containers if c["name"] == location][0] except IndexError: IStatusMessage(self.request).addStatusMessage(_("Cannot find checkout location"), type="stop") view_url = context.restrictedTraverse("@@plone_context_state").view_url() self.request.response.redirect(view_url) return policy = ICheckinCheckoutPolicy(context) wc = policy.checkout(locator()) # we do this for metadata update side affects which will update lock info context.reindexObject("review_state") IStatusMessage(self.request).addStatusMessage(_("Check-out created"), type="info") # view_url = wc.restrictedTraverse("@@plone_context_state").view_url() return wc
def test_local_role(self): """ A local role is assigned for the user making the checkout. """ self.portal.portal_membership.addMember( testing.EDITOR['id'], testing.EDITOR['password'], testing.EDITOR['roles'], []) login(self.portal, testing.EDITOR['id']) baseline = self.portal.docs.doc1 policy = ICheckinCheckoutPolicy(baseline, None) working_copy = policy.checkout(self.portal.workarea) # Verify assumptions self.assertEqual( baseline.get_local_roles_for_userid(TEST_USER_ID), ('Owner', ), 'Different Owner local role than this test assumes') self.assertEqual( working_copy.get_local_roles_for_userid(TEST_USER_ID), ('Owner', ), 'Different Owner local role than this test assumes') self.assertEqual( baseline.get_local_roles_for_userid('editor'), (), 'Different check out user local role than this test assumes') self.assertEqual( working_copy.get_local_roles_for_userid('editor'), ('iterate: Check out initiator', ), 'Wrong check out initiator local role')
def __call__(self): context = aq_inner(self.context) containers = list(self.containers()) if len(containers) == 1: # Special case for when there's only when folder to select self.request.form['form.button.Checkout'] = 1 self.request.form['checkout_location'] = containers[0]['name'] # We want to redirect to a specific template, else we might # end up downloading a file if self.request.form.has_key('form.button.Checkout'): control = getMultiAdapter((context, self.request), name=u"iterate_control") if not control.checkout_allowed(): raise CheckoutException(u"Not allowed") location = self.request.form.get('checkout_location', None) locator = None try: locator = [ c['locator'] for c in self.containers() if c['name'] == location ][0] except IndexError: IStatusMessage(self.request).addStatusMessage( _("Cannot find checkout location"), type='stop') view_url = context.restrictedTraverse( "@@plone_context_state").view_url() self.request.response.redirect(view_url) return policy = ICheckinCheckoutPolicy(context) wc = policy.checkout(locator()) # we do this for metadata update side affects which will update lock info context.reindexObject('review_state') IStatusMessage(self.request).addStatusMessage( _("Check-out created"), type='info') view_url = wc.restrictedTraverse( "@@plone_context_state").view_url() self.request.response.redirect(view_url) elif self.request.form.has_key('form.button.Cancel'): view_url = context.restrictedTraverse( "@@plone_context_state").view_url() self.request.response.redirect(view_url) else: return self.index()
def test_annotation_saved_on_checkin(self): # First we get and save a custom annotation to the existing object obj_annotations = IAnnotations(self.s1) self.assertEqual(obj_annotations, {}) obj_annotations['key1'] = u'value1' obj_annotations = IAnnotations(self.s1) self.assertEqual(obj_annotations, {'key1': u'value1'}) # Now, let's get a working copy for it. locators = getAdapters((self.s1,), IWCContainerLocator) location = u'plone.app.iterate.parent' locator = [c[1] for c in locators if c[0] == location][0] policy = ICheckinCheckoutPolicy(self.s1) wc = policy.checkout(locator()) # Annotations should be the same new_annotations = IAnnotations(wc) self.assertEqual(new_annotations['key1'], u'value1') # Now, let's modify the existing one, and create a new one new_annotations['key1'] = u'value2' new_annotations['key2'] = u'value1' # Check that annotations were stored correctly and original ones were # not overriten new_annotations = IAnnotations(wc) self.assertEqual(new_annotations['key1'], u'value2') self.assertEqual(new_annotations['key2'], u'value1') obj_annotations = IAnnotations(self.s1) self.assertEqual(obj_annotations['key1'], u'value1') self.assertFalse('key2' in obj_annotations) # Now, we do a checkin policy = ICheckinCheckoutPolicy(wc) policy.checkin(u'Commit message') # And finally check that the old object has the same annotations as # its working copy obj_annotations = IAnnotations(self.s1) self.assertTrue('key1' in obj_annotations) self.assertTrue('key2' in obj_annotations) self.assertEqual(obj_annotations['key1'], u'value2') self.assertEqual(obj_annotations['key2'], u'value1')
def __call__(self): context = aq_inner(self.context) # We want to redirect to a specific template, else we might # end up downloading a file if 'form.button.Checkout' in self.request.form: control = getMultiAdapter((context, self.request), name=u'iterate_control') if not control.checkout_allowed(): raise CheckoutException(u'Not allowed') location = self.request.form.get('checkout_location', None) locator = None try: locator = [ c['locator'] for c in self.containers() if c['name'] == location ][0] except IndexError: IStatusMessage(self.request).addStatusMessage( _('Cannot find checkout location'), type='error') view_url = context.restrictedTraverse( '@@plone_context_state').view_url() self.request.response.redirect(view_url) return policy = ICheckinCheckoutPolicy(context) wc = policy.checkout(locator()) # we do this for metadata update side affects which will update # lock info context.reindexObject('review_state') IStatusMessage(self.request).addStatusMessage( _('Check-out created'), type='info') view_url = wc.restrictedTraverse( '@@plone_context_state').view_url() self.request.response.redirect(view_url) elif 'form.button.Cancel' in self.request.form: view_url = context.restrictedTraverse( '@@plone_context_state').view_url() self.request.response.redirect(view_url) else: return self.index()
def checkout_object(self, fileobj, related, mimetype): """Replaces the content of uploaded file/image at the working copy of the related object """ control = getMultiAdapter( (related, self.context.REQUEST), name=u"iterate_control") policy = ICheckinCheckoutPolicy(related) working_copies = related.getBRefs(WorkingCopyRelation.relationship) if control.checkout_allowed(): folder = related.aq_parent working_copy = policy.checkout(folder) elif working_copies: working_copy = working_copies[0] else: raise Exception(u"Can't obtain working copy.") working_copy.update_data(fileobj, mimetype) working_copy.reindexObject() return '/'.join(related.getPhysicalPath())
def _checkout(self): # NOTE: this code is copied from plone.app.iterate.browser.checkout context = aq_inner(self.context) containers = list(self._containers()) location = containers[0]['name'] # We want to redirect to a specific template, else we might # end up downloading a file control = getMultiAdapter((context, self.request), name=u"iterate_control") if not control.checkout_allowed(): raise CheckoutException(u"Not allowed") locator = None try: locator = [ c['locator'] for c in containers if c['name'] == location ][0] except IndexError: IStatusMessage(self.request).addStatusMessage( _("Cannot find checkout location"), type='stop') view_url = context.restrictedTraverse( "@@plone_context_state").view_url() self.request.response.redirect(view_url) return policy = ICheckinCheckoutPolicy(context) wc = policy.checkout(locator()) # we do this for metadata update side affects which will update lock info context.reindexObject('review_state') IStatusMessage(self.request).addStatusMessage(_("Check-out created"), type='info') #view_url = wc.restrictedTraverse("@@plone_context_state").view_url() return wc
def do_checkout(self, obj): policy = ICheckinCheckoutPolicy(obj) working_copy = policy.checkout(self.folder) return working_copy
new_id = content.generateId(prefix='') content.invokeFactory(content_type, new_id) content = content[new_id] print 'Created {} with id "{}"'.format(content.portal_type, new_id) else: print 'Found {} with title "{}"'.format(content.portal_type, content.Title()) status = workflow.getStatusOf("pleiades_entity_workflow", content) review_state = status and status.get('review_state', 'unknown') or 'unknown' print "Workflow state: {}.".format(review_state) container = aq_parent(content) if not creating: policy = ICheckinCheckoutPolicy(content) working_copy = policy.checkout(container) print "Checked out working copy: {}".format(working_copy.absolute_url_path()) else: policy = None working_copy = content change_note = args.message for key, modify in values.items(): if key == 'change_note': change_note = modify continue if key == 'id' and creating: print "Content id change ignored during creation." continue if key == 'id': if modify['mode'] == 'replace':
def serviceDescriptionUpdated(event): context = event.object updated_text = event.updated_text data = event.data old_national_text = context.getRawNationalText().decode('utf-8') old_text = context.getRawText().decode('utf-8') parent_folder = aq_parent(context) policy = ICheckinCheckoutPolicy(context) wc = policy.checkout(parent_folder) context.reindexObject('review_state') dmp = diff_match_patch() current_patch = dmp.patch_make(old_national_text, old_text) updated_text_patch = dmp.patch_make(old_national_text, updated_text) final_patch = current_patch + updated_text_patch new_text, success = dmp.patch_apply(final_patch, old_national_text) if False in success: # XXX # We need to handle the possibility of patching failing return wc.setNationalText(updated_text) wc.setText(new_text) if data: wc.setTitle(data['title']) wc.setDescription(data['description']) logger.info("Patched Service Description %s at %s" % \ (context.Title(), context.absolute_url())) # Send notification creator = context.Creator() pm = getToolByName(context, 'portal_membership') creator = pm.getMemberById(creator) mail_to = None if creator is not None: mail_to = creator.getProperty('email') if not mail_to: registry = getUtility(IRegistry) mail_to = registry['jarn.kommuner.notifyEmail'] if not mail_to: return request = context.REQUEST site_title = context.portal_properties.site_properties.title mail_template = getMultiAdapter((context, request), name='sd_mail') mail_text = mail_template( sd_title=wc.Title(), sd_url=wc.absolute_url(), site_title=site_title, charset='utf-8') portal_state = getMultiAdapter((context, request), name=u"plone_portal_state") portal = portal_state.portal() mail_from = portal.getProperty('email_from_address') mail_host = getToolByName(context, 'MailHost') try: mail_host.send(mail_text.encode('utf-8'), mto=mail_to, mfrom=mail_from, subject='Service Update', charset='utf-8', msg_type=None) except (MailHostError, SMTPException, socket.error): logger.error( """mail error: Attempt to send mail failed.\n%s""" % traceback.format_exc())
def do_checkout(self): policy = ICheckinCheckoutPolicy(self.obj) working_copy = policy.checkout(self.folder) return working_copy
def serviceDescriptionUpdated(event): context = event.object updated_text = event.updated_text data = event.data old_national_text = context.getRawNationalText().decode('utf-8') old_text = context.getRawText().decode('utf-8') parent_folder = aq_parent(context) policy = ICheckinCheckoutPolicy(context) wc = policy.checkout(parent_folder) context.reindexObject('review_state') dmp = diff_match_patch() current_patch = dmp.patch_make(old_national_text, old_text) updated_text_patch = dmp.patch_make(old_national_text, updated_text) final_patch = current_patch + updated_text_patch new_text, success = dmp.patch_apply(final_patch, old_national_text) if False in success: # XXX # We need to handle the possibility of patching failing return wc.setNationalText(updated_text) wc.setText(new_text) if data: wc.setTitle(data['title']) wc.setDescription(data['description']) logger.info("Patched Service Description %s at %s" % \ (context.Title(), context.absolute_url())) # Send notification creator = context.Creator() pm = getToolByName(context, 'portal_membership') creator = pm.getMemberById(creator) mail_to = None if creator is not None: mail_to = creator.getProperty('email') if not mail_to: registry = getUtility(IRegistry) mail_to = registry['jarn.kommuner.notifyEmail'] if not mail_to: return request = context.REQUEST site_title = context.portal_properties.site_properties.title mail_template = getMultiAdapter((context, request), name='sd_mail') mail_text = mail_template(sd_title=wc.Title(), sd_url=wc.absolute_url(), site_title=site_title, charset='utf-8') portal_state = getMultiAdapter((context, request), name=u"plone_portal_state") portal = portal_state.portal() mail_from = portal.getProperty('email_from_address') mail_host = getToolByName(context, 'MailHost') try: mail_host.send(mail_text.encode('utf-8'), mto=mail_to, mfrom=mail_from, subject='Service Update', charset='utf-8', msg_type=None) except (MailHostError, SMTPException, socket.error): logger.error("""mail error: Attempt to send mail failed.\n%s""" % traceback.format_exc())