U
    =e                     @   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_DIRZ
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parseZ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refererobj_idr   r   r   _check_access   sD    	



  zFileView._check_accessc           	      C   s:  |  |r*tjj|ddgd}|sl|drl|dd }tjj|dd |dd	gd
}|jddgd}|s|dsd| }tjj|ddgd}|std| |j	j
}tjd}|r|jdkrtjj|jjj
ddd}||}|d  d|j }n||}|d }tj|S tddiS dS )u{   
        Возвращаем уже сохраненный файл
        :param req_filename:
        :return:
        parentabspath)idfieldszobj/r   r   z--url)namer)   r,   )r,   z/obj/u   Файл не найден: version)zpreview_img.pngzpreview.pdfz.meta )r+   .error   Нет доступаN)r(   r!   ZCmfRFiler   
startswithr   CmfAttachmentZ	get_rfile	Exceptionr*   r#   r   argsr/   r)   r+   replaceZget_versionZflaskZhelpersZ	send_filejsonify)	r   r%   Z	cmf_rfiler'   ZattachZabs_file_pathr0   Zparent_rfileZrfile_versionr   r   r   r   I   s,     


zFileView.get)r%   c              
   C   s   |  |stdztj  W n tk
r4   Y nX tjd}|sNtdt	j
d| }tjj|dgd}|s~tdS z|| W n6 tk
r } zt| |   W 5 d}~X Y nX td	|jjd
S )u   
        Сохраняем файл в объекте

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

        :return: Ответ клиенту
        :rtype: Response
        r4   fileu   Не передан файлz/files/r   )r.   r,   u.   Сначала создайте CmfAttachment!NZOK)resultZ
attach_url)r(   r7   r!   r"   Zactivate_admin_modeZCmfPermissionErrorr   filesr   r   r    Zquoter6   Zupload_stream_fileZloggingZ	exceptiondeleter:   r.   r#   )r   r%   Z	load_filer.   Z
attachmenter   r   r   postl   s(    


zFileView.post)__name__
__module____qualname__Z__url__r   r(   cmfviewsactionr   strr@   __classcell__r   r   r   r   r   	   s   7
"r   )
Zurllib.parser   pathlibr   shutilZcmf.includerD   rE   ZBaseViewr   r   r   r   r   <module>   s   