o
    &Zcj                     @   s  d dl mZ d dlZd dlZd dlmZ d dlmZ d dlm	Z	 d dl
mZ d dlmZ zd dlmZ W n eyC   d dlmZ Y nw d d	lT d
dlmZmZ edZdadd Zdd Zi add Zdd Zdd Zd&ddZdd Z dd Z!d d! Z"d"d# Z#d$d% Z$dS )'    )unicode_literalsN)NamedTemporaryFile)md5settings)ImproperlyConfigured)Fileimport_module)*   )NullHandlerforce_bytesz[ -\s]+Fc                 c   s6    | j js| V  |  D ]}t|D ]}|V  qqdS )z4 Returns all non-abstract descendants of the model. N)_metaabstract__subclasses__get_nonabstract_descendants)modelsm r   C/var/www/jaguar/venv/lib/python3.10/site-packages/imagekit/utils.pyr      s   r   c              
   C   s   z|  d}W n ty   td| |f w | d | | |d d  }}zt|}W n tyA } z	td|||f d }~ww zt||}|W S  tyd   td|d  |dd   ||f w )N.z%s isn't a %s module.r   z"Error importing %s module %s: "%s"z#%s module "%s" does not define "%s"r   )rindex
ValueErrorr   r
   ImportErrorgetattrAttributeErrorupper)pathdescdotmoduleobjnamemodeobjr   r   r   get_by_qname   s,   
r'   c                 C   s*   t | |}t|}|s|  }t|< |S N)r'   _singletonsget)
class_pathr    clsinstancer   r   r   get_singleton5   s
   

r.   c                  C   sH   t rdS zddlm}  W n ty   t  Y da dS w | d da dS )z
    Auto-discover INSTALLED_APPS imagegenerators.py modules and fail silently
    when not present. This forces an import on them to register any admin bits
    they may want.

    Copied from django.contrib.admin
    Nr   autodiscover_modulesimagegeneratorsT)_autodiscovereddjango.utils.module_loadingr0   r   _autodiscover_modules_fallbackr/   r   r   r   autodiscover>   s   
r5   c               	   C   s   ddl m}  zddlm} W n ty   ddlm} Y nw ddlm} | jD ]$}z||}z|d|  W n
   ||dr@ Y W q' tyK   Y q'w dS )z
    Auto-discover INSTALLED_APPS imagegenerators.py modules and fail silently
    when not present. This forces an import on them to register any admin bits
    they may want.

    Copied from django.contrib.admin

    Used for Django versions < 1.7
    r   r   r	   )module_has_submodulez%s.imagegeneratorsr1   N)	django.confr   	importlibr
   r   django.utils.importlibr3   r6   INSTALLED_APPS)r   r
   r6   appr$   r   r   r   r4   U   s*   


r4   imagekitTc                 C   s   t | }|r|t  |S r(   )logging	getLogger
addHandlerr   )logger_nameadd_null_handlerloggerr   r   r   
get_loggerx   s   
rC   c                 C   s    t | ddt t | ddddfS )a
  
    A utility for easily extracting information about the host model from a
    Django FileField (or subclass). This is especially useful for when you want
    to alter processors based on a property of the source model. For example::

        class MySpec(ImageSpec):
            def __init__(self, source):
                instance, attname = get_field_info(source)
                self.processors = [SmartResize(instance.thumbnail_width,
                                               instance.thumbnail_height)]

    r-   Nfieldattnamer   )
field_filer   r   r   get_field_info   s   
rH   c                 C   s,   |   }t|}t| |_|d |S )z
    Calls the ``generate()`` method of a generator instance, and then wraps the
    result in a Django File object so Django knows how to save it.

    r   )generater   lenreadsizeseek)	generatorcontentfr   r   r   rI      s
   
rI   c                 C   s0   t | dd }t ||d }|d ur||  d S d S )Ncachefile_strategyrF   )filemethod_namestrategyfnr   r   r   call_strategy_method   s
   rV   c                  C   sD   zddl m}  W n ty   ddl m} |tj Y S w | tj S )Nr   )caches)	get_cache)django.core.cacherW   r   rX   r   IMAGEKIT_CACHE_BACKEND)rW   rX   r   r   r   rX      s   
rX   c                 C   sF   t jr!td| }t|dkrd|d d tt|  f }|} | S )N    z%s:%s   )r   %IMAGEKIT_USE_MEMCACHED_SAFE_CACHE_KEYbad_memcached_key_charssubrJ   r   r   	hexdigest)keynew_keyr   r   r   sanitize_cache_key   s    rd   )r<   T)%
__future__r   r=   retempfiler   hashlibr   r7   r   django.core.exceptionsr   django.core.filesr   r8   r
   r   r9   pilkit.utilslibr   r   compiler_   r2   r   r'   r)   r.   r5   r4   rC   rH   rI   rV   rX   rd   r   r   r   r   <module>   s:    
		
#