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')
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_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()
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']
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)
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)
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')
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)
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'})