def test_create(self): # Prepare creation headers headers = { 'Tus-Resumable': tus_api_version, 'Upload-Length': 100, 'Upload-Metadata': encode_upload_metadata({'filename': 'test_file.jpg'}) } # Perform request result = self.client.post( reverse('rest_framework_tus:api:upload-list'), headers=headers) # Check status assert result.status_code == status.HTTP_201_CREATED # Retrieve upload upload = get_upload_model().objects.all().first() # Validate upload assert upload.upload_length == 100 assert upload.filename == 'test_file.jpg' # Validate response headers assert 'Tus-Resumable' in result assert result['Location'].endswith( reverse('rest_framework_tus:api:upload-detail', kwargs={'guid': upload.guid}))
def test_terminate(self): # Create upload upload = UploadFactory(filename='test_data.txt', upload_metadata=json.dumps( {'filename': 'test_data.txt'}), upload_length=100, state=states.DONE) # Prepare headers headers = { 'Tus-Resumable': tus_api_version, } # Perform request result = self.client.delete(reverse( 'rest_framework_tus:api:upload-detail', kwargs={'guid': upload.guid}), headers=headers) # Check result assert result.status_code == status.HTTP_204_NO_CONTENT # Verify existence assert get_upload_model().objects.filter( guid=upload.guid).exists() is False
def test_create_without_length_with_defer(self): # Prepare creation headers headers = { 'Tus-Resumable': tus_api_version, 'Upload-Defer-Length': 1, 'Upload-Metadata': encode_upload_metadata({ # Make sure non-ASCII characters are supported (regression) 'filename': 'test_file_٩(-̮̮̃-̃)۶ ٩(●̮̮̃•̃)۶ ٩(͡๏̯͡๏)۶ ٩(-̮̮̃•̃).jpg' }) } # Perform request result = self.client.post( reverse('rest_framework_tus:api:upload-list'), headers=headers) # Check status assert result.status_code == status.HTTP_201_CREATED # Retrieve upload upload = get_upload_model().objects.all().first() # Validate upload assert upload.upload_length == -1 assert upload.filename == 'test_file_٩(-̮̮̃-̃)۶ ٩(●̮̮̃•̃)۶ ٩(͡๏̯͡๏)۶ ٩(-̮̮̃•̃).jpg' # Validate response headers assert 'Tus-Resumable' in result assert result['Location'].endswith( reverse('rest_framework_tus:api:upload-detail', kwargs={'guid': upload.guid}))
def _test_upload_with_checksum(self, checksum_algorithm, checksum=None, expected_failure=None): # Define blob blob = 'Şởოè śấოρļể ẮŞĈİĪ-ŧểхŧ'.encode( 'utf-8') # Make sure the data are **BYTES**!!!! # Create test data test_data = ('test_data.txt', blob) # Create upload upload = UploadFactory(filename=test_data[0], upload_metadata=json.dumps( {'filename': test_data[0]}), upload_length=len(test_data[1])) # Define chunk size chunk_size = 4 # 4 bytes # Write upload_offset = 0 data = copy.copy(test_data[1]) while True: # Take chunk chunk = data[:chunk_size] # Prepare headers headers = { 'Tus-Resumable': tus_api_version, 'Upload-Offset': upload_offset, } # Prepare checksum if checksum_algorithm is not None: headers[ 'Upload-Checksum'] = checksum or create_checksum_header( chunk, checksum_algorithm) # Perform request result = self.client.patch( reverse('rest_framework_tus:api:upload-detail', kwargs={'guid': upload.guid}), data=chunk, headers=headers, content_type='application/offset+octet-stream') # Maybe we expect a failure if expected_failure: assert result.status_code == expected_failure # Cleanup file upload.delete() # The test is over here! return # Check result assert result.status_code == status.HTTP_204_NO_CONTENT # Update data data = data[chunk_size:] # Update iterator upload_offset += len(chunk) # Check final piece if upload_offset == len(test_data[1]): break # Reload upload upload = get_upload_model().objects.get(guid=upload.guid) # Assert file is ready assert upload.state == states.DONE # Compare data uploaded_data = read_bytes_from_field_file(upload.uploaded_file.file) assert uploaded_data == blob # Cleanup file upload.delete()
def on_finished(sender, instance, **kwargs): if not issubclass(sender, get_upload_model()): return logger.debug('on_finished: {}'.format(instance))
def on_saving_done(sender, instance, **kwargs): if not issubclass(sender, get_upload_model()): return logger.debug('on_saving_done: {}'.format(instance))
def on_receiving_done(sender, instance, **kwargs): if not issubclass(sender, get_upload_model()): return logger.debug('on_receiving_done: {}'.format(instance)) save_handler = get_save_handler() save_handler(upload=instance).run()
class Meta: model = get_upload_model() fields = '__all__'
class Meta: model = get_upload_model()
# -*- coding: utf-8 -*- from __future__ import unicode_literals import logging from django.dispatch import receiver from rest_framework_tus.models import get_upload_model from rest_framework_tus.signals import received, saved, finished from rest_framework_tus.storage import get_save_handler logger = logging.getLogger(__name__) @receiver(received, sender=get_upload_model()) def on_receiving_done(sender, instance, **kwargs): logger.debug('on_receiving_done: {}'.format(instance)) save_handler = get_save_handler() save_handler(upload=instance).run() @receiver(saved, sender=get_upload_model()) def on_saving_done(sender, instance, **kwargs): logger.debug('on_saving_done: {}'.format(instance)) @receiver(finished, sender=get_upload_model()) def on_finished(sender, instance, **kwargs): logger.debug('on_finished: {}'.format(instance))