o
    b.                     @   s   d Z ddlZddlmZ ddlmZ ddlmZmZ ddl	m
Z
 g dZG dd	 d	eZG d
d deZG dd deZG dd deZG dd dZG dd deZG dd deZdd ZdS )zH
Base file upload handler classes, and the built-in concrete subclasses
    N)BytesIO)settings)InMemoryUploadedFileTemporaryUploadedFileimport_string)UploadFileException
StopUploadSkipFileFileUploadHandlerTemporaryFileUploadHandlerMemoryFileUploadHandlerload_handlerStopFutureHandlersc                   @      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   ^/var/www/secure340b-portal/env/lib/python3.10/site-packages/django/core/files/uploadhandler.pyr          r   c                   @   s"   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S dS )Nz StopUpload: Halt current upload.z,StopUpload: Consume request data, then halt.r   r   r   r   r   __str__'   s   zStopUpload.__str__N)F)r   r   r   r   r   r   r   r   r   r   r	      s    
r	   c                   @   r   )r
   zX
    This exception is raised by an upload handler that wants to skip a given file.
    Nr   r   r   r   r   r
   .   r   r
   c                   @   r   )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.
    Nr   r   r   r   r   r   5   s    r   c                   @   sR   e Zd ZdZdZdddZdddZddd	Zd
d Zdd Z	dd Z
dd ZdS )r   z3
    Base class for streaming upload handlers.
    i   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      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   Z
input_dataZ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      t d)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() methodNotImplementedErrorr   raw_datastartr   r   r   receive_data_chunkk   s   z$FileUploadHandler.receive_data_chunkc                 C   r-   )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() methodr.   r   	file_sizer   r   r   file_completer   s   zFileUploadHandler.file_completec                 C   r&   )z
        Signal that the upload is complete. Subclasses should perform cleanup
        that is necessary for this handler.
        Nr   r   r   r   r   upload_complete{      z!FileUploadHandler.upload_completec                 C   r&   )z
        Signal that the upload was interrupted. Subclasses should perform
        cleanup that is necessary for this handler.
        Nr   r   r   r   r   upload_interrupted   r8   z$FileUploadHandler.upload_interruptedr   )NN)r   r   r   r   
chunk_sizer   r*   r,   r3   r6   r7   r9   r   r   r   r   r   =   s    


	r   c                       s8   e Zd ZdZ fddZdd Zdd Zdd	 Z  ZS )
r   zA
    Upload handler that streams data into a temporary file.
    c                    s0   t  j|i | 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 | d S r   )r<   writer0   r   r   r   r3      s   z-TemporaryFileUploadHandler.receive_data_chunkc                 C   s   | j d || j _| j S )Nr   )r<   seeksizer4   r   r   r   r6      s   z(TemporaryFileUploadHandler.file_completec                 C   sH   t | dr"| j }z| j  t| W d S  ty!   Y d S w d S )Nr<   )hasattrr<   Ztemporary_file_pathcloseosremoveFileNotFoundError)r   Ztemp_locationr   r   r   r9      s   


z-TemporaryFileUploadHandler.upload_interrupted)	r   r   r   r   r,   r3   r6   r9   __classcell__r   r   r@   r   r      s    r   c                       s:   e Zd ZdZdddZ fddZdd Zd	d
 Z  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	activatedr'   r   r   r   r*      s   z(MemoryFileUploadHandler.handle_raw_inputc                    s*   t  j|i | | jrt | _t d S r   )r;   r,   rK   r   r<   r   r=   r@   r   r   r,      s
   z MemoryFileUploadHandler.new_filec                 C   s   | j r| j| dS |S )z!Add the data to the BytesIO file.N)rK   r<   rB   r0   r   r   r   r3      s   z*MemoryFileUploadHandler.receive_data_chunkc              	   C   s8   | j sdS | jd t| j| j| j| j|| j| jdS )z2Return a file object if this handler is activated.Nr   )r<   r+   namer!   rD   r#   r$   )	rK   r<   rC   r   r+   r    r!   r#   r$   r4   r   r   r   r6      s   z%MemoryFileUploadHandler.file_completer   )	r   r   r   r   r*   r,   r3   r6   rJ   r   r   r@   r   r      s    
	r   c                 O   s   t | |i |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   )pathr>   r?   r   r   r   r      s   
r   )r   rG   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    M,