
    `?iN                     @   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  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_lazyc                        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       o/home/cursorai/projects/django-cronjob-utils/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_file/   sC    4$'/**499d;DJzzr   c                     || _         y r%   r-   r   files     r   	_set_filezFieldFile._set_file5   s	    
r   c                     | ` y r%   r3   r'   s    r   	_del_filezFieldFile._del_file8   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.urlB   s'    ||		**r   c                     | j                          | j                  s| j                  j                  S | j                  j                  | j
                        S r%   )r+   r   r5   sizer   r   r'   s    r   r>   zFieldFile.sizeG   s<    99>>!||  ++r   c                     | j                          t        | dd       -| j                  j                  | j                  |      | _        | S | j
                  j                  |       | S Nr-   )r+   r/   r   r0   r   r5   )r   modes     r   r0   zFieldFile.openN   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   saverI   r   rG   r   )r   r   rF   rK   s       r   rK   zFieldFile.save`   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!   closer5   r   deleter   rC   r   r   rD   r   rK   )r   rK   s     r   rN   zFieldFile.deletel   s|     4!JJL	DII&	tzz11499=MM  r   c                 @    t        | dd       }|d u xs |j                  S r@   )r/   closedr4   s     r   rP   zFieldFile.closed   s#    tWd+t|*t{{*r   c                 D    t        | dd       }||j                          y y r@   )r/   rM   r4   s     r   rM   zFieldFile.close   s$    tWd+JJL r   c                 P    | j                   ddd | j                  | j                  dS )NFT)r   rP   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+   r1   r6   r8   propertyr5   r:   r<   r>   r0   alters_datarG   rK   rN   rP   rM   rS   rX   __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_classrU   rD   r   
db_defaultr   r   r   r5   r   r!   r   r   )r   r   clsr5   attr	file_copyr   s         r   rd   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%   )rU   r   rD   )r   r   values      r   __set__zFileDescriptor.__set__   s    05$**,,-r   r%   )rZ   r[   r\   __doc__rd   rn   r_   r`   s   @r   rb   rb      s    ;5z6r   rb   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 | _         ||n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 .rI   d   )_primary_key_set_explicitlyr
   r   callable_storage_callablere   r	   	TypeErrorr   r\   r[   	upload_to
setdefaultr   r   )r   verbose_namer   rz   r   kwargsr   s         r   r   zFileField.__init__   s     ,9F+B(")"5w?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)rv   r   Errorr   rZ   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)re   rz   rf   
startswithr   r   r   rZ   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 )NrI   ru   rz   rx   r   )r   deconstructgetrz   r/   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)Nrq   r   r'   s    r   get_internal_typezFileField.get_internal_type:  s    r   c                 >    t         |   |      }|y t        |      S r%   )r   get_prep_valuerf   )r   rm   r   s     r   r   zFileField.get_prep_value=  s&    &u- =5zr   c                 P   t         |   ||      }|j                  R|j                  Ft	        d| j                   d      }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)rK   )r   pre_saver   r-   r   re   r   add_noter   rK   r5   )r   model_instanceaddr5   excr   s        r   r   zFileField.pre_saveE  s    w499!7DII; '< <C $**k2EFIIIdiiI7r   c                 t    t        |   ||fi | t        || j                  | j	                  |              y r%   )r   contribute_to_classrC   rD   descriptor_classr   ri   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)rw   rz   datetimenowstrftimerf   	posixpathjoinr   r   rJ   )r   r   filenamedirnames       r   rJ   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 )rC   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_classrI   r   )r   	formfieldr   rq   rI   r   s     r   r   zFileField.formfieldr  s7    w  
#oo"oo 
 	
r   )NNr   N)rZ   r[   r\   r   rg   rb   r   _descriptionr   r   r   r   r   r   r   r   r   rJ   r   r   r_   r`   s   @r   rq   rq      sd     J &F)K CG70
( @85
 
r   rq   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)rU   r   r   rD   r   rn   update_dimension_fields)r   r   rm   previous_filer   s       r   rn   zImageFileDescriptor.__set__  sU     ))--djj.@.@A%( $JJ..xt.D %r   )rZ   r[   r\   ro   rn   r_   r`   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%   )rC   r   r   rD   r   rU   rE   s      r   rG   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   rN   )r   rK   r   s     r   rN   zImageFieldFile.delete  s     4,-&tr   rY   )rZ   r[   r\   rG   rN   r_   r`   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   rD   rU   r/   widthheightrC   )
r   r   r   r   r}   has_dimension_fieldsr5   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)rZ   r[   r\   r   rg   r   r   r   r   r   r   r   r   r   r   r   r_   r`   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   r   rb   rq   r   r   r   r   r   r   <module>r      s        - 4 . > 6 $ 8 ) : - 6F*j F*RM6& M6`M
 M
`E. E.Y	 y
 y
r   