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_remove_item_from_storage(self): storage = IDownloadTokenStorage(self.portal) file_ = create(Builder('file')) added = storage.add(file_, '*****@*****.**') storage.remove(added) self.assertFalse(len(storage.get_storage()), 'Storage should be empty.')
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))
def test_add_new_item_to_storage(self): storage = IDownloadTokenStorage(self.portal) file_ = create(Builder('file')) added = storage.add(file_, '*****@*****.**') self.assertEquals(1, len(storage.get_storage()), 'Expect one item in storage') self.assertTrue( isinstance(storage.get_storage()[0], DownloadToken), 'Item is not a DownloadToken instance.') self.assertEquals(added, storage.get_storage()[0])
def test_storage_cleanup(self): storage = IDownloadTokenStorage(self.portal) file_ = create(Builder('file')) expiredtoken1 = storage.add(file_, '*****@*****.**') expiredtoken2 = storage.add(file_, '*****@*****.**') expiredtoken1.expiration_date = datetime.now() - timedelta(days=10) expiredtoken2.expiration_date = datetime.now() - timedelta(days=20) self.assertEquals(2, len(storage.get_storage()), 'Expect two items') validtoken = storage.add(file_, '*****@*****.**') self.assertEquals(1, len(storage.get_storage()), 'Expect only the last added item. The others are ' 'expired and removed.') self.assertEquals(validtoken.token, storage.get_storage()[0].token, 'Found the wrong token.')
def test_get_inexistend_downloadtoken(self): storage = IDownloadTokenStorage(self.portal) file_ = create(Builder('file')) storage.add(file_, '*****@*****.**') self.assertIsNone(storage.get_downloadtoken('12345'))
def test_get_downloadtoken_by_token(self): storage = IDownloadTokenStorage(self.portal) file_ = create(Builder('file')) added = storage.add(file_, '*****@*****.**') self.assertEquals(added, storage.get_downloadtoken(added.token))
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)