
    h                         d dl Z d dlZd dlZd dlmZ d dlmZ d dlmZm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  G d
 d      ZddZ G d de      Zy)    N)date)BaseCommand)datetime	timedelta)settings)Source)get_storage)get_storage_hash)storagesc                   T    e Zd ZdZdZdZdZdZdZd Z	d Z
d Zd Zd Z	 	 dd	Zd
 Zy)ThumbnailCollectionCleanerzL
    Remove thumbnails and DB references to non-existing source images.
    r   c                      || _         || _        y N)stdoutstderr)selfr   r   s      e/home/dcms/DCMS/lib/python3.12/site-packages/easy_thumbnails/management/commands/thumbnail_cleanup.py__init__z#ThumbnailCollectionCleaner.__init__   s        c                     t        |d      r*t        j                  j                  |j                  |      S t        j                  j                  t
        j                  |      S )Nlocation)hasattrospathjoinr   r   
MEDIA_ROOT)r   r   storages      r   _get_absolute_pathz-ThumbnailCollectionCleaner._get_absolute_path   sB    7J'77<< 0 0$7777<< 3 3T::r   c                 ^    t         j                  j                  |t        j                        S r   )r   r   relpathr   r   )r   r   s     r   _get_relative_pathz-ThumbnailCollectionCleaner._get_relative_path$   s    wwtX%8%899r   c                     	 |j                  |      S # t        $ rO}| j                  j                  dj	                  |             | j                  j                  |       Y d }~y d }~ww xY w)Nz3Something went wrong when checking existance of {}:)exists	Exceptionr   writeformat)r   r   r   es       r   _check_if_existsz+ThumbnailCollectionCleaner._check_if_exists'   sZ    	!>>$'' 	!KKSZZ[_`aKKa  	!s    	A+AA&&A+c                 |    t         j                  j                         j                  |      j	                          y )N)id__in)r   objectsallfilterdelete)r   idss     r   _delete_sources_by_idz0ThumbnailCollectionCleaner._delete_sources_by_id.   s)    ##3#/668r   Nc                 .   |r| j                   j                  d       |s
t               }t        j                  j                         D ci c]  }t        t        |         | }}g }t        j                         }	t        j                  j                         }
|dkD  r5t        j                         }|
j                  |t        |      z
  |f      }
|r|
j                  |      }
t!        |
      D ]  }|j#                  |j$                        }|r	t        |   nd}|sE| j                   j                  d|j$                   d       | j                   j                  d	       s| xj&                  d
z  c_        | j)                  |j*                  |      }| j-                  ||      s|dkD  r*| j                   j                  dj/                  |             | xj0                  d
z  c_        |j3                  |j4                         |j6                  j                         D ]  }| xj8                  d
z  c_        | j)                  |j*                  |      }| j-                  ||      sG|s|j;                  |       |dkD  s`| j                   j                  dj/                  |              t=        |      dk\  s|r| j?                  |       g } |s| j?                  |       tA        t        j                         |	z
        | _!        yc c}w )z
        Iterate through sources. Delete database references to sources
        not existing, including its corresponding thumbnails (files and
        database references).
        z
Dry run...r   )days)modified__range)name__startswithNzSource storage hash (z) not found in STORAGESz/Can't determine source storage, skipping source   zSource not present: {}zDeleting thumbnail: {}  )"r   r%   r	   r   STORAGESkeysr
   r   timer   r+   r,   r   todayr-   r   queryset_iteratorgetstorage_hashsourcesr   namer(   r&   source_refs_deletedappendid
thumbnailsthumbnails_deletedr.   lenr0   roundexecution_time)r   dry_run	verbositylast_n_dayscleanup_pathr   aliasstorage_hash_mapsources_to_delete
time_startqueryr:   sourcesource_storage_aliassource_storageabs_source_paththumbabs_thumbnail_paths                     r   clean_upz#ThumbnailCollectionCleaner.clean_up1   s    KKl+!mGRZRcRcRhRhRjk,Xe_=uDkkYY[
""$?JJLELL!&)D!De L ! NELL,L?E'. 	'F#3#7#78K8K#L ?SX&:;Y]N!!!$9&:M:M9NNe"fg!!"STLLAL"55fkk>RO((Iq=KK%%&>&E&Eo&VW((A-(!((3#..224 cE++q0+)-)@)@W)U&,,W6HI&#NN+=>$q= KK--.F.M.MN`.abc $%-g**+<=$&!;	'> &&'89#DIIK*$<=[ ls   
Lc                 @   | j                   j                  dj                  t        j                         j                  d                   | j                   j                  dj                  d| j                               | j                   j                  dj                  d| j                               | j                   j                  dj                  d| j                               | j                   j                  dj                  | j                               y)	z?
        Print statistics about the cleanup performed.
        z{0:-<48}z%Y-%m-%d %H:%M z{0:<40} {1:>7}zSources checked:z"Source references deleted from DB:zThumbnails deleted from disk:z(Completed in {} seconds)
N)
r   r%   r&   r   nowstrftimer>   r@   rD   rG   )r   s    r   print_statsz&ThumbnailCollectionCleaner.print_statsm   s     	hlln556GHI	K*112DdllST*110$2J2JL 	M*112Q$($;$;= 	>7>>t?R?RSTr   )Fr5   r   NN)__name__
__module____qualname____doc__r>   rC   rD   r@   rG   r   r   r!   r(   r0   rW   r[    r   r   r   r      sS     GJN;:!9 @A,0:>xUr   r   c              #   $  K   | j                         r|d}| j                  d      d   j                  }| j                  d      } ||k  rE| j                  |      d| D ]  }|j                  }|  t	        j
                          ||k  rDyyyw)z
    The queryset iterator helps to keep the memory consumption down.
    And also making it easier to process for weaker computers.
    r   z-pkpk)pk__gtN)r#   order_byrb   r-   gccollect)queryset	chunksizeprimary_keylast_pkrows        r   r;   r;   {   s     
 ##E*1-00$$T*G#k::IF !ff	 JJL	 G#	 s   B
BBc                       e Zd ZdZd Zd Zy)Commandz: Deletes thumbnails that no longer have an original file. c                     |j                  ddddd       |j                  ddd	d
t        d       |j                  dddt        d       y )Nz	--dry-run
store_truerH   FzDry run the execution.)actiondestdefaulthelpz--last-n-daysstorerJ   r   z8The number of days back in time to clean thumbnails for.)rp   rq   rr   typers   z--pathrK   zSpecify a path to clean up.)rp   rq   ru   rs   )add_argumentintstr)r   parsers     r   add_argumentszCommand.add_arguments   sp    ) 	 	+ 	K 	 	M 	. 	 	0r   c           
      0   t        | j                  | j                        }|j                  |j	                  dd      t        |j	                  dd            t        |j	                  dd            |j	                  d             |j                          y )	NrH   FrI   r5   rJ   r   rK   )rH   rI   rJ   rK   )r   r   r   rW   r<   rw   r[   )r   argsoptionstccs       r   handlezCommand.handle   ss    (dkkBKK	51'++k156GKKq9: ^4	 	 	6
 	r   N)r\   r]   r^   rs   rz   r   r`   r   r   rm   rm      s    KD0*r   rm   )r6   )re   r   r9   r   r   django.core.management.baser   django.utils.timezoner   easy_thumbnails.confr   easy_thumbnails.modelsr   easy_thumbnails.storager	   easy_thumbnails.utilsr
   django.core.files.storager   r   r;   rm   r`   r   r   <module>r      sF    	 	   3 5 ) ) / 2 .hU hUV k r   