
    h5                     <   d dl Z d dlZd dl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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 ddlmZ ddlmZ ddlmZ ddl m!Z!  G d de      Z" G d de      Z#d Z$d Z% G d deejL                        Z'y)    N)datetimetimezone)settings)ValidationError)ContentFile)models)NoReverseMatchreverse)cached_property)gettext_lazy)PolymorphicManager)PolymorphicModel)PolymorphicQuerySet   )MultiStorageFileField   )mixins)Folderc                        e Zd Z fdZ xZS )FileQuerySetc                 X    t        |      }|j                  g d       t        |   | S )N)
_file_sizesha1	is_public)setupdatesuperonly)selffields	__class__s     G/home/dcms/DCMS/lib/python3.12/site-packages/filer/models/filemodels.pyr   zFileQuerySet.only   s(    V9:w|V$$    )__name__
__module____qualname__r   __classcell__r!   s   @r"   r   r      s    % %r#   r   c                       e Zd ZeZd Zd Zy)FileManagerc                     i }| j                         D ]I  }|j                  s| j                  |j                        }t        |      dkD  s;|||j                  <   K |S )Nr   r   )allr   filterlen)r   rfile_objqs       r"   find_all_duplicateszFileManager.find_all_duplicates"   sW    
 	)H}}KKX]]K3q6A:'(Ahmm$		)
 r#   c                     | j                  |j                        j                  |j                        D cg c]  }| c}S c c}w )N)pkr,   )excluder5   r.   r   )r   r1   is      r"   find_duplicateszFileManager.find_duplicates+   s7    <<8;;<7>>HMM>RSaSSSs   	AN)r$   r%   r&   r   queryset_classr3   r8    r#   r"   r*   r*      s    !NTr#   r*   c                  "    t         j                  S N)filer_settingsFILER_IS_PUBLIC_DEFAULTr:   r#   r"   is_public_defaultr?   /   s     111r#   c                 h    t        j                  |       sd}t        |j                  |             y )Nz+'{mimetype}' is not a recognized MIME-Type.)mimetype)	mimetypesguess_extensionr   format)valuemsgs     r"   mimetype_validatorrG   5   s0    $$U+;cjj%j899 ,r#   c            
           e Zd Zd ZdZdZ ej                  e e	d      dddej                        Z e e	d      ddd      Z ej                   e	d	      dd
      Z ej                    e	d      ddd      Z ej$                   e	d      dd      Z ej                    e	d      ddd      Z ej                   ddd e	d            Z ej,                  dd e	d            Z ej                   eedd      dej4                  dd e	d            Z ej8                   e	d      d      Z ej8                   e	d      d       Z ej$                  e e	d!       e	d"      #      Z  ej                   dd$e!gd%&      Z" e#       Z$ G d' d(      Z%d) Z&e'd*        Z( fd+Z)e*d,        Z+e*d-        Z,dGd.Z-d/ Z.dGd0Z/d1 Z0 fd2Z1de1_2         fd3Z3de3_2        e4d4        Z5d5 Z6d6 Z7d7 Z8d8 Z9d9 Z:d: Z;d; Z<d< Z=d= Z>e4d>        Z?e4d?        Z@e4d@        ZAe4dA        ZBe4dB        ZCe4dC        ZDe4dD        ZEe4dE        ZFe4dF        ZG xZHS )HFilefileNfolder	all_filesT)verbose_namerelated_namenullblank	on_delete   )rO   rP   
max_lengthz	file size)rO   rP   r   (    )rS   rP   defaultzhas all mandatory dataF)rV   editablezoriginal filename)rS   rP   rO   name)rS   rV   rP   rM   description)rO   rP   rM   AUTH_USER_MODELz	auth.Userzowned_%(class)ssowner)rN   rQ   rO   rP   rM   zuploaded at)auto_now_addzmodified at)auto_nowzPermissions disabledzZDisable any permission checking for this file. File will be publicly accessible to anyone.)rV   rM   	help_textzMIME type of uploaded contentapplication/octet-stream)rS   r^   
validatorsrV   c                   0    e Zd ZdZ ed      Z ed      Zy)	File.MetafilerrJ   filesN)r$   r%   r&   	app_label_rM   verbose_name_pluralr:   r#   r"   Metarb      s    	yjr#   rh   c                 Z    | j                   dv r| j                   }|S | j                    }|S )NrU   NrX   original_filenamer   texts     r"   __str__zFile.__str__   s5    99
",,-D  ii[Dr#   c                      y)NTr:   )clsinameifile	mime_types       r"   matches_file_typezFile.matches_file_type   s    r#   c                 j    t        |   |i | | j                  | _        | j	                  d       y )NT)	post_init)r   __init__r   _old_is_publicfile_data_changedr   argskwargsr!   s      r"   rx   zFile.__init__   s2    $)&)"nn.r#   c                 >    | j                   j                  d      d   S )N/r   rt   splitr   s    r"   mime_maintypezFile.mime_maintype       ~~##C(++r#   c                 >    | j                   j                  d      d   S )Nr   r   r   r   s    r"   mime_subtypezFile.mime_subtype   r   r#   c                    | j                   | j                   }d| _         |sy|r| j                  r| j                  ry	 | j                  j                  | _        	 | j                          	 t        j                  | j                  j                        d   xs d| _
        y#  d| _        Y SxY w# t        $ r
 d| _        Y Ww xY w# t        $ r Y yw xY w)a$  
        This is called whenever self.file changes (including initial set in __init__).
        MultiStorageFileField has a custom descriptor which calls this function when
        field value is changed.
        Returns True if data related attributes were updated, False otherwise.
        NFrU   r   r_   T)_file_data_changed_hintr   r   rJ   sizegenerate_sha1	ExceptionrB   
guess_typerX   rt   )r   rw   data_changed_hints      r"   rz   zFile.file_data_changed   s     ''3 $ < <+/D($TYY 	#"iinnDO	 	&11$))..A!DbHbDN
 	#"DO  	DI	  			s/   B" B0 ,5C "	B-0CC	CCc                    | j                   j                  }| j                  j                  d      j	                  | | j
                        }| j                  r3| j                   j                  d   }| j                   j                  d   }n2| j                   j                  d   }| j                   j                  d   }| j                   | _        | j                   j                          | j                   | _        |j                  |      }|j                         5 }t        |j                               }ddd       d| _        |j                  |      | _         |j                  |       y# 1 sw Y   9xY w)z0
        Move the file from src to dst.
        rJ   privatepublicNF)rJ   rX   _meta	get_fieldgenerate_filenamerl   r   storagesdelete_thumbnailsopenr   readr   savedelete)r   src_file_namedst_file_namesrc_storagedst_storagesrc_filefcontent_files           r"   
_move_filezFile._move_file   s0    		

,,V4FF$((* >>)),,Y7K)),,X6K)),,X6K)),,Y7K
 "^^+		##%!^^+##M2 ]]_ 	1&qvvx0L	1 (-$$$]LA	=)	1 	1s   E..E7c                 @   |rt         | j                  j                  }| j                  j                  | j                  rdnd   }|j                  |      }	 |j                          |j                  |t        |j                                     S # t        $ r Y 4w xY w)zH
        Copies the file to a destination files and returns it.
        r   r   )
NotImplementedErrorrJ   rX   r   r   r   
ValueErrorr   r   r   )r   destination	overwriter   storager   s         r"   
_copy_filezFile._copy_file   s    
  &%		))$$XYO<<.	 MMO ||KX]]_)EFF  		s   B 	BBc                 $   t        j                         }| j                  j                  d       	 | j                  j	                  d      }|sn|j                  |       0|j                         | _        | j                  j                  d       y )Nr   i  @)hashlibr   rJ   seekr   r   	hexdigest)r   shabufs      r"   r   zFile.generate_sha1  sg    lln		q))..+CJJsO	 
 MMO			qr#   c                 B   | j                   t        k(  rn5t        | j                   t              r| j                   j                  | _        | j
                  | j                  k7  r-| j                  r!| j                          | j                  | _        t        | (  |i | y r<   )r!   rI   
issubclassr$   _file_type_plugin_namery   r   r5   r   r   r   r{   s      r"   r   z	File.save  su     >>T! -*...*A*AD'$..0TWWOO"&..Dd%f%r#   c                     t        |   |i | t        j                  j	                  | j
                  j                  | j                        j                         s| j
                  j                  d       y y )N)rJ   r   F)	r   r   rI   objectsr.   rJ   rX   r   existsr{   s      r"   r   zFile.delete-  sX    ''||""		$.."QXXZIIU# [r#   c                 b    | j                   dv r| j                  xs d}n| j                   }| }|S )Nrj   zunnamed filerk   rm   s     r"   labelz
File.label5  s3    99
"));^D99Dr#   c                 l    | j                   j                         |j                   j                         k  S r<   )r   lower)r   others     r"   __lt__zFile.__lt__>  s'    zz!EKK$5$5$777r#   c                 `    |j                   j                  d      xr | j                  |d      S )Nzfiler.change_fileedituserhas_permhas_generic_permissionr   requests     r"   has_edit_permissionzFile.has_edit_permissionA  s,    ||$$%89jd>Y>YZaci>jjr#   c                 &    | j                  |d      S )Nr   )r   r   s     r"   has_read_permissionzFile.has_read_permissionD  s    **7F;;r#   c                 `    |j                   j                  d      xr | j                  |d      S )Nzfiler.add_fileadd_childrenr   r   s     r"   has_add_children_permissionz File.has_add_children_permissionG  s,    ||$$%56o4;V;VW^`n;oor#   c                     |j                   }|j                  sy|j                  ry|| j                  k(  ry| j                  r| j                  j                  ||      S y)z
        Return true if the current user has permission on this
        image. Return the string 'ALL' if the user has all rights.
        FT)r   is_authenticatedis_superuserr[   rK   r   )r   r   permission_typer   s       r"   r   zFile.has_generic_permissionJ  sU    
 ||$$TZZ[[;;55gOOr#   c                     t        dj                  | j                  j                  | j                  j                  |      | j
                  f      S )Nzadmin:{}_{}_{})r|   )r
   rD   r   re   
model_namer5   )r   actions     r"   get_admin_urlzFile.get_admin_url[  sE    ##

$$

%%
 ''
 	
r#   c                 $    | j                  d      S )Nchanger   r   s    r"   get_admin_change_urlzFile.get_admin_change_urle      !!(++r#   c                 $    | j                  d      S )Nexpandr   r   s    r"   get_admin_expand_view_urlzFile.get_admin_expand_view_urlh  r   r#   c                 $    | j                  d      S )Nr   r   r   s    r"   get_admin_delete_urlzFile.get_admin_delete_urlk  r   r#   c                 H    	 | j                   j                  }|S #  d}Y |S xY w)z<
        to make the model behave like a file field
        rU   )rJ   url)r   r0   s     r"   r   zFile.urln  s,    
			A 	As    !c           
      
   t         j                  rBt        | j                  t	        ddddt
        j                        z
  j                               S t        | j                  t	        dddd      z
  j                               S )Ni  r   )tzinfo)r   USE_TZintuploaded_atr   r   utctotal_secondsr   s    r"   canonical_timezFile.canonical_timey  sc    ??((8D!Q(,,+WWffhii((8D!Q+BBQQSTTr#   c                     d}| j                   r3| j                  r'	 t        d| j                  | j                  d      }|S |S # t
        $ r Y |S w xY w)NrU   	canonical)r   file_id)r}   )rJ   r   r
   r   idr	   )r   r   s     r"   canonical_urlzFile.canonical_url  s^    99k#'#6#6#ww3  
s
 " 
s   $A 	AAc                 >    	 | j                   j                  S #  Y yxY w)NrU   )rJ   pathr   s    r"   r   z	File.path  s    	99>>!	s    c                 "    | j                   xs dS )Nr   )r   r   s    r"   r   z	File.size  s    #!#r#   c                     t         j                  j                  | j                  j                        d   j                         }t        |      dkD  r|dd  }|S )Nr   r   )osr   splitextrJ   rX   r   r/   )r   filetypes     r"   	extensionzFile.extension  sH    77##DIINN3A6<<>x=1|Hr#   c                 L    | j                   sddlm}  |       S | j                   S )zm
        if this file is not in a specific folder return the Special "unfiled"
        Folder object
        r   )UnsortedImages)rK   virtualitemsr   )r   r   s     r"   logical_folderzFile.logical_folder  s!     {{4!##;;r#   c                     g }| j                   r%|j                  | j                   j                         |j                  | j                         |S )zm
        Gets logical path of the folder in the tree structure.
        Used to generate breadcrumbs
        )rK   extendlogical_pathappendr   )r   folder_paths     r"   r   zFile.logical_path  sB     ;;t{{7784../r#   c                 @    t         j                  j                  |       S r<   )rI   r   r8   r   s    r"   
duplicateszFile.duplicates  s    ||++D11r#   )F)Ir$   r%   r&   	file_type_iconr   r   
ForeignKeyr   rf   CASCADErK   r   rJ   BigIntegerFieldr   	CharFieldr   BooleanFieldhas_all_mandatory_datarl   rX   	TextFieldrY   getattrr   SET_NULLr[   DateTimeFieldr   modified_atr?   r   rG   rt   r*   r   rh   ro   classmethodru   rx   r   r   r   rz   r   r   r   r   alters_datar   propertyr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r'   r(   s   @r"   rI   rI   ;   s|   IE"Vx[ ..F !	&		D (''	+J 6	&		D 1V00	
"# )((	
	 6vY	D #&""}%K F+[9'//wZE '&&&	-K
 '&&&	-K
 $##!-. ! "#I !  1&'*	I mG) )
  /
 , , , , D*@G0
& D$ F 8k<p"
,,,   U U 
 
   $ $   	 	 	 	 2 2r#   rI   )(r   rB   r   r   r   django.confr   django.core.exceptionsr   django.core.files.baser   	django.dbr   django.urlsr	   r
   django.utils.functionalr   django.utils.translationr   rf   polymorphic.managersr   polymorphic.modelsr   polymorphic.queryr   rU   r=   fields.multistorage_filer   r   foldermodelsr   r   r*   r?   rG   
IconsMixinrI   r:   r#   r"   <module>r     sx      	 '   2 .  / 3 6 3 / 1 ) <   %& %T$ T 2:~2V.. ~2r#   