U
    {h                     @   sx   d dl Z d dlmZmZ d dlmZ ddlmZ e dZ	ddd	gZ
G d
d deZG dd deZG dd	 d	eZdS )    Nurlsplit
urlunsplit)ImproperlyConfigured   )BaseBackendzwagtail.frontendcacheAzureBaseBackendAzureFrontDoorBackendAzureCdnBackendc                       st   e Zd Z fddZdd Zdd Zdd Zd	d
 Zdd Zdd Z	dd Z
dd Zdd Zdd Zdd Z  ZS )r   c                    sh   t  | |dd | _|dd | _z|d| _W n tk
rT   tdY nX |dd | _d S )NZCREDENTIALSZSUBSCRIPTION_IDZRESOURCE_GROUP_NAMEzRThe setting 'WAGTAILFRONTENDCACHE' requires 'RESOURCE_GROUP_NAME' to be specified.ZCUSTOM_HEADERS)	super__init__pop_credentials_subscription_id_resource_group_nameKeyErrorr   _custom_headersselfparams	__class__ u/var/www/dating/data/www/fatepal.com/env/lib/python3.8/site-packages/wagtail/contrib/frontend_cache/backends/azure.pyr      s    
zAzureBaseBackend.__init__c                    s      fdd|D  d S )Nc                    s   g | ]}  |qS r   )	_get_path).0urlr   r   r   
<listcomp>   s     z0AzureBaseBackend.purge_batch.<locals>.<listcomp>)_purge_content)r   urlsr   r   r   purge_batch   s    zAzureBaseBackend.purge_batchc                 C   s   |  |g d S )N)r!   )r   r   r   r   r   purge   s    zAzureBaseBackend.purgec                 C   s.   zddl m} W n tk
r&   Y d S X | S )Nr   )DefaultAzureCredential)Zazure.identityr#   ImportError)r   r#   r   r   r   _get_default_credentials!   s
    z)AzureBaseBackend._get_default_credentialsc                 C   s   | j }|r|S |  S )z|
        Use credentials object set by user. If not set, use the one configured
        in the current environment.
        )r   r%   )r   Zuser_credentialsr   r   r   _get_credentials(   s    z!AzureBaseBackend._get_credentialsc                 C   sL   zddl m} W n tk
r&   Y dS X |  }||}t|j }|jS )z=
        Obtain subscription ID directly from Azure.
        r   )SubscriptionClient )Zazure.mgmt.resourcer'   r$   r&   nextZsubscriptionslistsubscription_id)r   r'   
credentialZsubscription_clientZsubscriptionr   r   r   _get_default_subscription_id2   s    z-AzureBaseBackend._get_default_subscription_idc                 C   s   | j }|r|S |  S )z
        Use subscription ID set in the user configuration. If not set, try to
        retrieve one from Azure directly.
        )r   r-   )r   Zuser_subscription_idr   r   r   _get_subscription_id?   s    z%AzureBaseBackend._get_subscription_idc                 C   s   |   |  dS )N)r,   r+   )r&   r.   r   r   r   r   _get_client_kwargsI   s    z#AzureBaseBackend._get_client_kwargsc                 C   s   dt |dd  }t|S )zA
        Split netloc from the URL and return path only.
        )r(   r(      Nr   )r   r   Z	url_partsr   r   r   r   O   s    zAzureBaseBackend._get_pathc                 C   s   |   }|  }|f |S )z,
        Get Azure client instance.
        )_get_client_classr/   )r   klasskwargsr   r   r   _get_clientX   s    zAzureBaseBackend._get_clientc                 C   s   | j | j|dS )zL
        Get keyword arguments passes to Azure purge content calls.
        )Zresource_group_nameZcustom_headersZcontent_paths)r   r   )r   pathsr   r   r   _get_purge_kwargs`   s    z"AzureBaseBackend._get_purge_kwargsc              
   C   sn   ddl m} |  }z| || W nD |k
rh } z&|D ]}td|t| j|j q:W 5 d }~X Y nX d S )Nr   )HttpOperationErrorz9Couldn't purge '%s' from %s cache. HttpOperationError: %r)	Zmsrest.exceptionsr7   r4   _make_purge_calllogger	exceptiontype__name__response)r   r5   r7   clientr:   pathr   r   r   r   j   s    zAzureBaseBackend._purge_content)r<   
__module____qualname__r   r!   r"   r%   r&   r-   r.   r/   r   r4   r6   r   __classcell__r   r   r   r   r      s   

	
c                       s8   e Zd Z fddZdd Z fddZdd Z  ZS )	r	   c                    sL   t  | z|d| _W n tk
r8   tdY nX |dd | _d S )NZFRONT_DOOR_NAMEzNThe setting 'WAGTAILFRONTENDCACHE' requires 'FRONT_DOOR_NAME' to be specified.ZFRONT_DOOR_SERVICE_URL)r   r   r   _front_door_namer   r   _front_door_service_urlr   r   r   r   r   {   s    
zAzureFrontDoorBackend.__init__c                 C   s   ddl m} |S )Nr   )FrontDoorManagementClient)Zazure.mgmt.frontdoorrE   )r   rE   r   r   r   r1      s    z'AzureFrontDoorBackend._get_client_classc                    s   t   }|d| j |S Nbase_url)r   r/   
setdefaultrD   r   r3   r   r   r   r/      s    
z(AzureFrontDoorBackend._get_client_kwargsc                 C   s   |j jf | |d| jiS )NZfront_door_name)	endpointspurge_contentr6   rC   r   r>   r5   r   r   r   r8      s
    z&AzureFrontDoorBackend._make_purge_callr<   r@   rA   r   r1   r/   r8   rB   r   r   r   r   r	   z   s   
c                       s8   e Zd Z fddZdd Z fddZdd Z  ZS )	r
   c                    sX   t  | z|d| _|d| _W n tk
rD   tdY nX |dd | _d S )NZCDN_PROFILE_NAMEZCDN_ENDPOINT_NAMEzgThe setting 'WAGTAILFRONTENDCACHE' requires 'CDN_PROFILE_NAME' and 'CDN_ENDPOINT_NAME' to be specified.ZCDN_SERVICE_URL)r   r   r   _cdn_profile_name_cdn_endpoint_namer   r   _cdn_service_urlr   r   r   r   r      s    
zAzureCdnBackend.__init__c                 C   s   ddl m} |S )Nr   )CdnManagementClient)Zazure.mgmt.cdnrQ   )r   rQ   r   r   r   r1      s    z!AzureCdnBackend._get_client_classc                    s   t   }|d| j |S rF   )r   r/   rH   rP   rI   r   r   r   r/      s    
z"AzureCdnBackend._get_client_kwargsc                 C   s"   |j jf | || j| jdS )N)Zprofile_nameZendpoint_name)rJ   rK   r6   rN   rO   rL   r   r   r   r8      s
    z AzureCdnBackend._make_purge_callrM   r   r   r   r   r
      s   )loggingurllib.parser   r   Zdjango.core.exceptionsr   baser   	getLoggerr9   __all__r   r	   r
   r   r   r   r   <module>   s   

l