a
    ¥Q•hœQ  ã                   @   sò   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
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„ deƒZG dd„ dƒZG dd„ deƒZG dd„ deeƒZG dd„ deƒZeƒ ZdS )é    N)ÚunquoteÚ	urldefragÚurlsplitÚ
urlunsplit)ÚSTATICFILES_STORAGE_ALIASÚsettings)Úcheck_settingsÚmatches_patterns)ÚImproperlyConfigured)ÚContentFile)ÚFileSystemStorageÚstorages)Úmd5)Ú
LazyObjectc                       s.   e Zd ZdZd‡ fdd„	Z‡ fdd„Z‡  ZS )ÚStaticFilesStoragez˜
    Standard file system storage for static files.

    The defaults for ``location`` and ``base_url`` are
    ``STATIC_ROOT`` and ``STATIC_URL``.
    Nc                    sT   |d u rt j}|d u rt j}t|ƒ tƒ j||g|¢R i |¤Ž |sPd | _d | _d S ©N)r   ÚSTATIC_ROOTÚ
STATIC_URLr   ÚsuperÚ__init__Úbase_locationÚlocation)Úselfr   Úbase_urlÚargsÚkwargs©Ú	__class__© ú[/var/www/sistema_ama/venv/lib/python3.9/site-packages/django/contrib/staticfiles/storage.pyr      s    zStaticFilesStorage.__init__c                    s   | 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   r   r   r    %   s
    ÿzStaticFilesStorage.path)NN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r    Ú__classcell__r   r   r   r   r      s   r   c                       sœ   e Zd ZdZdZdZdZdZdZ‡ fdd„Z	d d
d„Z
d!dd„Zd"‡ fd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d„ Z‡  ZS )&ÚHashedFilesMixinzurl("%(url)s")é   F)ú*.js))zU(?P<matched>import(?s:(?P<import>[\s\{].*?))\s*from\s*['"](?P<url>[\.\/].*?)["']\s*;)z import%(import)s from "%(url)s";)zV(?P<matched>export(?s:(?P<exports>[\s\{].*?))\s*from\s*["'](?P<url>[\.\/].*?)["']\s*;)z!export%(exports)s from "%(url)s";)z4(?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"))zI(?m)(?P<matched>)^(/\*#[ \t](?-i:sourceMappingURL)=(?P<url>.*)[ \t]*\*/)$z/*# sourceMappingURL=%(url)s */)r*   ))z;(?m)(?P<matched>)^(//# (?-i:sourceMappingURL)=(?P<url>.*))$z//# sourceMappingURL=%(url)sTc                    s˜   | j r|  j| jf7  _tƒ j|i |¤Ž i | _i | _| jD ]V\}}|D ]H}t|tt	fƒrd|\}}n| j
}t |tj¡}| j |g ¡ ||f¡ qHq<d S 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   Ú	extensionr,   ÚpatternÚtemplateZcompiledr   r   r   r   l   s    
zHashedFilesMixin.__init__Nc                 C   s>   |du rdS t dd�}| ¡ D ]}| |¡ q| ¡ 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Úchunkr   r   r   Ú	file_hash{   s    
zHashedFilesMixin.file_hashc                 C   s,  t t|ƒƒ}|j ¡ }|r,t t|ƒƒj ¡ p.|}|d u }|r||  |¡sVtd|| f ƒ‚z|  |¡}W n tyz   | Y S 0 z|  ||¡}W |r¨| 	¡  n|r¦| 	¡  0 t
j |¡\}}t
j |¡\}	}
|rÔd| nd}t
j |d|	||
f ¡}t|ƒ}||d< d|v �r$|d �s$|d  d7  < t|ƒS )	Nz)The file '%s' could not be found with %r.z.%sÚ z%s%s%sé   ú?#é   ú?)r   r   r    ÚstripÚexistsÚ
ValueErrorÚopenÚOSErrorrD   ÚcloseÚosÚsplitÚsplitextÚjoinr2   r   )r   r"   rA   ÚfilenameÚparsed_nameÚ
clean_nameZopenedrD   r    ÚrootÚextÚhashed_nameÚunparsed_namer   r   r   rY   †   s8    


ÿ

ÿ
zHashedFilesMixin.hashed_namec                    sÀ   t jr|s|d }}nBt|ƒ\}}t|ƒj d¡r8|}n |f}|durP||f7 }||Ž }tƒ  |¡}	d|v }
|st|
r¸tt|	ƒƒ}|r”|d s”||d< |
r°|d s°|d  d7  < t	|ƒ}	t
|	ƒS )	ú:
        Return the non-hashed URL in DEBUG mode.
        rE   ú/NrG   é   rH   rF   rI   )r   ÚDEBUGr   r   r    Úendswithr   Úurlr2   r   r   )r   Zhashed_name_funcr"   Úforcer/   rY   ÚfragmentrV   r   Z	final_urlZquery_fragmentZurlpartsr   r   r   Ú_url¨   s&    

zHashedFilesMixin._urlc                 C   s   |   | j||¡S )r[   )rc   Ústored_name)r   r"   ra   r   r   r   r`   Ç   s    zHashedFilesMixin.urlc                    s$   ˆdu rˆj ‰‡ ‡‡‡fdd„}|S )zJ
        Return the custom URL converter for the given file name.
        Nc           
         s(  |   ¡ }|d }|d }t d|¡r(|S | d¡rB| tj¡sB|S t|ƒ\}}|sV|S | d¡r„| tj¡spJ ‚|ttjƒd… }n.tj	dkr’ˆnˆ 
tj	d¡}t t |¡|¡}ˆjˆjt|ƒdˆ d�}d | d¡dd… | d¡dd…  ¡}	|�r|	d	|v �r
d	nd
| 7 }	t|	ƒ|d< ˆ| 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.
            Úmatchedr`   z^[a-z]+:r\   NT)ra   r/   éÿÿÿÿrG   ú#)Ú	groupdictr4   ÚmatchÚ
startswithr   r   r   ÚlenrP   ÚsepÚreplaceÚ	posixpathrS   Údirnamerc   Ú_stored_namer   rQ   )
ZmatchobjÚmatchesre   r`   Zurl_pathrb   Ztarget_nameZsource_nameZ
hashed_urlZtransformed_url©r/   r"   r   r;   r   r   Ú	converterÔ   s8    
ü"ÿz1HashedFilesMixin.url_converter.<locals>.converter)r3   )r   r"   r/   r;   rs   r   rr   r   Úurl_converterÍ   s    8zHashedFilesMixin.url_converterc                 +   s  |rdS i }‡fdd„ˆ D ƒ}i }ˆ  ˆ ||¡D ]:\}}}	}
||vsNt|	tƒr\|||	fV  q0|||	f||< q0‡ fdd„|D ƒ‰ d}tˆjƒD ]B}d}ˆ  ˆ ||¡D ]"\}}}	}|||	f||< |pÂ|}q¢|sŒ qÐqŒ|räddtdƒfV  ˆj |¡ | ¡ E dH  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                    s   g | ]}t |ˆ jƒr|‘qS r   )r	   r.   ©Ú.0r    ©r   r   r   Ú
<listcomp>$  s   z1HashedFilesMixin.post_process.<locals>.<listcomp>c                    s   i | ]}|ˆ | “qS r   r   ru   )Úpathsr   r   Ú
<dictcomp>5  ó    z1HashedFilesMixin.post_process.<locals>.<dictcomp>FÚAllz!Max post-process passes exceeded.)	Ú_post_processr0   Ú	ExceptionÚrangeÚmax_post_process_passesÚRuntimeErrorr/   r?   Úvalues)r   ry   Údry_runÚoptionsr/   Úadjustable_pathsZprocessed_adjustable_pathsr"   rY   Ú	processedÚ_ÚsubstitutionsÚiÚsubstr   )ry   r   r   Úpost_process  s8    
ÿÿÿ
zHashedFilesMixin.post_processc                 c   s  dd„ }t ||dd�D �]ê}d}|| \}}| |¡��¸}	|  |¡}
|  |
¡}||vrd|  ||	¡}n|| }t|	dƒr€|	 d¡ |  |¡}d}||v �r¦|}|	 ¡  	d¡}| j
 ¡ D ]v\}}t||fƒr´|D ]\\}}|  |||¡}z| ||¡}W qÌ t�y& } z|d |dfV  W Y d }~qÌd }~0 0 qÌq´|�r<|  |¡ t| ¡ ƒ}| j�r\|  ||¡ |  ||¡}|  |¡�r~|  |¡ |  ||¡}|  |¡}||k�r¢d}d}|�sÌ|�sÌd}|  ||	¡}|  |¡}|||< ||||fV  W d   ƒ q1 �sø0    Y  qd S )	Nc                 S   s   t |  tj¡ƒS r   )rk   rQ   rP   rl   )r"   r   r   r   Ú
path_levelO  s    z2HashedFilesMixin._post_process.<locals>.path_levelT)ÚkeyÚreverseÚseekr   Fzutf-8)ÚsortedrM   rV   Úhash_keyrY   Úhasattrr�   rK   ÚreadÚdecoder.   Úitemsr	   rt   ÚsubrL   Údeleter   ÚencodeÚkeep_intermediate_filesÚ_save)r   ry   r…   r/   rŒ   r"   rˆ   Ústorager    Zoriginal_fileÚcleaned_namer‘   rY   Zhashed_file_existsr†   Zold_hashed_namerA   r9   r,   r:   r;   rs   ÚexcZcontent_fileZ
saved_namer   r   r   r}   M  s^    





ÿ(




zHashedFilesMixin._post_processc                 C   s   |  dd¡S )Nú\r\   )rm   r!   r   r   r   rV   —  s    zHashedFilesMixin.clean_namec                 C   s   |S r   r   r!   r   r   r   r‘   š  s    zHashedFilesMixin.hash_keyc                 C   sD   t  |¡}|  |¡}|  |¡}| |¡}|d u r@|  |  |¡¡}|S r   )rn   ÚnormpathrV   r‘   ÚgetrY   )r   r"   r/   rœ   r‘   Ú
cache_namer   r   r   rp   �  s    



zHashedFilesMixin._stored_namec                 C   sˆ   |   |¡}|  |¡}| j |¡}|r(|S |}t| jd ƒD ]8}|   | j|d |d�¡}||krn|| j|< |  S |}q:td|| f ƒ‚d S )Né   )rA   rT   z*The name '%s' could not be hashed with %r.)rV   r‘   r/   r    r   r€   rY   rL   )r   r"   rœ   r‘   r¡   Zintermediate_namer‰   r   r   r   rd   ©  s    

ÿ
zHashedFilesMixin.stored_name)N)NN)FN)F)N)F)r#   r$   r%   r3   r€   r+   r-   r,   r™   r   rD   rY   rc   r`   rt   r‹   r}   rV   r‘   rp   rd   r'   r   r   r   r   r(   /   s$   

"

A
?Jr(   c                       s^   e Zd ZdZdZdZdZddœ‡ fdd„
Zd	d
„ Zdd„ Z	‡ fdd„Z
dd„ Zdd„ Z‡  ZS )ÚManifestFilesMixinú1.1zstaticfiles.jsonTFN)Úmanifest_storagec                   s8   t ƒ j|i |¤Ž |d u r| }|| _|  ¡ \| _| _d S r   )r   r   r¥   Úload_manifestr/   Úmanifest_hash)r   r¥   r   r   r   r   r   r   Ç  s
    zManifestFilesMixin.__init__c                 C   sZ   z@| j  | j¡�}| ¡  ¡ W  d   ƒ W S 1 s40    Y  W n tyT   Y d S 0 d S r   )r¥   rM   Úmanifest_namer“   r”   ÚFileNotFoundError)r   Zmanifestr   r   r   Úread_manifestÎ  s
    0z ManifestFilesMixin.read_manifestc                 C   s~   |   ¡ }|d u ri dfS zt |¡}W n tjy:   Y n,0 | d¡}|dv rf| di ¡| dd¡fS td| j| jf ƒ‚d S )NrE   Úversion)z1.0r¤   ry   Úhashz(Couldn't load manifest '%s' (version %s))rª   ÚjsonÚloadsÚJSONDecodeErrorr    rL   r¨   Úmanifest_version)r   rA   Zstoredr«   r   r   r   r¦   Õ  s    

ÿÿz ManifestFilesMixin.load_manifestc                 /   s4   i | _ tƒ j|i |¤ŽE d H  | d¡s0|  ¡  d S )Nrƒ   )r/   r   r‹   r    Úsave_manifest)r   r   r   r   r   r   r‹   æ  s    
zManifestFilesMixin.post_processc              	   C   sz   |   d tt t| j ¡ ƒ¡ ¡ ƒ¡| _| j| j	| jdœ}| j
 | j¡rT| j
 | j¡ t |¡ ¡ }| j
 | jt|ƒ¡ d S )N)ry   r«   r¬   )rD   r   r­   Údumpsr�   r/   r•   r˜   r§   r°   r¥   rK   r¨   r—   rš   )r   ÚpayloadÚcontentsr   r   r   r±   ì  s    ÿýz ManifestFilesMixin.save_manifestc                 C   sŽ   t t|ƒƒ}|j ¡ }|  |¡}| j |¡}|d u rV| jrFtd| ƒ‚|  	|  
|¡¡}t|ƒ}||d< d|v r†|d s†|d  d7  < t|ƒS )Nz+Missing staticfiles manifest entry for '%s'rF   rG   rH   rI   )r   r   r    rJ   r‘   r/   r    Úmanifest_strictrL   rV   rY   r2   r   )r   r"   rU   rV   r‘   r¡   rZ   r   r   r   rd   ú  s    

ÿzManifestFilesMixin.stored_name)r#   r$   r%   r°   r¨   rµ   r™   r   rª   r¦   r‹   r±   rd   r'   r   r   r   r   r£   Á  s   r£   c                   @   s   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   r¶   c                   @   s   e Zd Zdd„ ZdS )ÚConfiguredStoragec                 C   s   t t | _d S r   )r   r   Ú_wrappedrw   r   r   r   Ú_setup  s    zConfiguredStorage._setupN)r#   r$   r%   r¹   r   r   r   r   r·     s   r·   ) r­   rP   rn   r4   Úurllib.parser   r   r   r   Údjango.confr   r   Z 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   r   Ú<module>   s(      M	