U
    {yd                     @   s<   d dl Zd dlmZ d dlZd dlT G dd dejjZ	dS )    N)Path)*c                       sT   e Zd ZdZdd fddZdd Zejjdd	 Z	ejje
d
ddZ  ZS )FileViewz/<path:req_filename>N)returnc                    s0   t j| _tj| js"t| j t   d S )N)	configZ
UPLOAD_DIR
upload_dirospathexistsmakedirssuper__init__)self	__class__ ./modules/files/views/index.pyr      s    zFileView.__init__c                 C   sB  t jt jt jfkrdS t d| dt j  |d}t|dk sP|d dkrdt d|  d	S tj	d
krt dtj	 d d	S d}t
jrtjd}|rt|}|st d|  d	S n2tj|d }t|}|st d|  d	S t jr&t j|kr&t dt j d|  d	S tjjdd	|jj|jddS )u   
        Проверяем доступ к файлу
        g.sharelink_access_request = False
        g.sharelink_access_granted = False
        g.sharelink_access_obj = None
        TuA   Попытка анонимного доступа к файлу z, sharelink=/   r   obju`   Анонимный доступ возможен только к файлам вложений: FZGETuW   Анонимный доступ возможен только на чтение(method=)NZRefereru_   Не найден или не определён объект для вложения: referer=   uc   Не найден или не определён объект для вложения: path_obj_id=zShare link for z, but attachment for readZattachments)Zaccess_levelZraise_errorZinitial_acl_keyZobject_modelZobject_field)gZcurrent_personZanonymous_userZsharelink_anonymous_userdebugZsharelink_access_objsplitlenrequestmethodr   ZPUBLIC_FILES_HACKZheadersgetZcmfutilZget_url_path_objurllibparseunquoteZget_obj_by_idZsharelink_access_requestmodelsCmfAccessListZcheck_accessZperm_effective_acl_idvalue
class_name)r   req_filename
path_partsr   ZrefererZobj_idr   r   r   _check_access   sD    	



   zFileView._check_accessc                 C   s:   |  |r*tjtj| jtj|S t	ddiS dS )u{   
        Возвращаем уже сохраненный файл
        :param req_filename:
        :return:
        error   Нет доступаN)
r)   ZflaskZhelpersZ	send_fileZ	safe_joinr   r    r!   r"   jsonify)r   r'   r   r   r   r   H   s    
 zFileView.get)r'   c              
   C   s  |  |stddiS ztj  W n tk
r8   Y nX tjdd}|dk}tj	d}|sntddd	S t
| j| }tjd
| }tjj|d}|std| }t|tjd kr|  tdtj ddd t| j\}}	}
|
t| dk r|  tddd z|j||d |  W n@ tk
rr } z t| tddd	 W Y S d}~X Y nX td|jjdS )u   
        Сохраняем файл в объекте

        :param req_filename: Путь к сохраняемому файлу

        :return: Ответ клиенту
        :rtype: Response
        r*   r+   	overwriteFtruefileu   Не передан файлZno_data)r*   Z
error_codez/files/)urlu.   Сначала создайте CmfAttachment!i@B u   Файл больше, чем u_    МБ. Для загрузки, пожалуйста уменьшите размер файлаT)aborti 5wu3   На диске недостаточно места)r-   u/   Не удалось сохранить файлZno_saveNZOK)resultZ
attach_url)r)   r,   r#   r$   Zactivate_admin_modeZCmfPermissionErrorr   Zformr   filesr   r   r    r!   ZquoteZCmfAttachment	Exceptionr   r   r   ZMAX_SIZE_MEGABYTEdeleteZ	cmf_alertshutil
disk_usageZupload_fileZsaveZloggingZ	exceptionr0   r%   )r   r'   r-   Z	load_fileZ	file_pathr0   Z
attachmentZ
bytes_filetotalusedfreeer   r   r   postU   sB    

	
$zFileView.post)__name__
__module____qualname__Z__url__r   r)   cmfviewsactionr   strr<   __classcell__r   r   r   r   r   	   s   6
r   )
Zurllib.parser    pathlibr   r6   Zcmf.includer@   rA   ZBaseViewr   r   r   r   r   <module>   s   