
    k"g,R                        d dl Z d dlZd dlZd dlZd dlmZ d dlmZmZm	Z	m
Z
 d dlmZ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  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y)    N)md5)unquote	urldefragurlsplit
urlunsplit)STATICFILES_STORAGE_ALIASsettings)check_settingsmatches_patterns)ImproperlyConfigured)ContentFile)FileSystemStoragestorages)
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``.
    c                     |t         j                  }|t         j                  }t        |       t	        |   ||g|i | |sd | _        d | _        y y N)r	   STATIC_ROOT
STATIC_URLr
   super__init__base_locationlocation)selfr   base_urlargskwargs	__class__s        [/var/www/html/djangosite/lib/python3.12/site-packages/django/contrib/staticfiles/storage.pyr   zStaticFilesStorage.__init__   s_    ++H**Hx 8=d=f= !%D DM     c                 P    | 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 
 w|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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")   F)*.js))zS(?P<matched>import(?s:(?P<import>[\s\{].*?))\s*from\s*['"](?P<url>[./].*?)["']\s*;)z import%(import)s from "%(url)s";)zT(?P<matched>export(?s:(?P<exports>[\s\{].*?))\s*from\s*["'](?P<url>[./].*?)["']\s*;)z!export%(exports)s from "%(url)s";)z2(?P<matched>import\s*['"](?P<url>[./].*?)["']\s*;)zimport"%(url)s";)z+(?P<matched>import\(["'](?P<url>.*?)["']\))zimport("%(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"))zG(?m)^(?P<matched>/\*#[ \t](?-i:sourceMappingURL)=(?P<url>.*)[ \t]*\*/)$z/*# sourceMappingURL=%(url)s */)r/   ))z9(?m)^(?P<matched>//# (?-i:sourceMappingURL)=(?P<url>.*))$z//# sourceMappingURL=%(url)sTc                    | j                   r | xj                  | j                  fz  c_        t        |   |i | i | _        i | _        | j                  D ]  \  }}|D ]{  }t        |t        t        f      r|\  }}n| j                  }t        j                  |t        j                        }| j
                  j                  |g       j                  ||f       }  y r   )$support_js_module_import_aggregationpatterns&_js_module_import_aggregation_patternsr   r   	_patternshashed_files
isinstancetuplelistdefault_templaterecompile
IGNORECASE
setdefaultappend)	r   r   r   	extensionr2   patterntemplatecompiledr   s	           r    r   zHashedFilesMixin.__init__l   s    44MMdIIKKM$)&)#'== 	VIx# Vgt}5(/%GX#44H::gr}}=)))R8??8@TUV	Vr!   c                     |yt        d      }|j                         D ]  }|j                  |        |j                         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{   sN     ?U+^^% 	!EMM% 	!!#2&&r!   c                 "   t        t        |            }|j                  j                         }|xr, t        t        |            j                  j                         xs |}|d u }|r5| j	                  |      st        d|d| d      	 | j                  |      }	 | j                  ||      }|r|j                          	 t        j                  j                  |      \  }}t        j                  j                  |      \  }	}
|rd|z  nd}t        j                  j                  ||	||
      }t        |      }||d<   d|v r|d   s|dxx   d	z  cc<   t        |      S # t        $ r |cY S w xY w# |r|j                          w w xY w)
Nz
The file 'z' could not be found with .z.%s    ?#   ?)r   r   r#   stripexists
ValueErroropenOSErrorrL   closeossplitsplitextjoinr8   r   )r   r$   rI   filenameparsed_name
clean_nameopenedrL   r#   rootexthashed_nameunparsed_names                r    rd   zHashedFilesMixin.hashed_name   so    wt}- %%++-
I'(*;!<!A!A!G!G!IXjD;;x( CKTR ))H-	 z7;Iz2hGG$$X.	c+4UY&"	ggll4T9c)JK[)&a 4<a 0!#-((%    s   E( E9 (E65E69Fc                 ~   t         j                  r|s|d}}nEt        |      \  }}t        |      j                  j                  d      r|}n|f}|||fz  } || }t        |   |      }	d|v }
|s|
r?t        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.
        rO   /rQ      rR   rP   rS   )r	   DEBUGr   r   r#   endswithr   urlr8   r   r   )r   hashed_name_funcr$   forcer5   rd   fragmentr`   r   	final_urlquery_fragmenturlpartsr   s               r    _urlzHashedFilesMixin._url   s     >>%$("K#,T? J
#((11#6""}+\O+D.5GK,	 ~HY/0H&hqks""8,Iy!!r!   c                 <    | j                  | j                  ||      S )rg   )rs   stored_name)r   r$   rn   s      r    rl   zHashedFilesMixin.url   s     yy))477r!   c                 :      j                    fd}|S )zJ
        Return the custom URL converter for the given file name.
        c                 x   | j                         }|d   }|d   }t        j                  d|      s|j                  d      r|S |j                  d      r!|j                  t        j
                        s|S t        |      \  }}|s|S |j                  d      rA|j                  t        j
                        sJ |j                  t        j
                        }n^t        j                  dk(  rnj                  t        j                  d      }t        j                  t        j                  |      |      }j                  j                  t!        |      d
      }dj                  |j#                  d      dd	 |j#                  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.
            matchedrl   z^[a-z]+:z//rh   T)rn   r5   NrQ   #)	groupdictr:   match
startswithr	   r   r   removeprefixrZ   sepreplace	posixpathr]   dirnamers   _stored_namer   r[   )matchobjmatchesrx   rl   url_pathro   target_namesource_name
hashed_urltransformed_urlr5   r$   r   rA   s             r    	converterz1HashedFilesMixin.url_converter.<locals>.converter   s    ((*Gi(G%.C xxS)S^^D-A ~~c"3>>(:M:M+N "+3Hh ""3'**8+>+>???&33H4G4GH ')ffmdbffc9R'nnY->->{-KXV !!$)	 # J "hhs#CR(:+;+;C+@+EEO
 DCKDSH#LL %_5GENg%%r!   )r9   )r   r$   r5   rA   r   s   ```` r    url_converterzHashedFilesMixin.url_converter   s$     ,,H6	&p r!   c              +   J  K   |ryi }|D cg c]  }t        || j                        s| }}i }| j                  |||      D ]+  \  }}	}
}||vst        |
t              r||	|
f $||	|
f||<   - |D ci c]  }|||   
 }}d}t        | j                        D ]3  }d}| j                  |||      D ]  \  }}	}
}||	|
f||<   |xs |} |r3 n |rddt        d      f | j                  j                  |       |j                         E d{    yc c}w c c}w 7 w)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.
        NFAllz!Max post-process passes exceeded.)r   r4   _post_processr6   	Exceptionrangemax_post_process_passesRuntimeErrorr5   rG   values)r   pathsdry_runoptionsr5   r#   adjustable_pathsprocessed_adjustable_pathsr$   rd   	processed_substitutionsisubsts                  r    post_processzHashedFilesMixin.post_process  s       #
&6tT^^&LD
 

 &(" 04/A/A#\0
 	R+D+y! ++z)Y/OK2248+y3Q*40	R 0@@tuT{"@@t334 
	A!M7;7I7I'8 73k9e 59+y3Q*40 - 67 !
	 |,OPPP 	  . .44666O
" A, 	7s5   
D#DDA	D#5DAD#AD#D!D#c           	   #     K   d }t        ||d      D ]  }d}||   \  }}|j                  |      5 }	| j                  |      }
| j                  |
      }||vr| j	                  ||	      }n||   }t        |	d      r|	j                  d       | j                  |      }d}||v r,|}	 |	j                         j                  d      }| j                  j                         D ]C  \  }}t        ||f      s|D ]+  \  }}| j                  |||      }	 |j                  |      }- E |r| j#                  |       t%        j'                               }| j(                  r| j+                  ||       | j	                  ||      }| j                  |      r| j#                  |       | j+                  ||      }| j                  |      }||k(  rd}d}|s'|s%d}| j+                  ||	      }| j                  |      }|||<   ||||f d d d         y # t        $ r}|d |df Y d }~cd }~ww xY w# t         $ r}|d |df Y d }~Rd }~ww xY w# 1 sw Y   IxY ww)Nc                 R    t        | j                  t        j                              S r   )lenr[   rZ   r   )r$   s    r    
path_levelz2HashedFilesMixin._post_process.<locals>.path_levelO  s    tzz"&&)**r!   T)keyreverseseekr   Fzutf-8)sortedrW   r`   hash_keyrd   hasattrr   rU   readdecodeUnicodeDecodeErrorr4   itemsr   r   subrV   deleter   encodekeep_intermediate_files_save)r   r   r   r5   r   r$   r   storager#   original_filecleaned_namer   rd   hashed_file_existsr   old_hashed_namerI   excr?   r2   r@   rA   r   content_file
saved_names                            r    r   zHashedFilesMixin._post_processM  s    	+ 5j$? F	BD M "$KMGTd# AB}#t4==6 </"&"2"24"GK".x"8K =&1!&&q)%)[[%="!	 ++&1O5"/"4"4"6"="=g"F 04~~/C/C/E 	A+	8+D9,?5= A 1,0,>,>$(,-"	!A.5kk)W.MGA	A *K0#.w~~/?#@L33

;="&"2"24"FK{{;/K0!%K!FJ"&//*"=K&+5(- $I  .$(	%)ZZ]%K
&*ooj&A *5X&KMAACAB ABF	B8 . 5"D#u4445 (2 !A*.c5*@$@$@!ACAB ABsx   1I A6I*H	-I7IH4%C$I	I 	H1H,&I,H11I4	I=IIIII	I c                 &    |j                  dd      S )N\rh   )r   r   r$   s     r    r`   zHashedFilesMixin.clean_name  s    ||D#&&r!   c                     |S r    r   s     r    r   zHashedFilesMixin.hash_key  s    r!   c                     t        j                  |      }| j                  |      }| j                  |      }|j	                  |      }| | j                  | j                  |            }|S r   )r   normpathr`   r   getrd   )r   r$   r5   r   r   
cache_names         r    r   zHashedFilesMixin._stored_name  se     !!$'t,==.!%%h/
)9)9$)?@Jr!   c                 `   | j                  |      }| j                  |      }| j                  j                  |      }|r|S |}t	        | j
                  dz         D ]?  }| j                  | j                  |d |            }||k(  r|| j                  |<   |c S |}A t        d|d| d      )N   )rI   r^   z
The name 'z' could not be hashed with rN   )r`   r   r5   r   r   r   rd   rV   )r   r$   r   r   r   intermediate_namer   s          r    ru   zHashedFilesMixin.stored_name  s    t,==.&&**84
 t33a78 
	/A  t>O PJ !J..8!!(+!! %/!
	/ tTUUr!   r   r%   )FN)F)r&   r'   r(   r9   r   r1   r3   r2   r   r   rL   rd   rs   rl   r   r   r   r`   r   r   ru   r*   r+   s   @r    r-   r-   /   sp    ++0(.*6H8 #V	' )D">8?B=7~KBZ'
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.1zstaticfiles.jsonTFN)manifest_storagec                t    t        |   |i | || }|| _        | j                         \  | _        | _        y r   )r   r   r   load_manifestr5   manifest_hash)r   r   r   r   r   s       r    r   zManifestFilesMixin.__init__  sB    $)&)## 0040B0B0D-4-r!   c                     	 | j                   j                  | j                        5 }|j                         j	                         cd d d        S # 1 sw Y   y xY w# t
        $ r Y y w xY wr   )r   rW   manifest_namer   r   FileNotFoundError)r   manifests     r    read_manifestz ManifestFilesMixin.read_manifest  s[    	&&++D,>,>? 08}}--/0 0 0  		s.   %A A	A AA A 	A'&A'c                 J   | j                         }|i dfS 	 t        j                  |      }|j                  d      }|dv r$|j                  di       |j                  dd      fS t        d| j                  d| j                  d      # t        j                  $ r Y ;w xY w)	NrO   version)z1.0r   r   hashzCouldn't load manifest 'z' (version ))r   jsonloadsr   JSONDecodeErrorrV   r   manifest_version)r   rI   storedr   s       r    r   z ManifestFilesMixin.load_manifest  s    $$&?r6M	GZZ(F jj+G.(zz'2.

620FFF!!4#8#8:
 	
 ## 		s   B B"!B"c              /      K   i | _         t        |   |i |E d {    |j                  d      s| j	                          y y 7 'w)Nr   )r5   r   r   r   save_manifest)r   r   r   r   s      r    r   zManifestFilesMixin.post_process  sI     7'8888zz)$  % 	9s   AA(Ac                 H   | j                  d t        t        j                  t	        | j
                  j                                     j                                     | _        | j
                  | j                  | j                  d}| j                  j                  | j                        r%| j                  j                  | j                         t        j                  |      j                         }| j                  j                  | j                  t        |             y )N)r   r   r   )rL   r   r   dumpsr   r5   r   r   r   r   r   rU   r   r   r   )r   payloadcontentss      r    r   z ManifestFilesMixin.save_manifest  s    !^^+djj0A0A0G0G0I)JKRRTU
 &&,,&&

   ''(:(:;!!((););<::g&--/##D$6$6H8MNr!   c                    t        t        |            }|j                  j                         }| j	                  |      }| j
                  j                  |      }|:| j                  rt        d|z        | j                  | j                  |            }t        |      }||d<   d|v r|d   s|dxx   dz  cc<   t        |      S )Nz+Missing staticfiles manifest entry for '%s'rP   rQ   rR   rS   )r   r   r#   rT   r   r5   r   manifest_strictrV   r`   rd   r8   r   )r   r$   r_   r`   r   r   re   s          r    ru   zManifestFilesMixin.stored_name  s    wt}- %%++-
==,&&**84
## AJN  )9)9$)?@J[)%a 4<a 0!#-((r!   )r&   r'   r(   r   r   r   r   r   r   r   r   r   ru   r*   r+   s   @r    r   r     s<    &MO#/3 E
"!O)r!   r   c                       e Zd ZdZy)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    
 	r!   r   c                       e Zd Zd Zy)ConfiguredStoragec                 (    t         t           | _        y r   )r   r   _wrapped)r   s    r    _setupzConfiguredStorage._setup  s     !:;r!   N)r&   r'   r(   r   r   r!   r    r   r     s    <r!   r   ) r   rZ   r   r:   hashlibr   urllib.parser   r   r   r   django.confr   r	    django.contrib.staticfiles.utilsr
   r   django.core.exceptionsr   django.core.files.baser   django.core.files.storager   r   django.utils.functionalr   r   r-   r   r   r   staticfiles_storager   r!   r    <module>r      s     	  	  A A ; M 7 . A ."* ">RV RVjJ)) J)Z	!35G 	<
 <
 () r!   