
     hK                     :   d dl Z d dlZd dlZd dlZd dlmZmZmZmZ d dl	m
Z
 d dlmZm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	lmZ  G d
 de          Z G d d          Z G d de          Z G d dee          Z G d de          Z e            ZdS )    N)unquote	urldefragurlsplit
urlunsplit)settings)check_settingsmatches_patterns)ImproperlyConfigured)ContentFile)FileSystemStorageget_storage_class)md5)
LazyObjectc                   .     e Zd ZdZd fd	Z fdZ xZS )StaticFilesStoragez
    Standard file system storage for static files.

    The defaults for ``location`` and ``base_url`` are
    ``STATIC_ROOT`` and ``STATIC_URL``.
    Nc                     |t           j        }|t           j        }t          |            t	                      j        ||g|R i | |sd | _        d | _        d S d S N)r   STATIC_ROOT
STATIC_URLr   super__init__base_locationlocation)selfr   base_urlargskwargs	__class__s        ^/var/www/html/Sam_Eipo/venv/lib/python3.11/site-packages/django/contrib/staticfiles/storage.pyr   zStaticFilesStorage.__init__   s}    +H*Hx   8=d===f===  	!!%D DMMM	! 	!    c                 r    | j         st          d          t                                          |          S )NzaYou're using the staticfiles app without having set the STATIC_ROOT setting to a filesystem path.)r   r
   r   path)r   namer   s     r   r"   zStaticFilesStorage.path%   s<    } 	&0  
 ww||D!!!r    NN)__name__
__module____qualname____doc__r   r"   __classcell__r   s   @r   r   r      s`         ! ! ! ! ! !" " " " " " " " "r    r   c                        e Zd ZdZdZdZdZ fdZddZddZ	d fd
	Z
ddZddZddZd Zd Zd Zd Zd Z xZS )HashedFilesMixinzurl("%(url)s")   ))z*.css)z5(?P<matched>url\(['"]{0,1}\s*(?P<url>.*?)["']{0,1}\)))z.(?P<matched>@import\s*["']\s*(?P<url>.*?)["'])z@import url("%(url)s"))zI(?m)(?P<matched>)^(/\*#[ \t](?-i:sourceMappingURL)=(?P<url>.*)[ \t]*\*/)$z/*# sourceMappingURL=%(url)s */)z*.js))z;(?m)(?P<matched>)^(//# (?-i:sourceMappingURL)=(?P<url>.*))$z//# sourceMappingURL=%(url)sTc                 j    t                      j        |i | i | _        i | _        | j        D ]\  }}|D ]z}t          |t          t          f          r|\  }}n| j        }t          j
        |t          j                  }| j                            |g                               ||f           {d S r   )r   r   	_patternshashed_filespatterns
isinstancetuplelistdefault_templaterecompile
IGNORECASE
setdefaultappend)	r   r   r   	extensionr1   patterntemplatecompiledr   s	           r   r   zHashedFilesMixin.__init__P   s    $)&)))#'= 	V 	VIx# V Vgt}55 5(/%GXX#4H:gr}==)))R88??8@TUUUUV	V 	Vr    Nc                     |dS t          d          }|                                D ]}|                    |           |                                dd         S )zU
        Return a hash of the file with the given name and optional content.
        NF)usedforsecurity   )r   chunksupdate	hexdigest)r   r#   contenthasherchunks        r   	file_hashzHashedFilesMixin.file_hash]   sg     ?4U+++^^%% 	! 	!EMM%    !!#2#&&r    c                    t          t          |                    }|j                                        }|r3t          t          |                    j                                        p|}|d u }|rT|                     |          st          d|d| d          	 |                     |          }n# t          $ r |cY S w xY w	 |                     ||          }|r|	                                 n# |r|	                                 w w xY wt          j                            |          \  }}t          j                            |          \  }	}
|rd|z  nd}t          j                            ||	||
          }t          |          }||d<   d|v r|d         s|dxx         d	z  cc<   t          |          S )
Nz
The file 'z' could not be found with .z.%s    ?#   ?)r   r   r"   stripexists
ValueErroropenOSErrorrH   closeossplitsplitextjoinr4   r   )r   r#   rE   filenameparsed_name
clean_nameopenedrH   r"   rootexthashed_nameunparsed_names                r   r`   zHashedFilesMixin.hashed_nameh   s    wt}}-- %++--
I'(*;*;!<!<!A!G!G!I!IXjD 		;;x((  jCK88TTTR  ))H--   	 z7;;I      z22hG$$X..	c+4<UY&&"	gll4TT99cc)JKK[))&a 4<<a 0<!#-(((s   B5 5CCC5 5DFc                    t           j        r|s|d}}nLt          |          \  }}t          |          j                            d          r|}n|f}|||fz  } || }t                                          |          }	d|v }
|s|
rTt          t          |	                    }|r|d         s||d<   |
r|d         s|dxx         dz  cc<   t          |          }	t          |	          S )	:
        Return the non-hashed URL in DEBUG mode.
        rK   /NrM      rN   rL   rO   )r   DEBUGr   r   r"   endswithr   urlr4   r   r   )r   hashed_name_funcr#   forcer0   r`   fragmentr\   r   	final_urlquery_fragmenturlpartsr   s               r   _urlzHashedFilesMixin._url   s#    > 
	6% 
	6$("KK#,T?? J
##(11#66 6""}+\O+D..5GGKK,,	  	-~ 	-HY//00H ' '& #hqk #s""8,,Iy!!!r    c                 :    |                      | j        ||          S )rc   )ro   stored_name)r   r#   rj   s      r   rh   zHashedFilesMixin.url   s     yy)4777r    c                 0      j          fd}|S )zJ
        Return the custom URL converter for the given file name.
        Nc                    |                                  }|d         }|d         }t          j        d|          r|S |                    d          r!|                    t          j                  s|S t          |          \  }}|                    d          rC|                    t          j                  sJ |t          t          j                  d         }nYt          j	        dk    rn
                    t          j	        d          }t          j        t          j        |          |          }                    j        t!          |          d
          }d                    |                    d          dd         |                    d          dd         z             }	|r|	d	|v rd	nd
|z   z  }	t!          |	          |d<   |z  S )z
            Convert the matched URL to a normalized and hashed URL.

            This requires figuring out which files the matched URL resolves
            to and calling the url() method of the storage.
            matchedrh   z^[a-z]+:rd   NT)rj   r0   rM   #)	groupdictr6   match
startswithr   r   r   lenrV   sepreplace	posixpathrY   dirnamero   _stored_namer   rW   )matchobjmatchesrt   rh   url_pathrk   target_namesource_name
hashed_urltransformed_urlr0   r#   r   r=   s             r   	converterz1HashedFilesMixin.url_converter.<locals>.converter   s    ((**Gi(G%.C xS))  ~~c"" 3>>(:M+N+N  "+3Hh""3'' W**8+>?????&s8+>'?'?'A'AB ')fmmddbfc9R9R'nY->{-K-KXVV !$$)	 #  J "hhs##CRC(:+;+;C+@+@+EE O
  MDCKKDDSH#LL %_55GENg%%r    )r5   )r   r#   r0   r=   r   s   ```` r   url_converterzHashedFilesMixin.url_converter   sG     ,H2	& 2	& 2	& 2	& 2	& 2	& 2	& 2	&h r    c              +      K   |rdS i } fdD             }i }                      ||          D ]0\  }}}	}
||vst          |	t                    r|||	fV  (|||	f||<   1fd|D             d}t           j                  D ]3}d}                      ||          D ]\  }}}	}|||	f||<   |p|}|s n4|rddt          d          fV   j                            |           |                                E d{V  dS )a  
        Post process the given dictionary of files (called from collectstatic).

        Processing is actually two separate operations:

        1. renaming files to include a hash of their content for cache-busting,
           and copying those files to the target storage.
        2. adjusting files which contain references to other files so they
           refer to the cache-busting filenames.

        If either of these are performed on a file, then that file is considered
        post-processed.
        Nc                 >    g | ]}t          |j                  |S  )r	   r/   ).0r"   r   s     r   
<listcomp>z1HashedFilesMixin.post_process.<locals>.<listcomp>  s;     
 
 
&6tT^&L&L

 
 
r    c                 "    i | ]}||         S r   r   )r   r"   pathss     r   
<dictcomp>z1HashedFilesMixin.post_process.<locals>.<dictcomp>  s    @@@tuT{@@@r    FAllz!Max post-process passes exceeded.)	_post_processr2   	Exceptionrangemax_post_process_passesRuntimeErrorr0   rC   values)r   r   dry_runoptionsr0   adjustable_pathsprocessed_adjustable_pathsr#   r`   	processed_substitutionsisubsts   ``            r   post_processzHashedFilesMixin.post_process   s       	F 
 
 
 
"
 
 

 &(" 04/A/A#\0
 0
 	R 	R+D+y! +++z)Y/O/O+K2222248+y3Q*400@@@@/?@@@t344 
	 
	A!M7;7I7I'8 8 7 73k9e 59+y3Q*40 - 6    	Q|,OPPPPPP 	  ... .4466666666666r    c           	   #   :  K   d }t          ||d          D ]}d}||         \  }}|                    |          5 }	|                     |          }
|                     |
          }||vr|                     ||	          }n||         }t          |	d          r|	                    d           |                     |          }d}||v rx|}|	                                	                    d          }| j
                                        D ]k\  }}t          ||f          rU|D ]R\  }}|                     |||          }	 |                    ||          }4# t          $ r}|d |dfV  Y d }~Kd }~ww xY wl|r|                     |           t#          |                                          }| j        r|                     ||           |                     ||          }|                     |          r|                     |           |                     ||          }|                     |          }||k    rd}d}|s/|s-d}|                     ||	          }|                     |          }|||<   ||||fV  d d d            n# 1 swxY w Y   d S )Nc                 Z    t          |                     t          j                            S r   )rz   rW   rV   r{   )r#   s    r   
path_levelz2HashedFilesMixin._post_process.<locals>.path_level-  s    tzz"&))***r    T)keyreverseseekr   Fzutf-8)sortedrS   r\   hash_keyr`   hasattrr   rQ   readdecoder/   itemsr	   r   subrR   deleter   encodekeep_intermediate_files_save)r   r   r   r0   r   r#   r   storager"   original_filecleaned_namer   r`   hashed_file_existsr   old_hashed_namerE   r;   r1   r<   r=   r   exccontent_file
saved_names                            r   r   zHashedFilesMixin._post_process+  s     	+ 	+ 	+ 5j$??? C	B C	BD M "$KMGTd## >B}#t44==66 <//"&"2"24"G"GKK".x"8K =&11 *!&&q)))%)[[%=%="!	 +++&1O+002299'BBG/3~/C/C/E/E 	A 	A+	8+D9,?? A5= A A 1,0,>,>$(,-" -"	!A.5kk)W.M.MGG'1 !A !A !A*.c5*@$@$@$@$@$@$@$@$@!A) 1K000#.w~~/?/?#@#@L3 >

;==="&"2"24"F"FK{{;// 1K000!%K!F!FJ"&//*"="=K&+55(- $I  B . B$(	%)ZZ]%K%K
&*ooj&A&A *5X&KMAAAA}>B >B >B >B >B >B >B >B >B >B >B >B >B >B >BC	B C	Bs=   DJEJ
E6$E1,J1E66DJJ	J	c                 .    |                     dd          S )N\rd   )r|   r   r#   s     r   r\   zHashedFilesMixin.clean_nameu  s    ||D#&&&r    c                     |S r   r   r   s     r   r   zHashedFilesMixin.hash_keyx  s    r    c                     t          j        |          }|                     |          }|                     |          }|                    |          }|(|                     |                     |                    }|S r   )r}   normpathr\   r   getr`   )r   r#   r0   r   r   
cache_names         r   r   zHashedFilesMixin._stored_name{  st     !$''t,,==..!%%h//
)9)9$)?)?@@Jr    c                 x   |                      |          }|                     |          }| j                            |          }|r|S |}t	          | j        dz             D ]C}|                      |                     |d |                    }||k    r|| j        |<   |c S |}Dt          d|d| d          )N   )rE   rZ   z
The name 'z' could not be hashed with rJ   )r\   r   r0   r   r   r   r`   rR   )r   r#   r   r   r   intermediate_namer   s          r   rq   zHashedFilesMixin.stored_name  s    t,,==..&**844
 	 t3a788 
	/ 
	/A  t>O PP J !J...8!(+!!!! %/!! jtttTUUUr    r   r$   )FN)F)r%   r&   r'   r5   r   r1   r   r   rH   r`   ro   rh   r   r   r   r\   r   r   rq   r)   r*   s   @r   r,   r,   /   s6       +H8 #V V V V V	' 	' 	' 	' )  )  )  )D" " " " " ">8 8 8 8; ; ; ;z=7 =7 =7 =7~HB HB HBT' ' '  
 
 
V V V V V V Vr    r,   c                   V     e Zd ZdZdZdZdZdd fd
Zd Zd	 Z	 fd
Z
d Zd Z xZS )ManifestFilesMixin1.0zstaticfiles.jsonTFN)manifest_storagec                     t                      j        |i | || }|| _        |                                 | _        d S r   )r   r   r   load_manifestr0   )r   r   r   r   r   s       r   r   zManifestFilesMixin.__init__  sM    $)&)))## 0 ..00r    c                     	 | j                             | j                  5 }|                                                                cd d d            S # 1 swxY w Y   d S # t
          $ r Y d S w xY wr   )r   rS   manifest_namer   r   FileNotFoundError)r   manifests     r   read_manifestz ManifestFilesMixin.read_manifest  s    	&++D,>?? 08}}--//0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0  	 	 	44	s4   A! &AA! AA! AA! !
A/.A/c                 *   |                                  }|i S 	 t          j        |          }|                    d          }|dk    r|                    di           S n# t          j        $ r Y nw xY wt          d| j        d| j        d          )Nversionr   r   zCouldn't load manifest 'z' (version ))r   jsonloadsr   JSONDecodeErrorrR   r   manifest_version)r   rE   storedr   s       r   r   z ManifestFilesMixin.load_manifest  s    $$&&?I	/Z((F jj++G%zz'2...  	 # 	 	 	D	 j!!!4#8#8#8:
 
 	
s   A   A21A2c              /      K   i | _          t                      j        |i |E d {V  |                    d          s|                                  d S d S )Nr   )r0   r   r   r   save_manifest)r   r   r   r   s      r   r   zManifestFilesMixin.post_process  ss      '577'8888888888zz)$$ 	!     	! 	!r    c                 F   | j         | j        d}| j                            | j                  r| j                            | j                   t          j        |                                          }| j        	                    | j        t          |                     d S )N)r   r   )r0   r   r   rQ   r   r   r   dumpsr   r   r   )r   payloadcontentss      r   r   z ManifestFilesMixin.save_manifest  s     -$:OPP ''(:;; 	=!(();<<<:g&&--//##D$6H8M8MNNNNNr    c                    t          t          |                    }|j                                        }|                     |          }| j                            |          }|A| j        rt          d|z            | 	                    | 
                    |                    }t          |          }||d<   d|v r|d         s|dxx         dz  cc<   t          |          S )Nz+Missing staticfiles manifest entry for '%s'rL   rM   rN   rO   )r   r   r"   rP   r   r0   r   manifest_strictrR   r\   r`   r4   r   )r   r#   r[   r\   r   r   ra   s          r   rq   zManifestFilesMixin.stored_name  s    wt}}-- %++--
==,,&**844
#  AJN   )9)9$)?)?@@J[))%a 4<<a 0<!#-(((r    )r%   r&   r'   r   r   r   r   r   r   r   r   r   rq   r)   r*   s   @r   r   r     s        &MO#/3 1 1 1 1 1 1 1  
 
 
"! ! ! ! !O O O) ) ) ) ) ) )r    r   c                       e Zd ZdZdS )ManifestStaticFilesStoragezh
    A static file system storage backend which also saves
    hashed copies of the files it saves.
    N)r%   r&   r'   r(   r   r    r   r   r     s         
 	Dr    r   c                       e Zd Zd ZdS )ConfiguredStoragec                 R     t          t          j                              | _        d S r   )r   r   STATICFILES_STORAGE_wrapped)r   s    r   _setupzConfiguredStorage._setup  s!    G)(*FGGIIr    N)r%   r&   r'   r   r   r    r   r   r     s(        J J J J Jr    r   )r   rV   r}   r6   urllib.parser   r   r   r   django.confr    django.contrib.staticfiles.utilsr   r	   django.core.exceptionsr
   django.core.files.baser   django.core.files.storager   r   django.utils.cryptor   django.utils.functionalr   r   r,   r   r   r   staticfiles_storager   r    r   <module>r      s    				     				 A A A A A A A A A A A A             M M M M M M M M 7 7 7 7 7 7 . . . . . . J J J J J J J J # # # # # # . . . . . ." " " " "* " " ">mV mV mV mV mV mV mV mV`C) C) C) C) C)) C) C) C)L	 	 	 	 	!35G 	 	 	J J J J J
 J J J
 ('))   r    