U
    {h                     @   s   d dl Z d dlZd dl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 e dZG d	d
 d
e
ZdddZdddZdddZdd ZdddZdddZG dd dZdS )    N)defaultdict)urlsplit
urlunsplit)settings)ImproperlyConfigured)import_string)get_content_languageszwagtail.frontendcachec                   @   s   e Zd ZdS ) InvalidFrontendCacheBackendErrorN)__name__
__module____qualname__ r   r   l/var/www/dating/data/www/fatepal.com/env/lib/python3.8/site-packages/wagtail/contrib/frontend_cache/utils.pyr	      s   r	   c           
      C   s   | d krt tdd } | d kr>t tdd }|d k	r>dd|di} | d krJi S i }|  D ]|\}}|d k	rp||krpqV| }|d}zt|}W n6 tk
r }	 ztd| d|	 W 5 d }	~	X Y nX ||||< qV|S )	NZWAGTAILFRONTENDCACHEZWAGTAILFRONTENDCACHE_LOCATIONdefaultz3wagtail.contrib.frontend_cache.backends.HTTPBackend)BACKENDZLOCATIONr   zCould not find backend 'z': )getattrr   itemscopypopr   ImportErrorr	   )
backend_settingsbackendsZcache_locationZbackend_objectsbackend_nameZ_backend_configZbackend_configbackendZbackend_clser   r   r   get_backends   s4    
r   c                 C   s   t | g||d d S N)r   r   )purge_urls_from_cache)urlr   r   r   r   r   purge_url_from_cache>   s    r   c              
      sP  t tdd}|rt ni }t tdt| }tjr|rdd| }g }|D ]T}| D ]J}	t|	}
t|
j	|
j
t|d| |
j|
j|
jf}||krqV|| qVqN|} tt}| D ]}	|t|	j
 |	 qt||}| D ]j\ }  fdd| D }|std	  q| D ].\}}| D ]}	td
||	 q&||  qqd S )NZWAGTAIL_I18N_ENABLEDFZWAGTAILFRONTENDCACHE_LANGUAGESz^/(%s)/|z/%s/c                    s    i | ]\}}|  r||qS r   )Zinvalidates_hostname).0r   r   hostnamer   r   
<dictcomp>o   s   
 z)purge_urls_from_cache.<locals>.<dictcomp>z#Unable to find purge backend for %sz[%s] Purging URL: %s)r   r   r   listkeysZUSE_I18Njoinr   r   schemenetlocresubpathqueryfragmentappendr   r   r   loggerinfoZpurge_batch)urlsr   r   Zwagtail_i18n_enabledZcontent_languages	languagesZlangs_regexZnew_urlsZisocoder   upnew_urlZurls_by_hostnameZbackends_for_hostnamer   r   r   r"   r   r   B   sP      



r   c                    s*   | j   d krg S  fdd| j D S )Nc                    s   g | ]} | d  qS )/)lstrip)r!   r,   page_urlr   r   
<listcomp>   s     z)_get_page_cached_urls.<locals>.<listcomp>)full_urlZspecificZget_cached_paths)pager   r8   r   _get_page_cached_urls   s    r=   c                 C   s   t | g||d d S r   )purge_pages_from_cache)r<   r   r   r   r   r   purge_page_from_cache   s    r?   c                 C   s0   g }| D ]}| t| q|r,t||| d S N)extendr=   r   )pagesr   r   r2   r<   r   r   r   r>      s
    r>   c                   @   sD   e Zd ZdZdddZdd Zdd Zd	d
 Zdd ZdddZ	dS )
PurgeBatchz:Represents a list of URLs to be purged in a single requestNc                 C   s   g | _ |d k	r| | d S r@   )r2   add_urlsselfr2   r   r   r   __init__   s    zPurgeBatch.__init__c                 C   s   | j | dS )zAdds a single URLN)r2   r/   )rF   r   r   r   r   add_url   s    zPurgeBatch.add_urlc                 C   s   | j | dS )z
        Adds multiple URLs from an iterable

        This is equivalent to running ``.add_url(url)`` on each URL
        individually
        N)r2   rA   rE   r   r   r   rD      s    zPurgeBatch.add_urlsc                 C   s   |  t| dS )z
        Adds all URLs for the specified page

        This combines the page's full URL with each path that is returned by
        the page's `.get_cached_paths` method
        N)rD   r=   )rF   r<   r   r   r   add_page   s    zPurgeBatch.add_pagec                 C   s   |D ]}|  | qdS )z
        Adds multiple pages from a QuerySet or an iterable

        This is equivalent to running ``.add_page(page)`` on each page
        individually
        N)rI   )rF   rB   r<   r   r   r   	add_pages   s    zPurgeBatch.add_pagesc                 C   s   t | j|| dS )a  
        Performs the purge of all the URLs in this batch

        This method takes two optional keyword arguments: backend_settings and backends

        - backend_settings can be used to override the WAGTAILFRONTENDCACHE setting for
          just this call

        - backends can be set to a list of backend names. When set, the invalidation request
          will only be sent to these backends
        N)r   r2   )rF   r   r   r   r   r   purge   s    zPurgeBatch.purge)N)NN)
r
   r   r   __doc__rG   rH   rD   rI   rJ   rK   r   r   r   r   rC      s   
		
rC   )NN)NN)NN)NN)NN)loggingr*   collectionsr   urllib.parser   r   Zdjango.confr   Zdjango.core.exceptionsr   Zdjango.utils.module_loadingr   Zwagtail.coreutilsr   	getLoggerr0   r	   r   r   r   r=   r?   r>   rC   r   r   r   r   <module>   s    

+

>

	