
    gN                     L   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	m
Z
 d dlmZ d dlmZ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
e      Z! G d de      Z" G d de      Z# G d de"      Z$ G d dee!      Z% G d de#      Z&y)    N)forms)checks)
FieldError)ContentFileFile)	ImageFile)Storagedefault_storage)validate_file_name)signals)DatabaseDefault)Field)DeferredAttribute)
AltersData)gettext_lazy)PY311c                        e Zd Z fdZd Zd Zd Zd Zd Zd Z	 e
eee	      Ze
d        Ze
d	        Ze
d
        ZddZde_        d ZddZde_        ddZde_        e
d        Zd Zd Zd Z xZS )	FieldFilec                 r    t         |   d |       || _        || _        |j                  | _        d| _        y )NT)super__init__instancefieldstorage
_committed)selfr   r   name	__class__s       u/var/www/python.vincentserveurtest.ovh/public_html/venv/lib/python3.12/site-packages/django/db/models/fields/files.pyr   zFieldFile.__init__   s2    t$ 
}}    c                 j    t        |d      r| j                  |j                  k(  S | j                  |k(  S )Nr   )hasattrr   )r   others     r   __eq__zFieldFile.__eq__   s0     5&!99

**yyE!!r    c                 ,    t        | j                        S N)hashr   r   s    r   __hash__zFieldFile.__hash__#   s    DIIr    c                 L    | s"t        d| j                  j                  z        y )Nz2The '%s' attribute has no file associated with it.)
ValueErrorr   r   r(   s    r   _require_filezFieldFile._require_file*   s'    DtzzV  r    c                     | j                          t        | dd       +| j                  j                  | j                  d      | _        | j
                  S )N_filerb)r,   getattrr   openr   r.   r(   s    r   	_get_filezFieldFile._get_file0   sC    4$'/**499d;DJzzr    c                     || _         y r&   r.   r   files     r   	_set_filezFieldFile._set_file6   s	    
r    c                     | ` y r&   r4   r(   s    r   	_del_filezFieldFile._del_file9   s    Jr    c                 l    | j                          | j                  j                  | j                        S r&   )r,   r   pathr   r(   s    r   r;   zFieldFile.path>   s'    ||  ++r    c                 l    | j                          | j                  j                  | j                        S r&   )r,   r   urlr   r(   s    r   r=   zFieldFile.urlC   s'    ||		**r    c                     | j                          | j                  s| j                  j                  S | j                  j                  | j
                        S r&   )r,   r   r6   sizer   r   r(   s    r   r?   zFieldFile.sizeH   s<    99>>!||  ++r    c                     | j                          t        | dd       -| j                  j                  | j                  |      | _        | S | j
                  j                  |       | S Nr.   )r,   r0   r   r1   r   r6   )r   modes     r   r1   zFieldFile.openO   sW    4$'/))$))T:DI  IINN4 r    Tc                 Z    t        | j                  | j                  j                  |       y r&   )setattrr   r   attnamer   r   contents      r   _set_instance_attributez!FieldFile._set_instance_attribute^   s    tzz1148r    c                 >   | j                   j                  | j                  |      }| j                  j	                  ||| j                   j
                        | _        | j                  | j                  |       d| _        |r| j                  j	                          y y )N)
max_lengthT)	r   generate_filenamer   r   saverJ   r   rH   r   )r   r   rG   rL   s       r   rL   zFieldFile.savea   sx    zz++DMM4@LL%%dG

@U@U%V	$$TYY8 MM  r    c                 P   | sy t        | d      r| j                          | `| j                  j	                  | j
                         d | _        t        | j                  | j                  j                  | j
                         d| _
        |r| j                  j                          y y )Nr.   F)r"   closer6   r   deleter   rD   r   r   rE   r   rL   )r   rL   s     r   rO   zFieldFile.deletem   s|     4!JJL	DII&	tzz11499=MM  r    c                 @    t        | dd       }|d u xs |j                  S rA   )r0   closedr5   s     r   rQ   zFieldFile.closed   s#    tWd+t|*t{{*r    c                 D    t        | dd       }||j                          y y rA   )r0   rN   r5   s     r   rN   zFieldFile.close   s$    tWd+JJL r    c                 P    | j                   ddd | j                  | j                  dS )NFT)r   rQ   r   r.   r   r   )r   r   r   r(   s    r   __getstate__zFieldFile.__getstate__   s,    
 IIZZ
 	
r    c                 p    | j                   j                  |       | j                  j                  | _        y r&   )__dict__updater   r   )r   states     r   __setstate__zFieldFile.__setstate__   s%    U#zz))r    )r/   T)__name__
__module____qualname__r   r$   r)   r,   r2   r7   r9   propertyr6   r;   r=   r?   r1   alters_datarH   rL   rO   rQ   rN   rT   rY   __classcell__r   s   @r   r   r      s    " Iy)4D, , + + , , D9! D!$ F+ +

*r    r   c                   *     e Zd ZdZd fd	Zd Z xZS )FileDescriptora  
    The descriptor for the file attribute on the model instance. Return a
    FieldFile when accessed so you can write code like::

        >>> from myapp.models import MyModel
        >>> instance = MyModel.objects.get(pk=1)
        >>> instance.file.size

    Assign a file object on assignment so you can do::

        >>> with open('/path/to/hello.world') as f:
        ...     instance.file = File(f)
    c                    || S t         |   ||      }t        |t              s|L| j                  j                  || j                  |      }||j                  | j                  j                  <   ngt        |t              r_| j                  j                  || j                  | j                  j                        }||j                  | j                  j                  <   nt        |t              rst        |t              sc| j                  j                  || j                  |j                        }||_        d|_        ||j                  | j                  j                  <   nut        |t              r@t        |d      s4||_        | j                  |_        | j                  j"                  |_        n%t        |t              r||j                   ur||_        |j                  | j                  j                     S )NFr   )r   __get__
isinstancestrr   
attr_classrV   rE   r   
db_defaultr   r   r   r6   r   r"   r   r   )r   r   clsr6   attr	file_copyr   s         r   re   zFileDescriptor.__get__   s   K wx- dC DL::((4::tDD48Hdjj001 o.::((4::tzz?T?TUD48Hdjj001 d#JtY,G

--h

DIINI!IN#(I 4=Hdjj001
 i(w1G$DMDJ::--DL i(XT]]-J$DM   !3!344r    c                 J    ||j                   | j                  j                  <   y r&   )rV   r   rE   )r   r   values      r   __set__zFileDescriptor.__set__   s    05$**,,-r    r&   )r[   r\   r]   __doc__re   ro   r`   ra   s   @r   rc   rc      s    :5x6r    rc   c                        e Zd ZeZeZ ed      Z	 d fd	Z	 fdZ
d Zd Z fdZd Z fdZ fd	Z fd
Zd Zd Z fdZ xZS )	FileFieldr   c                    d|v | _         |xs t        | _        t        | j                        r| j                  | _        | j                         | _        t        | j                  t              sCt        | j                  j                  dt        j                  dt        j                        || _        |j                  dd       t        | 8  ||fi | y )Nprimary_keyz(.storage must be a subclass/instance of .rJ   d   )_primary_key_set_explicitlyr
   r   callable_storage_callablerf   r	   	TypeErrorr   r]   r\   	upload_to
setdefaultr   r   )r   verbose_namer   r{   r   kwargsr   s         r   r   zFileField.__init__   s     ,9F+B(1/DLL!%)\\D"<<>DLdllG4 33**,,	  #,,t6v6r    c                 f    g t        |   di || j                         | j                         S N )r   check_check_primary_key_check_upload_tor   r~   r   s     r   r   zFileField.check  sE    
W]$V$
$$&
 ""$
 	
r    c                 ~    | j                   r0t        j                  d| j                  j                  z  | d      gS g S )Nz/'primary_key' is not a valid argument for a %s.zfields.E201)objid)rw   r   Errorr   r[   r(   s    r   r   zFileField._check_primary_key  sC    ++Enn--.$	  Ir    c                     t        | j                  t              rL| j                  j                  d      r1t	        j
                  d| j                  j                  z  | dd      gS g S )N/zH%s's 'upload_to' argument must be a relative path, not an absolute path.zfields.E202zRemove the leading slash.)r   r   hint)rf   r{   rg   
startswithr   r   r   r[   r(   s    r   r   zFileField._check_upload_to"  s^    dnnc*t~~/H/H/M%'+~~'>'>?$4  Ir    c                     t         |          \  }}}}|j                  d      dk(  r|d= | j                  |d<   t	        | d| j
                        }|t        ur||d<   ||||fS )NrJ   rv   r{   ry   r   )r   deconstructgetr{   r0   r   r
   )r   r   r;   argsr~   r   r   s         r   r   zFileField.deconstruct0  st    #(7#6#8 dD&::l#s*|$"nn{$ 3T\\B/) 'F9T4''r    c                      y)Nrr   r   r(   s    r   get_internal_typezFileField.get_internal_type:  s    r    c                 >    t         |   |      }|y t        |      S r&   )r   get_prep_valuerg   )r   rn   r   s     r   r   zFileField.get_prep_value=  s&    &u- =5zr    c                 \   t         |   ||      }|j                  X|j                  Lt	        d| j                   d      }t
        r+t        |j                  t              r|j                  d       ||r4|j                  s(|j                  |j                  |j                  d       |S )Nz	File for z4 must have the name attribute specified to be saved.z&Pass a 'name' argument to ContentFile.F)rL   )r   pre_saver   r.   r   r   rf   r   add_noter   rL   r6   )r   model_instanceaddr6   excr   s        r   r   zFileField.pre_saveE  s    w499!7DII; '< <C DJJ<EFIIIdiiI7r    c                 t    t        |   ||fi | t        || j                  | j	                  |              y r&   )r   contribute_to_classrD   rE   descriptor_classr   rj   r   r~   r   s       r   r   zFileField.contribute_to_classU  s2    #C88T\\4#8#8#>?r    c                 N   t        | j                        r| j                  ||      }nVt        j                  j                         j	                  t        | j                              }t        j                  ||      }t        |d      }| j                  j                  |      S )a  
        Apply (if callable) or prepend (if a string) upload_to to the filename,
        then delegate further processing of the name to the storage backend.
        Until the storage layer, all file paths are expected to be Unix style
        (with forward slashes).
        T)allow_relative_path)rx   r{   datetimenowstrftimerg   	posixpathjoinr   r   rK   )r   r   filenamedirnames       r   rK   zFileField.generate_filenameY  sy     DNN#~~h9H''++-66s4>>7JKG ~~gx8H%hDI||--h77r    c                 @    |t        || j                  |xs d       y y )N )rD   r   )r   r   datas      r   save_form_datazFileField.save_form_datah  s%    
  Hdii4 r    c                 \    t        |   di t        j                  | j                  d|S )N)
form_classrJ   r   )r   	formfieldr   rr   rJ   r   s     r   r   zFileField.formfieldr  s7    w  
#oo"oo 
 	
r    )NNr   N)r[   r\   r]   r   rh   rc   r   _descriptionr   r   r   r   r   r   r   r   r   rK   r   r   r`   ra   s   @r   rr   rr      sd     J &F)K CG70
( @85
 
r    rr   c                   "     e Zd ZdZ fdZ xZS )ImageFileDescriptorz
    Just like the FileDescriptor, but for ImageFields. The only difference is
    assigning the width/height to the width_field/height_field, if appropriate.
    c                     |j                   j                  | j                  j                        }t        |   ||       || j                  j                  |d       y y )NT)force)rV   r   r   rE   r   ro   update_dimension_fields)r   r   rn   previous_filer   s       r   ro   zImageFileDescriptor.__set__  sU     ))--djj.@.@A%( $JJ..xt.D %r    )r[   r\   r]   rp   ro   r`   ra   s   @r   r   r   |  s    
E Er    r   c                   &     e Zd Zd Zd fd	Z xZS )ImageFieldFilec                     t        | j                  | j                  j                  |       | j                  | j                  j
                  | j                  j                  <   y r&   )rD   r   r   rE   r   rV   rF   s      r   rH   z&ImageFieldFile._set_instance_attribute  s@    tzz117; 6:YYtzz112r    c                 @    t        | d      r| `t        |   |       y )N_dimensions_cache)r"   r   r   rO   )r   rL   r   s     r   rO   zImageFieldFile.delete  s     4,-&tr    rZ   )r[   r\   r]   rH   rO   r`   ra   s   @r   r   r     s    ? r    r   c                   v     e Zd ZeZeZ ed      Z	 	 	 	 d	 fd	Z	 fdZ
d Z fdZ fdZd
dZ fdZ xZS )
ImageFieldImagec                 F    ||c| _         | _        t        |   ||fi | y r&   )width_fieldheight_fieldr   r   )r   r}   r   r   r   r~   r   s         r   r   zImageField.__init__  s+     /:<+$+t6v6r    c                 F    g t        |   di || j                         S r   )r   r   _check_image_library_installedr   s     r   r   zImageField.check  s2    
W]$V$
002
 	
r    c                 f    	 ddl m} g S # t        $ r t        j                  dd| d      gcY S w xY w)Nr   )r   z6Cannot use ImageField because Pillow is not installed.z]Get Pillow at https://pypi.org/project/Pillow/ or run command "python -m pip install Pillow".zfields.E210)r   r   r   )PILr   ImportErrorr   r   )r   r   s     r   r   z)ImageField._check_image_library_installed  sI    	! I  	LI $
 
	s   
 #00c                     t         |          \  }}}}| j                  r| j                  |d<   | j                  r| j                  |d<   ||||fS )Nr   r   )r   r   r   r   )r   r   r;   r   r~   r   s        r   r   zImageField.deconstruct  sZ    #(7#6#8 dD&$($4$4F=!%)%6%6F>"T4''r    c                     t        |   ||fi | |j                  j                  sE| j                  s| j
                  r,t        j                  j                  | j                  |       y y y )N)sender)
r   r   _metaabstractr   r   r   	post_initconnectr   r   s       r   r   zImageField.contribute_to_class  s^    #C88 yy!!t'7'74;L;L%%d&B&B3%O <M!r    c                    | j                   xs | j                  }|r| j                  |j                  vryt	        || j                        }|s|sy| j                   xr t	        || j                          xs% | j                  xr t	        || j                          }|r|sy|r|j
                  }|j                  }	nd}d}	| j                   rt        || j                   |       | j                  rt        || j                  |	       yy)a  
        Update field's width and height fields, if defined.

        This method is hooked up to model's post_init signal to update
        dimensions after instantiating a model instance.  However, dimensions
        won't be updated if the dimensions fields are already populated.  This
        avoids unnecessary recalculation when loading an object from the
        database.

        Dimensions can be forced to update with force=True, which is how
        ImageFileDescriptor.__set__ calls this method.
        N)r   r   rE   rV   r0   widthheightrD   )
r   r   r   r   r~   has_dimension_fieldsr6   dimension_fields_filledr   r   s
             r   r   z"ImageField.update_dimension_fields  s     $//D43D3D#t||8;L;L'L
 x. E Igh8H8H&I"I P!!N'(D<M<M*N&N#
 #5 JJE[[F EF Hd..6Hd//8 r    c                 F    t        |   di dt        j                  i|S )Nr   r   )r   r   r   r   r   s     r   r   zImageField.formfield  s2    w  
e..
 	
r    )NNNN)F)r[   r\   r]   r   rh   r   r   r   r   r   r   r   r   r   r   r   r`   ra   s   @r   r   r     sO    J*G*K 	7
$(P79r
 
r    r   )'r   r   djangor   django.corer   django.core.exceptionsr   django.core.files.baser   r   django.core.files.imagesr   django.core.files.storager	   r
   django.core.files.utilsr   django.db.modelsr   django.db.models.expressionsr   django.db.models.fieldsr   django.db.models.query_utilsr   django.db.models.utilsr   django.utils.translationr   r   django.utils.versionr   r   rc   rr   r   r   r   r   r    r   <module>r      s        - 4 . > 6 $ 8 ) : - 6 &F*j F*RL6& L6^M
 M
`E. E.Y	 y
 y
r    