
    EvgN                     r   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&dS )    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                     t                                          d |           || _        || _        |j        | _        d| _        d S )NT)super__init__instancefieldstorage
_committed)selfr   r   name	__class__s       Z/var/www/pixelcanvas.ch/venv/lib/python3.11/site-packages/django/db/models/fields/files.pyr   zFieldFile.__init__   s?    t$$$ 
}    c                 X    t          |d          r| j        |j        k    S | j        |k    S )Nr   )hasattrr   )r   others     r   __eq__zFieldFile.__eq__   s2     5&!! 	+9
**yE!!r    c                 *    t          | j                  S N)hashr   r   s    r   __hash__zFieldFile.__hash__#   s    DIr    c                 B    | st          d| j        j        z            d S )Nz2The '%s' attribute has no file associated with it.)
ValueErrorr   r   r(   s    r   _require_filezFieldFile._require_file*   s2     	DtzV  	 	r    c                     |                                   t          | dd           %| j                            | j        d          | _        | j        S )N_filerb)r,   getattrr   openr   r.   r(   s    r   	_get_filezFieldFile._get_file0   sI    4$''/**49d;;DJzr    c                     || _         d S r&   r.   r   files     r   	_set_filezFieldFile._set_file6   s    


r    c                 
    | ` d S r&   r4   r(   s    r   	_del_filezFieldFile._del_file9   s    JJJr    c                 h    |                                   | j                            | j                  S r&   )r,   r   pathr   r(   s    r   r;   zFieldFile.path>   s,    |  +++r    c                 h    |                                   | j                            | j                  S r&   )r,   r   urlr   r(   s    r   r=   zFieldFile.urlC   s,    |	***r    c                     |                                   | j        s| j        j        S | j                            | j                  S r&   )r,   r   r6   sizer   r   r(   s    r   r?   zFieldFile.sizeH   s@     	"9>!|  +++r    r/   c                     |                                   t          | dd           &| j                            | j        |          | _        n| j                            |           | S Nr.   )r,   r0   r   r1   r   r6   )r   modes     r   r1   zFieldFile.openO   s\    4$''/))$)T::DIIINN4   r    Tc                 F    t          | j        | j        j        |           d S r&   )setattrr   r   attnamer   r   contents      r   _set_instance_attributez!FieldFile._set_instance_attribute^   s!    tz1488888r    c                    | j                             | j        |          }| j                            ||| j         j                  | _        |                     | j        |           d| _        |r| j                                         d S d S )N)
max_lengthT)	r   generate_filenamer   r   saverJ   r   rH   r   )r   r   rG   rL   s       r   rL   zFieldFile.savea   s    z++DM4@@L%%dG
@U%VV	$$TY888  	!M     	! 	!r    c                 8   | sd S t          | d          r|                                  | `| j                            | j                   d | _        t          | j        | j        j	        | j                   d| _
        |r| j                                         d S d S )Nr.   F)r"   closer6   r   deleter   rD   r   r   rE   r   rL   )r   rL   s     r   rO   zFieldFile.deletem   s     	F 4!! 	JJLLL	DI&&&	tz149=== 	!M     	! 	!r    c                 :    t          | dd           }|d u p|j        S rA   )r0   closedr5   s     r   rQ   zFieldFile.closed   s$    tWd++t|*t{*r    c                 X    t          | dd           }||                                 d S d S rA   )r0   rN   r5   s     r   rN   zFieldFile.close   s2    tWd++JJLLLLL r    c                 2    | 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+    
 IZ
 
 	
r    c                 \    | j                             |           | j        j        | _        d S r&   )__dict__updater   r   )r   states     r   __setstate__zFieldFile.__setstate__   s(    U###z)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           " " "           8Iy)44D, , X, + + X+ , , X,    D9 9 9! ! ! ! D! ! ! !$ F+ + X+  

 
 
* * * * * * *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)
    Nc                    || S t                                          ||          }t          |t                    s|7| j                            || j        |          }||j        | j        j        <   n7t          |t                    r@| j                            || j        | j        j	                  }||j        | j        j        <   nt          |t                    r^t          |t                    sI| j                            || j        |j                  }||_        d|_        ||j        | j        j        <   not          |t                    r5t          |d          s%||_        | 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 wwx-- dC   	%DL:((4:tDDD48Hdj011 o.. 	%:((4:tz?TUUD48Hdj011 d## 	%JtY,G,G 	%
--h
DINNI!IN#(I 4=Hdj011
 i(( 	%w1G1G 	%$DMDJ:-DLL i(( 	%XT]-J-J$DM  !344r    c                 .    ||j         | j        j        <   d S 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      sW         :5 :5 :5 :5 :5 :5x6 6 6 6 6 6 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   N c                    d|v | _         |pt          | _        t          | j                  rt| j        | _        |                                 | _        t          | j        t                    s5t          | j        j	        dt          j
        dt          j	                  || _        |                    dd            t                      j        ||fi | d S )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/DL!! 	%)\D"<<>>DLdlG44  333***,,	   #,,,,t66v66666r    c                     g  t                      j        di ||                                 |                                 S N )r   check_check_primary_key_check_upload_tor   r   r   s     r   r   zFileField.check  sU    
UWW]$$V$$
$$&&
 ""$$
 	
r    c                 ^    | j         r%t          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)rx   r   Errorr   r[   r(   s    r   r   zFileField._check_primary_key  sH    + 
	En-.$	    Ir    c                     t          | j        t                    r@| j                            d          r&t	          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"  sm    dnc** 	t~/H/H/M/M 	%'+~'>?$4    Ir    c                     t                                                      \  }}}}|                    d          dk    r|d= | j        |d<   t	          | d| j                  }|t          ur||d<   ||||fS )NrJ   rw   r|   rz   r   )r   deconstructgetr|   r0   r   r
   )r   r   r;   argsr   r   r   s         r   r   zFileField.deconstruct0  s    #(77#6#6#8#8 dD&::l##s**|$"n{$ 3T\BB/)) 'F9T4''r    c                     dS )Nrr   r   r(   s    r   get_internal_typezFileField.get_internal_type:  s    {r    c                 l    t                                          |          }|d S t          |          S r&   )r   get_prep_valuerg   )r   rn   r   s     r   r   zFileField.get_prep_value=  s2    &&u-- =45zzr    c                 ^   t                                          ||          }|j        W|j        Pt	          d| j         d          }t
          r/t          |j        t                    r|                    d           ||r)|j	        s"|
                    |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    ww449!7<DI < < < C  GDJ<< GEFFFI 	8 	8IIdiI777r    c                      t                      j        ||fi | t          || j        |                     |                      d S r&   )r   contribute_to_classrD   rE   descriptor_classr   rj   r   r   r   s       r   r   zFileField.contribute_to_classU  sL    ##C88888T\4#8#8#>#>?????r    c                 ^   t          | j                  r|                     ||          }nXt          j                                                            t          | j                            }t          j        ||          }t          |d          }| 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)ry   r|   datetimenowstrftimerg   	posixpathjoinr   r   rK   )r   r   filenamedirnames       r   rK   zFileField.generate_filenameY  s     DN## 	9~~h99HH'++--66s4>7J7JKKG ~gx88H%hDIII|--h777r    c                 >    |t          || j        |pd           d S d S )Nrs   )rD   r   )r   r   datas      r   save_form_datazFileField.save_form_datah  s2    
  Hdi44444 r    c                 ^     t                      j        di t          j        | j        d|S )N)
form_classrJ   r   )r   	formfieldr   rr   rJ   r   s     r   r   zFileField.formfieldr  sF     uww  
 
#o"o  
 
 	
r    )NNrs   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      sF        J &!F))K CG7 7 7 7 7 70
 
 
 
 
    ( ( ( ( (           @ @ @ @ @8 8 85 5 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                  }t	                                          ||           || j                            |d           d S d S )NT)force)rV   r   r   rE   r   ro   update_dimension_fields)r   r   rn   previous_filer   s       r   ro   zImageFileDescriptor.__set__  sg     )--dj.@AA%((( $J..xt.DDDDD %$r    )r[   r\   r]   rp   ro   r`   ra   s   @r   r   r   |  sK         
E E E E E E E 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        <   d S r&   )rD   r   r   rE   r   rV   rF   s      r   rH   z&ImageFieldFile._set_instance_attribute  s9    tz17;;; 6:Ytz1222r    Tc                 n    t          | d          r| `t                                          |           d S )N_dimensions_cache)r"   r   r   rO   )r   rL   r   s     r   rO   zImageFieldFile.delete  s8    4,-- 	'&tr    rZ   )r[   r\   r]   rH   rO   r`   ra   s   @r   r   r     sL        ? ? ?         r    r   c                   |     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ImageNc                 \    ||c| _         | _         t                      j        ||fi | d S r&   )width_fieldheight_fieldr   r   )r   r~   r   r   r   r   r   s         r   r   zImageField.__init__  s>     /:<+$+t66v66666r    c                 b    g  t                      j        di ||                                 S r   )r   r   _check_image_library_installedr   s     r   r   zImageField.check  s?    
UWW]$$V$$
002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  sv    	!!!!!! 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  s`    #(77#6#6#8#8 dD& 	5$($4F=! 	7%)%6F>"T4''r    c                      t                      j        ||fi | |j        j        s6| j        s| j        r*t          j                            | j	        |           d S d S d S )N)sender)
r   r   _metaabstractr   r   r   	post_initconnectr   r   s       r   r   zImageField.contribute_to_class  s    ##C88888 y! 	Pt'7 	P4;L 	P%%d&B3%OOOOO	P 	P 	P 	Pr    Fc                    | j         p| j        }|r| j        |j        vrdS t	          || j                  }|s|sdS | j         rt	          || j                    p| j        ot	          || j                    }|r|sdS |r|j        }|j        }	nd}d}	| j         rt          || j         |           | j        rt          || j        |	           dS dS )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.     $/D43D# 	t|8;L'L'LF
 x..  	E 	F Igh8H&I&I"I P!N'(D<M*N*N&N#
 # 	5 	F  	JE[FF EF  	7Hd.666 	9Hd/88888	9 	9r    c                 R     t                      j        di dt          j        i|S )Nr   r   )r   r   r   r   r   s     r   r   zImageField.formfield  s=     uww  
 
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     s        J*!G**K 	7 	7 	7 	7 	7 	7
 
 
 
 
  $( ( ( ( (P P P P P79 79 79 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      sZ                    - - - - - - 4 4 4 4 4 4 4 4 . . . . . . > > > > > > > > 6 6 6 6 6 6 $ $ $ $ $ $ 8 8 8 8 8 8 ) ) ) ) ) ) : : : : : : - - - - - - 6 6 6 6 6 6 & & & & & &F* F* F* F* F*j F* F* F*RL6 L6 L6 L6 L6& L6 L6 L6^M
 M
 M
 M
 M
 M
 M
 M
`E E E E E. E E E.    Y	   y
 y
 y
 y
 y
 y
 y
 y
 y
 y
r    