o
    &zh#                     @   s   d dl Z d dlZd dlZd dlmZ d dlmZmZmZ d dl	m
Z
mZmZmZ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 G d
d dZdS )    N)datetime)AnyDictList)ParseResulturlparse
urlunparse	parse_qsl	urlencodequoteunquote   )Default)SUPPORTED_TRANS)camel_dict_to_snake_dictflatten_dict)ERRORSc                   @   s   e Zd ZdZdd ZddedefddZdedefd	d
Z	e
ddedefddZe
dedefddZe
deeef defddZe
dedefddZe
dd Ze
dd Ze
dd Ze
dd ZdS )Urlzb
    Url class holds the request and related methods
    to generate url(signed and unsigned)
    c                 C   s
   || _ d S N)request)selfrequest_obj r   I/var/www/html/kangema/venv/lib/python3.10/site-packages/imagekitio/url.py__init__   s   
zUrl.__init__Noptionsreturnc                 C   sH   t |}|di d}|rt| |d d< | j|}| |S )Nquery_parameterszik-attachment)r   getstrlowerr   extend_url_options	build_url)r   r   
attachmentextended_optionsr   r   r   generate_url   s   
zUrl.generate_urlc                 C   s  | ddd}| ddd}| ddd}| | d}| dtjj}|tjjvr7ttj	j|dkrA|dkrAdS |rb|dkr[t
|dkr[d	|tjj|d|}nd
||}n|}tjj}t|}tt|j}	|	| di  |tjjkrt
|dkr|	tjj|i |jt|	d}| dr| d}
| d}| |
}| j|| ||d}	 |
r|	tjj|tjj|i n	|	tjj|i |jt|	d}| S )z2
        builds url for from all options,
        path /srcurl_endpointtransformationtransformation_positionr   z{}/{}:{}/{}z{}/{}r   )querysignedexpire_secondsprivate_key)r0   urlr*   expiry_timestamp)r   striptransformation_to_strr   DEFAULT_TRANSFORMATION_POSITIONvalueVALID_TRANSFORMATION_POSITION
ValueErrorr   INVALID_TRANSFORMATION_POSITIONlenformatTRANSFORMATION_PARAMETERQUERY_TRANSFORMATION_POSITIONr   dictr	   r-   update_replacer
   get_signature_timestampget_signaturegeturlTIMESTAMP_PARAMETERSIGNATURE_PARAMETER)r   r   r&   r)   r*   transformation_strr,   temp_url
url_objectquery_paramsr/   r0   r2   url_signaturer   r   r   r"       sf   




zUrl.build_urlexpiry_secondsc                 C   s$   | st jjS tt  }||  S )a	  
        this function returns the signature timestamp to be used
        with the generated url.
        If expiry_seconds is provided, it returns expiry_seconds added
        to the current unix time, otherwise the default time stamp
        is returned.
        )r   DEFAULT_TIMESTAMPr6   intdtnow	timestamp)rK   current_timestampr   r   r   rA   t   s   	zUrl.get_signature_timestampr2   c                 C   sd   |d dkr
|d7 }|dk rt jj}||dt| }t|}tj| 	 |	 t
jd}| S )zu "
        create signature(hashed hex key) from
        private_key, url, url_endpoint and expiry_timestamp
        r(   r   r'   )keymsg	digestmod)r   rL   r6   replacer   r   encode_string_if_requiredhmacnewencodehashlibsha1	hexdigest)r0   r1   r*   r2   replaced_url	signaturer   r   r   rB      s   
zUrl.get_signaturec                 C   s4   t  }t| dg }|D ]	}||vr dS qdS )z
        check if transformation options parameter provided by user is valid
        so that ValueError exception can be raised with appropriate error
        message in the ImageKitRequest Class
        r+   FT)r   keysr   r   )r   supported_trans_keystransformation_dictrS   r   r   r   is_valid_trans_options   s   zUrl.is_valid_trans_options	trans_posc                 C   s   | t jjv S )zY
        Returns if transformation position is valid as per Server Documentation
        )r   r7   r6   )rd   r   r   r   is_valid_transformation_pos   s   zUrl.is_valid_transformation_posc              	   C   s  t | tsdS g }tt| D ]o}g }| | D ]\}t|d}|s#|}| | | dkr1|| q| | | }t |trBt|	 }|dksJ|dkrU|
d}|dd}|dkrg|dD ]}|| q^q|d	|tjj| q|tjj| qtjj|S )
zp
        creates transformation_position string for url from
        transformation_position dictionary
        r'   -oidir(   z@@raw,z{}{}{})
isinstancelistranger:   r   r   appendboolr   r    r3   rV   splitr;   r   TRANSFORM_KEY_VALUE_DELIMITERr6   TRANSFORM_DELIMITERjoinCHAIN_TRANSFORM_DELIMITER)r+   parsed_transformsiparsed_transform_steprS   transform_keyr6   jr   r   r   r4      s@   


zUrl.transformation_to_strc                 C   sL   d| v rt | dd tjjdd | dd  }|S t | tjjd}|S )N?r   )safer   )r   rp   r   IGNORE_CHARACTERSr6   )url_strencoded_urlr   r   r   	encodeURI   s
   ,zUrl.encodeURIc                 C   s   t dd | D S )Nc                 s   s    | ]	}t |d kV  qdS )   N)ord).0charr   r   r   	<genexpr>   s    z*Url.has_more_than_ascii.<locals>.<genexpr>)anysr   r   r   has_more_than_ascii   s   zUrl.has_more_than_asciic                 C   s   t | r
t | S | S r   )r   r   r   r   r   r   r   rW      s   zUrl.encode_string_if_requiredr   )__name__
__module____qualname____doc__r   r   r   r%   r>   r"   staticmethodrM   rA   rB   r   ro   rc   re   r4   r   r   rW   r   r   r   r   r      s*    T
)
	
r   )r[   rX   sysr   rN   typingr   r   r   urllib.parser   r   r   r	   r
   r   r   constants.defaultsr   constants.supported_transformr   utils.formatterr   r   constants.errorsr   r   r   r   r   r   <module>   s    $