from django.core.files.uploadedfile import InMemoryUploadedFile
from django.core.files.uploadedfile import TemporaryUploadedFile

from django.core.files.uploadhandler import MemoryFileUploadHandler
from django.core.files.uploadhandler import TemporaryFileUploadHandler

class InMemoryUploadedFileExt(InMemoryUploadedFile):
    """
    An extension that add some proxy method to the object
    """
    def __init__(self, *args, **kwargs):
        super(InMemoryUploadedFileExt, self).__init__(*args, **kwargs)
        
    def tell(self, *args): return self.file.tell(*args)

class TemporaryUploadedFileExt(TemporaryUploadedFile):
    """
    An extension that add some proxy method to the object
    """
    def __init__(self, *args, **kwargs):
        super(TemporaryUploadedFileExt, self).__init__(*args,**kwargs)

    def tell(self, *args): return self.file.tell(*args)
    
    def seek(self, *args, **kwargs):
        self.file.seek(*args, **kwargs)

    
class TemporaryFileUploadHandlerExt(TemporaryFileUploadHandler):
    """
    Upload handler that streams data into a temporary file.
    """
    def __init__(self, *args, **kwargs):
        super(TemporaryFileUploadHandlerExt, self).__init__(*args, **kwargs)

    def new_file(self, file_name, *args, **kwargs):
        """
        Create the file object to append to as data is coming in.
        """
        super(TemporaryFileUploadHandlerExt, self).new_file(file_name, *args, **kwargs)
        self.file = TemporaryUploadedFileExt(self.file_name, self.content_type, 0, self.charset)


class MemoryFileUploadHandlerExt(MemoryFileUploadHandler):

    """
    Upload handler that streams data into a temporary file.
    """
    def __init__(self, *args, **kwargs):
        super(MemoryFileUploadHandlerExt, self).__init__(*args, **kwargs)


    def file_complete(self, file_size):
        """
        Return a file object if we're activated.
        """
        if not self.activated:
            return

        return InMemoryUploadedFileExt(
            file = self.file,
            field_name = self.field_name,
            name = self.file_name,
            content_type = self.content_type,
            size = file_size,
            charset = self.charset
        )
 