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()))
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): # 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())
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)))
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)))
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)
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)
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())
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)
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())
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)
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)))
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), ))
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())
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)
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 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())