
    恕f"                         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  G d de      Z G d de      Zy# e$ r dxZ
ZY .w xY w)    )absolute_import)datetime)	timedelta)sleepN)BlobPermissions)BlockBlobService)redirect   )BaseFileAdminc                       e Zd ZdZdZdZ ed      Z ed      ZdZ	d Z
ed	        Zed
        Ze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)AzureStoragea  
        Storage object representing files on an Azure Storage container.

        Usage::

            from flask_admin.contrib.fileadmin import BaseFileAdmin
            from flask_admin.contrib.fileadmin.azure import AzureStorage

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

            fileadmin_view = MyAzureAdmin(storage=AzureStorage(...))

    z.dirr
      )minutes)hours/c                 P    t         st        d      || _        || _        d| _        y)z
            Constructor

            :param container_name:
                Name of the container that the files are on.

            :param connection_string:
                Azure Blob Storage Connection String
        zeCould not import Azure Blob Storage SDK. You can install the SDK using pip install azure-storage-blobN)r   
ValueError_container_name_connection_string_AzureStorage__client)selfcontainer_nameconnection_strings      b/var/www/feuerwehr-webapp/venv/lib/python3.12/site-packages/flask_admin/contrib/fileadmin/azure.py__init__zAzureStorage.__init__(   s2       > ? ?  ."3    c                     | j                   sBt        | j                        | _         | j                   j                  | j                  d       | j                   S )N)r   F)fail_on_exist)r   r   r   create_containerr   r   s    r   _clientzAzureStorage._client<   sJ    }},"&"9"9;DMMM**$$E + ;}}r   c                     |j                   j                  }|j                  }|t        ddd|      z
  }|j	                         S )Ni  r
   )tzinfo)
propertieslast_modifiedr#   r   total_seconds)clsblobr%   r#   epochs        r   _get_blob_last_modifiedz$AzureStorage._get_blob_last_modifiedE   s@    55%%q!F CC""$$r   c                     |y |j                  t        j                        }| j                  j	                  |      j                  | j                        S N)splitopsep	separatorjoinlstrip)r'   path
path_partss      r   _ensure_blob_pathzAzureStorage._ensure_blob_pathL   s@    <ZZ'
}}!!*-44S]]CCr   c                    |r||k7  rt        j                  ||      }| j                  |      }| j                  |      }|r|j                  | j                        ng }t        |      }t               }g }| j                  j                  | j                  |      D ]  }|j                  j                  | j                        }|j                         }	||k(  }
|	| j                  k(  }|
rN|sL|j                  }d}|j                  j                  }| j                  |      }|j!                  |	||||f       |d |dz    }| j                  j                  |      }|j#                  |        |j%                  |       |D ]>  }|j                  | j                        d   }	|}d}d}d}|j!                  |	||||f       @ |S )NFr
   Tr   )r.   r1   r5   r-   r0   lensetr!   
list_blobsr   namepop_fakedirr$   content_lengthr*   appendadddiscard)r   r3   	directoryr4   num_path_partsfoldersfilesr(   blob_path_partsr;   blob_is_file_at_current_levelblob_is_directory_filerel_pathis_dirsizer%   next_level_folderfolder_namefolders                      r   	get_fileszAzureStorage.get_filesT   s   *774+D%%d+**95	37TZZ/R
Z%LL++D,@,@$G 	)D"iioodnn=O"&&(D,;z,I)%)T]]%:",5K9955 $ < <T BdHfdMJK$34G^a5G$H!"nn112CDK(!	)$ 		" 	HF<</3DHFDMLL$&$FG	H r   c                    | j                  |      }d}| j                  j                  | j                  |      D ]K  }|j                  j                  | j                        }|d   | j                  k(  }|r y|dz  }|dk\  }|sK y y)Nr   r7   Tr
      F)r5   r!   r:   r   r;   r-   r0   r=   )r   r3   	num_blobsr(   rF   is_explicit_directorypath_cannot_be_leafs          r   rJ   zAzureStorage.is_dir}   s    %%d+	LL++D,@,@$G 		D"iioodnn=O$3B$74==$H!$NI"+q."		 r   c                     | j                  |      }|| j                         k(  ry	 t        t        | j                  j                  | j                  |                   y# t        $ r Y yw xY w)NTF)r5   get_base_pathnextiterr!   r:   r   StopIteration)r   r3   s     r   path_existszAzureStorage.path_exists   sh    %%d+4%%''	dll--d.B.BDIJK   		s   8A   	A,+A,c                      yN  r    s    r   rV   zAzureStorage.get_base_path   s    r   c                     | j                  |      }g }g }|j                  | j                        D ]?  }|j                  |       |j                  || j                  j	                  |      f       A |S r,   )r5   r-   r0   r?   r1   )r   r3   accumulatorbreadcrumbsrN   s        r   get_breadcrumbszAzureStorage.get_breadcrumbs   sr    %%d+jj0 	KFv&(;(;K(HIJ	K r   c                    | j                  |      }| j                  j                  | j                  |      s
t	               t        j                         }| j                  j                  | j                  |      }| j                  j                  | j                  |t        j                  || j                  z   || j                  z
        }t        |d|      S )N)expirystart?)r5   r!   existsr   r   r   utcnowmake_blob_url%generate_blob_shared_access_signaturer   READ_send_file_validity_send_file_lookbackr	   )r   	file_pathnowurlsass        r   	send_filezAzureStorage.send_file   s    **95	||""4#7#7C,ooll(()=)=yIll@@  )  111000	 A 2
 3,--r   c                     | j                  |      }| j                  j                  | j                  |      }|j                  S r,   )r5   r!   get_blob_to_bytesr   content)r   r3   r(   s      r   	read_filezAzureStorage.read_file   s8    %%d+||--d.B.BDI||r   c                 t    | j                  |      }| j                  j                  | j                  ||       y r,   )r5   r!   create_blob_from_textr   )r   r3   ru   s      r   
write_filezAzureStorage.write_file   s.    %%d+**4+?+?wOr   c                     | j                  |      }| j                  j                  | j                  ||j                         y r,   )r5   r!   create_blob_from_streamr   stream)r   r3   	file_datas      r   	save_filezAzureStorage.save_file   s7    %%d+,,T-A-A4-6-=-=	?r   c                     | j                  |      }| j                  j                  | j                  |      D ]2  }| j                  j	                  | j                  |j
                         4 y r,   )r5   r!   r:   r   delete_blobr;   )r   rB   r(   s      r   delete_treezAzureStorage.delete_tree   sX    **95	LL++D,@,@)L 	FDLL$$T%9%9499E	Fr   c                 r    | j                  |      }| j                  j                  | j                  |       y r,   )r5   r!   r   r   )r   rn   s     r   delete_filezAzureStorage.delete_file   s,    **95	  !5!5yAr   c                    | j                  |      }| j                  |      }| j                  j                  ||| j                  g      }|j	                  | j                        }| j
                  j                  | j                  |d       y r\   )r5   r0   r1   r=   r2   r!   rx   r   )r   r3   rB   r(   s       r   make_dirzAzureStorage.make_dir   so    %%d+**95	~~""D)T]]#CD{{4>>***4+?+?rJr   c                 |   | j                   j                  | j                  |      }| j                   j                  | j                  ||      }|j                  dk7  r`t        | j                         | j                   j                  | j                  |      j                  j                  }|j                  dk7  r_y y )Nsuccess)
r!   ri   r   	copy_blobstatusr   _copy_poll_interval_secondsget_blob_propertiesr$   copy)r   srcdstsrc_urlr   s        r   
_copy_blobzAzureStorage._copy_blob   s    ,,,,T-A-A3G||%%d&:&:CIkkY&$223<<33$$c++5:dd  kkY&r   c                 J    | j                  ||       | j                  |       y r,   )r   r   r   r   r   s      r   _rename_filezAzureStorage._rename_file   s    S!r   c           	          | j                   j                  | j                  |      D ]9  }| j                  |j                  |j                  j                  ||d             ; y )Nr
   )r!   r:   r   r   r;   replace)r   r   r   r(   s       r   _rename_directoryzAzureStorage._rename_directory   sQ    LL++D,@,@#F 	IDdii):):3Q)GH	Ir   c                     | j                  |      }| j                  |      }| j                  |      r| j                  ||       y | j                  ||       y r,   )r5   rJ   r   r   r   s      r   rename_pathzAzureStorage.rename_path   sN    $$S)$$S);;s""3,c3'r   N) __name__
__module____qualname____doc__r=   r   r   rm   rl   r0   r   propertyr!   classmethodr*   r5   rO   rJ   rZ   rV   rb   rr   rv   ry   r~   r   r   r   r   r   r   r   r^   r   r   r   r      s     H"##B/#!,I(   % % D D'R".P
?FB
K;I(r   r   c                   "     e Zd ZdZ fdZ xZS )AzureFileAdmina   
        Simple Azure Blob Storage file-management interface.

            :param container_name:
                Name of the container that the files are on.

            :param connection_string:
                Azure Blob Storage Connection String

        Sample usage::

            from flask_admin import Admin
            from flask_admin.contrib.fileadmin.azure import AzureFileAdmin

            admin = Admin()

            admin.add_view(AzureFileAdmin('files_container', 'my-connection-string')
    c                 H    t        ||      }t        t        |   |d|i| y )Nstorage)r   superr   r   )r   r   r   argskwargsr   	__class__s         r   r   zAzureFileAdmin.__init__	  s)    ~/@And,dNGNvNr   )r   r   r   r   r   __classcell__)r   s   @r   r   r      s    &O Or   r   )
__future__r   r   r   timer   os.pathr3   r.   azure.storage.blobr   r   ImportErrorflaskr	   r]   r   objectr   r   r^   r   r   <module>r      sa    &    .23  `(6 `(FO] OW  .)--O&.s   A 	AA