
    h                     x   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 ej&                  ej(                  d
Zej,                  ej.                  d
Zej2                  ej4                  d
Zd Z G d de      Z G d deej<                        Z G d dej@                        Z!y)    N)BytesIO)ContentFile)FileDescriptor)fields)files   )settings)ThumbnailerNameMixin)publicprivatec                     | j                   rt        j                  }nt        j                  }t	        |      r	 || |      S |S )N)	is_publicfiler_settingsFILER_PUBLICMEDIA_UPLOAD_TOFILER_PRIVATEMEDIA_UPLOAD_TOcallable)instancefilename	upload_tos      N/home/dcms/DCMS/lib/python3.12/site-packages/filer/fields/multistorage_file.pygenerate_filename_multistorager      s<    ">>	"??		8,,    c                   "     e Zd ZdZ fdZ xZS )MultiStorageFileDescriptora  
    This is rather similar to Django's ImageFileDescriptor.
    It calls <field name>_data_changed on model instance when new
    value is set. The callback is supposed to update fields which
    are related to file data (like size, checksum, etc.).
    When this is called from model __init__ (prev_assigned=False),
    it does nothing because related fields might not have values yet.
    In such case data_changed callback should be called at the end of model __init__
    (File.__init__ in this case).
    c                 H   | j                   j                  |j                  v }|j                  j                  | j                   j                        }t        |   ||       |r>||k7  r8| j                   j                   d}t        ||      r t        ||              y y y y )N_data_changed)fieldname__dict__getsuper__set__hasattrgetattr)selfr   valueprev_assignedprevious_filecallback_attr	__class__s         r   r"   z"MultiStorageFileDescriptor.__set__5   s    

8+<+<< ))--djjoo>%( Um3#zz/}=Mx/0-02 0 4=r   )__name__
__module____qualname____doc__r"   __classcell__r*   s   @r   r   r   *   s    	3 3r   r   c                   l     e Zd Zd Zed        Zed        Zed        Zed        Zd fd	Z	d Z
 xZS )	MultiStorageFieldFilec                    t         j                  j                  | d|       || _        || _        d| _        | j                  j                  | _        | j                  j                  | _        | j                  j                  | _        | j                  | _
        | j                  | _        | j                  | _        | j                  | _        y)aa  
        This is a little weird, but I couldn't find a better solution.
        Thumbnailer.__init__ is called first for proper object initialisation.
        Then we override some attributes defined at runtime with properties.
        We cannot simply call super().__init__ because filer Field objects
        doesn't have a storage attribute.
        NT)easy_thumbnails_filesThumbnailer__init__r   r   
_committedstoragesthumbnail_storagesthumbnail_options_storagestorage_source_storagesource_storage_thumbnail_storagethumbnail_storage_thumbnail_base_dirthumbnail_basedir)r%   r   r   r   s       r   r6   zMultiStorageFieldFile.__init__F   s     	))224tD 


++"&**"?"?!%!=!=}}"22!%!8!8!%!9!9r   c                 j    | j                   j                  r| j                  d   S | j                  d   S Nr   r   r   r   r8   r%   s    r   r;   zMultiStorageFieldFile._storageZ   -    ==""==**==++r   c                 j    | j                   j                  r| j                  d   S | j                  d   S rD   rE   rF   s    r   r=   z%MultiStorageFieldFile._source_storagea   rG   r   c                 j    | j                   j                  r| j                  d   S | j                  d   S rD   )r   r   r9   rF   s    r   r?   z(MultiStorageFieldFile._thumbnail_storageh   s1    ==""**844**955r   c                     | j                   j                  r| j                  d   j                  dd      S | j                  d   j                  dd      S )Nr   base_dir r   )r   r   r:   r    rF   s    r   rA   z)MultiStorageFieldFile._thumbnail_base_diro   sK    ==""))(377
BGG)))488RHHr   c                 J    |j                  d       t        | 	  |||       y )Nr   )seekr!   save)r%   r   contentrO   r*   s       r   rO   zMultiStorageFieldFile.savev   s    QT7D)r   c                 h    | j                   xr% | j                  j                  | j                         S )zH
        Returns ``True`` if underlying file exists in storage.
        )r   r<   existsrF   s    r   rR   zMultiStorageFieldFile.existsz   s&     yy;T\\00;;r   )T)r+   r,   r-   r6   propertyr;   r=   r?   rA   rO   rR   r/   r0   s   @r   r2   r2   D   sd    :( , , , , 6 6 I I*<r   r2   c                   <     e Zd ZeZeZ	 	 d fd	Z fdZd Z	 xZ
S )MultiStorageFileFieldc                 "   d|v r7|j                  d      }|t        k7  rt        j                  d|z  t               |xs t
        | _        |xs t        | _        |xs t        | _
        t        t        j                  | :  d||t        d d| y )Nr   z<MultiStorageFileField can handle only File objects;%s passed)verbose_namer   r   r<    )popr   warningswarnSyntaxWarningSTORAGESr8   THUMBNAIL_STORAGESr9   THUMBNAIL_OPTIONSr:   r!   easy_thumbnails_fieldsThumbnailerFieldr6   )	r%   rW   r   r8   r9   r:   kwargsr   r*   s	           r   r6   zMultiStorageFileField.__init__   s    & 

;/I:: *,567DF ,H"4"J8J!2!G6G$55tE 	$%D4	$ #	$r   c                    t         |   |      }t        j                  s|S 	 t	        | j
                  j                  |      j                               }t        j                         }|j                  |j                                |j                         |j                  k7  r"t        j                  d|j                  z         |j                  d       t!        j"                  |j                               j%                  d      }||fS # t&        $ r? t        j                  d|j                   d| j
                  j(                   d       |cY S w xY w)Nz;The checksum for "%s" diverges. Check for file consistency!r   zutf-8zThe payload for "z$" is missing. No such file on disk: !)r!   value_to_stringr   FILER_DUMP_PAYLOADr   r<   openreadhashlibsha1update	hexdigestrZ   r[   original_filenamerN   base64	b64encodedecodeOSErrorlocation)r%   objr&   payload_fileshaencoded_stringr*   s         r   re   z%MultiStorageFileField.value_to_string   s    ',00L	"4<<#4#4U#;#@#@#BCL,,.CJJ|((*+}}#((*[^a^s^ssta #--l.?.?.ABII'RN.(( 	MM-c.C.C-DDhimiuiui~i~h  @A  B  CL	s   C*D AEEc                 x   t        |t              rt        |      dk(  rt        |d   t              rx|\  }}	 t	        j
                  |      }| j                  j                  |      r| j                  j                  |       | j                  j                  |t        |             |S |S # t        $ r Y |S w xY w)Nr   r   )
isinstancelistlenstrrn   	b64decoder<   rR   deleterO   r   	TypeError)r%   r&   r   payloads       r   	to_pythonzMultiStorageFileField.to_python   s    eT"s5zQ:eAhPS;T %Hg  **73 <<&&x0LL''1!!(K,@A   s   B, ,	B98B9)NNNNN)r+   r,   r-   r2   
attr_classr   descriptor_classr6   re   r   r/   r0   s   @r   rU   rU      s#    &J1/3KO$"r   rU   )"rn   ri   rZ   ior   django.core.files.baser   django.db.models.fields.filesr   easy_thumbnailsr   r`   r   r4   rL   r	   r   utils.filer_easy_thumbnailsr
   FILER_PUBLICMEDIA_STORAGEFILER_PRIVATEMEDIA_STORAGEr]   #FILER_PUBLICMEDIA_THUMBNAIL_STORAGE$FILER_PRIVATEMEDIA_THUMBNAIL_STORAGEr^   #FILER_PUBLICMEDIA_THUMBNAIL_OPTIONS$FILER_PRIVATEMEDIA_THUMBNAIL_OPTIONSr_   r   r   ThumbnailerFieldFiler2   ra   rU   rX   r   r   <module>r      s        . 8 < : ) > 6688
 @@BB 
 @@BB 	3 34:<01FF:<z02CC 0r   