a
    Lcòf +  ã                   @   s  d dl Z d dl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mZmZ d dlmZ d d	lmZmZ d d
lmZ g ZG dd„ dƒZG dd„ deƒZG dd„ deƒZG dd„ deƒZG dd„ deƒZddd„Zdd„ Ze j dd�dd„ ƒZ!dS )é    N)Úapps)Úsettings)Úutils)ÚErrorÚWarning)ÚImproperlyConfigured)ÚFileSystemStorageÚStorageÚdefault_storage)Ú	safe_join)Ú
LazyObjectÚempty)Úimport_stringc                   @   s*   e Zd ZdZdd„ Zd
dd„Zdd„ Zd	S )Ú
BaseFinderzN
    A base file finder to be used for custom staticfiles finder classes.
    c                 K   s   t dƒ‚d S )NzUsubclasses may provide a check() method to verify the finder is configured correctly.©ÚNotImplementedError)ÚselfÚkwargs© r   ú_/home/httpd/docs/test/DocsMgr/lib/python3.9/site-packages/django/contrib/staticfiles/finders.pyÚcheck   s    ÿzBaseFinder.checkFc                 C   s   t dƒ‚dS )zÞ
        Given a relative file path, find an absolute file path.

        If the ``all`` parameter is False (default) return only the first found
        file path; if True, return a list of all found files paths.
        z5subclasses of BaseFinder must provide a find() methodNr   )r   ÚpathÚallr   r   r   Úfind   s    ÿzBaseFinder.findc                 C   s   t dƒ‚dS )z•
        Given an optional list of paths to ignore, return a two item iterable
        consisting of the relative path and storage instance.
        z5subclasses of BaseFinder must provide a list() methodNr   )r   Úignore_patternsr   r   r   Úlist(   s    ÿzBaseFinder.listN)F)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   r   r   r   r   r   r      s   
r   c                       sF   e Zd ZdZd‡ fdd„	Zdd„ Zddd	„Zdd
d„Zdd„ Z‡  Z	S )ÚFileSystemFinderz_
    A static files finder that uses the ``STATICFILES_DIRS`` setting
    to locate files.
    Nc                    s’   g | _ i | _tjD ]>}t|ttfƒr.|\}}nd}||f| j vr| j  ||f¡ q| j D ]"\}}t|d�}||_	|| j|< qXt
ƒ j|i |¤Ž d S )NÚ )Úlocation)Ú	locationsÚstoragesr   ÚSTATICFILES_DIRSÚ
isinstancer   ÚtupleÚappendr   ÚprefixÚsuperÚ__init__)r   Ú	app_namesÚargsr   Úrootr)   Zfilesystem_storage©Ú	__class__r   r   r+   8   s    


zFileSystemFinder.__init__c                 K   sÊ   g }t tjttfƒs,| tdddd�¡ |S tjD ]’}t |ttfƒrl|\}}| d¡rl| td| dd�¡ tjržt	j
 tj¡t	j
 |¡krž| td	d
d�¡ t	j
 |¡s2| td|› d�dd�¡ q2|S )Nz4The STATICFILES_DIRS setting is not a tuple or list.z$Perhaps you forgot a trailing comma?zstaticfiles.E001)ÚhintÚidú/zHThe prefix %r in the STATICFILES_DIRS setting must not end with a slash.zstaticfiles.E003)r2   zHThe STATICFILES_DIRS setting should not contain the STATIC_ROOT setting.zstaticfiles.E002zThe directory 'z1' in the STATICFILES_DIRS setting does not exist.zstaticfiles.W004)r&   r   r%   r   r'   r(   r   ÚendswithZSTATIC_ROOTÚosr   ÚabspathÚisdirr   )r   r   Úerrorsr.   r)   r   r   r   r   J   sR    ýÿ

ÿýÿÿ
þýÿ
ýÿzFileSystemFinder.checkFc                 C   sR   g }| j D ]B\}}|tvr$t |¡ |  |||¡}|r
|sB|  S | |¡ q
|S )zW
        Look for files in the extra locations as defined in STATICFILES_DIRS.
        )r#   Úsearched_locationsr(   Úfind_location)r   r   r   Úmatchesr)   r.   Úmatched_pathr   r   r   r   t   s    
zFileSystemFinder.findc                 C   sN   |r0d|t jf }| |¡s dS |t|ƒd… }t||ƒ}t j |¡rJ|S dS )z‚
        Find a requested static file in a location and return the found
        absolute path (or ``None`` if no match).
        z%s%sN)r5   ÚsepÚ
startswithÚlenr   r   Úexists)r   r.   r   r)   r   r   r   r:   ƒ   s    

zFileSystemFinder.find_locationc                 c   sF   | j D ]:\}}tj |¡r| j| }t ||¡D ]}||fV  q0qdS )z2
        List all files in all locations.
        N)r#   r5   r   r7   r$   r   Ú	get_files)r   r   r)   r.   Ústorager   r   r   r   r   ‘   s
    
zFileSystemFinder.list)N)F)N)
r   r   r   r   r+   r   r   r:   r   Ú__classcell__r   r   r/   r   r    2   s   *

r    c                       sD   e Zd ZdZeZdZd‡ fdd„	Zdd„ Zdd	d
„Z	dd„ Z
‡  ZS )ÚAppDirectoriesFinderzu
    A static files finder that looks in the directory of each app as
    specified in the source_dir attribute.
    ZstaticNc                    sž   g | _ i | _t  ¡ }ˆ r2tˆ ƒ‰ ‡ fdd„|D ƒ}|D ]P}|  tj |j| j¡¡}tj 	|j
¡r6|| j|j< |j| j vr6| j  |j¡ q6tƒ j|i |¤Ž d S )Nc                    s   g | ]}|j ˆ v r|‘qS r   )Úname)Ú.0Úac©r,   r   r   Ú
<listcomp>®   ó    z1AppDirectoriesFinder.__init__.<locals>.<listcomp>)r   r$   Zget_app_configsÚsetÚstorage_classr5   r   ÚjoinÚ
source_dirr7   r"   rE   r(   r*   r+   )r   r,   r-   r   Zapp_configsZ
app_configZapp_storager/   rH   r   r+   ¦   s    ÿzAppDirectoriesFinder.__init__c                 c   s:   | j  ¡ D ]*}| d¡r
t ||¡D ]}||fV  q$q
dS )z5
        List all files in all app storages.
        r!   N)r$   Úvaluesr@   r   rA   )r   r   rB   r   r   r   r   r   ¹   s    
zAppDirectoriesFinder.listFc                 C   sX   g }| j D ]H}| j| j}|tvr,t |¡ |  ||¡}|r
|sH|  S | |¡ q
|S )z8
        Look for files in the app directories.
        )r   r$   r"   r9   r(   Úfind_in_app)r   r   r   r;   ÚappZapp_locationÚmatchr   r   r   r   Â   s    

zAppDirectoriesFinder.findc                 C   s0   | j  |¡}|r,| |¡r,| |¡}|r,|S dS )zL
        Find a requested static file in an app's static locations.
        N)r$   Úgetr@   r   )r   rQ   r   rB   r<   r   r   r   rP   Ò   s
    
z AppDirectoriesFinder.find_in_app)N)F)r   r   r   r   r   rL   rN   r+   r   r   rP   rC   r   r   r/   r   rD   �   s   	
rD   c                       s8   e Zd ZdZdZd
‡ fdd„	Zddd„Zdd	„ Z‡  ZS )ÚBaseStorageFinderzZ
    A base static files finder to be used to extended
    with an own storage class.
    Nc                    sV   |d ur|| _ | j d u r&td| j ƒ‚t| j ttfƒs@|   ¡ | _ tƒ j|i |¤Ž d S )NzHThe staticfiles storage finder %r doesn't have a storage class assigned.)rB   r   r0   r&   r	   r   r*   r+   )r   rB   r-   r   r/   r   r   r+   æ   s    
þÿ
zBaseStorageFinder.__init__Fc                 C   sh   z| j  d¡ W n ty"   Y nB0 | j jtvr>t | j j¡ | j  |¡rd| j  |¡}|r`|g}|S g S )zL
        Look for files in the default file storage, if it's local.
        r!   )rB   r   r   r"   r9   r(   r@   )r   r   r   rR   r   r   r   r   ô   s    zBaseStorageFinder.findc                 c   s$   t  | j|¡D ]}|| jfV  qdS )z0
        List all files of the storage.
        N)r   rA   rB   )r   r   r   r   r   r   r     s    zBaseStorageFinder.list)N)F)	r   r   r   r   rB   r+   r   r   rC   r   r   r/   r   rT   Þ   s
   
rT   c                       s$   e Zd ZdZeZ‡ fdd„Z‡  ZS )ÚDefaultStorageFinderzF
    A static files finder that uses the default storage backend.
    c                    s6   t ƒ j|i |¤Ž t| jdtƒ}|s2td| j ƒ‚d S )NÚbase_locationzOThe storage backend of the staticfiles finder %r doesn't have a valid location.)r*   r+   ÚgetattrrB   r   r   r0   )r   r-   r   rV   r/   r   r   r+     s    þÿzDefaultStorageFinder.__init__)r   r   r   r   r
   rB   r+   rC   r   r   r/   r   rU     s   rU   Fc                 C   sl   g t dd…< g }tƒ D ]@}|j| |d�}|s8|r8|  S t|ttfƒsL|g}| |¡ q|r`|S |rhg S dS )zÓ
    Find a static file with the given path using all enabled finders.

    If ``all`` is ``False`` (default), return the first matching
    absolute path (or ``None`` if no match). Otherwise return a list.
    N)r   )r9   Úget_findersr   r&   r   r'   Úextend)r   r   r;   ÚfinderÚresultr   r   r   r      s    
r   c                  c   s   t jD ]} t| ƒV  qd S )N)r   ZSTATICFILES_FINDERSÚ
get_finder)Zfinder_pathr   r   r   rX   6  s    
rX   )Úmaxsizec                 C   s(   t | ƒ}t|tƒs"td|tf ƒ‚|ƒ S )zƒ
    Import the staticfiles finder class described by import_path, where
    import_path is the full Python path to the class.
    z%Finder "%s" is not a subclass of "%s")r   Ú
issubclassr   r   )Zimport_pathÚFinderr   r   r   r\   ;  s    

ÿr\   )F)"Ú	functoolsr5   Zdjango.appsr   Zdjango.confr   Zdjango.contrib.staticfilesr   Zdjango.core.checksr   r   Zdjango.core.exceptionsr   Zdjango.core.files.storager   r	   r
   Zdjango.utils._osr   Zdjango.utils.functionalr   r   Zdjango.utils.module_loadingr   r9   r   r    rD   rT   rU   r   rX   Ú	lru_cacher\   r   r   r   r   Ú<module>   s(    kA0

