B
    Wvgj                 @   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   C/tmp/pip-install-4y76y3dr/django-cleanup/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   sV   |rdS |j rRt|sRy| jj|j d}W n | jk
rB   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   sh   |rdS |sZxLt |D ]>\}}|dks0||krt ||}	|	|krt| |||	|d qW t | dS )z;Post_save on all models with file fields, deletes old filesNupdated)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.   x(t |D ]\}}t| ||||d qW 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 }yjdd d} W nB tk
rr } z$|}j}td|j|j W d 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	ExceptionZ_metalogger	exceptionZ	app_labelr)   r	   )r.   r-   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defaultZget_field_storager(   r   )	r   r   r"   r%   r   reasonr)   r=   r7   r   )r6   r"   r%   r   r   r   r    =   s,    



r    c              C   s~   xxt  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
W dS )z%Connect signals to the cleanup modelsz{{}}_django_cleanup_{}r   )r   Zdispatch_uidr   r   r   N)r   Zcleanup_modelsformatr9   r   connectr   r   r   r   r#   r   r&   )modelkeyr   r   r   r@   {   s    r@   )r   loggingZdjango.db.models.signalsr   r   r   r   Zdjango.db.transactionr    r   Zsignalsr	   r
   	getLoggerr   r2   r   r   r   r#   r&   r    r@   r   r   r   r   <module>   s   
>