
vÅÏ^G  ã               @   s  d  Z  d d l m Z d d l m Z d d l m Z m Z d d l m	 Z	 d d d d	 d
 d d d g Z
 Gd d „  d e ƒ Z Gd d „  d e ƒ Z Gd d „  d e ƒ Z Gd d „  d e ƒ Z Gd d	 „  d	 ƒ Z Gd d
 „  d
 e ƒ Z Gd d „  d e ƒ Z d d „  Z d S)zH
Base file upload handler classes, and the built-in concrete subclasses
é    )ÚBytesIO)Úsettings)ÚInMemoryUploadedFileÚTemporaryUploadedFile)Úimport_stringÚUploadFileExceptionÚ
StopUploadÚSkipFileÚFileUploadHandlerÚTemporaryFileUploadHandlerÚMemoryFileUploadHandlerÚload_handlerÚStopFutureHandlersc               @   s   e  Z d  Z d Z d S)r   z6
    Any error having to do with uploading files.
    N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__© r   r   úA/tmp/pip-build-8lau8j11/django/django/core/files/uploadhandler.pyr      s   c               @   s1   e  Z d  Z d Z d d d „ Z d d „  Z d S)r   z=
    This exception is raised when an upload must abort.
    Fc             C   s   | |  _  d S)zÒ
        If ``connection_reset`` is ``True``, Django knows will halt the upload
        without consuming the rest of the upload. This will cause the browser to
        show a "connection reset" error.
        N)Úconnection_reset)Úselfr   r   r   r   Ú__init__   s    zStopUpload.__init__c             C   s   |  j  r d Sd Sd  S)Nz StopUpload: Halt current upload.z,StopUpload: Consume request data, then halt.)r   )r   r   r   r   Ú__str__'   s    	zStopUpload.__str__N)r   r   r   r   r   r   r   r   r   r   r      s   c               @   s   e  Z d  Z d Z d S)r	   zX
    This exception is raised by an upload handler that wants to skip a given file.
    N)r   r   r   r   r   r   r   r   r	   .   s   c               @   s   e  Z d  Z d Z d S)r   z”
    Upload handlers that have handled a file and do not want future handlers to
    run should raise this exception instead of returning None.
    N)r   r   r   r   r   r   r   r   r   5   s   c               @   sp   e  Z d  Z d Z d Z d d d „ Z d d d	 „ Z d d d
 d „ Z d d „  Z d d „  Z	 d d „  Z
 d S)r
   z3
    Base class for streaming upload handlers.
    é@   é   é
   Nc             C   s:   d  |  _  d  |  _ d  |  _ d  |  _ d  |  _ | |  _ d  S)N)Ú	file_nameÚcontent_typeÚcontent_lengthÚcharsetÚcontent_type_extraÚrequest)r   r!   r   r   r   r   C   s    					zFileUploadHandler.__init__c             C   s   d S)aÆ  
        Handle the raw input from the client.

        Parameters:

            :input_data:
                An object that supports reading via .read().
            :META:
                ``request.META``.
            :content_length:
                The (integer) value of the Content-Length header from the
                client.
            :boundary: The boundary from the Content-Type header. Be sure to
                prepend two '--'.
        Nr   )r   Ú
input_dataÚMETAr   ÚboundaryÚencodingr   r   r   Úhandle_raw_inputK   s    z"FileUploadHandler.handle_raw_inputc             C   s:   | |  _  | |  _ | |  _ | |  _ | |  _ | |  _ d S)z½
        Signal that a new file has been started.

        Warning: As with any data from the client, you should not trust
        content_length (and sometimes won't even get it).
        N)Ú
field_namer   r   r   r   r    )r   r'   r   r   r   r   r    r   r   r   Únew_file]   s    					zFileUploadHandler.new_filec             C   s   t  d ƒ ‚ d S)z{
        Receive data from the streamed upload parser. ``start`` is the position
        in the file of the chunk.
        zJsubclasses of FileUploadHandler must provide a receive_data_chunk() methodN)ÚNotImplementedError)r   Úraw_dataÚstartr   r   r   Úreceive_data_chunkk   s    z$FileUploadHandler.receive_data_chunkc             C   s   t  d ƒ ‚ d S)zÆ
        Signal that a file has completed. File size corresponds to the actual
        size accumulated by all the chunks.

        Subclasses should return a valid ``UploadedFile`` object.
        zEsubclasses of FileUploadHandler must provide a file_complete() methodN)r)   )r   Ú	file_sizer   r   r   Úfile_completer   s    zFileUploadHandler.file_completec             C   s   d S)zƒ
        Signal that the upload is complete. Subclasses should perform cleanup
        that is necessary for this handler.
        Nr   )r   r   r   r   Úupload_complete{   s    z!FileUploadHandler.upload_completei   i   )r   r   r   r   Ú
chunk_sizer   r&   r(   r,   r.   r/   r   r   r   r   r
   =   s   	c                   s@   e  Z d  Z d Z ‡  f d d †  Z d d „  Z d d „  Z ‡  S)r   zA
    Upload handler that streams data into a temporary file.
    c                s>   t  ƒ  j | | Ž  t |  j |  j d |  j |  j ƒ |  _ d S)zK
        Create the file object to append to as data is coming in.
        r   N)Úsuperr(   r   r   r   r   r    Úfile)r   ÚargsÚkwargs)Ú	__class__r   r   r(   ‡   s    z#TemporaryFileUploadHandler.new_filec             C   s   |  j  j | ƒ d  S)N)r2   Úwrite)r   r*   r+   r   r   r   r,   Ž   s    z-TemporaryFileUploadHandler.receive_data_chunkc             C   s#   |  j  j d ƒ | |  j  _ |  j  S)Nr   )r2   ÚseekÚsize)r   r-   r   r   r   r.   ‘   s    z(TemporaryFileUploadHandler.file_complete)r   r   r   r   r(   r,   r.   r   r   )r5   r   r   ƒ   s   c                   sO   e  Z d  Z d Z d d d „ Z ‡  f d d †  Z d d „  Z d	 d
 „  Z ‡  S)r   zS
    File upload handler to stream uploads into memory (used for small files).
    Nc             C   s   | t  j k |  _ d S)zf
        Use the content_length to signal whether or not this handler should be
        used.
        N)r   ZFILE_UPLOAD_MAX_MEMORY_SIZEÚ	activated)r   r"   r#   r   r$   r%   r   r   r   r&   œ   s    z(MemoryFileUploadHandler.handle_raw_inputc                s5   t  ƒ  j | | Ž  |  j r1 t ƒ  |  _ t ƒ  ‚ d  S)N)r1   r(   r9   r   r2   r   )r   r3   r4   )r5   r   r   r(   ¥   s    	z MemoryFileUploadHandler.new_filec             C   s$   |  j  r |  j j | ƒ n | Sd S)z!Add the data to the BytesIO file.N)r9   r2   r6   )r   r*   r+   r   r   r   r,   «   s    	z*MemoryFileUploadHandler.receive_data_chunkc             C   s`   |  j  s d S|  j j d ƒ t d |  j d |  j d |  j d |  j d | d |  j d	 |  j ƒ S)
z2Return a file object if this handler is activated.Nr   r2   r'   Únamer   r8   r   r    )	r9   r2   r7   r   r'   r   r   r   r    )r   r-   r   r   r   r.   ²   s    						z%MemoryFileUploadHandler.file_complete)r   r   r   r   r&   r(   r,   r.   r   r   )r5   r   r   —   s
   	c             O   s   t  |  ƒ | | Ž  S)a=  
    Given a path to a handler, return an instance of that handler.

    E.g.::
        >>> from django.http import HttpRequest
        >>> request = HttpRequest()
        >>> load_handler('django.core.files.uploadhandler.TemporaryFileUploadHandler', request)
        <TemporaryFileUploadHandler object at 0x...>
    )r   )Úpathr3   r4   r   r   r   r   Ã   s    
N)r   Úior   Zdjango.confr   Zdjango.core.files.uploadedfiler   r   Zdjango.utils.module_loadingr   Ú__all__Ú	Exceptionr   r   r	   r   r
   r   r   r   r   r   r   r   Ú<module>   s   		F,