U
    |ej                     @   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   T/var/www/website-v5/atlas_env/lib/python3.8/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   sX   |rdS |j rTt|sTz| jj|j d}W n | jk
rD   Y dS X tj||d dS )zEFallback to the database to remake the cleanup cache if there is noneN)pk)source)r   r   	has_cacheobjectsgetDoesNotExistr   )r   r   rawupdate_fieldsusingr   db_instancer   r   r   fallback_pre_save   s    r!   c           
      K   sd   |rdS |sVt |D ]>\}}|dks.||krt ||}	|	|krt| |||	|d qt | dS )z;Post_save on all models with file fields, deletes old filesNupdated)r   fields_for_model_instanceget_field_attrdelete_filer   )
r   r   r   createdr   r   r   
field_namenew_fileold_filer   r   r   delete_old_post_save&   s    r*   c                 K   s*   t |D ]\}}t| ||||d q
dS )z=Post_delete on all models with file fields, deletes all filesdeletedN)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	sRjj	nj	 }j |krjdS tdst
| _|dk|j ||dkd  fdd}t|| dS )	zDeletes a fileNfieldstorager+   r"   )r+   
model_namer'   	file_nameZdefault_file_namefiler   r"   c               
      s   t jf di  d} d }zjdd d} W nB tk
rr } z$|}j}td|j|j W 5 d }~X Y nX t	jf || d  d S )Nr   F)saveTzAThere was an exception deleting the file `%s` on field `%s.%s.%s`)r   errorsuccess)
r
   senddelete	Exception_metalogger	exception	app_labelr0   r	   )r5   r4   exoptseventr'   r,   r   r   r   r   run_on_commiti   s"       z"delete_file.<locals>.run_on_commit)namer   r   r   get_model_namehasattr	get_fieldr.   callabledefaultget_field_storager/   r   )	r   r   r'   r,   r   reasonr0   rG   rA   r   r?   r   r%   =   s.    



r%   c                  C   sz   t  D ]l} 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   dispatch_uidr   r   r   N)r   cleanup_modelsformatrC   r   connectr   r   r!   r   r*   r   r-   )modelkeyr   r   r   rM   {   s    rM   )r   loggingZdjango.db.models.signalsr   r   r   r   Zdjango.db.transactionr    r   signalsr	   r
   	getLoggerr   r:   r   r   r!   r*   r-   r%   rM   r   r   r   r   <module>   s   
>