
    R}bgf                        d dl 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	 d dlm
Z
 d dlmZ d dlmZ d dlmZ d d	lmZ d d
lmZ d dlmZ d dlmZ d dlmZ d dlmZ d dlmZ d dlmZ d dlmZ d dlm Z  d dlm!Z! d dlm"Z" d dlm#Z# d dlm$Z$ d dlm%Z% d dlm&Z& d dlm'Z' 	 d dl(Z)d dl*Z+d dl,m-Z- d dl.m/Z/ d dl0m1Z1 d dl2m3Z3 n# e4$ rZ5 ede5z            dZ5[5ww xY wd Z6d  Z7e6e7fD ]Z8	  e8            Z9 n# e4$ r Y w xY wd! Z9d" Z:e G d# d$ee                      Z;e G d% d&ee                      Z< G d' d(e<          Z= G d) d*ee=          Z>dS )+    N)datetime)	timedelta)	parse_qsl)	urlencode)urlsplit)ManifestFilesMixinImproperlyConfigured)SuspiciousOperation)File)deconstructible)filepath_to_uri)
make_naive)BaseStorage)CompressedFileMixin)CompressStorageMixin)ReadBytesWrapper)check_location)
clean_name)get_available_overwrite_name)is_seekable)
lookup_env)	safe_join)setting)to_bytes)TransferConfig)Config)ClientError)CloudFrontSignerz&Could not load Boto3's S3 bindings. %sc                  N    ddl m ddlm ddlm ddlm fd} | S )Nr   )default_backend)hashes)padding)load_pem_private_keyc                     t          |t                    r|                    d          } |d                        t          | fd          S )Nascii)passwordbackendc                 z                         |                                                                           S N)signPKCS1v15SHA1)xr"   keyr#   s    g/home/e360mart.nyusoft.in/public_html/e360mart_env/lib/python3.11/site-packages/storages/backends/s3.py<lambda>zP_use_cryptography_signer.<locals>._cloud_front_signer_from_pem.<locals>.<lambda>;   s+    chhq'*:*:*<*<fkkmmLL     )
isinstancestrencoder   )key_idpemr/   r!   r"   r$   r#   s     @r0   _cloud_front_signer_from_pemz>_use_cryptography_signer.<locals>._cloud_front_signer_from_pem5   sm    c3 	&**W%%C""3?P?PQQQLLLLLL
 
 	
r2   )cryptography.hazmat.backendsr!   cryptography.hazmat.primitivesr"   )cryptography.hazmat.primitives.asymmetricr#   ,cryptography.hazmat.primitives.serializationr$   )r8   r!   r"   r$   r#   s    @@@@r0   _use_cryptography_signerr=   .   s~    <<<<<<555555AAAAAAQQQQQQ
 
 
 
 
 
 
 
 ('r2   c                      dd l fd} | S )Nr   c                     t          |t                    r|                    d          }j                            |          t          | fd          S )Nr&   c                 2                         | d          S )NzSHA-1)r+   )r.   r/   rsas    r0   r1   zG_use_rsa_signer.<locals>._cloud_front_signer_from_pem.<locals>.<lambda>I   s    #((1c72K2K r2   )r3   r4   r5   
PrivateKey
load_pkcs1r   )r6   r7   r/   rA   s     @r0   r8   z5_use_rsa_signer.<locals>._cloud_front_signer_from_pemE   sY    c3 	&**W%%Cn'',,(K(K(K(K(KLLLr2   )rA   )r8   rA   s    @r0   _use_rsa_signerrD   A   s2    JJJM M M M M ('r2   c                      t          d          )NznAn RSA backend is required for signing cloudfront URLs.
Supported backends are packages: cryptography and rsa.r	   )r6   r7   s     r0   r8   r8   V   s    "E
 
 	
r2   c                 >    d |                                  D             S )Nc                 @    i | ]\  }}|t           j        j        v ||S  )
s3transfer	constantsALLOWED_DOWNLOAD_ARGS).0r/   values      r0   
<dictcomp>z+_filter_download_params.<locals>.<dictcomp>^   s9       S%*&<<< 	U<<<r2   )items)paramss    r0   _filter_download_paramsrQ   ]   s+     "LLNN   r2   c                        e Zd ZdZddZd ZddZed             Zed             Z	d Z
d	 Z ee
e          Z fd
Z fdZd Z fdZed             Zd Zd Zd Z xZS )S3Fileab  
    The default file object used by the S3Storage backend.

    This file implements file streaming using boto's multipart
    uploading functionality. The file can be opened in read or
    write mode.

    This class extends Django's File class. However, the contained
    data is only the data contained in the current buffer. So you
    should not access the contained file object directly. You should
    access the data via this class.

    Warning: This file *must* be closed using the close() method in
    order to properly write the file to S3. Be sure to close the file
    in your application.
    Nc                 "   d|v rd|v rt          d          || _        |t          | j        j                  d                              d          | _        || _        d|v rd nd | _        |j        	                    |          | _
        d|vr>t          | j                            | j                            } | j
        j        di | d| _        d | _        d | _        |pt#          d	d
          | _        |                                  d S )Nrwz"Can't combine 'r' and 'w' in mode./bc                     | S r*   rH   rX   s    r0   r1   z!S3File.__init__.<locals>.<lambda>~   s    a r2   c                 *    |                                  S r*   )decoderZ   s    r0   r1   z!S3File.__init__.<locals>.<lambda>~   s    

 r2   FAWS_S3_FILE_BUFFER_SIZEi  P rH   )
ValueError_storagelenlocationlstripname_mode_force_modebucketObjectobjrQ   get_object_parametersload_closed_file_partsr   buffer_size_reset_file_properties)selfrc   modestoragern   rP   s         r0   __init__zS3File.__init__x   s   $;;3$;;ABBBT]344667>>sCC	
,/4KKKKK>R>R>((..d??,33DI>> F DHM##F###

 'U'2KW*U*U##%%%%%r2   c                 >    d | _         d| _        d| _        d| _        d S )Nr   F)
_multipart_raw_bytes_written_write_counter	_is_dirtyrp   s    r0   ro   zS3File._reset_file_properties   s$    "#r2   c                     | j         | j        s|                     d           n|r|| j        k    rt	          d          | j         | S )Nr   z#Cannot reopen file with a new mode.)rl   closedseekrd   r^   file)rp   rq   s     r0   openzS3File.open   sT    :!$+!IIaLLLL 	Dddj((BCCC 			r2   c                     | j         j        S r*   )rh   content_lengthry   s    r0   sizezS3File.size   s    x&&r2   c                     | j         S r*   )rk   ry   s    r0   r{   zS3File.closed   s
    |r2   c                    | j         t          j        | j        j        dt          d                    | _         d| j        v rd| _        t          | j        	                    | j
                            }| j                            | j         || j        j                   | j                             d           | j        j        r6| j        j        dk    r&|                     | j        | j         	          | _         d| _        | j         S )
Nz.S3FileFILE_UPLOAD_TEMP_DIR)max_sizesuffixdirrU   F	ExtraArgsr   r   gzip)rq   r}   )rl   tempfileSpooledTemporaryFiler_   max_memory_sizer   rd   rx   rQ   ri   rc   rh   download_fileobjtransfer_configr|   r   content_encoding_decompress_filerk   )rp   rP   s     r0   	_get_filezS3File._get_file   s   :!66 233  DJ
 dj  !&0M77	BB  ))J&9V *    
"""=% Y$(*Cv*M*M!%!6!6DJTZ!6!X!XDJ DLzr2   c                     || _         d S r*   )rl   )rp   rM   s     r0   	_set_filezS3File._set_file   s    


r2   c                     d| j         vrt          d          |                      t                      j        |i |          S NrU   z!File was not opened in read mode.)rd   AttributeErrorre   superreadrp   argskwargs	__class__s      r0   r   zS3File.read   sH    dj   !DEEEd =f = =>>>r2   c                     d| j         vrt          d          |                      t                      j        |i |          S r   )rd   r   re   r   readliner   s      r0   r   zS3File.readline   sJ    dj   !DEEE 0 0$ A& A ABBBr2   c                      t          |           S r*   )listry   s    r0   	readlineszS3File.readlines   s    Dzzr2   c                    d| j         vrt          d          d| _        | j        @ | j        j        di | j                            | j        j                  | _        g | _	        | j
        | j        k    r|                                  t          |          }| xj        t          |          z  c_        t!                                          |          S )NrV   z"File was not opened in write mode.TrH   )rd   r   rx   ru   rh   initiate_multipart_uploadr_   _get_write_parametersr/   rm   rn   _buffer_file_size_flush_write_bufferr   rv   r`   r   write)rp   contentbstrr   s      r0   r   zS3File.write   s    dj   !EFFF?"@dh@  -55dhlCC DO DKt555$$&&&  3t99,ww}}T"""r2   c                     | j                                         }| j                             dt          j                   | j                                         }| j                             |           |S )Nr   )r}   tellr|   osSEEK_END)rp   poslengths      r0   r   zS3File._buffer_file_size   sU    inn	q"+&&&!!	sr2   c                    | j         r| xj        dz  c_        | j                            d           | j                            | j                  }|                    | j                                                  }| j        	                    |d         | j        d           | j                            d           | j        
                                 d S d S )N   r   )BodyETag)r   
PartNumber)r   rw   r}   r|   ru   Partuploadr   rm   appendtruncate)rp   partresponses      r0   r   zS3File._flush_write_buffer   s    ! 		!1$INN1?''(;<<D{{	(8(8{99HK!&)9LMM   INN1I     		! 		!r2   c                 8   d| j         v sJ | j        dk    sJ 	 | j                                         dS # t          $ rZ}|j        d         d         dk    r7 | j        j        d	ddi| j                            | j        j	                   n Y d}~dS d}~ww xY w)
a  
        Attempt to create an empty file for this key when this File is closed if no
        bytes have been written and no object already exists on S3 for this key.

        This behavior is meant to mimic the behavior of Django's builtin
        FileSystemStorage, where files are always created after they are opened in
        write mode:

            f = storage.open('file.txt', mode='w')
            f.close()
        rV   r   ResponseMetadataHTTPStatusCode  r   r2   NrH   )
rd   rv   rh   rj   r   r   putr_   r   r/   )rp   errs     r0   _create_empty_on_closezS3File._create_empty_on_close   s     dj    &!++++		HMMOOOOO 	 	 	|./0@ASHH   $ C CDHL Q Q    	     	s   5 
BABBc                    | j         r>| j        6|                                  | j                            d| j        i           nH| j        | j                                         d| j        v r| j        dk    r|                                  | j	         | j	        
                                 d | _	        |                                  d| _        d S )NParts)MultipartUploadrV   r   T)rx   ru   r   completerm   abortrd   rv   r   rl   closero   rk   ry   s    r0   r   zS3File.close  s    > 	.*((***(('4;9O(PPP*%%'''dj  T%<%A%A++---:!JDJ##%%%r2   r*   )__name__
__module____qualname____doc__rs   ro   r~   propertyr   r{   r   r   r}   r   r   r   r   r   r   r   r   __classcell__r   s   @r0   rS   rS   e   sn        "& & & &0  	 	 	 	 ' ' X'   X  *   8Iy))D? ? ? ? ?
C C C C C
  # # # # #   X
! 
! 
!  4      r2   rS   c                        e Zd ZdZdZdZ fdZd Zd Zd Z	d Z
ed	             Zd
 Zed             Zd ZddZd Zd Zd Zd Zd ZddZd Zd Zd ZddZd fd	Z xZS )	S3Storagez
    Amazon Simple Storage Service using Boto3

    This storage backend supports opening files in read or write
    mode and supports streaming(buffering) data in chunks to S3
    when writing.
    zapplication/octet-streamNc                    t                      }t          | d          s|                    d|          | _         t	                      j        d
i | t          |            | j        s| j        r| j	        rt          d          d | _        t          j                    | _        | j        &t!          j        dt$                     | j        | _        | j        (t)          d| j        i| j        | j                  | _        | j        du rt!          j        dt$                     | j        t5          | j                  | _        | j        |u rv| j        r.| j        r'|                     | j        | j                  | _        d S t=          | j                  t=          | j                  z  rt          d	          d | _        d S d S )Ncloudfront_signerzAWS_S3_SESSION_PROFILE/session_profile should not be provided with AWS_S3_ACCESS_KEY_ID/access_key and AWS_S3_SECRET_ACCESS_KEY/secret_keyzThe 'config' class property is deprecated and will be removed in a future version. Use AWS_S3_CLIENT_CONFIG to customize any of the botocore.config.Config parameters.addressing_style)s3signature_versionproxiesFzThe AWS_S3_USE_THREADS setting is deprecated. Use AWS_S3_TRANSFER_CONFIG to customize any of the boto.s3.transfer.TransferConfig parameters.)use_threadszmBoth AWS_CLOUDFRONT_KEY_ID/cloudfront_key_id and AWS_CLOUDFRONT_KEY/cloudfront_key must be provided together.rH   )objecthasattrpopr   r   rs   r   
access_key
secret_keysession_profiler
   _bucket	threadinglocal_connectionsconfigwarningswarnDeprecationWarningclient_configr   r   r   r   r   r   r   cloudfront_key_idcloudfront_keyget_cloudfront_signerbool)rp   settingsomittedr   s      r0   rs   zS3Storage.__init__.  s   ((t011 	P%-\\2Ew%O%OD"$$8$$$tO 	t 	D4H 	&6   %O--;"MM #	   "&D%!'&(=>"&"8" " "D u$$M> #	   '#1d>N#O#O#OD !W,,% 
.$*= 
.)-)C)C*D,?* *&&& d,--T5H0I0II .*S  
 *.&&& -,r2   c                 "    t          ||          S r*   )r8   )rp   r6   r/   s      r0   r   zS3Storage.get_cloudfront_signeri  s    +FC888r2   c                 N   i dt          dt          dt          ddg                              dt          dt          dt          ddg                              dt          dt          d	                    d
t          dt          dg                    dt          dd          dt          di           dt          d          dt          dd          dt          dd          dt          d          dt          dd          dt          d          dt          d           d!t          d"          d#t          d$          d%t          d&d'          d(t          d)d*          t          d+d,          t          d-d.          t          d/          t          d0          t          d1          t          d2d          t          d3d           t          d4d5          t          d6d           t          d7d          t          d8d           t          d9d           d:S );Nr   AWS_S3_ACCESS_KEY_IDAWS_ACCESS_KEY_IDr   AWS_S3_SECRET_ACCESS_KEYAWS_SECRET_ACCESS_KEYsecurity_tokenAWS_SESSION_TOKENAWS_SECURITY_TOKENr   AWS_S3_SESSION_PROFILEfile_overwriteAWS_S3_FILE_OVERWRITETobject_parametersAWS_S3_OBJECT_PARAMETERSbucket_nameAWS_STORAGE_BUCKET_NAMEquerystring_authAWS_QUERYSTRING_AUTHquerystring_expireAWS_QUERYSTRING_EXPIREi  r   AWS_S3_SIGNATURE_VERSIONra   AWS_LOCATION custom_domainAWS_S3_CUSTOM_DOMAINr   AWS_CLOUDFRONT_KEY_IDr   AWS_CLOUDFRONT_KEYr   AWS_S3_ADDRESSING_STYLEfile_name_charsetAWS_S3_FILE_NAME_CHARSETzutf-8r   AWS_IS_GZIPPEDFGZIP_CONTENT_TYPES)ztext/cssztext/javascriptzapplication/javascriptzapplication/x-javascriptzimage/svg+xmlAWS_S3_URL_PROTOCOLzhttps:AWS_S3_ENDPOINT_URLAWS_S3_PROXIESAWS_S3_REGION_NAMEAWS_S3_USE_SSLAWS_S3_VERIFYAWS_S3_MAX_MEMORY_SIZEr   AWS_DEFAULT_ACLAWS_S3_USE_THREADSAWS_S3_TRANSFER_CONFIGAWS_S3_CLIENT_CONFIG)gzip_content_typesurl_protocolendpoint_urlr   region_nameuse_sslverifyr   default_aclr   r   r   )r   r   ry   s    r0   get_default_settingszS3Storage.get_default_settingsl  s   7
'&' 68KLMM  7
 '*+ :<STUU  7
 g#W-A%B%B 7
$ w(*6N5O*P*P   %7
* g&=tDD+7
,  )CR!H!H-7
. 7#<==/7
0 (> E E17
2 !'*BD"I"I37
4  )C!D!D57
6 3377
8 W%;<<97
:  )@!A!A;7
< g&:;;=7
> (A B B?7
@  )CW!M!MA7
B G,e44C7
D #*$	# 	# $$98DD#$9::/00"#788/66ot44&'?CC"#4d;;"#7>>&'?FF$%;TBBm7
 7
 7
 7	
r2   c                     | j                                         }|                    dd            |                    dd            |S Nr   r   )__dict__copyr   rp   states     r0   __getstate__zS3Storage.__getstate__  sB    ""$$		.$'''		)T"""r2   c                 J    t          j                    |d<   d |d<   || _        d S r"  )r   r   r#  r%  s     r0   __setstate__zS3Storage.__setstate__  s)     ) 1 1nir2   c                     t          | j        dd           }|R|                                 }|                    d| j        | j        | j        | j        | j                  | j        _	        | j        j	        S )N
connectionr   )r  r  r  r   r  )
getattrr   _create_sessionresourcer  r  r  r   r  r+  )rp   r+  sessions      r0   r+  zS3Storage.connection  sz    T.dCC
**,,G+2+;+; ,!.){ ,< , ,D(  ++r2   c                     | j         rt          j        | j                   }n&t          j        | j        | j        | j                  }|S )z
        If a user specifies a profile name and this class obtains access keys
        from another source such as environment variables,we want the profile
        name to take precedence.
        )profile_name)aws_access_key_idaws_secret_access_keyaws_session_token)r   boto3Sessionr   r   r   )rp   r/  s     r0   r-  zS3Storage._create_session  sS      	m1EFFFGGm"&/&*o"&"5  G
 r2   c                 f    | j         $| j                            | j                  | _         | j         S )za
        Get the current bucket. If there is no current bucket object
        create it.
        )r   r+  Bucketr   ry   s    r0   rf   zS3Storage.bucket  s.     <?11$2BCCDL|r2   c                 n    	 t          | j        |          S # t          $ r t          d|z            w xY w)z
        Normalizes the name so that paths like /path/to/ignored/../something.txt
        work. We check to make sure that the path pointed to is not outside
        the directory specified by the LOCATION setting.
        z Attempted access to '%s' denied.)r   ra   r^   r   rp   rc   s     r0   _normalize_namezS3Storage._normalize_name  sM    	QT]D111 	Q 	Q 	Q%&H4&OPPP	Qs    4rbc                     |                      t          |                    }	 t          |||           }n<# t          $ r/}|j        d         d         dk    rt          d|z             d }~ww xY w|S Nr   r   r   zFile does not exist: %s)r;  r   rS   r   r   FileNotFoundError)rp   rc   rq   fr   s        r0   _openzS3Storage._open  s    ##Jt$4$455	tT4((AA 	 	 	|./0@ASHH'(AD(HIII	 s   6 
A/ *A**A/c                    t          |          }|                     |          }|                     ||          }t          |          r |                    dt
          j                   t          |          }| j        r-|d         | j	        v rd|vr| 
                    |          }d|d<   | j                            |          }|j        }d |_        	 |                    ||| j                   ||_        n# ||_        w xY w|S )Nr   ContentTypeContentEncodingr   c                      d S r*   rH   rH   r2   r0   r1   z!S3Storage._save.<locals>.<lambda>  s     r2   r   )r   r;  r   r   r|   r   SEEK_SETr   r   r  _compress_contentrf   rg   r   upload_fileobjr   )rp   rc   r   cleaned_namerP   rh   original_closes          r0   _savezS3Storage._save  s    !$''##L11++D'::w 	)LLBK((( #7++ I	/}%)@@@!//,,W55G(.F$%k  && !$	+w&AUVVV*GMMNGM****s   C< <	Dc                    	 |                      t          |                    }| j                            |                                           d S # t
          $ r#}|j        d         d         dk    rY d }~d S  d }~ww xY w)Nr   r   r   )r;  r   rf   rg   deleter   r   rp   rc   r   s      r0   rM  zS3Storage.delete  s    		''
4(8(899DKt$$++----- 	 	 	|./0@ASHH 	s   AA 
A?A:9A::A?c                    |                      t          |                    }	 | j        j        j                            | j        |           dS # t          $ r#}|j        d         d         dk    rY d }~dS  d }~ww xY w)N)r8  KeyTr   r   r   F)	r;  r   r+  metaclienthead_objectr   r   r   rN  s      r0   existszS3Storage.exists  s    ##Jt$4$455	O '334;KQU3VVV4 	 	 	|./0@ASHHuuuuu 	s   +A 
A>A98A99A>c                   	 |                      t          |                    		r	                    d          s	dz  	g }g }| j        j        j                            d          }|                    | j        d	          }|D ]v}|	fd|	                    dd          D             z  }|	                    dd          D ]8}|d         }|	k    r(|
                    t          j        |	                     9w||fS )	NrW   list_objects)r8  	DelimiterPrefixc                 F    g | ]}t          j        |d                    S )rX  )	posixpathrelpath)rL   entrypaths     r0   
<listcomp>z%S3Storage.listdir.<locals>.<listcomp>1  s:        !%/488  r2   CommonPrefixesrH   ContentsrP  )r;  r   endswithr+  rQ  rR  get_paginatorpaginater   getr   rZ  r[  )
rp   rc   directoriesfiles	paginatorpagespager\  r/   r]  s
            @r0   listdirzS3Storage.listdir&  s6   ##Jt$4$455 	c** 	CKDO(/==nMM	""$*:cRV"WW 	? 	?D    !XX&6;;   K *b11 ? ?El$;;LL!23!=!=>>>? E!!r2   c                     |                      t          |                    }	 | j                            |          j        S # t
          $ r/}|j        d         d         dk    rt          d|z             d }~ww xY wr>  )r;  r   rf   rg   r   r   r   r?  rN  s      r0   r   zS3Storage.size;  s    ##Jt$4$455	;%%d++:: 	 	 	|./0@ASHH'(AD(HIII	s   A 
A<*A77A<c                     |                      |          }d|vr?t          j        |          \  }}t          |dd           }|p|p| j        }||d<   |r||d<   d|vr| j        r
| j        |d<   |S )NrC  content_typerD  ACL)ri   	mimetypes
guess_typer,  default_content_typer  )rp   rc   r   rP   _typeencodingrm  s          r0   r   zS3Storage._get_write_parametersD  s    ++D11&&'2488OE8"7NDAAL'M5MD4ML$0F=! 5,4()4#3 ,F5Mr2   c                 4    | j                                         S )aB  
        Returns a dictionary that is passed to file upload. Override this
        method to adjust this on a per-object basis to set e.g ContentDisposition.

        By default, returns the value of AWS_S3_OBJECT_PARAMETERS.

        Setting ContentEncoding will prevent objects from being automatically gzipped.
        )r   r$  r:  s     r0   ri   zS3Storage.get_object_parametersU  s     %**,,,r2   c                     |                      t          |                    }| j                            |          }t	          d          r|j        S t          |j                  S )z
        Returns an (aware) datetime object containing the last modified time if
        USE_TZ is True, otherwise returns a naive datetime in the local timezone.
        USE_TZ)r;  r   rf   rg   r   last_modifiedr   )rp   rc   r\  s      r0   get_modified_timezS3Storage.get_modified_time`  s^    
 ##Jt$4$455""4((8 	3&&e1222r2   c                    t          |          }t          |j        d          }h dfd|D             }d |D             }|                    d                    |                    }|                                S )NT)keep_blank_values>
   
x-amz-datex-amz-expiresx-amz-algorithmx-amz-signaturex-amz-credentialx-amz-signedheadersx-amz-security-tokenexpires	signatureawsaccesskeyidc              3   R   K   | ]!\  }}|                                 v||fV  "d S r*   )lower)rL   r/   val	blacklists      r0   	<genexpr>z6S3Storage._strip_signing_parameters.<locals>.<genexpr>  s=      UUhc3		98T8TSz8T8T8T8TUUr2   c              3   @   K   | ]}d                      |          V  dS )=N)join)rL   keyvals     r0   r  z6S3Storage._strip_signing_parameters.<locals>.<genexpr>  s.      @@&SXXf%%@@@@@@r2   &)query)r   r   r  _replacer  geturl)rp   url	split_urlqsfiltered_qs	joined_qsr  s         @r0   _strip_signing_parametersz#S3Storage._strip_signing_parametersm  s     SMM	y$???
 
 
	 VUUU"UUU A@K@@@	&&SXXi-@-@&AA	!!!r2   c           
         |                      t          |                    }|r|                                ni }|| j        }| j        rd                    | j        | j        t          |          |r"d                    t          |                    nd          }| j	        rG| j
        r@t          j                    t          |          z   }| j
                            ||          S |S | j        j        |d<   ||d<   | j        j        j                            d|||	          }| j	        r|S |                     |          S )
Nz{}//{}/{}{}z?{}r  )seconds)date_less_thanr8  rP  
get_object)Params	ExpiresIn
HttpMethod)r;  r   r$  r   r  formatr  r   r   r   r   r   utcnowr   generate_presigned_urlrf   rc   rQ  rR  r  )rp   rc   
parametersexpirehttp_methodrP   r  
expirations           r0   r  zS3Storage.url  se   ##Jt$4$455&08"""b>,F 	&&!"%%39AYv..///r	 C $ )? %_..61J1J1JJ
-DD
 E    J;+xuk%<<6k = 
 
   	J--c222r2   c                     t          |          }| j        rt          ||          S t                                          ||          S )z+Overwrite existing file with the same name.)r   r   r   r   get_available_name)rp   rc   
max_lengthr   s      r0   r  zS3Storage.get_available_name  sF    $ 	B/jAAAww))$
;;;r2   )r<  r*   )NNN)r   r   r   r   rq  r   rs   r   r   r'  r)  r   r+  r-  rf   r;  rA  rK  rM  rT  rj  r   r   ri   rx  r  r  r  r   r   s   @r0   r   r     s         6 F9. 9. 9. 9. 9.v9 9 98
 8
 8
t    
 , , X,      X	Q 	Q 	Q     >
 
 

 
 
" " "*     "	- 	- 	-3 3 3" " ">3 3 3 3@< < < < < < < < < <r2   r   c                       e Zd ZdZdZdS )S3StaticStoragezLQuerystring auth must be disabled so that url() returns a consistent output.FN)r   r   r   r   r   rH   r2   r0   r  r    s        VVr2   r  c                       e Zd ZdZdS )S3ManifestStaticStoragez,Add ManifestFilesMixin with S3StaticStorage.N)r   r   r   r   rH   r2   r0   r  r    s        6666r2   r  )?ro  r   rZ  r   r   r   r   r   urllib.parser   r   r   "django.contrib.staticfiles.storager   django.core.exceptionsr
   r   django.core.files.baser   django.utils.deconstructr   django.utils.encodingr   django.utils.timezoner   storages.baser   storages.compressr   r   storages.utilsr   r   r   r   r   r   r   r   r   boto3.sessionr5  s3transfer.constantsrI   boto3.s3.transferr   botocore.configr   botocore.exceptionsr   botocore.signersr   ImportErrorer=   rD   _signer_factoryr8   rQ   rS   r   r  r  rH   r2   r0   <module>r     s       				                       " " " " " " " " " " " " ! ! ! ! ! ! A A A A A A 7 7 7 7 7 7 6 6 6 6 6 6 ' ' ' ' ' ' 4 4 4 4 4 4 1 1 1 1 1 1 , , , , , , % % % % % % 1 1 1 1 1 1 2 2 2 2 2 2 + + + + + + ) ) ) ) ) ) % % % % % % 7 7 7 7 7 7 & & & & & & % % % % % % $ $ $ $ $ $ " " " " " " # # # # # #M000000&&&&&&//////1111111 M M M

G!K
L
LLM
( ( (&
( 
( 
( 1/B 
 
O'6'8'8$   
 
 
   v v v v v $ v v vr Q< Q< Q< Q< Q<$k Q< Q< Q<h    i   7 7 7 7 70/ 7 7 7 7 7s*   * C C#CC#3
C??DD