
^Q\M                 @   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" 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  Z0 e0   Z1 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)range)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__ H/var/www/dbchiro/venv/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#   0   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 d$ Z   f d d   Z d	 d
 d  Z d	 d	 d d  Z d 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   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   	extensionr1   patterntemplateZcompiled)r    r!   r"   r   B   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_hashO   s    zHashedFilesMixin.file_hashc             C   s  t  t |   } | j j   } | rE t  t |   j j   } n  | pN | } 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	 r6d | } n  t
 j j | d |	 | |
 f  } t |  } | | d <d | k r| d r| 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IOErrorrF   closeossplitsplitextjoinr4   r   )r   r$   rD   filenameparsed_name
clean_nameZopenedrF   r#   rootexthashed_nameunparsed_namer!   r!   r"   rY   Z   s:    		
zHashedFilesMixin.hashed_nameFc                s  t  j r  | r  | d } } nd t |  \ } } t |  j j d  rS | } n1 | f } | d k	 rx | | f 7} n  | |   } 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)	z:
        Return the non-hashed URL in DEBUG mode.
         /Nz?#   rH   rG   rI   )r   DEBUGr   r   r#   endswithr   r)   urlr4   r   r   )r   Zhashed_name_funcr$   forcer0   rY   fragmentrV   r   Z	final_urlZquery_fragmenturlparts)r    r!   r"   _url   s&    		zHashedFilesMixin._urlc             C   s   |  j  |  j | |  S)z:
        Return the non-hashed URL in DEBUG mode.
        )rd   stored_name)r   r$   ra   r!   r!   r"   r`      s    zHashedFilesMixin.urlc                s7    d k r  j   n       f d d   } | S)zJ
        Return the custom URL converter for the given file name.
        Nc       	         s  |  j    \ } } t j d |  r( | S| j d  rN | j t j  rN | 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  j t |  d d d   } d j | j d  d d
  | j d  d d   } | rq| d | k rc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.
            z^[a-z]+:r\   Nra   Tr0      z?##rh   )groupsr6   match
startswithr   r   r   AssertionErrorlenrP   sepreplace	posixpathrS   dirnamerd   _stored_namer   rQ   )	Zmatchobjmatchedr`   Zurl_pathrb   Ztarget_nameZsource_nameZ
hashed_urlZtransformed_url)r0   r$   r   r=   r!   r"   	converter   s$    "*9#z1HashedFilesMixin.url_converter.<locals>.converter)r5   )r   r$   r0   r=   rt   r!   )r0   r$   r   r=   r"   url_converter   s    -zHashedFilesMixin.url_converterc             +   s   | r
 d St    }  f d d     D } x7  j   | |  D]  \ } } } }	 | | | f VqB W  f d d   | D   xm t  j  D]\ }
 d } xC  j   | |  D], \ } } } } | | | f V| p | } q W| s Pq q W| rd d t d  f Vn   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   i  |  ] }   | |  q Sr!   r!   )rw   r#   )pathsr!   r"   
<dictcomp>   s   	 z1HashedFilesMixin.post_process.<locals>.<dictcomp>FZAllz!Max post-process passes exceeded.)r   _post_processr   max_post_process_passesRuntimeErrorr0   rB   )r   ry   dry_runoptionsr0   adjustable_pathsr$   rY   	processed_isubstitutionsZsubstr!   )ry   r   r"   post_process   s"    	((zHashedFilesMixin.post_processc             c   s  d d   } xt  | j   d | d d D]} d } | | \ } } | j |  h}	 |  j |  }
 |  j |
  } | | k r |  j | |	  } n
 | | } t |	 d  r |	 j d  n  |  j |  } d } | | k r`| } |	 j	   j
 t j  } x t |  j  D] \ } } t | | f  rx{ | D]p \ } } |  j | | |  } y | j | |  } Wq5t k
 r} z | d  | d f VWYd  d  } ~ Xq5Xq5WqqW| r|  j |  n  t t |   } |  j | |  } |  j | |  } |  j |  r|  j |  n  |  j | |  } t |  j |   } | | k rWd } n  d } n  | s| sd } |  j | |	  } t |  j |   } qn  | | | <| | | | f VWd  QXq+ Wd  S)	Nc             S   s   t  |  j t j   S)N)rm   rQ   rP   rn   )r$   r!   r!   r"   
path_level  s    z2HashedFilesMixin._post_process.<locals>.path_levelkeyreverseTseekr   F)sortedrv   rM   rV   hash_keyrY   hasattrr   rK   readdecoder   ZFILE_CHARSETr   r/   r   ru   subrL   deleter   r   _saver   )r   ry   r   r0   r   r$   r   Zstorager#   Zoriginal_filecleaned_namer   rY   Zhashed_file_existsr   Zold_hashed_namerD   r;   r1   r<   r=   rt   excZcontent_fileZ
saved_namer!   r!   r"   r{   
  sX    %
/		
zHashedFilesMixin._post_processc             C   s   | j  d d  S)N\r\   )ro   )r   r$   r!   r!   r"   rV   Q  s    zHashedFilesMixin.clean_namec             C   s   | S)Nr!   )r   r$   r!   r!   r"   r   T  s    zHashedFilesMixin.hash_keyc             C   sg   t  j |  } |  j |  } |  j |  } | j |  } | d  k rc |  j |  j |   } n  | S)N)rp   normpathrV   r   getrY   )r   r$   r0   r   r   
cache_namer!   r!   r"   rr   W  s    zHashedFilesMixin._stored_namec             C   s   |  j  |  } |  j |  } |  j j |  } | r: | S| } xb t |  j d  D]M } |  j  |  j | d d  d |  } | | k r | |  j | <| S| } qT Wt d | |  f   d  S)Nrf   rD   rT   z*The name '%s' could not be hashed with %r.)rV   r   r0   r   r   r|   rY   rL   )r   r$   r   r   r   Zintermediate_namer   r!   r!   r"   re   c  s    
zHashedFilesMixin.stored_namer-   r.   r,   r   r+   r   )r   )r%   r&   r'   r5   r|   r1   r   rF   rY   rd   r`   ru   r   r{   rV   r   rr   re   r!   r!   )r    r"   r)   8   s"     %60Gr)   c                   sv   e  Z d  Z d Z d Z d Z   f d d   Z d d   Z d d	   Z   f d
 d   Z	 d d   Z
 d d   Z   S)ManifestFilesMixinz1.0zstaticfiles.jsonTc                s,   t  t |   j | |   |  j   |  _ d  S)N)r   r   r   load_manifestr0   )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)rM   manifest_namer   r   rN   )r   manifestr!   r!   r"   read_manifest  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.0ry   z(Couldn't load manifest '%s' (version %s))r   r   jsonloadsrL   r   r   manifest_version)r   rD   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   r0   r   r   r   save_manifest)r   r   r   Zall_post_processedZpost_processed)r    r!   r"   r     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)Nry   r   zutf-8)
r0   r   rK   r   r   r   dumpsencoder   r   )r   payloadcontentsr!   r!   r"   r     s
    z ManifestFilesMixin.save_manifestc             C   s   t  t |   } | j j   } |  j |  } |  j j |  } | d  k r |  j rj t d |   n  |  j	 |  j
 |   } n  t |  } | | d <d | k r | d r | d d 7<n  t |  S)Nz+Missing staticfiles manifest entry for '%s'rG   z?#rH   rI   )r   r   r#   rJ   r   r0   r   manifest_strictrL   rV   rY   r4   r   )r   r$   rU   rV   r   r   rZ   r!   r!   r"   re     s    	
zManifestFilesMixin.stored_name)r%   r&   r'   r   r   r   r   r   r   r   r   re   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   r   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   r   r   r!   r!   r"   __getitem__  s    z_MappingCache.__getitem__c             C   s   |  j  j   d  S)N)r   clear)r   r!   r!   r"   r     s    z_MappingCache.clearc             C   s   |  j  j |  d  S)N)r   Zset_many)r   datar!   r!   r"   rB     s    z_MappingCache.updateNc             C   s)   y |  | SWn t  k
 r$ | SYn Xd  S)N)r   )r   r   defaultr!   r!   r"   r     s    z_MappingCache.get)
r%   r&   r'   r(   r   r   r   r   rB   r   r!   r!   r!   r"   r     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	   r0   r   default_cache)r   r   r   )r    r!   r"   r     s
    zCachedFilesMixin.__init__c             C   s,   t  j t |  j |    j   } d | S)Nzstaticfiles:%s)r?   r@   r   rV   rC   )r   r$   r   r!   r!   r"   r     s    $zCachedFilesMixin.hash_key)r%   r&   r'   r   r   r!   r!   )r    r"   r     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   )2
__future__r   r?   r   rP   rp   r6   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.movesr   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>   s6   " D@