Esempio n. 1
0
    def test_create_file(self):
        grok_component('ITest2', ITest2)

        # mock stuf
        mock_context = self.providing_stub([
            ITabbedviewUploadable,
        ])
        named_file = NamedFile('bla bla', filename=u'test.txt')

        obj = self.providing_stub([ITest1, ITest2])
        request = self.stub()
        self.expect(obj.REQUEST).result(request)

        iterSchemata = self.mocker.replace(
            'plone.dexterity.utils.iterSchemata')
        self.expect(iterSchemata(obj)).result([ITest1, ITest2])

        self.replay()

        # test if it's sets the default value and
        # also if it add the created file to the primary field
        adapter = IQuickUploadFileFactory(mock_context)
        named_file = adapter.create_file(u'hugo.jpeg', u'data data', obj)

        self.assertEquals(named_file.data, u'data data')
Esempio n. 2
0
    def test_get_mimetype(self):
        mock_context = self.providing_stub([ITabbedviewUploadable])
        self.replay()
        adapter = IQuickUploadFileFactory(mock_context)
        self.assertEqual(adapter._get_mimetype('hanspeter.doc'),
                         'application/msword')

        self.assertEqual(adapter._get_mimetype('hanspeter.jpeg'), 'image/jpeg')
    def test_get_mimetype(self):
        mock_context = self.providing_stub([ITabbedviewUploadable])
        self.replay()
        adapter = IQuickUploadFileFactory(mock_context)
        self.assertEqual(adapter._get_mimetype('hanspeter.doc'),
            'application/msword')

        self.assertEqual(adapter._get_mimetype('hanspeter.jpeg'),
            'image/jpeg')
Esempio n. 4
0
    def test_get_portal_type(self):
        mock_context = self.providing_stub([ITabbedviewUploadable])
        self.replay()
        adapter = IQuickUploadFileFactory(mock_context)

        self.assertEqual(adapter.get_portal_type('image.jpeg'),
                         'opengever.document.document')
        self.assertEqual(adapter.get_portal_type('mail.eml'), 'ftw.mail.mail')
        self.assertEqual(adapter.get_portal_type('test.doc'),
                         'opengever.document.document')
    def test_get_portal_type(self):
        mock_context = self.providing_stub([ITabbedviewUploadable])
        self.replay()
        adapter = IQuickUploadFileFactory(mock_context)

        self.assertEqual(
            adapter.get_portal_type('image.jpeg'),
            'opengever.document.document')
        self.assertEqual(
            adapter.get_portal_type('mail.eml'), 'ftw.mail.mail')
        self.assertEqual(
            adapter.get_portal_type('test.doc'),
            'opengever.document.document')
class TestOGQuickupload(IntegrationTestCase):

    def setUp(self):
        super(TestOGQuickupload, self).setUp()

        self.login(self.regular_user)
        self.adapter = IQuickUploadFileFactory(self.dossier)

    def test_get_mimetype(self):
        self.assertEqual('application/msword',
                         self.adapter._get_mimetype('.doc'))
        self.assertEqual('image/jpeg',
                         self.adapter._get_mimetype('.jpeg'))

    def test_is_email_upload(self):
        self.assertTrue(self.adapter.is_email_upload('mail.msg'))
        self.assertTrue(self.adapter.is_email_upload('mail.eml'))

        self.assertFalse(self.adapter.is_email_upload('image.jpeg'))
        self.assertFalse(self.adapter.is_email_upload('test.doc'))

    def test_set_default_values(self):
        content = create(Builder('quickuploaded_document')
                         .within(self.dossier)
                         .with_data('text'))

        self.assertEquals('document', content.Title())
        self.assertEquals('text', content.file.data)
        self.assertEquals(u'', content.description)

    def test_expect_one_journal_entry_after_upload(self):
        content = create(Builder('quickuploaded_document')
                         .within(self.dossier)
                         .with_asset_data('text.txt'))

        history = JournalHistory(content, content.REQUEST)
        self.assertEquals(1,
                          len(history.data()),
                          'Expect exactly one journal entry after upload')

    def test_title_is_used_as_default_title_for_journal_entry(self):
        content = create(Builder('quickuploaded_document')
                         .within(self.dossier)
                         .with_data('text'))
        history = JournalHistory(content, content.REQUEST)

        self.assertEquals(u'Document added: document',
                          translate(history.data()[0]['action']['title']),
                          'Expected the document title in the action title')
class TestOGQuickupload(FunctionalTestCase):

    def setUp(self):
        super(TestOGQuickupload, self).setUp()
        self.dossier = create(Builder('dossier'))
        self.adapter = IQuickUploadFileFactory(self.dossier)

    def test_get_mimetype(self):
        self.assertEqual('application/msword',
                         self.adapter._get_mimetype('.doc'))
        self.assertEqual('image/jpeg',
                         self.adapter._get_mimetype('.jpeg'))

    def test_is_email_upload(self):
        self.assertTrue(self.adapter.is_email_upload('mail.msg'))
        self.assertTrue(self.adapter.is_email_upload('mail.eml'))

        self.assertFalse(self.adapter.is_email_upload('image.jpeg'))
        self.assertFalse(self.adapter.is_email_upload('test.doc'))

    def test_set_default_values(self):
        content = create(Builder('quickuploaded_document')
                         .within(self.dossier)
                         .with_data('text'))

        self.assertEquals('document', content.Title())
        self.assertEquals('text', content.file.data)
        self.assertEquals(u'', content.description)

    def test_expect_one_journal_entry_after_upload(self):
        content = create(Builder('quickuploaded_document')
                         .within(self.dossier)
                         .with_asset_data('text.txt'))
        history = JournalHistory(content, content.REQUEST)

        self.assertEquals(1,
                          len(history.data()),
                          'Expect exactly one journal entry after upload')

    def test_title_is_used_as_default_title_for_journal_entry(self):
        content = create(Builder('quickuploaded_document')
                         .within(self.dossier)
                         .with_data('text'))
        history = JournalHistory(content, content.REQUEST)

        self.assertEquals(u'Document added: document',
                          translate(history.data()[0]['action']['title']),
                          'Expected the document title in the action title')
    def flash_upload_file(self) :

        context = aq_inner(self.context)
        request = self.request
        self._auth_with_ticket()

        file_name = request.form.get("Filename", "")
        file_data = request.form.get("Filedata", None)
        content_type = mimetypes.guess_type(file_name)[0]
        portal_type = request.form.get('typeupload', '')
        title =  request.form.get("title", None)
        description =  request.form.get("description", None)

        if not portal_type :
            ctr = getToolByName(context, 'content_type_registry')
            portal_type = ctr.findTypeName(file_name.lower(), content_type, '') or 'File'

        if file_data:
            factory = IQuickUploadFileFactory(context)
            logger.debug("Uploading file with flash: filename=%s, title=%s, "
                         "description=%s, content_type=%s, portal_type=%s" % (
                       file_name, title, description, content_type, portal_type)
                         )

            try :
                f = factory(file_name, title, description, content_type, file_data, portal_type)
            except :
                # XXX todo : improve errors handlers for flashupload
                raise
            if f['success'] is not None :
                o = f['success']
                logger.info("file url: %s" % o.absolute_url())
                SecurityManagement.setSecurityManager(self.old_sm)
                return o.absolute_url()
Esempio n. 9
0
    def create_object(self, **kwargs):
        factory = IQuickUploadFileFactory(self.container)
        assert factory, 'invalid container'

        result = factory(
            filename=self.filename,
            title='',  # ignored by adapter
            description=None,
            content_type=self.content_type,
            data=self.data,
            portal_type='opengever.document.document')
        return result['success']
Esempio n. 10
0
    def create_object(self, **kwargs):
        factory = IQuickUploadFileFactory(self.container)
        assert factory, 'invalid container'

        result = factory(
            filename=self.filename,
            title='',  # ignored by adapter
            description=None,
            content_type='message/rfc822',
            data=self.data,
            portal_type='ftw.mail.mail')
        return result['success']
    def test_message_filename_initialized_with_quickupload(self):
        dossier = create(Builder("dossier"))
        factory = IQuickUploadFileFactory(dossier)

        result = factory(filename='mail.eml',
                         title='',  # ignored by adapter
                         description='Description',  # ignored by adapter
                         content_type='message/rfc822',
                         data=MAIL_DATA,
                         portal_type='ftw.mail.mail')
        mail = result['success']
        self.assertEquals('die-burgschaft.eml', mail.message.filename)
    def test_quickupload_p7m_mail(self):
        dossier = create(Builder("dossier"))
        factory = IQuickUploadFileFactory(dossier)

        result = factory(filename='signed.p7m',
                         title=None,  # ignored by adapter
                         description=None,  # ignored by adapter
                         content_type='application/pkcs7-mime',
                         data=load('signed.p7m'),
                         portal_type='ftw.mail.mail')
        mail = result['success']
        self.assertEquals('Hello.p7m', mail.message.filename)
Esempio n. 13
0
    def test_set_default_value(self):
        grok_component('ITest2', ITest2)

        # mock stuf
        mock_context = self.providing_stub([ITabbedviewUploadable, ])
        named_file = NamedFile('bla bla', filename=u'test.txt')

        obj = self.providing_stub([ITest1, ITest2])
        request = self.stub()
        self.expect(obj.REQUEST).result(request)

        iterSchemata = self.mocker.replace(
            'plone.dexterity.utils.iterSchemata')
        self.expect(iterSchemata(obj)).result([ITest1, ITest2])

        self.replay()

        # test if it's sets the default value and
        # also if it add the created file to the primary field
        adapter = IQuickUploadFileFactory(mock_context)
        adapter.set_default_values(obj, named_file)
        self.assertEquals(obj.description, 'hanspeter')
        self.assertEquals(obj.file, named_file)
Esempio n. 14
0
    def test_complete_creation(self):
        grok_component('ITest2', ITest2)

        # mock stuf
        mock_context = self.providing_stub([
            ITabbedviewUploadable,
        ])

        obj = self.providing_stub([ITest1, ITest2])
        request = self.stub()
        self.expect(obj.REQUEST).result(request)
        self.expect(obj.reindexObject()).result(None)
        self.expect(obj.__parent__).result(mock_context)
        self.expect(obj.__name__).result('test_context')

        iterSchemata = self.mocker.replace(
            'plone.dexterity.utils.iterSchemata')
        self.expect(iterSchemata(obj)).result([ITest1, ITest2]).count(0, None)

        createContentInContainer = self.mocker.replace(
            'plone.dexterity.utils.createContentInContainer')
        self.expect(
            createContentInContainer(
                mock_context, 'opengever.document.document')).result(obj)

        # filedata
        filename = u'hugo.doc'
        title = None
        description = None
        content_type = None
        data = u'Data data'
        portal_type = None

        self.replay()

        adapter = IQuickUploadFileFactory(mock_context)
        result = adapter(filename, title, description, content_type, data,
                         portal_type)
        obj = result.get('success')
        self.assertEquals(obj.description, 'hanspeter')
        self.assertEquals(obj.file.data, u'Data data')
Esempio n. 15
0
 def setUp(self):
     super(TestOGQuickupload, self).setUp()
     self.dossier = create(Builder('dossier'))
     self.adapter = IQuickUploadFileFactory(self.dossier)
    def quick_upload_file(self):
        context = aq_inner(self.context)
        request = self.request
        response = request.RESPONSE

        response.setHeader('Expires', 'Sat, 1 Jan 2000 00:00:00 GMT')
        response.setHeader('Cache-control', 'no-cache')
        # application/json is not supported by old IEs but text/html fails in
        # every browser with plone.protect 3.0.11
        response.setHeader('Content-Type', 'application/json; charset=utf-8')
        # disable diazo themes and csrf protection
        request.response.setHeader('X-Theme-Disabled', 'True')

        if request.HTTP_X_REQUESTED_WITH:
            # using ajax upload
            file_name = urllib.unquote(request.HTTP_X_FILE_NAME)
            upload_with = "XHR"
            try:
                file = request.BODYFILE
                file_data = file.read()
                file.seek(0)
            except AttributeError:
                # in case of cancel during xhr upload
                logger.error("Upload of %s has been aborted", file_name)
                # not really useful here since the upload block
                # is removed by "cancel" action, but
                # could be useful if someone change the js behavior
                return json.dumps({u'error': u'emptyError'})
            except:
                logger.error(
                    "Error when trying to read the file %s in request",
                    file_name)
                return self._error_response(u'serverError')
        else:
            # using classic form post method (MSIE<=8)
            file = request.get("qqfile", None)
            file_data = file.read()
            file.seek(0)
            filename = getattr(file, 'filename', '')
            file_name = filename.split("\\")[-1]
            try:
                file_name = file_name.decode('utf-8')
            except UnicodeDecodeError:
                pass

            file_name = IUserPreferredFileNameNormalizer(
                self.request).normalize(file_name)
            upload_with = "CLASSIC FORM POST"
            # we must test the file size in this case (no client test)
            if not self._check_file_size(file):
                logger.info("Test file size: the file %s is too big, upload "
                            "rejected" % filename)
                return self._error_response(u'sizeError')

        # overwrite file
        try:
            newid = get_id_from_filename(
                file_name, context, unique=self.qup_prefs.object_unique_id)
        except MissingExtension:
            return self._error_response(u'missingExtension')

        if (newid in context or file_name in context) and \
                not self.qup_prefs.object_unique_id:
            updated_object = context.get(newid, False) or context[file_name]
            mtool = getToolByName(context, 'portal_membership')
            override_setting = self.qup_prefs.object_override
            if override_setting and\
                    mtool.checkPermission(ModifyPortalContent, updated_object):
                can_overwrite = True
            else:
                can_overwrite = False

            if not can_overwrite:
                logger.debug(
                    "The file id for %s already exists, upload rejected" %
                    file_name)
                return self._error_response(u'serverErrorAlreadyExists')

            overwritten_file = updated_object
        else:
            overwritten_file = None

        content_type = get_content_type(context, file_data, file_name)

        portal_type = getDataFromAllRequests(request, 'typeupload') or ''
        title = getDataFromAllRequests(request, 'title') or ''
        description = getDataFromAllRequests(request, 'description') or ''
        if not title.strip() and self.qup_prefs.id_as_title:
            title = newid

        if not portal_type:
            ctr = getToolByName(context, 'content_type_registry')
            portal_type = ctr.findTypeName(file_name.lower(), content_type,
                                           '') or 'File'

        if not file_data:
            return self._error_response(u'emptyError')

        if overwritten_file is not None:
            updater = IQuickUploadFileUpdater(context)
            logger.info(
                "reuploading %s file with %s: title=%s, description=%s, "
                "content_type=%s" %
                (overwritten_file.absolute_url(), upload_with, title,
                 description, content_type))
            try:
                f = updater(overwritten_file, file_name, title, description,
                            content_type, file_data)
            except ConflictError:
                # Allow Zope to retry up to three times, and if that still
                # fails, handle ConflictErrors on client side if necessary
                raise
            except Exception as e:
                logger.error("Error updating %s file: %s", file_name, str(e))
                return self._error_response(u'serverError')

        else:
            factory = IQuickUploadFileFactory(context)
            logger.info("uploading file with %s: filename=%s, title=%s, "
                        "description=%s, content_type=%s, portal_type=%s" %
                        (upload_with, file_name, title, description,
                         content_type, portal_type))
            try:
                f = factory(file_name, title, description, content_type,
                            file_data, portal_type)
            except ConflictError:
                # Allow Zope to retry up to three times, and if that still
                # fails, handle ConflictErrors on client side if necessary
                raise
            except Exception as e:
                logger.error("Error creating %s file: %s", file_name, str(e))
                return self._error_response(u'serverError')

        if f['success'] is None:
            return self._error_response(f['error'])

        obj = f['success']
        logger.info("file url: %s" % obj.absolute_url())
        return self._success_response(obj)
Esempio n. 17
0
    def setUp(self):
        super(TestOGQuickupload, self).setUp()

        self.login(self.regular_user)
        self.adapter = IQuickUploadFileFactory(self.dossier)
    def quick_upload_file(self) :
        context = aq_inner(self.context)
        request = self.request
        response = request.RESPONSE

        response.setHeader('Expires', 'Sat, 1 Jan 2000 00:00:00 GMT')
        response.setHeader('Cache-control', 'no-cache')
        # the good content type woul be text/json or text/plain but IE
        # do not support it
        response.setHeader('Content-Type', 'text/html; charset=utf-8')
        # disable diazo themes
        request.response.setHeader('X-Theme-Disabled', 'True')

        if request.HTTP_X_REQUESTED_WITH :
            # using ajax upload
            file_name = urllib.unquote(request.HTTP_X_FILE_NAME)
            upload_with = "XHR"
            try :
                file = request.BODYFILE
                file_data = file.read()
                file.seek(0)
            except AttributeError :
                # in case of cancel during xhr upload
                logger.error("Upload of %s has been aborted", file_name)
                # not really useful here since the upload block
                # is removed by "cancel" action, but
                # could be useful if someone change the js behavior
                return  json.dumps({u'error': u'emptyError'})
            except :
                logger.error("Error when trying to read the file %s in request", file_name)
                return json.dumps({u'error': u'serverError'})
        else :
            # using classic form post method (MSIE<=8)
            file_data = request.get("qqfile", None)
            filename = getattr(file_data,'filename', '')
            file_name = filename.split("\\")[-1]
            try:
                file_name = file_name.decode('utf-8')
            except UnicodeDecodeError:
                pass

            file_name = IUserPreferredFileNameNormalizer(self.request
                            ).normalize(file_name)
            upload_with = "CLASSIC FORM POST"
            # we must test the file size in this case (no client test)
            if not self._check_file_size(file_data) :
                logger.info("Test file size : the file %s is too big, upload rejected" % filename)
                return json.dumps({u'error': u'sizeError'})

        # overwrite file
        try:
            newid = get_id_from_filename(file_name, context)
        except MissingExtension:
            return json.dumps({u'error': u'missingExtension'})

        if newid in context or file_name in context:
            updated_object = context.get(newid, False) or context[file_name]
            mtool = getToolByName(context, 'portal_membership')
            if mtool.checkPermission(ModifyPortalContent, updated_object):
                can_overwrite = True
            else:
                can_overwrite = False

            if not can_overwrite:
                logger.debug("The file id for %s already exists, upload rejected" % file_name)
                return json.dumps({u'error': u'serverErrorAlreadyExists'})

            overwritten_file = updated_object
        else:
            overwritten_file = None

        content_type = mimetypes.guess_type(file_name)[0]
        # sometimes plone mimetypes registry could be more powerful
        if not content_type :
            mtr = getToolByName(context, 'mimetypes_registry')
            oct = mtr.globFilename(file_name)
            if oct is not None :
                content_type = str(oct)
        
        portal_type = getDataFromAllRequests(request, 'typeupload') or ''
        title =  getDataFromAllRequests(request, 'title') or ''
        description =  getDataFromAllRequests(request, 'description') or ''

        if not portal_type :
            ctr = getToolByName(context, 'content_type_registry')
            portal_type = ctr.findTypeName(file_name.lower(), content_type, '') or 'File'

        if file_data:
            if overwritten_file is not None:
                updater = IQuickUploadFileUpdater(context)
                logger.info("reuploading %s file with %s : title=%s, description=%s, content_type=%s" % \
                        (overwritten_file.absolute_url(), upload_with, title, description, content_type))
                try :
                    f = updater(overwritten_file, file_name, title,
                                description, content_type, file_data)
                except Exception, e:
                    logger.error("Error updating %s file : %s", file_name, str(e))
                    return json.dumps({u'error': u'serverError'})

            else:
                factory = IQuickUploadFileFactory(context)
                logger.info("uploading file with %s : filename=%s, title=%s, description=%s, content_type=%s, portal_type=%s" % \
                        (upload_with, file_name, title, description, content_type, portal_type))
                try :
                    f = factory(file_name, title, description, content_type, file_data, portal_type)
                except Exception, e:
                    logger.error("Error creating %s file : %s", file_name, str(e))
                    return json.dumps({u'error': u'serverError'})
    def setUp(self):
        super(TestOGQuickupload, self).setUp()

        self.login(self.regular_user)
        self.adapter = IQuickUploadFileFactory(self.dossier)