B
    Wvg                 @   s   d Z ddlmZ ddlmZ ddlmZ ddlmZ dZ	dd Z
ee
Zd	d
 ZeeZeeZdZdd Zdd Zd1ddZd2ddZdd Zdd Zdd Zdd Zdd Zdd  Zd!d" Zd#d$ Zd%d& Zd3d'd(Zd)d* Zd+d, Zd-d. Z d/d0 Z!dS )4zF Our local cache of filefields, everything is private to this package.    )defaultdict)apps)models)import_stringZ_django_cleanup_original_cachec               C   s   t  S )N)set r   r   @/tmp/pip-install-4y76y3dr/django-cleanup/django_cleanup/cache.pyfields_default   s    r	   c               C   s   i S )Nr   r   r   r   r   fields_dict_default   s    r
   z'{klass.__module__}.{klass.__qualname__}c             C   sn   t rdS x`t D ]T}t|| r"qt|}t|r4q|j}x*| D ]}t|t	j
rDt||j| qDW qW dS )z/Prepare the cache for all models, non-reentrantN)FIELDSr   Z
get_modelsignore_modelget_model_namemodel_has_filefields_metaZ
get_fields
isinstancer   Z	FileFieldadd_field_for_modelname)select_modemodelr   optsfieldr   r   r   prepare   s    
r   c             C   s4   t |  | t|t|  |< t|jt|  |< dS )z2Centralized function to make all our local caches.N)r   addget_dotted_pathFIELDS_FIELDSZstorageFIELDS_STORAGE)
model_name
field_namer   r   r   r   r   ,   s    r   Nc             c   sH   t | rDt|  }|dk	r0t|ts&t||}x|D ]
}|V  q6W dS )z-Get the filefields for a model if it has themN)r   r   r   r   AssertionError
difference)r   excludefieldsr   r   r   r   get_fields_for_model:   s    

r"   c             c   sZ   |dkr| }t | }|  }x8t||dD ](}t| |d}||||j|jfV  q*W dS )z
        Yields (name, descriptor) for each file field given an instance

        Can use the `using` kwarg to change the instance that the `FieldFile`
        will receive.
    N)r    )r   Zget_deferred_fieldsr"   getattr	__class__r   r   )instanceusingr   Zdeferred_fieldsr   Z	fieldfiler   r   r   fields_for_model_instanceG   s    r'   c             C   s   t t|  | S )z$Restore a field from its dotted path)r   r   )r   r   r   r   r   	get_field\   s    r(   c             C   s   t t|  | S )z&Restore a storage from its dotted path)r   r   )r   r   r   r   r   get_field_storagea   s    r)   c             C   s   t j| jdS )z!get the dotted path for an object)klass)DOTTED_PATHformatr$   )Zobject_r   r   r   r   i   s    r   c             C   s   dj | jdS )zreturns a unique model namez {opt.app_label}.{opt.model_name})opt)r,   r   )r   r   r   r   r   n   s    r   c             C   s   dj | jdS )zOreturns a mangled attribute name specific to the model for ignore functionalityz1_{opt.model_name}__{opt.app_label}_cleanup_ignore)r-   )r,   r   )r   r   r   r   get_mangled_ignores   s    r.   c             C   s   dj | jdS )zOreturns a mangled attribute name specific to the model for select functionalityz1_{opt.model_name}__{opt.app_label}_cleanup_select)r-   )r,   r   )r   r   r   r   get_mangled_selectx   s    r/   c             C   s   | t kS )zCheck if a model has filefields)r   )r   r   r   r   r      s    r   c             C   s"   |rt | t|  S t | t| S )z"Check if a model should be ignored)hasattrr/   r.   )r   r   r   r   r   r      s    r   c             C   s   t | rt| t dS )z!Remove the cache from an instanceN)	has_cachedelattr
CACHE_NAME)r%   r   r   r   remove_instance_cache   s    r4   c             C   s(   |dkr| }t | ttt|| d dS )z~
        Make the cleanup cache for an instance.

        Can also change the source of the data with the `source` kwarg.
    N)r&   )setattrr3   dictr'   )r%   sourcer   r   r   make_cleanup_cache   s    r8   c             C   s
   t | tS )z&Check if an instance has a cache on it)r0   r3   )r%   r   r   r   r1      s    r1   c             C   s   t | t| S )z)Get a value from the cache on an instance)r#   r3   )r%   r   r   r   r   get_field_attr   s    r9   c              c   s   xt D ]} t| V  qW dS )z.Get all the models we have in the FIELDS cacheN)r   r   Z	get_model)r   r   r   r   cleanup_models   s    
r:   c               C   s   t  S )zGet a copy of the FIELDS cache)r   copyr   r   r   r   cleanup_fields   s    r<   )N)N)N)"__doc__collectionsr   Zdjango.appsr   Z	django.dbr   Zdjango.utils.module_loadingr   r3   r	   r   r
   r   r   r+   r   r   r"   r'   r(   r)   r   r   r.   r/   r   r   r4   r8   r1   r9   r:   r<   r   r   r   r   <module>   s:   


