B
    CVvgT:  ã               @   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                s8   t ƒ j||Ž 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__© ú`/tmp/pip-install-o3oxmrkh/Django/django/contrib/staticfiles/management/commands/collectstatic.pyr      s    zCommand.__init__c             C   s*   y| j  d¡ W n tk
r$   dS X dS )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 rR|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>S   s    z&Command.set_options.<locals>.<setcomp>r#   N)
r   r-   Úsymlinkr/   r0   r   Zget_app_configr%   Úlistr#   )r   Úoptionsr%   r   r   r   Úset_optionsG   s    




zCommand.set_optionsc             C   sr  | j r| jstdƒ‚| jr$|  d¡ | j r2| j}n| j}i }x~tƒ D ]t}xn| | j	¡D ]^\}}t
|ddƒr|tj |j|¡}n|}||kr¢||f||< ||||ƒ qV| jd| dd qVW qDW | jrZt| jdƒrZ| jj|| jd	}xt|D ]l\}}	}
t|
tƒr| j d
| ¡ | j ¡  |
‚|
rH| jd||	f dd | j |¡ qê|  d| ¡ qêW | 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#   )r0   zPost-processing '%s' failed!zPost-processed '%s' as '%s'é   zSkipped post-processing '%s')ÚmodifiedÚ
unmodifiedÚpost_processed)r7   r   r   r/   Ú	clear_dirÚ	link_fileÚ	copy_filer   r8   r%   Úgetattrr2   r   Újoinr;   Úlogr#   Úhasattrr   r0   Ú
isinstanceÚ	ExceptionÚstderrÚwriter   r$   r   r   r   )r   ÚhandlerZfound_filesÚfinderr   r   Úprefixed_pathÚ	processorZoriginal_pathZprocessed_pathÚ	processedr   r   r   ÚcollectV   sH    



zCommand.collectc       	      K   sp  | j f |Ž dg}| jr"| d¡ | d¡ |  ¡ rp| jjrp| jj}| d| ¡ | j |¡olt| j |¡ƒ}nd }| d¡ d}| j	rÌ|rÌ| j
rž| d¡ n
| d¡ | d	¡ td
 |¡ƒdkrÌtdƒ‚|  ¡ }| jdkrlt|d ƒ}t|d ƒ}t|d ƒ}d|d|dkrd
nd | jr(dnd|r8d| nd
|d rLd| nd
|d rbd| pdd
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<   r?   r@   rA   z]
%(modified_count)s %(identifier)s %(action)s%(destination)s%(unmodified)s%(post_processed)s.zstatic fileÚsZ	symlinkedÚcopiedz to '%s'z, %s unmodifiedz, %s post-processed)Úmodified_countÚ
identifierr    Zdestinationr@   rA   )r:   r0   r$   Úis_local_storager   ÚlocationÚexistsÚanyÚlistdirr   r/   ÚinputrF   r   rR   r-   Úlenr7   )	r   r9   ÚmessageZdestination_pathZshould_warn_userZ	collectedrW   Zunmodified_countZpost_processed_countr   r   r   Úhandle”   sJ    



zCommand.handler>   c             C   s   | j |kr| j |¡ dS )z"
        Small log helper
        N)r-   ÚstdoutrL   )r   Úmsgr=   r   r   r   rG   Ï   s    
zCommand.logc             C   s   t | jtƒS )N)rI   r   r   )r   r   r   r   rY   Ö   s    zCommand.is_local_storagec          	   C   sð   | j  |¡sdS | j  |¡\}}x¨|D ] }tj ||¡}| jrR| jd| dd q&| jd| dd y| j  |¡}W n  tk
r”   | j  	|¡ Y q&X tj |¡sºtj 
|¡rºt |¡ q&| j  	|¡ q&W x |D ]}|  tj ||¡¡ qÐW dS )zW
        Delete the given relative path using the destination storage backend.
        NzPretending to delete '%s'r<   )r=   zDeleting '%s')r   r[   r]   r2   r   rF   r0   rG   r   ÚdeleteÚlexistsÚunlinkrB   )r   r   ÚdirsÚfilesÚfZfpathÚ	full_pathÚdr   r   r   rB   Ù   s"    

zCommand.clear_dirc       	   
   C   s  | j  |¡ry| j  |¡}W n tttfk
r8   Y n X y| |¡}W n tttfk
rb   Y nvX | jrŒ| j  |¡}| jt	j 
|¡A  }nd}|jdd|jddk}|rØ|rØ|| jkrÆ| j |¡ |  d| ¡ dS | jrî|  d| ¡ n|  d| ¡ | j  |¡ dS )zR
        Check if the target file should be deleted if it already exists.
        Tr   )ÚmicrosecondzSkipping '%s' (not modified)FzPretending to delete '%s'zDeleting '%s')r   r[   Zget_modified_timeÚOSErrorr   ÚAttributeErrorr   r   r7   r2   ÚislinkÚreplacer   r$   rG   r0   rd   )	r   r   rO   Úsource_storageZtarget_last_modifiedZsource_last_modifiedrj   Zcan_skip_unmodified_filesZfile_is_unmodifiedr   r   r   Údelete_fileô   s2    

zCommand.delete_filec          
   C   sF  || j kr|  d| ¡S |  |||¡s*dS | |¡}| jrN| jd| dd nÜ| jd| dd | j |¡}tjtj |¡dd	 y&tj 	|¡ršt 
|¡ t ||¡ W n€ tk
rÔ   d
dl}td| ¡  ƒ‚Y nV tk
rþ   d
dl}td| ¡  ƒ‚Y n, tk
r( } zt|ƒ‚W dd}~X Y nX || j krB| j  |¡ dS )z*
        Attempt to link ``path``
        z&Skipping '%s' (already linked earlier)NzPretending to link '%s'r<   )r=   zLinking '%s'r>   T)Úexist_okr   z)Symlinking is not supported by Python %s.z2Symlinking is not supported in this platform (%s).)r   rG   rr   r   r0   r   r2   ÚmakedirsÚdirnamere   rf   r7   rn   Úplatformr   Úpython_versionr   rm   r$   )r   r   rO   rq   Úsource_pathrj   rv   Úer   r   r   rC   &  s4    


zCommand.link_filec          	   C   s”   || j kr|  d| ¡S |  |||¡s*dS | |¡}| jrN| jd| dd n6| jd| dd | |¡}| j ||¡ W dQ R X | 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'r>   )	r   rG   rr   r   r0   Úopenr   Úsaver$   )r   r   rO   rq   rx   Zsource_filer   r   r   rD   J  s    

zCommand.copy_file)r>   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r"   r   r1   Zrequires_system_checksr   r
   r   r,   r:   rR   ra   rG   rY   rB   rr   rC   rD   Ú__classcell__r   r   )r   r   r      s   	!>;
2$r   )r2   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   