o
    h                     @   s   d Z ddlZddlmZmZmZmZ ddlmZ ddl	m
Z
 ddlmZmZ eeZG dd	 d	Zd
d Zdd Zdd Zdd Zdd Zdd ZdS )z0
    Signal handlers to manage FileField files.
    N)post_delete	post_init	post_savepre_save)	on_commit   )cache)cleanup_post_deletecleanup_pre_deletec                   @   s   e Zd ZdZdS )FakeInstancez;A Fake model instance to ensure an instance is not modifiedN)__name__
__module____qualname____doc__ r   r   _/var/www/html/magazine_api/magazine_env/lib/python3.10/site-packages/django_cleanup/handlers.pyr      s    r   c                 K   s   t | dS )z?Post_init on all models with file fields, saves original valuesN)r   make_cleanup_cache)senderinstancekwargsr   r   r   cache_original_post_init   s   r   c                 K   s^   |rdS |j r+t|s-z
| jj|j d}W n | jy!   Y dS w tj||d dS dS dS )zEFallback to the database to remake the cleanup cache if there is noneN)pk)source)r   r   Z	has_cacheobjectsgetZDoesNotExistr   )r   r   rawupdate_fieldsusingr   Zdb_instancer   r   r   fallback_pre_save   s   r   c           
      K   s`   |rdS |s)t |D ]\}}|du s||v r(t ||}	|	|kr(t|||	| qt | dS )z;Post_save on all models with file fields, deletes old filesN)r   fields_for_model_instanceZget_field_attrdelete_filer   )
r   r   r   createdr   r   r   
field_namenew_fileZold_filer   r   r   delete_old_post_save&   s   r$   c                 K   s&   t |D ]\}}t|||| qdS )z=Post_delete on all models with file fields, deletes all filesN)r   r   r    )r   r   r   r   r"   file_r   r   r   delete_all_post_delete7   s   r&   c                    s   j sdS t _t}tdst|  _ j_ tjj	s)jj	nj	 }j |kr5dS tdsBt
|  _ fdd}t|| dS )zDeletes a fileNfieldstoragec               
      s`   t jd d zjdd W n ty&   j} td| j| j  Y nw t	jd d d S )N)r   fileF)savezAThere was an exception deleting the file `%s` on field `%s.%s.%s`)
r
   senddelete	Exception_metalogger	exceptionZ	app_label
model_namer	   )optsr"   r%   r   r   r   run_on_commit^   s   z"delete_file.<locals>.run_on_commit)namer   r   r   get_model_namehasattr	get_fieldr'   callabledefaultZget_field_storager(   r   )r   r"   r%   r   r1   r:   r4   r   r3   r   r    =   s   



r    c                  C   sz   t  D ]6} dt | }tjt| |dd tjt| |dd t	jt
| |dd tjt| |dd qdS )z%Connect signals to the cleanup modelsz{{}}_django_cleanup_{}r   )r   Zdispatch_uidr   r   r   N)r   Zcleanup_modelsformatr6   r   connectr   r   r   r   r$   r   r&   )modelkeyr   r   r   r<   l   s   r<   )r   loggingZdjango.db.models.signalsr   r   r   r   Zdjango.db.transactionr    r   Zsignalsr	   r
   	getLoggerr   r/   r   r   r   r$   r&   r    r<   r   r   r   r   <module>   s    
/