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ƒs„t 
|ˆ ¡ƒ ˆ_‡ ‡‡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   
/