示例#1
0
    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))
示例#8
0
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)