
    恕f                         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  G d	 d
e      Z G d de      Zy# e$ r dZY 2w xY w)    N)s3)Prefix)Key)redirect)gettext   )BaseFileAdminc                   |    e Zd ZdZd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 Zd Zd Zd Zd Zd Zd Zd Zd Zd Zy)	S3Storagea  
        Storage object representing files on an Amazon S3 bucket.

        Usage::

            from flask_admin.contrib.fileadmin import BaseFileAdmin
            from flask_admin.contrib.fileadmin.s3 import S3Storage

            class MyS3Admin(BaseFileAdmin):
                # Configure your class however you like
                pass

            fileadmin_view = MyS3Admin(storage=S3Storage(...))

    c                     t         st        d      t        j                  |||      }|j                  |      | _        d| _        y)a  
            Constructor

                :param bucket_name:
                    Name of the bucket that the files are on.

                :param region:
                    Region that the bucket is located

                :param aws_access_key_id:
                    AWS Access Key ID

                :param aws_secret_access_key:
                    AWS Secret Access Key

            Make sure the credentials have the correct permissions set up on
            Amazon or else S3 will return a 403 FORBIDDEN error.
        zECould not import boto. You can install boto by using pip install boto)aws_access_key_idaws_secret_access_key/N)r   
ValueErrorconnect_to_region
get_bucketbucket	separator)selfbucket_nameregionr   r   
connections         _/var/www/feuerwehr-webapp/venv/lib/python3.12/site-packages/flask_admin/contrib/fileadmin/s3.py__init__zS3Storage.__init__!   sO    *  6 7 7 ))/"7


 !++K8    c                 6   d }d }d }g }g }|r*|j                  | j                        s|| j                  z  }| j                  j                  || j                        D ]  }|j                  |k(  rt        |t              rB | ||j                  |            }	 ||j                        }
|j                  |	|
dddf       e ||j                        } ||j                  |      }	|j                  |	|j                  d|j                  |f        ||z   S )Nc                 N    | j                  |      r| j                  |dd      S | S )N r   )
startswithreplace)namepaths     r   _strip_pathz(S3Storage.get_files.<locals>._strip_pathC   s&    t$||D"a00Kr   c                     | d d S )N )r!   s    r   _remove_trailing_slashz3S3Storage.get_files.<locals>._remove_trailing_slashH   s    9r   c                     t        j                  | j                  d      d   d      }t        t        j                  |            S )N.r   z%Y-%m-%dT%H:%M:%S)timestrptimesplitintmktime)	timestampdts     r   _iso_to_epochz*S3Storage.get_files.<locals>._iso_to_epochK   s4    ys3A68KLBt{{2''r   Tr   F)
endswithr   r   listr!   
isinstancer   appendlast_modifiedsize)r   r"   	directoryr#   r'   r1   filesdirectorieskeyr!   key_namer6   s               r   	get_fileszS3Storage.get_filesB   s   	
		( dnn5DNN"D;;##D$..9 
	OCxx4#v&-k#((D.IJ1#((;""D(D!Q#?@ -c.?.? @"388T2dCHHeSXX}MN
	O U""r   c                     |j                  | j                        }t        |      dk(  rd}|S | j                  j                  |d d       | j                  z   }|S )Nr   r   r%   )r,   r   lenjoin)r   r"   partssearchs       r   _get_bucket_list_prefixz!S3Storage._get_bucket_list_prefix`   sU    

4>>*u:?F  ^^((s4t~~EFr   c                     | j                  |      }| j                  j                  || j                        D ch c]  }|j                   c}S c c}w N)rC   r   r3   r   r!   )r   r"   rB   r;   s       r   _get_path_keyszS3Storage._get_path_keysh   s?    --d3$(KK$4$4VT^^$LMSMMMs   Ac                 F    | j                  |      }|| j                  z   |v S rE   rF   r   r   r"   keyss      r   is_dirzS3Storage.is_dirl   s&    ""4(dnn$,,r   c                 ^    |dk(  ry| j                  |      }||v xs || j                  z   |v S )Nr   TrH   rI   s      r   path_existszS3Storage.path_existsp   s9    2:""4(t|>t~~ 5$>>r   c                      yNr   r&   )r   s    r   get_base_pathzS3Storage.get_base_pathv   s    r   c                     g }g }|j                  | j                        D ]?  }|j                  |       |j                  || j                  j                  |      f       A |S rE   )r,   r   r5   r@   )r   r"   accumulatorbreadcrumbsns        r   get_breadcrumbszS3Storage.get_breadcrumbsy   sb    DNN+ 	FAq!4>>#6#6{#CDE	F r   c                     | j                   j                  |      }|
t               t        |j	                  d            S )Ni  )r   get_keyr   r   generate_url)r   	file_pathr;   s      r   	send_filezS3Storage.send_file   s9    kk!!),;,((.//r   c                     t        | j                  |      }d|j                  i}|j                  |j                  |       y )NzContent-Type)headers)r   r   content_typeset_contents_from_filestream)r   r"   	file_datar;   r\   s        r   	save_filezS3Storage.save_file   s?    $++t$I22
 	""9#3#3W"Er   c                 v    | j                  |       | j                  j                  || j                  z          y rE   )_check_empty_directoryr   
delete_keyr   )r   r8   s     r   delete_treezS3Storage.delete_tree   s+    ##I.y4>>9:r   c                 :    | j                   j                  |       y rE   )r   rd   )r   rY   s     r   delete_filezS3Storage.delete_file   s    y)r   c                     | j                   j                  ||| j                   z   g      }t        | j                  |      }|j	                  d       y rO   )r   r@   r   r   set_contents_from_string)r   r"   r8   dir_pathr;   s        r   make_dirzS3Storage.make_dir   sB    >>&&y4>>/I'KL$++x($$R(r   c                 N    | j                  |      st        t        d            y)Nz'Cannot operate on non empty directoriesT)_is_directory_emptyr   r   )r   r"   s     r   rc   z S3Storage._check_empty_directory   s,    ''-W &3 4 5 5r   c                    | j                  |      r/| j                  |       || j                  z  }|| j                  z  }| j                  j	                  || j                  j
                  |       | j                  |       y rE   )rK   rc   r   r   copy_keyr!   rg   )r   srcdsts      r   rename_pathzS3Storage.rename_path   sf    ;;s'',4>>!C4>>!CS$++"2"2C8r   c                 Z    | j                  || j                  z         }t        |      dk(  S )Nr   )rF   r   r?   rI   s      r   rm   zS3Storage._is_directory_empty   s)    ""4$..#894yA~r   c                 N    t        | j                  |      }|j                         S rE   )r   r   get_contents_as_string)r   r"   r;   s      r   	read_filezS3Storage.read_file   s!    $++t$))++r   c                 R    t        | j                  |      }|j                  |       y rE   )r   r   r^   )r   r"   contentr;   s       r   
write_filezS3Storage.write_file   s     $++t$""7+r   N)__name__
__module____qualname____doc__r   r=   rC   rF   rK   rM   rP   rU   rZ   ra   re   rg   rk   rc   rr   rm   rv   ry   r&   r   r   r   r      sd     B#<N-?0F;*)
,,r   r   c                   "     e Zd ZdZ fdZ xZS )S3FileAdmina  
        Simple Amazon Simple Storage Service file-management interface.

            :param bucket_name:
                Name of the bucket that the files are on.

            :param region:
                Region that the bucket is located

            :param aws_access_key_id:
                AWS Access Key ID

            :param aws_secret_access_key:
                AWS Secret Access Key

        Sample usage::

            from flask_admin import Admin
            from flask_admin.contrib.fileadmin.s3 import S3FileAdmin

            admin = Admin()

            admin.add_view(S3FileAdmin('files_bucket', 'us-east-1', 'key_id', 'secret_key')
    c                 L    t        ||||      }t        t        |   |d|i| y )Nstorage)r   superr   r   )	r   r   r   r   r   argskwargsr   	__class__s	           r   r   zS3FileAdmin.__init__   s0    K1B13k4)4KKFKr   )rz   r{   r|   r}   r   __classcell__)r   s   @r   r   r      s    2L Lr   r   )r*   botor   boto.s3.prefixr   boto.s3.keyr   ImportErrorflaskr   flask_admin.babelr   r   r	   objectr   r   r&   r   r   <module>r      sU    %  % b, b,JL- L]  	Bs   A A
A