o
    `©Zh!;  ã                   @   s€   d dl Z d dlmZ d dlmZ d dl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dS )é    N)Úapps)Úget_finders)Ústaticfiles_storage)ÚTags)ÚFileSystemStorage)ÚBaseCommandÚCommandError)Úno_style)Úcached_propertyc                       sŠ   e Zd ZdZdZejgZ‡ fdd„Ze	dd„ ƒZ
dd„ Zd	d
„ Zdd„ Zdd„ Zddd„Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Z‡  ZS )ÚCommandzc
    Copies or symlinks static files from different locations to the
    settings.STATIC_ROOT.
    z*Collect static files in a single location.c                    s<   t ƒ j|i |¤Ž g | _g | _g | _g | _t| _tƒ | _	d S ©N)
ÚsuperÚ__init__Úcopied_filesÚsymlinked_filesÚunmodified_filesÚpost_processed_filesr   Ústorager	   Ústyle)ÚselfÚargsÚkwargs©Ú	__class__© ús/var/www/html/lang_env/lib/python3.10/site-packages/django/contrib/staticfiles/management/commands/collectstatic.pyr      s   zCommand.__init__c                 C   s(   z	| j  d¡ W dS  ty   Y dS w )NÚ FT)r   ÚpathÚNotImplementedError©r   r   r   r   Úlocal   s   þÿzCommand.localc              	   C   sŠ   |j dddddd |j dddd	d |j d
ddg dddd |j ddddd |j ddddd |j ddddd |j ddddd d S )Nz	--noinputz
--no-inputÚstore_falseÚinteractivez-Do NOT prompt the user for input of any kind.)ÚactionÚdestÚhelpz--no-post-processÚpost_processz$Do NOT post process collected files.z-iz--ignoreÚappendÚignore_patternsZPATTERNz`Ignore files or directories matching this glob-style pattern. Use multiple times to ignore more.)r#   Údefaultr$   Úmetavarr%   z-nz	--dry-runÚ
store_truez+Do everything except modify the filesystem.)r#   r%   z-cz--clearz[Clear the existing files using the storage before trying to copy or link the original file.z-lz--linkz7Create a symbolic link to each file instead of copying.z--no-default-ignoreÚuse_default_ignore_patternszWDon't ignore the common private glob-style patterns (defaults to 'CVS', '.*' and '*~').)Úadd_argument)r   Úparserr   r   r   Úadd_arguments'   s\   ûüù
üüü
ûzCommand.add_argumentsc                 K   st   |d | _ |d | _|d | _|d | _|d | _|d }|d r)|t d¡j7 }td	d
„ |D ƒƒ| _|d | _	dS )zA
        Set instance variables based on an options dict
        r"   Ú	verbosityÚlinkÚclearÚdry_runr(   r,   Ústaticfilesc                 S   s   h | ]}t j |¡’qS r   )Úosr   Únormpath)Ú.0Úpr   r   r   Ú	<setcomp>h   s    z&Command.set_options.<locals>.<setcomp>r&   N)
r"   r0   Úsymlinkr2   r3   r   Zget_app_configr(   Úlistr&   )r   Úoptionsr(   r   r   r   Úset_options\   s   




zCommand.set_optionsc                 C   s^  | j r
| js
tdƒ‚| jr|  d¡ | j r| j}n| j}i }tƒ D ]8}| | j	¡D ]/\}}t
|ddƒr<tj |j|¡}n|}||vrO||f||< ||||ƒ q)| jd| dd q)q!| jr£t| jdƒr£| jj|| jd	}|D ]4\}}	}
t|
tƒr‡| j d
| ¡ | j ¡  |
‚|
r›| jd||	f dd | j |¡ qn|  d| ¡ qn| j| j | j| jdœS )zx
        Perform the bulk of the work of collectstatic.

        Split off from handle() to facilitate testing.
        z&Can't symlink to a remote destination.r   ÚprefixNzÆFound another file with the destination path '%s'. It will be ignored since only the first encountered file is collected. If this is not what you want, make sure every static file has a unique path.é   ©Úlevelr&   )r3   zPost-processing '%s' failed!zPost-processed '%s' as '%s'é   zSkipped post-processing '%s')ÚmodifiedÚ
unmodifiedÚpost_processed)r:   r    r   r2   Ú	clear_dirÚ	link_fileÚ	copy_filer   r;   r(   Úgetattrr5   r   Újoinr>   Úlogr&   Úhasattrr   r3   Ú
isinstanceÚ	ExceptionÚstderrÚwriter   r'   r   r   r   )r   ÚhandlerZfound_filesÚfinderr   r   Úprefixed_pathÚ	processorZoriginal_pathZprocessed_pathÚ	processedr   r   r   Úcollectk   sR   

ýûõ


þ
ýzCommand.collectc           	      K   sf  | j di |¤Ž dg}| jr| d¡ | d¡ |  ¡ r:| jjr:| jj}| d| ¡ | j |¡o8t| j |¡ƒ}n	d }| d¡ d}| j	rh|rh| j
rQ| d¡ n| d¡ | d	¡ td
 |¡ƒdkrhtdƒ‚|  ¡ }| jdkr±t|d ƒ}t|d ƒ}t|d ƒ}d|d|dkrŒd
nd | jr“dnd|ršd| nd
|d r£d| nd
|d r¬d| p­d
dœ S d S )NÚ
zGYou have activated the --dry-run option so no files will be modified.

zdYou have requested to collect static files at the destination
location as specified in your settingsz:

    %s

z.

Tz-This will DELETE ALL FILES in this location!
z$This will overwrite existing files!
zNAre you sure you want to do this?

Type 'yes' to continue, or 'no' to cancel: r   Úyesz"Collecting static files cancelled.r?   rC   rD   rE   z]
%(modified_count)s %(identifier)s %(action)s%(destination)s%(unmodified)s%(post_processed)s.zstatic fileÚsZ	symlinkedZcopiedz to '%s'z, %s unmodifiedz, %s post-processed)Úmodified_countÚ
identifierr#   ÚdestinationrD   rE   r   )r=   r3   r'   Úis_local_storager   ÚlocationÚexistsÚanyÚlistdirr"   r2   ÚinputrJ   r   rV   r0   Úlenr:   )	r   r<   ÚmessageZdestination_pathZshould_warn_userÚ	collectedrZ   Zunmodified_countZpost_processed_countr   r   r   Úhandleª   s^   ÿÿ
ÿ


ÿ

ÿÿñýüzCommand.handlerB   c                 C   s   | j |kr| j |¡ dS dS )z"
        Small log helper
        N)r0   ÚstdoutrP   )r   ÚmsgrA   r   r   r   rK   í   s   
ÿzCommand.logc                 C   s   t | jtƒS r   )rM   r   r   r   r   r   r   r]   ô   s   zCommand.is_local_storagec              	   C   sæ   | j  |¡sdS | j  |¡\}}|D ]O}tj ||¡}| jr(| jd| dd q| jd| dd z| j  |¡}W n tyH   | j  	|¡ Y qw tj |¡s[tj 
|¡r[t |¡ q| j  	|¡ q|D ]}|  tj ||¡¡ qddS )zW
        Delete the given relative path using the destination storage backend.
        NúPretending to delete '%s'r?   r@   úDeleting '%s')r   r_   ra   r5   r   rJ   r3   rK   r   ÚdeleteÚlexistsÚunlinkrF   )r   r   ÚdirsÚfilesÚfZfpathÚ	full_pathÚdr   r   r   rF   ÷   s&   ÿÿzCommand.clear_dirc           	   
   C   s  | j  |¡r‚z| j  |¡}W n tttfy   Y nOw z| |¡}W n tttfy.   Y n;w | jrC| j  |¡}| jt	j 
|¡A  }nd}|jdd|jddk}|ri|ri|| jvr`| j |¡ |  d| ¡ dS | jru|  d| ¡ dS |  d| ¡ | j  |¡ dS )zR
        Check if the target file should be deleted if it already exists.
        Tr   )ÚmicrosecondzSkipping '%s' (not modified)Fri   rj   )r   r_   Zget_modified_timeÚOSErrorr   ÚAttributeErrorr    r   r:   r5   ÚislinkÚreplacer   r'   rK   r3   rk   )	r   r   rS   Úsource_storageZtarget_last_modifiedZsource_last_modifiedrq   Zcan_skip_unmodified_filesZfile_is_unmodifiedr   r   r   Údelete_file  s@   þÿÿÿ
þ
þzCommand.delete_filec              
   C   s  || j v r|  d| ¡S |  |||¡sdS | |¡}| jr'| jd| dd nP| jd| dd | j |¡}tjtj |¡dd	 ztj 	|¡rMt 
|¡ t ||¡ W n" tyg   d
dl}td| ¡  ƒ‚ tyv } zt|ƒ‚d}~ww || j vr„| j  |¡ dS dS )z*
        Attempt to link ``path``
        z&Skipping '%s' (already linked earlier)NzPretending to link '%s'r?   r@   zLinking '%s'rB   T)Úexist_okr   z2Symlinking is not supported in this platform (%s).)r   rK   ry   r   r3   r   r5   ÚmakedirsÚdirnamerl   rm   r:   r   Úplatformr   rt   r'   )r   r   rS   rx   Úsource_pathrq   r}   Úer   r   r   rG   E  s8   


ÿÿ€ÿ
ÿzCommand.link_filec                 C   s¨   || j v r|  d| ¡S |  |||¡sdS | |¡}| jr'| jd| dd n%| jd| dd | |¡}| j ||¡ W d  ƒ n1 sGw   Y  | j  |¡ dS )z7
        Attempt to copy ``path`` with storage
        z&Skipping '%s' (already copied earlier)NzPretending to copy '%s'r?   r@   zCopying '%s'rB   )	r   rK   ry   r   r3   Úopenr   Úsaver'   )r   r   rS   rx   r~   Zsource_filer   r   r   rH   h  s   

ÿzCommand.copy_file)rB   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r%   r   r4   Zrequires_system_checksr   r
   r    r/   r=   rV   rf   rK   r]   rF   ry   rG   rH   Ú__classcell__r   r   r   r   r      s"    	
5?
C3#r   )r5   Zdjango.appsr   Z"django.contrib.staticfiles.findersr   Z"django.contrib.staticfiles.storager   Zdjango.core.checksr   Zdjango.core.files.storager   Zdjango.core.management.baser   r   Zdjango.core.management.colorr	   Zdjango.utils.functionalr
   r   r   r   r   r   Ú<module>   s    