U
    %b                     @   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   ;/tmp/pip-unpacked-wheel-tw14ec8h/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   Z	has_cacheZ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 |sRt |D ]:\}}|dks.||k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_nameZ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	sRjj	nj	 }j |krjdS tdst
|  _ fdd}t|| dS )zDeletes a fileNfieldstoragec               
      sb   t jd d zjdd W n0 tk
rN   j} td| j| j  Y nX 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	ExceptionZ_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   r.   r7   r1   r   r0   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   Zdispatch_uidr   r   r   N)r   Zcleanup_modelsformatr3   r   connectr   r   r   r   r"   r   r$   )modelkeyr   r   r   r9   l   s    r9   )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   r9   r   r   r   r   <module>   s   
/