def send_mail(self, data): portal = api.portal.get() storage = IDownloadTokenStorage(portal) mail_template = self.context.restrictedTraverse('@@mail_downloadtoken') comment = data['comment'] subject = translate(_(u'mail_subject', default=u'[${title}] Download link', mapping={'title': self.context.Title().decode( 'utf-8')}), context=self.request) for email in data['recipients']: downloadtoken = storage.add(self.context, email) options = {'user': api.user.get_current(), 'date': DateTime(), 'link': storage.url(downloadtoken), 'comment': comment} mail = mail_template(**options) composer = HTMLComposer( message=mail, subject=subject, to_addresses=[(email, email)]) composed = composer.render() mh = api.portal.get_tool(name='MailHost') mh.send(composed.as_string(), mto=composed['To'], mfrom=composed['From']) notify(DownloadlinkSent(self.context, data['recipients'], comment))
def test_downloadtoken_url(self): storage = IDownloadTokenStorage(self.portal) file_ = create(Builder('file')) added = storage.add(file_, '*****@*****.**') url = '{0}/download-token?token={1}'.format( self.portal.portal_url(), added.token) self.assertEquals(url, storage.url(added))
class TestStorage(TestCase): layer = FTW_DOWNLOADTOKEN_FUNCTIONAL_TESTING def setUp(self): self.portal = self.layer['portal'] self.storage = IDownloadTokenStorage(self.portal) wftool = getToolByName(self.portal, 'portal_workflow') wftool.setChainForPortalTypes(('Folder',), ('plone_workflow',)) @browsing def test_download_fails_if_not_token_given(self, browser): with self.assertRaises(BadRequest): browser.visit(view='download-token') @browsing def test_download_fails_invalid_token_given(self, browser): url = self.portal.portal_url() + '/download-token?token=12345' with self.assertRaises(BadRequest): browser.open(url) @browsing def test_download_file_by_token(self, browser): folder = create(Builder('folder').in_state('private')) file_ = create(Builder('file') .with_dummy_content() .within(folder)) with self.assertRaises(Unauthorized): browser.visit(file_) downloadtoken = self.storage.add(file_, '*****@*****.**') url = self.storage.url(downloadtoken) transaction.commit() browser.open(url) self.assertEquals('Test data', browser.contents) @browsing def test_download_file_by_token_journal(self, browser): eventtesting.clearEvents() folder = create(Builder('folder').in_state('private')) file_ = create(Builder('file') .with_dummy_content() .within(folder)) with self.assertRaises(Unauthorized): browser.visit(file_) downloadtoken = self.storage.add(file_, '*****@*****.**') url = self.storage.url(downloadtoken) transaction.commit() browser.open(url) events = [e for e in eventtesting.getEvents() if IJournalEntryEvent.providedBy(e)] self.assertEqual(1, len(events)) self.assertEqual(u'*****@*****.**', events[0].actor) @browsing def test_download_fails_if_file_is_deleted(self, browser): folder = create(Builder('folder').in_state('private')) file_ = create(Builder('file') .with_dummy_content() .within(folder)) downloadtoken = self.storage.add(file_, '*****@*****.**') url = self.storage.url(downloadtoken) folder.manage_delObjects([file_.getId()]) transaction.commit() with self.assertRaises(NotFound): browser.open(url)