B
    `                 @   s   d dl Z d dlZd dlZd dlmZmZ d dlmZm	Z	 d dl
mZmZ d dlmZ d dlmZ e eZddd	d
dZG dd dZdS )    N)settingsdefaults)tokey	serialize)	ImageFileDummyImageFile)default)parse_geometryZjpgZpngZgifZwebp)JPEGPNGGIFWEBPc            
   @   sr   e Zd ZdZejejejejdddej	ej
d	ZdZdd Zdd	 Zd
d ZdddZdd Zdd Zdd ZdS )ThumbnailBackendz
    The main class for sorl-thumbnail, you can subclass this if you for example
    want to change the way destination filename is generated.
    FN)	formatZqualityZ
colorspaceZupscalecropZcropboxZroundedpaddingZpadding_color))ZprogressiveZTHUMBNAIL_PROGRESSIVE)ZorientationZTHUMBNAIL_ORIENTATION)ZblurZTHUMBNAIL_BLURc             C   s   t j|jd  S )N   )ospathsplitextnamelower)selfsource r   B/home/dcms/DCMS/lib/python3.7/site-packages/sorl/thumbnail/base.pyfile_extension.   s    zThumbnailBackend.file_extensionc             C   s`   |  |}|dks|dkrdS |dkr*dS |dkr6dS |dkrBd	S d
dlm} t|dtjS d S )Nz.jpgz.jpegr
   z.pngr   z.gifr   z.webpr   r   )r   THUMBNAIL_FORMAT)r   Zdjango.confr   getattrdefault_settingsr   )r   r   r   r   r   r   r   _get_format1   s    
zThumbnailBackend._get_formatc          
   K   s  t d|| |rt|}ntdtjr<|d| | x"| j	 D ]\}}||| qHW x6| j
D ],\}}tt|}|tt|krh||| qhW | |||}t|tj}	tj|	}
|
r|
S tjs|	 sytj|}W nP tk
r6 } z0t | tjrt|S t d|| |	S W dd}~X Y nX tj|}||d< tj|}|| z&| ||||	 | ||||	j  W dtj!| X tj"| tj#|	| |	S )z
        Returns thumbnail as an ImageFile instance for file with geometry and
        options given. First it will try to get it from the key value store,
        secondly it will create it.
        z'Getting thumbnail for file [%s] at [%s]z(falsey file_ argument in get_thumbnail()r   z'Remote file [%s] at [%s] does not existN
image_info)$loggerdebugr   
ValueErrorr   ZTHUMBNAIL_PRESERVE_FORMAT
setdefaultr    default_optionsitemsextra_optionsr   r   _get_thumbnail_filenamer   storagekvstoregetZTHUMBNAIL_FORCE_OVERWRITEexistsengineZ	get_image	Exception	exceptionZTHUMBNAIL_DUMMYr   warningZget_image_infoget_image_sizeset_size_create_thumbnail_create_alternative_resolutionsr   cleanupZ
get_or_setset)r   file_geometry_stringoptionsr   keyvalueattrr   	thumbnailcachedsource_imageer!   sizer   r   r   get_thumbnailA   sR    




zThumbnailBackend.get_thumbnailTc             C   s$   t |}|r|  tj| dS )zg
        Deletes file_ references in Key Value store and optionally the file_
        it self.
        N)r   deleter   r+   )r   r8   Zdelete_fileZ
image_filer   r   r   rD      s    zThumbnailBackend.deletec       	      C   sd   t d|j|| tj||}t||}tj|||}tj||| tj	|}|
| dS )z?
        Creates the thumbnail by using default.engine
        z.Creating thumbnail file [%s] at [%s] with [%s]N)r"   r#   r   r   r.   get_image_ratior	   createwriter2   r3   )	r   r@   r9   r:   r>   ratiogeometryimagerB   r   r   r   r4      s    
z"ThumbnailBackend._create_thumbnailc             C   s6  t j||}t||}tj|\}}xtjD ]}	t	|d |	 t	|d |	 f}
|
 }d|krt|d tr|d d}xFtt|D ]6}td|| }|rdt	t	|d|	  ||< qW d||d< t j||
|}d|d|	 |d	 }t|t j}t j||| t j|}|| q2W d
S )z
        Creates the thumbnail by using default.engine with multiple output
        sizes.  Appends @<ratio>x to the file name.
        r   r   r    z(\d+)pxz%spxz#%(file_name)s%(suffix)s%(file_ext)sz@%sx)	file_namesuffixZfile_extN)r   r.   rE   r	   r   r   r   r   Z!THUMBNAIL_ALTERNATIVE_RESOLUTIONSintcopy
isinstancestrsplitrangelenrematchgroupjoinrF   r   r*   rG   r2   r3   )r   r@   r9   r:   r   rH   rI   rL   Zdot_file_ext
resolutionZresolution_geometryZresolution_optionsr   isrJ   Zthumbnail_namer>   rB   r   r   r   r5      s,    
 "
z0ThumbnailBackend._create_alternative_resolutionsc             C   sH   t |j|t|}d|dd |dd |f }dtj|t|d  f S )z4
        Computes the destination filename.
        z%s/%s/%sN      z%s%s.%sr   )r   r;   r   r   ZTHUMBNAIL_PREFIX
EXTENSIONS)r   r   r9   r:   r;   r   r   r   r   r)      s    z(ThumbnailBackend._get_thumbnail_filename)T)__name__
__module____qualname____doc__r   r   ZTHUMBNAIL_QUALITYZTHUMBNAIL_COLORSPACEZTHUMBNAIL_UPSCALEZTHUMBNAIL_PADDINGZTHUMBNAIL_PADDING_COLORr&   r(   r   r    rC   rD   r4   r5   r)   r   r   r   r   r      s$   
K

 r   )loggingr   rU   Zsorl.thumbnail.confr   r   r   Zsorl.thumbnail.helpersr   r   Zsorl.thumbnail.imagesr   r   Zsorl.thumbnailr   Zsorl.thumbnail.parsersr	   	getLoggerr_   r"   r^   r   r   r   r   r   <module>   s   
