
 X;                 @   s  d  d l  m Z d  d l Z 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
 d  d l m Z m Z d  d l m Z 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 m Z d  d l m Z d  d l m  Z  d  d l! m" Z" m# Z# m$ Z$ m% Z% Gd d   d e  Z& Gd d   d e'  Z( Gd d   d e(  Z) Gd d   d e'  Z* Gd d   d e(  Z+ Gd d   d e+ e&  Z, Gd d   d e) e&  Z- Gd d   d e  Z. e.   Z/ d S)    )unicode_literalsN)OrderedDict)settings)check_settingsmatches_patterns)InvalidCacheBackendErrorcachecaches)ImproperlyConfigured)ContentFile)FileSystemStorageget_storage_class)force_bytes
force_text)
LazyObject)	iteritems)unquote	urldefragurlsplit
urlunsplitc                   s@   e  Z d  Z d Z d d   f d d  Z   f d d   Z   S)StaticFilesStoragez
    Standard file system storage for static files.

    The defaults for ``location`` and ``base_url`` are
    ``STATIC_ROOT`` and ``STATIC_URL``.
    Nc                sx   | d  k r t  j } n  | d  k r0 t  j } n  t |  t t |   j | | | |  | st d  |  _ d  |  _ n  d  S)N)	r   ZSTATIC_ROOT
STATIC_URLr   superr   __init__Zbase_locationlocation)selfr   base_urlargskwargs)	__class__ P/home/ubuntu/projects/ifolica/build/django/django/contrib/staticfiles/storage.pyr   !   s    

	zStaticFilesStorage.__init__c                s.   |  j  s t d   n  t t |   j |  S)NzaYou're using the staticfiles app without having set the STATIC_ROOT setting to a filesystem path.)r   r
   r   r   path)r   name)r   r    r!   r"   /   s    	zStaticFilesStorage.path)__name__
__module____qualname____doc__r   r"   r    r    )r   r!   r      s   r   c                   s   e  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   Z d d   Z d d   Z   S)HashedFilesMixinz	url("%s")*.css#(url\(['"]{0,1}\s*(.*?)["']{0,1}\))(@import\s*["']\s*(.*?)["'])@import url("%s")c                s   t  t |   j | |   t   |  _ i  |  _ x |  j D] \ } } xr | D]j } t | t t	 f  ru | \ } } n	 |  j
 } t j | t j  } |  j j | g   j | | f  qK Wq8 Wd  S)N)r   r(   r   r   	_patternshashed_filespatterns
isinstancetuplelistdefault_templaterecompile
IGNORECASE
setdefaultappend)r   r   r   	extensionr/   patterntemplateZcompiled)r   r    r!   r   @   s    		zHashedFilesMixin.__init__Nc             C   sT   | d k r d St  j   } x! | j   D] } | j |  q) W| j   d d  S)zU
        Return a hash of the file with the given name and optional content.
        N   )hashlibmd5chunksupdate	hexdigest)r   r#   contentr>   chunkr    r    r!   	file_hashM   s    zHashedFilesMixin.file_hashc             C   sp  t  t |   } | j j   } d } | d  k r |  j |  s[ t d | |  f   n  y |  j |  } Wn t k
 r | SYn Xd } n  z |  j | |  } Wd  | r | j	   n  Xt
 j j |  \ } } t
 j j |  \ }	 }
 | d  k	 rd | } n  t
 j j | d |	 | |
 f  } t |  } | | d <d | k rf| d rf| d d	 7<n  t |  S)
NFz)The file '%s' could not be found with %r.Tz.%sz%s%s%s   z?#   ?)r   r   r"   stripexists
ValueErroropenIOErrorrD   closeossplitsplitextjoinr2   r   )r   r#   rB   Zparsed_name
clean_nameZopenedrD   r"   filenamerootexthashed_nameZunparsed_namer    r    r!   rV   X   s6    		
zHashedFilesMixin.hashed_nameFc       	         s   t  j r  | r  | d } } nB t |  \ } } t |  j j d  rS | } n |  j |  } t t |   j	 |  } d | k } | s | r t
 t |   } | r | d r | | d <n  | r | d r | d d 7<n  t |  } n  t |  S)z4
        Return the real URL in DEBUG mode.
         /z?#   rF   rE   rG   )r   DEBUGr   r   r"   endswithstored_namer   r(   urlr2   r   r   )	r   r#   forcerV   fragmentrR   Z	final_urlZquery_fragmenturlparts)r   r    r!   r]   y   s     	zHashedFilesMixin.urlc                s4    d k r  j   n      f d d   } | S)zJ
        Return the custom URL converter for the given file name.
        Nc       	         sp  |  j    \ } } | j d  r% | S| j d  rK | j t j  rK | St |  \ } } | j d  r | j t j  s t  | t t j  d  } nE t j d k r   n   j	 t j d  } t
 j t
 j |  |  }  j t |  d d	 } d j | j d  d d  | j d  d d   } | rb| d | k rTd n d | 7} n   t |  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.
            http:https://#data:rX   Nr^   T   z?#)ra   rb   rc   rd   re   rg   )groups
startswithr   r   r   AssertionErrorlenrN   sepreplace	posixpathrQ   dirnamer]   r   rO   )	Zmatchobjmatchedr]   Zurl_pathr_   Ztarget_nameZsource_nameZ
hashed_urlZtransformed_url)r#   r   r;   r    r!   	converter   s     "*9#z1HashedFilesMixin.url_converter.<locals>.converter)r3   )r   r#   r;   rq   r    )r#   r   r;   r!   url_converter   s    *zHashedFilesMixin.url_converterc             +   s`  | r
 d St    }   f d d   | D } d d   } xt | j   d | d d D]} | | \ } }	 | j |	  }
   j | |
  } t |
 d	  r |
 j d
  n    j |  } d } | | k r|
 j   j	 t
 j  } x t   j  D] \ } } t |	 | f  r xu | D]j \ } }   j | |  } y | j | |  } Wqt k
 r} z | d | f VWYd d } ~ XqXqWq q W| r  j |  n  t t |   }   j | |  } t   j |   } d } n6 | s!d }   j | |
  } t   j |   } n  | |   j |  <| | | f VWd QXqW W  j j |  d S)a  
        Post process the given OrderedDict 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 j    r |  q Sr    )r   r-   keys).0r"   )r   r    r!   
<listcomp>   s   	 z1HashedFilesMixin.post_process.<locals>.<listcomp>c             S   s   t  |  j t j   S)N)rk   rO   rN   rl   )r#   r    r    r!   
path_level   s    z1HashedFilesMixin.post_process.<locals>.path_levelkeyreverseTseekr   F)r   sortedrs   rK   rV   hasattrry   rI   readdecoder   ZFILE_CHARSETr   r-   r   rr   subrJ   deleter   r   _saver   rR   hash_keyr.   r@   )r   pathsdry_runoptionsr.   Zadjustable_pathsrv   r#   Zstorager"   Zoriginal_filerV   Zhashed_file_exists	processedrB   r9   r/   r:   r;   rq   excZcontent_fileZ
saved_namer    )r   r!   post_process   sH    	%,	zHashedFilesMixin.post_processc             C   s   | j  d d  S)N\rX   )rm   )r   r#   r    r    r!   rR     s    zHashedFilesMixin.clean_namec             C   s   | S)Nr    )r   r#   r    r    r!   r     s    zHashedFilesMixin.hash_keyc             C   sY   |  j  |  } |  j j |  } | d  k rU |  j |  j |   } | |  j | <n  | S)N)r   r.   getrR   rV   )r   r#   r   Z
cache_namer    r    r!   r\      s    zHashedFilesMixin.stored_namer+   r,   r*   r   r)   r   )r   )r$   r%   r&   r3   r/   r   rD   rV   r]   rr   r   rR   r   r\   r    r    )r   r!   r(   7   s     !3Rr(   c                   sd   e  Z d  Z d Z d Z   f d d   Z d d   Z d d   Z   f d	 d
   Z d d   Z	   S)ManifestFilesMixinz1.0zstaticfiles.jsonc                s,   t  t |   j | |   |  j   |  _ d  S)N)r   r   r   load_manifestr.   )r   r   r   )r   r    r!   r   /  s    zManifestFilesMixin.__init__c             C   sO   y2 |  j  |  j   } | j   j d  SWd  QXWn t k
 rJ d  SYn Xd  S)Nzutf-8)rK   manifest_namer|   r}   rL   )r   manifestr    r    r!   read_manifest3  s
    z ManifestFilesMixin.read_manifestc             C   s   |  j    } | d  k r t   Sy t j | d t } Wn t k
 rL Yn/ X| j d  } | d k r{ | j d t    St d |  j |  j f   d  S)Nobject_pairs_hookversionz1.0r   z(Couldn't load manifest '%s' (version %s))r   r   jsonloadsrJ   r   r   manifest_version)r   rB   Zstoredr   r    r    r!   r   :  s    z ManifestFilesMixin.load_manifestc             /   sK   t    |  _ t t |   j | |   } x | D] } | Vq. W|  j   d  S)N)r   r.   r   r   r   save_manifest)r   r   r   Zall_post_processedZpost_processed)r   r    r!   r   I  s    	zManifestFilesMixin.post_processc             C   st   i |  j  d 6|  j d 6} |  j |  j  r? |  j |  j  n  t j |  j d  } |  j |  j t	 |   d  S)Nr   r   zutf-8)
r.   r   rI   r   r   r   dumpsencoder   r   )r   payloadcontentsr    r    r!   r   Q  s
    z ManifestFilesMixin.save_manifest)
r$   r%   r&   r   r   r   r   r   r   r   r    r    )r   r!   r   +  s   r   c               @   sa   e  Z d  Z d Z d d   Z d d   Z d d   Z d d	   Z d
 d   Z d d d  Z	 d S)_MappingCachezG
    A small dict-like wrapper for a given cache backend instance.
    c             C   s   | |  _  d  S)N)r   )r   r   r    r    r!   r   ]  s    z_MappingCache.__init__c             C   s   |  j  j | |  d  S)N)r   set)r   rw   valuer    r    r!   __setitem__`  s    z_MappingCache.__setitem__c             C   s5   |  j  j |  } | d  k r1 t d |   n  | S)NzCouldn't find a file name '%s')r   r   KeyError)r   rw   r   r    r    r!   __getitem__c  s    z_MappingCache.__getitem__c             C   s   |  j  j   d  S)N)r   clear)r   r    r    r!   r   i  s    z_MappingCache.clearc             C   s   |  j  j |  d  S)N)r   Zset_many)r   datar    r    r!   r@   l  s    z_MappingCache.updateNc             C   s)   y |  | SWn t  k
 r$ | SYn Xd  S)N)r   )r   rw   defaultr    r    r!   r   o  s    z_MappingCache.get)
r$   r%   r&   r'   r   r   r   r   r@   r   r    r    r    r!   r   Y  s   r   c                   s.   e  Z d  Z   f d d   Z d d   Z   S)CachedFilesMixinc                sX   t  t |   j | |   y t t d  |  _ Wn! t k
 rS t t  |  _ Yn Xd  S)NZstaticfiles)r   r   r   r   r	   r.   r   default_cache)r   r   r   )r   r    r!   r   w  s
    zCachedFilesMixin.__init__c             C   s,   t  j t |  j |    j   } d | S)Nzstaticfiles:%s)r=   r>   r   rR   rA   )r   r#   rw   r    r    r!   r     s    $zCachedFilesMixin.hash_key)r$   r%   r&   r   r   r    r    )r   r!   r   v  s   r   c               @   s   e  Z d  Z d Z d S)CachedStaticFilesStoragezh
    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 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 j    |  _ d  S)N)r   r   ZSTATICFILES_STORAGEZ_wrapped)r   r    r    r!   _setup  s    zConfiguredStorage._setupN)r$   r%   r&   r   r    r    r    r!   r     s   r   )0
__future__r   r=   r   rN   rn   r4   collectionsr   Zdjango.confr   Z django.contrib.staticfiles.utilsr   r   Zdjango.core.cacher   r   r   r	   Zdjango.core.exceptionsr
   Zdjango.core.files.baser   Zdjango.core.files.storager   r   Zdjango.utils.encodingr   r   Zdjango.utils.functionalr   Zdjango.utils.sixr   Z#django.utils.six.moves.urllib.parser   r   r   r   r   objectr(   r   r   r   r   r   r   Zstaticfiles_storager    r    r    r!   <module>   s2   ".