
    h                         d dl Z d dlZd dlZd dlmZmZmZmZmZ d dl	m
Z d dlmZ d dlmZ  G d de      Zd Zd	 Zd
 Z
ddZd Zy)    N)	ChunkIterSkipFileStopFutureHandlers
StopUploadexhaust)slugify)	force_str)get_valid_filenamec                       e Zd Zy)UploadExceptionN)__name__
__module____qualname__     A/home/dcms/DCMS/lib/python3.12/site-packages/filer/utils/files.pyr   r      s    r   r   c                 b   | j                   dk(  st        d      | j                  j                  d      dk(  rd}| j                  j                  dd      xs  | j                  j                  dd      xs d	}	 t        | j                  d
         }|dk  rt        d|z        t        j                  |      d   xs d}| j                  }|D ]!  }|j                  | | j                  |d d        # |D cg c]  }|j                  s|j                   }}t        dg|z         }	t!        | |	      }
dgt#        |      z  }	 |D ]  }	 |j%                  d |d |d         |
D ]F  }t)        |      D ]6  \  }}t#        |      }|j+                  |||         }||xx   |z  cc<   |6 F H 	 t-        |        |D ]  }|j5                         }|s n t)        |      D ]  \  }}|j7                  ||         }|s|} n6 n4t#        | j8                        dk(  rt;        |       \  }}}}nt        d      |||fS # t        t        t        f$ r d }Y w xY wc c}w # t&        $ r Y  	w xY w# t.        $ r t-        |
       Y t0        $ r!}|j2                  st-        |        Y d }~d }~ww xY w)NPOSTz&XMLHttpRequest not valid: must be POSTzx-requested-withXMLHttpRequestTqqfileFfilename zcontent-lengthr   zInvalid content length: %rapplication/octet-streami   z,XMLHttpRequest request not valid: Bad Upload)methodr   headersgetGETint
IndexError	TypeError
ValueError	mimetypes
guess_typeupload_handlershandle_raw_inputMETA
chunk_sizeminr   lennew_filer   	enumeratereceive_data_chunkr   r   r   connection_resetupload_completefile_completeFILEShandle_request_files_upload)requestis_rawr   content_length	mime_typer%   handlerxpossible_sizesr(   streamcounterschunkichunk_lengtheretvalfile_objuploads                      r   handle_uploadrC      s   >>V#FGG-.2BB;;??8U3_w{{zSX7Y_]_	" 1A!BCN A!">"OPP((215S9S	!11& 	G$$W%,\\%3%)%)	+
 	 1@P11<<!,,PP+78
7J/3_--	* $$T8%)>4A   "+O"< JAw#&u:L#66u7?{DEQK</K}$ G ' 	G,,.F	
 $O4 	JAw,,Xa[9H!		 w}}"2Mg2V/FHfi!"PQQ8VY..M Iz2 	"!N	"( Q *   	FO 	!%% 	!sg   ;H< 8I
II/ I AI/ (I/ <II	I,'I/ +I,,I/ /J.J.J))J.c                    d}t        | j                  j                               d   }|j                  }t        j
                  j                  |      \  }}|j                  j                         }t        j                  |      }|dk7  r2|r0|j                         |vrd}t        |j                  ||            ||||fS )z
    Handle request.FILES if len(request.FILES) == 1.
    Returns tuple(upload, filename, is_raw, mime_type) where upload is file itself.
    Fr   r   zKMIME-Type '{mimetype}' does not correspond to file extension of {filename}.)mimetyper   )listr1   valuesnameospathsplitextcontent_typelowerr#   guess_all_extensionsr   format)	r3   r4   rB   r   _iextr6   
extensionsmsgs	            r   r2   r2   b   s     F'--&&()!,F{{Hggx(GAt##))+I//	:J..:$**,V`B`[cjj)hjOPP8VY..r   c                 *    t        t        |             S )N)slugify_djangor	   )strings    r   r   r   y   s    )F+,,r   c                 ~    t        |       |k  r| S ||z
  }t        j                         j                  d| }| d| |z   S )a  
    Ensures that the filename does not exceed the maximum allowed length.
    If it does, the function truncates the filename and appends a random hexadecimal
    suffix of length `random_suffix_length` to ensure uniqueness and compliance with
    database constraints - even after markers for a thumbnail are added.

    Parameters:
        filename (str): The filename to check.
        max_length (int): The maximum allowed length for the filename.
        random_suffix_length (int): The length of the random suffix to append.

    Returns:
        str: The safe filename.


    Reference issue: https://github.com/django-cms/django-filer/issues/1270
    N)r*   uuiduuid4hex)r   
max_lengthrandom_suffix_lengthkeep_lengthrandom_suffixs        r   _ensure_safe_lengthr_   }   sL    & 8}
"33KJJL$$%:&:;ML[!M11r   c                     t        |       } t        j                  j                  |       \  }}t	        |      }t	        |      }|rdj                  ||      }t        |      S dj                  |      }t        |      S )z]
    like the regular get_valid_filename, but also slugifies away
    umlauts and stuff.
    z{}.{}z{})get_valid_filename_djangorI   rJ   rK   r   rO   r_   )sr   extvalid_filenames       r   r
   r
      sv    
 	"!$AGG$$Q'MHcx H
#,C
 #6
 ~.. X. ~..r   )      )r#   rI   rX   django.http.multipartparserr   r   r   r   r   django.template.defaultfiltersr   rU   django.utils.encodingr	   django.utils.textr
   ra   	Exceptionr   rC   r2   r_   r   r   r   <module>rl      sD     	  d d D + M	i 	P/f/.-26/r   