Beispiel #1
0
    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}))
Beispiel #2
0
    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
Beispiel #3
0
    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}))
Beispiel #4
0
    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()
Beispiel #5
0
def on_finished(sender, instance, **kwargs):
    if not issubclass(sender, get_upload_model()):
        return
    logger.debug('on_finished: {}'.format(instance))
Beispiel #6
0
def on_saving_done(sender, instance, **kwargs):
    if not issubclass(sender, get_upload_model()):
        return
    logger.debug('on_saving_done: {}'.format(instance))
Beispiel #7
0
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()
Beispiel #8
0
 class Meta:
     model = get_upload_model()
     fields = '__all__'
Beispiel #9
0
 class Meta:
     model = get_upload_model()
Beispiel #10
0
# -*- 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))