
    hn2                     <   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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  G d dej6                        Z G d dej:                  ej<                        Z G d dej:                        Z y)    )settings)models)ValidationError)Q)reverse)cached_property)format_htmlformat_html_join)gettext)gettext_lazy   )get_folder_permission_cacheupdate_folder_permission_cache   )mixinsc                   (    e Zd ZdZd Zd Zd Zd Zy)FolderPermissionManagerzj
    These methods are called by introspection from "has_generic_permission" on
    the folder model.
    c                 &    | j                  |d      S )z
        Give a list of a Folders where the user has read rights or the string
        "All" if the user has all rights.
        can_read%_FolderPermissionManager__get_id_listselfusers     I/home/dcms/DCMS/lib/python3.12/site-packages/filer/models/foldermodels.pyget_read_id_listz(FolderPermissionManager.get_read_id_list   s    
 !!$
33    c                 &    | j                  |d      S )Ncan_editr   r   s     r   get_edit_id_listz(FolderPermissionManager.get_edit_id_list   s    !!$
33r   c                 &    | j                  |d      S )Ncan_add_childrenr   r   s     r   get_add_children_id_listz0FolderPermissionManager.get_add_children_id_list    s    !!$(:;;r   c                    |j                   st        j                  syt        ||      }|r|S t	               }t	               }|j
                  j                         j                  dd      }t        |      t        |      z  t        d      z  }| j                  |      }|D ]  }	t        |	|      }
|
|	j                  s|	j                  t        j                  k(  sJ |
t        j                  k(  r?|j!                  t"        j$                  j                         j                  dd             n>|j!                  t"        j$                  j                         j                  dd             |	j                  j&                  }|
t        j                  k(  r|j)                  |       n|j)                  |       |	j                  t        j                  t        j*                  fv sI|
t        j                  k(  r+|j!                  |	j                  j-                                |j!                  |	j                  j-                                 ||z
  }t/        |||       |S )NAllidT)flatr   )	group__in)	everybody)is_superuserfiler_settingsFILER_ENABLE_PERMISSIONSr   setgroupsallvalues_listr   filtergetattrfoldertypeFolderPermissionALLALLOWupdateFolderobjectsr&   addCHILDRENget_descendants_idsr   )r   r   attrcached_id_list
allow_list	deny_list	group_idsqpermspermp	folder_idid_lists                r   __get_id_listz%FolderPermissionManager.__get_id_list#   s   N$K$K4T4@!!U
E	KKOO%11$T1B	4L1y11A4EEA 	HDd#Ay;;yy$4$8$8888(...%%fnn&8&8&:&F&FtRV&F&WX$$V^^%7%7%9%E%EdQU%E%VWI$***y)i(yy-113C3L3LMM(...%%dkk&E&E&GH$$T[[%D%D%FG9	H> y(&tT7;r   N)__name__
__module____qualname____doc__r   r    r#   r    r   r   r   r      s    44<.r   r   c                   V   e Zd ZdZd ZdZdZdZ ej                  d e
d      dddej                        Z ej                   e
d	      d
      Z ej                   eedd       e
d      dej"                  dd      Z ej&                   e
d      d      Z ej&                   e
d      d      Z ej&                   e
d      d      Z G d d      Zd Zd Zed        Zed        Zed        Zed        Zed        Z d Z!ed         Z"d! Z#d" Z$d# Z%d$ Z&d% Z'd& Z(d' Z)d( Z*y))*r:   a  
    Represents a Folder that things (files) can be put into. Folders are *NOT*
    mirrored in the Filesystem and can have any unicode chars as their name.
    Other models may attach to a folder with a ForeignKey. If the related name
    ends with "_files" they will automatically be listed in the
    folder.files list along with all the other models that link to the folder
    in this way. Make sure the linked models obey the AbstractFile interface
    (Duck Type).
    FTplainfolderr   parentchildren)verbose_namenullblankrelated_name	on_deletename   )
max_lengthAUTH_USER_MODEL	auth.Userownerfiler_owned_folders)rT   rW   rX   rU   rV   zuploaded at)auto_now_addz
created atzmodified at)auto_nowc                   <    e Zd ZdZdZdZdZ ed      Z ed      Z	y)Folder.Meta))rR   rY   rY   ))can_use_directory_listingzCan use directory listingfilerr:   FoldersN)
rK   rL   rM   unique_togetherorderingpermissions	app_label_rT   verbose_name_pluralrO   r   r   Metarc      s+    /7	{	lr   rn   c                     | j                   S Npretty_logical_pathr   s    r   __str__zFolder.__str__       '''r   c                 j    d| j                   j                   d| j                   d| j                   dS )N<(pk=z): >	__class__rK   pkrr   rs   s    r   __repr__zFolder.__repr__   s4    4>>**+4yD<T<T;UUVWWr   c                 p    t        | d      s| j                  j                         | _        | j                  S )N_file_count_cache)hasattrfilescountr   rs   s    r   
file_countzFolder.file_count   s.    t01%)ZZ%5%5%7D"%%%r   c                 p    t        | d      s| j                  j                         | _        | j                  S )N_children_count_cache)r   rS   r   r   rs   s    r   children_countzFolder.children_count   s.    t45)-)<)<)>D&)))r   c                 4    | j                   | j                  z   S rp   )r   r   rs   s    r   
item_countzFolder.item_count   s    !4!444r   c                 6    | j                   j                         S rp   )	all_filesr0   rs   s    r   r   zFolder.files   s    ~~!!##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
        )rR   extendlogical_pathappend)r   folder_paths     r   r   zFolder.logical_path   s@     ;;t{{778t{{+r   c                     g }| j                   j                         D ]<  }|j                  |j                         |j	                  |j                                > |S rp   )rS   r0   r   r&   r   r>   )r   descchilds      r   r>   zFolder.get_descendants_ids   sO    ]]&&( 	5EKK!KK1134	5 r   c           
      Z    t        dt        ddd | j                  | gz   D                    S )Nz/{}/z{0}c              3   6   K   | ]  }|j                   f  y wrp   rd   ).0fs     r   	<genexpr>z-Folder.pretty_logical_path.<locals>.<genexpr>   s     ?na	?ns   )r	   r
   r   rs   s    r   rr   zFolder.pretty_logical_path   s/    5"23?nSWSdSdhlgmSm?n"oppr   c                 `    |j                   j                  d      xr | j                  |d      S )Nfiler.change_foldereditr   has_permhas_generic_permissionr   requests     r   has_edit_permissionzFolder.has_edit_permission   s,    ||$$%:;l@[@[\cek@llr   c                 &    | j                  |d      S )Nread)r   r   s     r   has_read_permissionzFolder.has_read_permission   s    **7F;;r   c                 `    |j                   j                  d      xr | j                  |d      S )Nr   add_childrenr   r   s     r   has_add_children_permissionz"Folder.has_add_children_permission   s,    ||$$%:;t@[@[\ces@ttr   c                    |j                   }|j                  sy|j                  ry|| j                  k(  ryt	        | d      r>|| j
                  vs0|j                   j                  | j
                  d   j                  k7  rt	        | d      r0|j                   j                  | j
                  d   j                  k7  rd|j                   i| _        t        t        j                  d|z        } ||      }|dk(  r=d| j
                  |<   d| j
                  d<   d| j
                  d<   d| j
                  d	<   n| j                  |v | j
                  |<   | j
                  |   S )
z
        Return true if the current user has permission on this
        folder. Return the string 'ALL' if the user has all rights.
        FTpermission_cacher   zget_%s_id_listr%   r   r   r   )r   is_authenticatedr+   r^   r   r   r|   r3   r6   r;   r&   )r   r   permission_typer   func
permissions         r   r   zFolder.has_generic_permission   sF   
 ||$$TZZ4!34d&;&;;||$"7"7"?"B"BBt%78GLLOOtOdOdekOlOoOo<o-D)
 /77//AC!$Z
&=AD))/:48D))&148D))&1<@D)).9=AWW
=RD))/:((99r   c                 2    t        d| j                  f      S )Nzadmin:filer_folder_changeargsr   r&   rs   s    r   get_admin_change_urlzFolder.get_admin_change_url   s    2$''DDr   c                 2    t        d| j                  f      S )Nzadmin:filer-directory_listingr   r   rs   s    r   $get_admin_directory_listing_url_pathz+Folder.get_admin_directory_listing_url_path   s    6dggZHHr   c                     t        d| j                  j                   d| j                  j                   d| j                  f      S )Nzadmin:rl   _deleter   )r   _metark   
model_namer|   rs   s    r   get_admin_delete_urlzFolder.get_admin_delete_url   s@    TZZ))*!DJJ,A,A+B'J''
 	
r   c                 p    	 | j                   j                  |       y# t        j                  $ r Y yw xY w)Nrd   TF)rS   getr:   DoesNotExist)r   folder_names     r   contains_folderzFolder.contains_folder   s7    	MM;/"" 		s    55N)+rK   rL   rM   rN   	file_typeis_rootcan_have_subfolders_iconr   
ForeignKeyrl   CASCADErR   	CharFieldrY   r3   r   SET_NULLr^   DateTimeFielduploaded_at
created_atmodified_atrn   rt   r}   propertyr   r   r   r   r   r   r>   rr   r   r   r   r   r   r   r   r   rO   r   r   r:   r:   T   s    IGEVx[..F 6	&	D
 F+[9wZ*//E '&&&	-K
 &%%	,J
 '&&&	-K
+ +(X & &
 * *
 5 5 $ $ 	 	 q qm<u :DEI
r   r:   c                   d   e Zd ZdZdZdZdZdZe ed      fe ed      fe ed      fgZ	d ed      fe ed	      fe ed
      fgZ
 ej                  edddej                        Z ej                    ed      e	e      Z ej                   eedd      dej(                   ed      dd      Z ej                  ej.                  d ed      ddej                        Z ej2                   ed      d      Z ej                    ed      e
ddd      Z ej                    ed      e
ddd      Z ej                    ed      e
ddd      Z G d d      Z e       Z d  Z!d! Z"d" Z#e$d#        Z% ed$      e%_&        e$d%        Z' ed&      e'_&        e$d'        Z( ed(      e(_&        y))r6   r   r   r   z	all itemszthis item onlyzthis item and all childrenNinheritallowdenyr4   T)rT   rU   rV   rX   r5   )choicesdefaultr\   r]   filer_folder_permissionsr   )rW   rX   rT   rV   rU   group)rW   rT   rV   rU   rX   r*   F)r   zcan read)r   rV   rU   r   zcan editzcan add childrenc                   0    e Zd Z ed      Z ed      ZdZy)FolderPermission.Metazfolder permissionzfolder permissionsrf   N)rK   rL   rM   rl   rT   rm   rk   rO   r   r   rn   r   S  s    ,- 45	r   rn   c                     | j                   S rp   rq   rs   s    r   rt   zFolderPermission.__str__Z  ru   r   c                 j    d| j                   j                   d| j                   d| j                   dS )Nrw   rx   z): folder="z(", who="{self.who}", what="{self.what}">rz   rs   s    r   r}   zFolderPermission.__repr__]  s;    4>>**+4yDD\D\C] ^7 7 	7r   c                    | j                   | j                  k(  r | j                  rt        t	        d            | j                   | j                  k7  r | j                  st        t	        d            | j
                  r,| j                  s| j                  rt        t	        d            | j                  s.| j                  s!| j
                  st        t	        d            y y y )Nz0Folder cannot be selected with type "all items".z7Folder has to be selected when type is not "all items".z;User or group cannot be selected together with "everybody".z?At least one of user, group, or "everybody" has to be selected.)r5   r7   r4   r   rl   r*   r   r   rs   s    r   cleanzFolderPermission.cleana  s    99 T[[!!$V"WXX99 !!$]"^__>>tyyDJJ!!$a"bccyyDNN!!$e"fgg 5Cyr   c                 \    | j                   r| j                   j                  S t        d      S )NzAll Folders)r4   rr   r   rs   s    r   rr   z$FolderPermission.pretty_logical_pathk  s$    ;;;;222}%%r   zLogical Pathc                    g }| j                   r4|j                  t        d      j                  | j                                | j                  r4|j                  t        d      j                  | j                               | j
                  r|j                  t        d             |rt        ddd |D              S y	)
z[
        Returns a human readable string of *who* can interact with a given folder
        zUser: {user}r(   zGroup: {group})r   	Everybodyz; {}c              3   "   K   | ]  }|f 	 y wrp   rO   r   rG   s     r   r   z'FolderPermission.who.<locals>.<genexpr>  s     0E!!0E   u   –)r   r   rl   formatr   r*   r
   )r   partss     r   whozFolderPermission.whos  s    
 99LL>*11tyy1AB::LL+,33$**3EF>>LL;(#D$0Eu0EFFr   Whoc                 `   t        d      t        d      t        d      d}g }|j                         D ]e  \  }}t        | |      }|| j                  k(  r|j	                  |       3|| j
                  k(  sC|j	                  dj                  |      dz          g t        ddd |D              S )	zm
        Returns a human readable string of *what* a user/group/everybody can do with a given folder
        EditReadzAdd children)r   r   r"   u   ̶z, r   c              3   "   K   | ]  }|f 	 y wrp   rO   r   s     r   r   z(FolderPermission.what.<locals>.<genexpr>  s     ,AaaT,Ar   )rl   itemsr3   r8   r   DENYjoinr
   )r   mappingrE   keytextrF   s         r   whatzFolderPermission.what  s     &	&	 !. 1

   	=IC4%Dtzz!T""X]]408;<	=  d,A5,ABBr   What))rK   rL   rM   r7   THISr=   r8   r   rl   TYPES
PERMISIONSr   r   r:   r   r4   SmallIntegerFieldr5   r3   r   r   r   auth_modelsGroupr   BooleanFieldr*   r   r   r"   rn   r   r;   rt   r}   r   r   rr   short_descriptionr   r   rO   r   r   r6   r6     sM   
CDHED 
an	q!"#	1123E 
q|	'
	qyJ V..F $6##	&	D 6+[9///vYD F/wZ..E $##	+I
 (v''	*H (v''	*H 0v//	
 
 &'G(7h & &
 -.n,=)  eHCC C$ vYDr   r6   N)!django.confr   django.contrib.authr   r   django.core.exceptionsr   	django.dbdjango.db.modelsr   django.urlsr   django.utils.functionalr   django.utils.htmlr	   r
   django.utils.translationr   r   rl    r,   cacher   r   r   Managerr   Model
IconsMixinr:   r6   rO   r   r   <module>r     sl      5 2    3 ; , 6 ) O @fnn @FkV\\6,, k\V'v|| V'r   