o
    ^"<fcb                     @   s  d dl Z d dlZd dlmZmZ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mZ d dlmZ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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-m.Z.m/Z/m0Z0m1Z1 d dl2m3Z3m4Z4 d dl5m6Z6m7Z7 d dl8m9Z9m:Z:m;Z;m<Z<m=Z=m>Z>m?Z?m@Z@mAZAmBZBmCZCmDZDmEZEmFZFmGZGmHZHmIZImJZJmKZK d dlLmMZM d dlNmOZO d dlPmQZQ zd dlRZRW n eSy   d dlTmUZR Y nw eMejVvre jVeMf7  _Vi ZWd-ddZXdd ZYd-ddZZd d! Z[d"d# Z\e?fd$d%Z]d&d' Z^d(d) Z_G d*d+ d+e`Zae Zbeadebd,Zcecde- ecde. ecde/ ecde0 ecde1 dS ).    N)gmtime	localtimestrftimetime)forms)messages)staff_member_required)DefaultStorageFileSystemStoragedefault_storage)	EmptyPageInvalidPage	Paginator)HttpResponseBadRequestHttpResponseRedirect)HttpResponserender)RequestContext)get_resolverget_urlconfreverse)	smart_str)gettext)never_cache)csrf_exempt)signals)flip_horizontalflip_verticalrotate_90_clockwiserotate_90_counterclockwise
rotate_180)FileListing
FileObject)file_existspath_exists)ADMIN_THUMBNAILADMIN_VERSIONSCONVERT_FILENAMEDEFAULT_PERMISSIONSDEFAULT_SORTING_BYDEFAULT_SORTING_ORDER	DIRECTORYEXCLUDEEXTENSION_LIST
EXTENSIONSLIST_PER_PAGEMAX_UPLOAD_SIZENORMALIZE_FILENAMEOVERWRITE_EXISTINGSEARCH_TRAVERSESELECT_FORMATSUPLOAD_TEMPDIRVERSIONSVERSIONS_BASEDIR)FileSystemStorageMixin)query_helper)convert_filename)
simplejsonfilebrowserc                    s:   | t vri S tt j|   t fddt |   D S )z]
    Return a dict with all *deployed* FileBrowser sites that have
    a given app_name.
    c                 3   s$    | ]\}}| v r||fV  qd S N ).0kvdeployedr>   H/var/www/html/kck/venv/lib/python3.10/site-packages/filebrowser/sites.py	<genexpr>B   s   " z get_site_dict.<locals>.<genexpr>)_sites_cacher   r   app_dictdictitems)app_namer>   rB   rD   get_site_dict8   s   rK   c                 C   s    | t vri t | < |t |  |< dS )z(
    Add a site into the site dict.
    N)rF   )rJ   	site_namesiter>   r>   rD   register_siteE   s   rN   c                 C   s2   t t }d}|j|  }||vr|d }t | S )z
    Returns the default site. This function uses Django's url resolution method to
    obtain the name of the default site.
    r<   r   )r   r   rG   rK   )rJ   resolvernameapp_listr>   r>   rD   get_default_siteN   s   


rR   c                 C   s>   g }d}|r| tjD ]}tj||}|||g q|S )z
    Get breadcrumbs.
     )splitosseppathjoinappend)queryrW   breadcrumbs	dir_queryitemr>   r>   rD   get_breadcrumbs_   s   r^   c                 C   s   d}t dt|}t dt|}t dt|}| dkr@t|tt d kr@t|tt d kr@t|tt d kr@d	}|S | d
krO|t d krOd	}|S | dkrbt|tt d krbd	}|S | dkrq|t d krqd	}|S | dkrwd	}|S )z
    Get filterdate.
    rS   z%Yz%mz%dtodayr         true	thismonthi ' thisyear	past7daysi:	 )r   r   intr   r   )filter_date	date_timereturnvalue	date_year
date_monthdate_dayr>   r>   rD   get_filterdatem   s&   J	rm   c                 C   sH   i }t |d< t|d< t|d< t|d< t|d< t|d< t|d< t|d< |S )	z>
    Get settings variables used for FileBrowser listing.
    r.   r4   r&   r%   r0   r1   r'   r3   )r.   r4   r&   r%   r0   r1   r'   r3   )	directorysettings_varr>   r>   rD   get_settings_var   s   rp   c              
   C   sF   d}zt j| |j}|j||}W |S  ty" } z|d}~ww )z
    Handle File Upload.
    N)rU   rW   rX   rP   storagesave	Exception)rW   filerM   uploadedfile	file_pathinstr>   r>   rD   handle_file_upload   s   rx   c                 C   s   t t| S )zOnly let staff browse the files)r   r   )viewr>   r>   rD   filebrowser_view   s   rz   c                   @   s   e Zd ZdZeZddefddZdd Zdd	 Z	e
ee	Zd
d Zd(ddZdd Zdd Zdd Ze
dd Ze
dd Zdd Zdd Zdd Zdd Zd d! Zd"d# Zd$d% Zd&d' ZdS ))FileBrowserSitezW
    A filebrowser.site defines admin views for browsing your servers media files.
    Nr<   c                 C   s>   || _ || _|| _i | _| j | _t| j| j |  t| _d S r=   )	rP   rJ   rq   _actionscopy_global_actionsrN   r+   rn   )selfrP   rJ   rq   r>   r>   rD   __init__   s   
zFileBrowserSite.__init__c                 C   s   | j S )zSet directory
_directoryr   r>   r>   rD   _directory_get   s   zFileBrowserSite._directory_getc                 C   s
   || _ dS )zGet directoryNr   )r   valr>   r>   rD   _directory_set   s   
zFileBrowserSite._directory_setc                 C   s   ddl m} |dt| t| jdd|dt| t| jdd|dt| t| jd	d|d
t| t| t| jdd|dt| t| t| j	dd|dt| t| t| j
dd|dt| t| t| jdd|dtt| jddg}|S )zURLs for a filebrowser.siter   )re_pathz	^browse/$	fb_browse)rP   z^createdir/fb_createdirz^upload/	fb_uploadz^delete_confirm/$fb_delete_confirmz	^delete/$	fb_deletez	^detail/$	fb_detailz
^version/$
fb_versionz^upload_file/$fb_do_upload)django.urlsr   r$   rz   browse	creatediruploadr#   delete_confirmdeletedetailversionr   r   _upload_file)r   r   urlpatternsr>   r>   rD   get_urls   s   
zFileBrowserSite.get_urlsc                 C   sT   |p|j }t|ds|j dd |_t|dsdd |_|| j|< || j|< dS )z>
        Register an action to be available globally.
        short_description_ 
applies_toc                 S   s   dS )NTr>   )xr>   r>   rD   <lambda>   s    z,FileBrowserSite.add_action.<locals>.<lambda>N)__name__hasattrreplace
capitalizer   r   r|   r~   )r   actionrP   r>   r>   rD   
add_action   s   




zFileBrowserSite.add_actionc                 C   s   | j |= dS )zZ
        Disable a globally-registered action. Raises KeyError for invalid names.
        N)r|   r   rP   r>   r>   rD   disable_action   s   zFileBrowserSite.disable_actionc                 C   s
   | j | S )z
        Explicitally get a registered global action wheather it's enabled or
        not. Raises KeyError for invalid names.
        )r~   r   r>   r>   rD   
get_action   s   
zFileBrowserSite.get_actionc                 C   s0   g }| j D ]\}}||r|||f q|S )ze
        Return a list of tuples (name, action) of actions applicable to a given fileobject.
        )actionsr   rY   )r   
fileobjectresrP   r   r>   r>   rD   applicable_actions   s   
z"FileBrowserSite.applicable_actionsc                 C   s"   t | j }|jdd d |S )z
        Get all the enabled actions as a list of (name, func). The list
        is sorted alphabetically by actions names
        c                 S   s   | d S )Nr   r>   )	name_funcr>   r>   rD   r   	  s    z)FileBrowserSite.actions.<locals>.<lambda>)key)listr|   rI   sort)r   r   r>   r>   rD   r     s   zFileBrowserSite.actionsc                 C   s   |   | j| jfS )zfilebrowser.site URLs)r   rJ   rP   r   r>   r>   rD   urls  s   zFileBrowserSite.urlsc                    s.  g  t D ]
} t| qts-t D ]\}}d|dtf } t|tj	 q fdd}|j
 }dtj| j|dd }| j|||dt|d	t| d
}g }	trf|drf| }
n| }
|d}|r}t|d tj}|d}|d}|d}|
D ]8}d}|r|j|kr|rt||jpdr|r||jv rd}|r||j sd}|jdkrd}|r|	| qt|
|_t|	|_ t!|	t"}|j
dd}z|#|}W n t$t%fy   |#|j&}Y nw | j'|_(t)|d||||t*dt+| jdt,||ddd| d	S )zBrowse Files/Directories.z_%s(%s)$|c                    s2   | j d} D ]
}|| j rd}q|rdS dS )zDefining a browse filter.TF)filename
startswithsearch)r]   filtered	re_prefix	filter_rer>   rD   filter_browse  s   z-FileBrowserSite.browse.<locals>.filter_browse%sdirrS   oot)filter_func
sorting_bysorting_orderrM   qfilter_typerg   typeFr   TFolderp1zfilebrowser/index.htmlFileBrowserrn   )	r   pagefilelistingrZ   titlero   r[   breadcrumbs_titlefilebrowser_site)-r,   rY   recompiler7   r6   rI   rX   r-   
IGNORECASEGETr}   rU   rW   rn   getfilelisting_classr)   r*   r3   files_walk_filteredfiles_listing_filteredlowerMfiletyperm   dateformatr   r   lenresults_totalresults_currentr   r/   r   r   r   	num_pagesrP   current_appr   r   rp   r^   )r   requestexpr@   rA   r   rZ   rW   r   fileslisting	do_searchre_qr   rg   filter_formatr   rY   r   page_nrr   r>   r   rD   r     s   















zFileBrowserSite.browsec           
      C   s  ddl m} |j}dtj| j|dd }|jdkr|||j	| d}|
 rtj||jd }zAtjj|||jd | d	 | j| tjj|||jd | d	 t|tjtd
|jd   td| jdt|dd }t|W S  ty } z(|jd }	|	dkrtjtdg|jd< ntjtdg|jd< W Y d}~nd}~ww n||| d}| j|_ t!|d||tdt"| jdt#||ddtd| dS )zCreate Directoryr   )CreateDirFormr   r   rS   POST)r   rP   senderrW   rP   rM   z'The Folder %s was successfully created.filebrowser:fb_browser   zot=desc,o=datez ot,o,filter_type,filter_date,q,p   zPermission denied.zError creating folder.Nzfilebrowser/createdir.htmlz
New Folderr   )formrZ   r   ro   r[   r   r   )$filebrowser.formsr   r   rU   rW   rX   rn   r   methodr   is_validcleaned_datar   filebrowser_pre_createdirsendrq   makedirsfilebrowser_post_createdirr   add_messageSUCCESSr   r   rP   r9   r   OSErrorargsr   utils	ErrorListerrorsr   r   rp   r^   )
r   r   r   rZ   rW   r   server_pathredirect_urleerrnor>   r>   rD   r   i  sB   



zFileBrowserSite.createdirc                 C   sF   |j }| j|_t|d|tdt| jdt||ddtd| dS )zMultipe File Upload.zfilebrowser/upload.htmlzSelect files to uploadr   r   rS   Upload)rZ   r   ro   r[   r   r   )	r   rP   r   r   r   rp   rn   r^   r   )r   r   rZ   r>   r>   rD   r     s   
zFileBrowserSite.uploadc                 C   s   |j }dtj| j|dd }ttj||dd| d}|jdkrV| jtj||j	|dd|dt
| d	}| }t|d
krSt|d
 }|dd
 }nd}nd}d}| j|_t|d||||tdt| jdt||ddtd| d	S )Delete existing File/Directory.r   r   rS   r   rM   r   r   r   )r   r   rM   d   Nzfilebrowser/delete_confirm.htmlzConfirm deleter   )	r   r   additional_filesrZ   r   ro   r[   r   r   )r   rU   rW   rX   rn   r   r"   r   r   r   r*   files_walk_totalr   rP   r   r   r   rp   r^   )r   r   rZ   rW   r   r   r
  r>   r>   rD   r     s:   



zFileBrowserSite.delete_confirmc                 C   s   |j }dtj| j|dd }ttj||dd| d}|j r\z/tjj	||j|j
| d |  |  tjj	||j|j
| d t|tjtd|j
  W n	 ty[   Y nw td| jd	t|dd
 }t|S )r  r   r   rS   r   r  r   zSuccessfully deleted %sr   r   zfilename,filetype)r   rU   rW   rX   rn   r   r"   r   filebrowser_pre_deleter   r   delete_versionsr   filebrowser_post_deleter   r   r   r   r   r   rP   r9   r   )r   r   rZ   rW   r   r  r>   r>   rD   r     s   zFileBrowserSite.deletec                 C   s2  ddl m} |j}dtj| j|dd }ttj||dd| d}|j	dkr||j
||| d	}| r|jd
 }|jd }zd}	|rj| |}
tjj|||g| d |
||gd}	tjj|||g|	| d ||jkrtjj||j|j|| d |  | j|jtj|j| tjj||j|j|| d t|tjtd t|	tr|	W S d|j
v rtd| j dt!|d| d }ntd| j dt!|dd }t"|W S  t#y   t$j%&tdg|j'd
< Y nw n|d
|ji||| d}| j |_(t)|d|||d|j t*| jdt+||ddd|j | dS )z
        Show detail page for a file.
        Rename existing File/Directory (deletes existing Image Versions/Thumbnails).
        r   )
ChangeFormr   r   rS   r   r  r   )rW   r   r   rP   custom_actionN)r   action_namer   rM   )r   fileobjects)r   r  r   resultrM   )r   rW   rP   new_namerM   zRenaming was successful.	_continuezfilebrowser:fb_detailr   z	filename=r   zError.)initialrW   r   r   zfilebrowser/detail.htmlr   )r   r   rZ   r   ro   r[   r   r   ),r   r  r   rU   rW   rX   rn   r   r"   r   r   r   r   r   r   filebrowser_actions_pre_applyr   filebrowser_actions_post_applyr   filebrowser_pre_renamer  rq   moveheadfilebrowser_post_renamer   r   r   r   
isinstancer   r   rP   r9   r   r   r   r   r   r  r   r   rp   r^   )r   r   r  rZ   rW   r   r   r  r  action_responser   r  r>   r>   rD   r     sX   






 

zFileBrowserSite.detailc                 C   sf   |j }dtj| j|dd }ttj||dd| d}| j|_t	|d||t
| jd| dS )	us   
        Version detail.
        This just exists in order to select a version with a filebrowser–popup.
        r   r   rS   r   r  zfilebrowser/version.htmlr   )r   rZ   ro   r   )r   rU   rW   rX   rn   r   r"   rP   r   r   rp   )r   r   rZ   rW   r   r>   r>   rD   r     s   
zFileBrowserSite.versionc                 C   s  |j dkr|jdd}|jdd}d}t|jdkr tdS t|jdkr+td	S t|j d }t	d
t
d| jd }|d|}|tkrQ|dkrQ|}ntj| j|}t|j}||_tj||}	| j|	}
|tkr}|dkr}tj||}|
r| j|	rd|d}tt|S tjj|||| d t||| d}|
rtrt|	}t|}| jj||dd t t|| d}nt|}tj!|||_t t|| d}t"durt#|j$t" tj%j|||| d d|j&|d}tt|ddS dS )z
        Upload file to the server.

        If temporary is true, we upload to UPLOAD_TEMPDIR, otherwise
        we upload to site.directory
        r   folderrS   	temporaryNr   z#Invalid request! No files included.r`   z)Invalid request! Multiple files included.z^.*(%s)zfilebrowser:fb_uploadr   rb   F)successr   )r   rW   rt   rM   r  T)allow_overwrite)r!  r   temp_filenamezapplication/json)content_type)'r   r   r   r   FILESr   r   valuesr   r   r   rP   subr5   rU   rW   rX   rn   r:   rq   existsisdirr   jsondumpsr   filebrowser_pre_uploadr   rx   r2   r   r  r"   relpathr(   chmod	path_fullfilebrowser_post_uploadr   )r   r   r  r   r#  filedatafb_uploadurl_rerW   	file_namerv   file_already_existsret_jsonru   old_filenew_filefr>   r>   rD   r     sN   


zFileBrowserSite._upload_filer=   )r   
__module____qualname____doc__r!   r   r   r   r   r   propertyrn   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r>   r>   r>   rD   r{      s0    



	
X%"7r{   )rP   rq   )r<   )erU   r   r   r   r   r   djangor   django.contribr   %django.contrib.admin.views.decoratorsr   django.core.files.storager	   r
   r   django.core.paginatorr   r   r   django.httpr   r   django.shortcutsr   r   django.templater   Contextr   r   r   r   django.utils.encodingr   django.utils.translationr   r   django.views.decorators.cacher   django.views.decorators.csrfr   r<   r   filebrowser.actionsr   r   r   r   r    filebrowser.baser!   r"   filebrowser.decoratorsr#   r$   filebrowser.settingsr%   r&   r'   r(   r)   r*   r+   r,   r-   r.   r/   r0   r1   r2   r3   r4   r5   r6   r7   filebrowser.storager8    filebrowser.templatetags.fb_tagsr9   filebrowser.utilsr:   r*  ImportErrordjango.utilsr;   	__bases__rF   rK   rN   rR   r^   rm   rp   rx   rz   objectr{   rq   rM   r   r>   r>   r>   rD   <module>   sf   T


	   2



