def handleAdd(self, action):
                data, errors = self.extractData()
                if errors:
                    self.status = self.formErrorsMessage
                    return

                document = self.createAndAdd(data)
                if document is None:
                    return

                self._finishedAdd = True
                api.portal.show_message(
                    _(u'Creation with officeatwork initiated successfully'),
                    request=self.request,
                    type='info')

                # temporarily aq-wrap the document to be able to get an url
                aq_wrapped_doc = document.__of__(self.context)
                target_url = '{}/create_with_officeatwork'.format(
                    aq_wrapped_doc.absolute_url())
                redirector = IRedirector(self.request)
                redirector.redirect(target_url)

                return self.request.RESPONSE.redirect('{}#documents'.format(
                    self.context.absolute_url()))
            def handleAdd(self, action):
                data, errors = self.extractData()
                if errors:
                    self.status = self.formErrorsMessage
                    return

                document = self.createAndAdd(data)
                if document is None:
                    return

                self._finishedAdd = True
                api.portal.show_message(
                    _(u'Creation with officeatwork initiated successfully'),
                    request=self.request,
                    type='info')

                # temporarily aq-wrap the document to be able to get an url
                aq_wrapped_doc = document.__of__(self.context)
                target_url = '{}/create_with_officeatwork'.format(
                    aq_wrapped_doc.absolute_url())
                redirector = IRedirector(self.request)
                redirector.redirect(target_url)

                return self.request.RESPONSE.redirect(
                    '{}#documents'.format(self.context.absolute_url()))
Exemple #3
0
    def test_viewlet_only_redirects_once(self):
        redirector = IRedirector(self.request)
        redirector.redirect('http://example.com', target='named-window')

        viewlet = RedirectorViewlet(self.portal, self.request, {}, {})
        self.assertIn("http://example.com", viewlet.render().strip())

        self.assertEquals("", viewlet.render())
    def test_viewlet_only_redirects_once(self):
        redirector = IRedirector(self.request)
        redirector.redirect('http://www.google.ch', target='named-window')

        viewlet = RedirectorViewlet(self.portal, self.request, {}, {})
        self.assertIn("http://www.google.ch", viewlet.render().strip())

        self.assertEquals("", viewlet.render())
    def render(self):
        redirector = IRedirector(self.request)
        redirects = redirector.get_redirects(remove=True)
        html = []
        for redirect in redirects:
            html.append(RedirectorViewlet.JS_TEMPLATE % redirect)

        return ''.join(html)
    def render(self):
        redirector = IRedirector(self.request)
        redirects = redirector.get_redirects(remove=True)
        html = []
        for redirect in redirects:
            html.append(RedirectorViewlet.JS_TEMPLATE % redirect)

        return ''.join(html)
Exemple #7
0
    def render(self):

        # check whether we have paths or not
        paths = self.request.get('paths')

        # using "paths" is mandantory on any objects except for a document
        if not paths and not IDocumentSchema.providedBy(self.context):
            msg = _(u'You have not selected any documents')
            IStatusMessage(self.request).addStatusMessage(msg, type='error')

            # we assume the request came from the tabbed_view "documents"
            # tab on the dossier
            return self.request.RESPONSE.redirect('%s#documents' %
                                                  self.context.absolute_url())

        elif paths:
            # lookup the objects to be handled using the catalog
            catalog = getToolByName(self.context, 'portal_catalog')
            objects = []
            for path in paths:
                query = dict(path={'query': path, 'depth': 0})
                obj = catalog(query)[0].getObject()
                objects.append(obj)

        else:
            # the context is the document
            objects = [self.context]

        # now, lets checkout every document
        for obj in objects:
            if not IDocumentSchema.providedBy(obj):
                # notify the user. we have a no-checkoutable object
                msg = _(
                    u'Could not check out object: ${title}, '
                    'it is not a document',
                    mapping={'title': obj.Title().decode('utf-8')})
                IStatusMessage(self.request).addStatusMessage(msg,
                                                              type='error')
                continue

            self.checkout(obj)

        # lets register a redirector for starting external
        # editor - if requested
        external_edit = self.request.get('mode') == 'external'
        if len(objects) == 1 and external_edit:
            redirector = IRedirector(self.request)
            redirector.redirect('%s/external_edit' % objects[0].absolute_url(),
                                target='_self',
                                timeout=1000)

        # now lets redirect to an appropriate target..
        if len(objects) == 1:
            return self.request.RESPONSE.redirect(objects[0].absolute_url())

        else:
            return self.request.RESPONSE.redirect('%s#documents' %
                                                  self.context.absolute_url())
Exemple #8
0
    def render(self):

        # have the document a file
        if not self.context.file:
            msg = _(u"The Document ${title} has no File", mapping={"title": self.context.Title().decode("utf-8")})

            IStatusMessage(self.request).addStatusMessage(msg, type="error")
            return self.request.RESPONSE.redirect(get_redirect_url(self.context))

        # check out the document
        manager = getMultiAdapter((self.context, self.request), ICheckinCheckoutManager)

        # check if the document is allready checked out by the actual user
        userid = getToolByName(self.context, "portal_membership").getAuthenticatedMember().getId()

        if manager.checked_out() == userid:
            # check if the document is locked
            # otherwies only open with the ext. editor
            info = getMultiAdapter((self.context, self.request), name="plone_lock_info")

            if info.is_locked():
                msg = _(u"Can't edit the document at moment, " "beacuse it's locked.")
                IStatusMessage(self.request).addStatusMessage(msg, type="error")

                return self.request.RESPONSE.redirect(get_redirect_url(self.context))

        elif manager.checked_out() is not None:
            info = getUtility(IContactInformation)
            msg = _(
                u"The Document is allready checked out by: ${userid}",
                mapping={"userid": info.describe(manager.checked_out())},
            )
            IStatusMessage(self.request).addStatusMessage(msg, type="error")
            return self.request.RESPONSE.redirect(get_redirect_url(self.context))

        elif not manager.is_checkout_allowed():
            msg = _(u"Could not check out document ${title}", mapping={"title": self.context.Title().decode("utf-8")})
            IStatusMessage(self.request).addStatusMessage(msg, type="error")
            return self.request.RESPONSE.redirect(get_redirect_url(self.context))

        else:
            # check it out
            manager.checkout()

            # notify the user
            msg = _(u"Checked out: ${title}", mapping={"title": self.context.Title().decode("utf-8")})

            IStatusMessage(self.request).addStatusMessage(msg, type="info")

        # lets register a redirector for starting external
        # editor - if requested
        redirector = IRedirector(self.request)
        redirector.redirect("%s/external_edit" % self.context.absolute_url(), target="_self", timeout=1000)

        # now lets redirect to an appropriate target..
        return self.request.RESPONSE.redirect(self.context.absolute_url())
class TestRedirector(FunctionalTestCase):

    def setUp(self):
        super(TestRedirector, self).setUp()
        self.prepareSession()

        self.redirector = IRedirector(self.request)

    def test_stores_and_retrieves_redirects(self):
        self.redirector.redirect('http://www.google.ch', target='named-window')
        self.assertEquals([{'url': 'http://www.google.ch',
                            'target': 'named-window',
                            'timeout': 0}],
                          self.redirector.get_redirects())

    def test_retrieving_a_redirect_removes_it(self):
        self.redirector.redirect('http://www.ebay.ch', target='named-window')

        self.assertEquals(1, len(self.redirector.get_redirects()))
        self.assertEquals(0, len(self.redirector.get_redirects()))

    def test_pass_remove_false_to_keeps_redirects(self):
        self.redirector.redirect('http://www.yahoo.com', target='named-window')

        self.assertEquals(1, len(self.redirector.get_redirects(remove=False)))
        self.assertEquals(1, len(self.redirector.get_redirects(remove=False)))
Exemple #10
0
class TestRedirector(FunctionalTestCase):
    def setUp(self):
        super(TestRedirector, self).setUp()
        self.prepareSession()

        self.redirector = IRedirector(self.request)

    def test_stores_and_retrieves_redirects(self):
        self.redirector.redirect('http://www.google.ch', target='named-window')
        self.assertEquals([{
            'url': 'http://www.google.ch',
            'target': 'named-window',
            'timeout': 0
        }], self.redirector.get_redirects())

    def test_retrieving_a_redirect_removes_it(self):
        self.redirector.redirect('http://www.ebay.ch', target='named-window')

        self.assertEquals(1, len(self.redirector.get_redirects()))
        self.assertEquals(0, len(self.redirector.get_redirects()))

    def test_pass_remove_false_to_keeps_redirects(self):
        self.redirector.redirect('http://www.yahoo.com', target='named-window')

        self.assertEquals(1, len(self.redirector.get_redirects(remove=False)))
        self.assertEquals(1, len(self.redirector.get_redirects(remove=False)))
Exemple #11
0
    def activate_external_editing(self, new_doc):
        """Check out the given document, and add the external_editor URL
        to redirector queue.
        """

        # Check out the new document
        manager = self.context.restrictedTraverse('checkout_documents')
        manager.checkout(new_doc)

        # Add redirect to the zem-file download,
        # in order to start editing with external editor.
        redirector = IRedirector(self.request)
        redirector.redirect('%s/external_edit' % new_doc.absolute_url(),
                            target='_self',
                            timeout=1000)
Exemple #12
0
    def activate_external_editing(self, new_doc):
        """Check out the given document, and add the external_editor URL
        to redirector queue.
        """

        # Check out the new document
        manager = self.context.restrictedTraverse('checkout_documents')
        manager.checkout(new_doc)

        # Add redirect to the zem-file download,
        # in order to start editing with external editor.
        redirector = IRedirector(self.request)
        redirector.redirect(
            '%s/external_edit' % new_doc.absolute_url(),
            target='_self',
            timeout=1000)
Exemple #13
0
    def handle_copy(self, action):
        data, errors = self.extractData()
        if len(errors) == 0:

            info = getUtility(IContactInformation)
            client = info.get_client_by_id(data['client'])

            target = data.get('target_dossier')
            cid = client.client_id
            trans = getUtility(ITransporter)
            for obj in self.objects:
                trans.transport_to(obj, cid, target)
            redirect_to = os.path.join(client.public_url, target, '#documents')
            redirector = IRedirector(self.request)
            redirector.redirect(redirect_to, target='_blank')
            return self.request.RESPONSE.redirect(self.context.absolute_url() +
                                                  '#documents')
    def test_checkout(self):
        view = self.doc1.restrictedTraverse('@@editing_document')()

        self.assertEquals(self.doc1.absolute_url(), view)
        self.assertEquals(
            self.doc1.absolute_url() + '/external_edit',
            IRedirector(self.doc1.REQUEST).get_redirects()[0].get('url'))
        self.assertEquals(TEST_USER_ID,
                          self.get_manager(self.doc1).get_checked_out_by())
Exemple #15
0
    def handle_copy(self, action):
        data, errors = self.extractData()
        if len(errors) == 0:

            info = getUtility(IContactInformation)
            client = info.get_client_by_id(data['client'])

            target = data.get('target_dossier')
            cid = client.client_id
            trans = getUtility(ITransporter)
            for obj in self.objects:
                trans.transport_to(obj, cid, target)
            redirect_to = os.path.join(client.public_url,
                                       target, '#documents')
            redirector = IRedirector(self.request)
            redirector.redirect(redirect_to, target='_blank')
            return self.request.RESPONSE.redirect(
                self.context.absolute_url() + '#documents')
    def render(self):
        redirector = IRedirector(self.request)

        # If we're on the CSRF confirm-action dialog, we don't want to
        # trigger any redirects.
        if self.view_name() == 'confirm-action':
            # Consume the redirector cookie to avoid unconditional redirects
            # immediately *after* the confirm-action view. If the user
            # confirms, the redirector cookies will be set again.
            redirector.get_redirects(remove=True)
            return ''

        redirects = redirector.get_redirects(remove=True)
        html = []
        for redirect in redirects:
            html.append(RedirectorViewlet.JS_TEMPLATE % redirect)

        return ''.join(html)
Exemple #17
0
    def render(self):
        redirector = IRedirector(self.request)

        # If we're on the CSRF confirm-action dialog, we don't want to
        # trigger any redirects.
        if self.view_name() == 'confirm-action':
            # Consume the redirector cookie to avoid unconditional redirects
            # immediately *after* the confirm-action view. If the user
            # confirms, the redirector cookies will be set again.
            redirector.get_redirects(remove=True)
            return ''

        redirects = redirector.get_redirects(remove=True)
        html = []
        for redirect in redirects:
            html.append(RedirectorViewlet.JS_TEMPLATE % redirect)

        return ''.join(html)
Exemple #18
0
    def test_etag_value_is_md5_hash_of_cookie_content(self):
        document = create(Builder('document'))
        url = 'http://nohost/plone/document-1/externaledit'
        target = 'named-window'

        self.assertIsNone(self.get_etag_value_for(document))

        # register redirect
        redirector = IRedirector(self.request)
        redirector.redirect(url, target=target)

        data = json.dumps([{'url': url, 'target': target, 'timeout': 0}])
        m = hashlib.md5()
        m.update(data.encode('utf-8'))
        expected_hash = m.hexdigest()

        self.assertEquals(expected_hash, self.get_etag_value_for(document))

        # Read and delete redirect
        viewlet = RedirectorViewlet(self.portal, self.request, {}, {})
        viewlet.render()

        self.assertIsNone(self.get_etag_value_for(document))
    def test_etag_value_is_md5_hash_of_cookie_content(self):
        document = create(Builder('document'))
        url = 'http://nohost/plone/document-1/externaledit'
        target = 'named-window'

        self.assertIsNone(self.get_etag_value_for(document))

        # register redirect
        redirector = IRedirector(self.request)
        redirector.redirect(url, target=target)

        data = json.dumps([{'url': url, 'target': target, 'timeout': 0}])
        m = hashlib.md5()
        m.update(data.encode('utf-8'))
        expected_hash = m.hexdigest()

        self.assertEquals(expected_hash,
                          self.get_etag_value_for(document))

        # Read and delete redirect
        viewlet = RedirectorViewlet(self.portal, self.request, {}, {})
        viewlet.render()

        self.assertIsNone(self.get_etag_value_for(document))
    def test_checkout(self):
        doc1 = createContentInContainer(
            self.portal,
            'opengever.document.document',
            title=u'Doc \xf6ne',
            document_author=u'Hugo Boss',
            document_date=datetime.date(2011, 1, 1),
            file=NamedBlobFile('bla bla', filename=u'test.txt'))

        transaction.commit()

        view = doc1.restrictedTraverse('@@editing_document')()

        self.assertEquals('http://nohost/plone/document-1', view)
        self.assertEquals(
            'http://nohost/plone/document-1/external_edit',
            IRedirector(doc1.REQUEST).get_redirects()[0].get('url'))
        self.assertEquals(TEST_USER_ID, self.get_manager(doc1).checked_out())
Exemple #21
0
 def setup_external_edit_redirect(self, request):
     redirector = IRedirector(request)
     if is_officeconnector_checkout_feature_enabled():
         redirector.redirect(create_oc_url(
             request,
             self,
             dict(action='checkout'),
         ))
     else:
         redirector.redirect(
             '%s/external_edit' % self.absolute_url(),
             target='_self',
             timeout=1000)
Exemple #22
0
class TestRedirector(IntegrationTestCase):
    def setUp(self):
        super(TestRedirector, self).setUp()
        self.redirector = IRedirector(self.request)

    def test_stores_and_retrieves_redirects(self):
        self.redirector.redirect('http://example.com', target='named-window')
        self.assertEquals([{
            'url': 'http://example.com',
            'target': 'named-window',
            'timeout': 0
        }], self.redirector.get_redirects())

    def test_retrieving_a_redirect_removes_it(self):
        self.redirector.redirect('http://example.com', target='named-window')

        self.assertEquals(1, len(self.redirector.get_redirects()))
        self.assertEquals(0, len(self.redirector.get_redirects()))

    def test_pass_remove_false_to_keeps_redirects(self):
        self.redirector.redirect('http://example.com', target='named-window')

        self.assertEquals(1, len(self.redirector.get_redirects(remove=False)))
        self.assertEquals(1, len(self.redirector.get_redirects(remove=False)))
Exemple #23
0
 def setup_external_edit_redirect(self, request, action='checkout'):
     redirector = IRedirector(request)
     if action == "checkout":
         if is_officeconnector_checkout_feature_enabled():
             redirector.redirect(create_oc_url(
                 request,
                 self,
                 dict(action=action),
             ))
         else:
             redirector.redirect(
                 '%s/external_edit' % self.absolute_url(),
                 target='_self',
                 timeout=1000)
     elif action == "oneoffixx" and is_oneoffixx_feature_enabled():
         redirector.redirect(create_oc_url(
                 request,
                 self,
                 dict(action=action),
             ))
Exemple #24
0
    def render(self):

        # have the document a file
        if not self.context.file:
            msg = _(
                u'The Document ${title} has no File',
                mapping={'title': self.context.Title().decode('utf-8')})

            IStatusMessage(self.request).addStatusMessage(msg, type='error')
            return self.request.RESPONSE.redirect(
                get_redirect_url(self.context))

        # check out the document
        manager = getMultiAdapter((self.context, self.request),
                                  ICheckinCheckoutManager)

        # check if the document is allready checked out by the actual user
        userid = getToolByName(
            self.context, 'portal_membership').getAuthenticatedMember().getId()

        if manager.get_checked_out_by() == userid:
            # check if the document is locked
            # otherwies only open with the ext. editor
            info = getMultiAdapter((self.context, self.request),
                        name="plone_lock_info")

            if info.is_locked():
                msg = _(u"Can't edit the document at moment, "
                        "beacuse it's locked.")
                IStatusMessage(
                        self.request).addStatusMessage(msg, type='error')

                return self.request.RESPONSE.redirect(
                    get_redirect_url(self.context))

        elif manager.get_checked_out_by() is not None:
            msg = _(u"The Document is allready checked out by: ${userid}",
                    mapping={'userid':
                             Actor.lookup(manager.get_checked_out_by()).get_label()})
            IStatusMessage(self.request).addStatusMessage(msg, type='error')
            return self.request.RESPONSE.redirect(
                get_redirect_url(self.context))

        elif not manager.is_checkout_allowed():
            msg = _(
                u'Could not check out document ${title}',
                mapping={'title': self.context.Title().decode('utf-8')})
            IStatusMessage(self.request).addStatusMessage(msg, type='error')
            return self.request.RESPONSE.redirect(
                get_redirect_url(self.context))

        else:
            # check it out
            manager.checkout()

            # notify the user
            msg = _(
                u'Checked out: ${title}',
                mapping={'title': self.context.Title().decode('utf-8')})

            IStatusMessage(self.request).addStatusMessage(msg, type='info')

        # lets register a redirector for starting external
        # editor - if requested
        redirector = IRedirector(self.request)
        redirector.redirect(
            '%s/external_edit' % self.context.absolute_url(),
            target='_self',
            timeout=1000)

        # now lets redirect to an appropriate target..
        return self.request.RESPONSE.redirect(self.context.absolute_url())
Exemple #25
0
    def setUp(self):
        super(TestRedirector, self).setUp()
        self.prepareSession()

        self.redirector = IRedirector(self.request)
 def setUp(self):
     super(TestRedirector, self).setUp()
     self.redirector = IRedirector(self.request)
Exemple #27
0
    def render(self):

        # have the document a file
        if not self.context.file:
            msg = _(u'The Document ${title} has no File.',
                    mapping={'title': self.context.Title().decode('utf-8')})

            IStatusMessage(self.request).addStatusMessage(msg, type='error')
            return self.request.RESPONSE.redirect(
                get_redirect_url(self.context))

        # check out the document
        manager = getMultiAdapter((self.context, self.request),
                                  ICheckinCheckoutManager)

        # check if the document is allready checked out by the actual user
        userid = getToolByName(
            self.context,
            'portal_membership').getAuthenticatedMember().getId()

        if manager.get_checked_out_by() == userid:
            # check if the document is locked
            # otherwies only open with the ext. editor
            info = getMultiAdapter((self.context, self.request),
                                   name="plone_lock_info")

            if info.is_locked():
                msg = _(u"Can't edit the document at moment, "
                        "beacuse it's locked.")
                IStatusMessage(self.request).addStatusMessage(msg,
                                                              type='error')

                return self.request.RESPONSE.redirect(
                    get_redirect_url(self.context))

        elif manager.get_checked_out_by() is not None:
            msg = _(u"The Document is already checked out by: ${userid}",
                    mapping={
                        'userid':
                        Actor.lookup(manager.get_checked_out_by()).get_label()
                    })
            IStatusMessage(self.request).addStatusMessage(msg, type='error')
            return self.request.RESPONSE.redirect(
                get_redirect_url(self.context))

        elif not manager.is_checkout_allowed():
            msg = _(u'Could not check out document ${title}.',
                    mapping={'title': self.context.Title().decode('utf-8')})
            IStatusMessage(self.request).addStatusMessage(msg, type='error')
            return self.request.RESPONSE.redirect(
                get_redirect_url(self.context))

        else:
            # check it out
            manager.checkout()

            # notify the user
            msg = _(u'Checked out: ${title}',
                    mapping={'title': self.context.Title().decode('utf-8')})

            IStatusMessage(self.request).addStatusMessage(msg, type='info')

        # lets register a redirector for starting external
        # editor - if requested
        redirector = IRedirector(self.request)
        redirector.redirect('%s/external_edit' % self.context.absolute_url(),
                            target='_self',
                            timeout=1000)

        # now lets redirect to an appropriate target..
        return self.request.RESPONSE.redirect(self.context.absolute_url())
    def setUp(self):
        super(TestRedirector, self).setUp()
        self.prepareSession()

        self.redirector = IRedirector(self.request)
Exemple #29
0
    def render(self):

        # check whether we have paths or not
        paths = self.request.get('paths')

        # using "paths" is mandantory on any objects except for a document
        if not paths and not IDocumentSchema.providedBy(self.context):
            msg = _(u'You have not selected any documents')
            IStatusMessage(self.request).addStatusMessage(
                msg, type='error')

            # we assume the request came from the tabbed_view "documents"
            # tab on the dossier
            return self.request.RESPONSE.redirect(
                '%s#documents' % self.context.absolute_url())

        elif paths:
            # lookup the objects to be handled using the catalog
            catalog = getToolByName(self.context, 'portal_catalog')
            objects = []
            for path in paths:
                query = dict(path={'query': path, 'depth': 0})
                obj = catalog(query)[0].getObject()
                objects.append(obj)

        else:
            # the context is the document
            objects = [self.context]

        # now, lets checkout every document
        for obj in objects:
            if not IDocumentSchema.providedBy(obj):
                # notify the user. we have a no-checkoutable object
                msg = _(
                    u'Could not check out object: ${title}, '
                    'it is not a document',
                    mapping={'title': obj.Title().decode('utf-8')})
                IStatusMessage(
                    self.request).addStatusMessage(msg, type='error')
                continue

            self.checkout(obj)

        # lets register a redirector for starting external
        # editor - if requested
        external_edit = self.request.get('mode') == 'external'
        if len(objects) == 1 and external_edit:
            redirector = IRedirector(self.request)
            redirector.redirect(
                '%s/external_edit' % objects[0].absolute_url(),
                target='_self',
                timeout=1000)

        # now lets redirect to an appropriate target..
        if len(objects) == 1:
            return self.request.RESPONSE.redirect(
                objects[0].absolute_url())

        else:
            return self.request.RESPONSE.redirect(
                '%s#documents' % self.context.absolute_url())
Exemple #30
0
 def setUp(self):
     super(TestRedirector, self).setUp()
     self.redirector = IRedirector(self.request)