3
gT:                 @   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__ z/var/www/tester-filtro-web/env/lib/python3.6/site-packages/django/contrib/staticfiles/management/commands/collectstatic.pyr      s    zCommand.__init__c             C   s*   y| j 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j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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 rtd| jr&| jd | j r4| j}n| j}i }x~t D ]t}xn|j| j	D ]^\}}t
|ddr~tjj|j|}n|}||kr||f||< |||| qX| jd| dd qXW qFW | jot| jdrZ| jj|| jd	}xt|D ]l\}}	}
t|
tr| jjd
|  | jj  |
|
rH| jd||	f dd | jj| q| jd|  qW | 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   prefixNzFound 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"|jd |jd | j rp| jjrp| jj}|jd|  | jj|olt| jj|}nd }|jd d}| j	r|r| j
r|jd n
|jd |jd	 td
j|dkrtd| j }| 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    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_user	collectedrW   Zunmodified_countZpost_processed_countr   r   r   handle   sJ    



zCommand.handler>   c             C   s   | j |kr| j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   rZ      s    zCommand.is_local_storagec             C   s   | j j|sdS | j j|\}}x|D ]}tjj||}| jrR| jd| dd q&| jd| dd y| j j|}W n  tk
r   | j j	| Y q&X tjj| rtjj
|rtj| q&| j j	| q&W x |D ]}| jtjj|| qW 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 j|ry| j j|}W n tttfk
r8   Y nX y|j|}W n tttfk
rb   Y nvX | jr| j j|}| jt	jj
|A  }nd}|jdd|jddk}|r|r|| jkr| jj| | jd|  dS | jr| jd|  n| jd|  | j 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   rf   )	r   r   rO   source_storageZtarget_last_modifiedZsource_last_modifiedrl   Zcan_skip_unmodified_filesZfile_is_unmodifiedr   r   r   delete_file   s2    

zCommand.delete_filec             C   sH  || j kr| jd| S | j|||s*dS |j|}| jrN| jd| dd n| jd| dd | jj|}tjtjj|dd	 y&tjj	|rtj
| tj|| W n tk
r   d
dl}td|j  Y nX tk
r    d
dl}td|j  Y n, tk
r* } zt|W Y dd}~X nX || j krD| j 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   rt   r   r0   r   r2   makedirsdirnamerg   rh   r7   rp   platformr   python_versionr   ro   r$   )r   r   rO   rs   source_pathrl   rx   er   r   r   rC   &  s4    


zCommand.link_filec          
   C   s   || j kr| jd| S | j|||s*dS |j|}| jrN| jd| dd n6| jd| dd |j|}| jj|| W dQ R X | j 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   rt   r   r0   openr   saver$   )r   r   rO   rs   rz   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   rc   rG   rZ   rB   rt   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   