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 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()
Exemple #4
0
    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
Exemple #5
0
    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()}
Exemple #6
0
    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')
Exemple #9
0
    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 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')
Exemple #12
0
    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())
Exemple #14
0
    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':
Exemple #17
0
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())
Exemple #18
0
 def do_checkout(self):
     policy = ICheckinCheckoutPolicy(self.obj)
     working_copy = policy.checkout(self.folder)
     return working_copy
Exemple #19
0
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())