U
    uf-                     @   sX   d dl Z d dlZd dlZd dlm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)BytesIO)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   sz  t d| dt j  |d}|d dkrBt d|  dS d}tjrztjd	}|rft	
|}|szt d
|  |stj|d }|dr|d dkrtj|d }t|dks|d dkrt d|  dS t	|}|st d|  dS t jdkr| S t jrJt j|krJt dt j d|  dS tjdkrZdnd}tjj|d|jj|jddS )u   
        Проверяем доступ к файлу
        g.sharelink_access_request = False
        g.sharelink_access_granted = False
        g.sharelink_access_obj = None
        uA   Попытка анонимного доступа к файлу z, sharelink=/r   obju`   Анонимный доступ возможен только к файлам вложений: FNZRefereru_   Не найден или не определён объект для вложения: referer=.metazpreview_img.pngzpreview.pdf%   i:u;   Недопустимый путь для вложения: uc   Не найден или не определён объект для вложения: path_obj_id=Zsd_apizShare link for z, but attachment for )ZGETZHEADreadwriteZattachments)access_levelZraise_errorZinitial_acl_keyZobject_modelZobject_field)gdebugZsharelink_access_objsplitr   ZPUBLIC_FILES_HACKrequestZheadersgetcmfutilZget_url_path_objurllibparseZunquoteendswithlenZget_obj_by_idZ	api_scopeZ_sdesk_check_accessZsharelink_access_requestmethodmodelsCmfAccessListZcheck_accessZperm_effective_acl_idvalue
class_name)r   req_filename
path_partsr   Zrefererobj_idr   r   r   r   _check_access   sJ    


  zFileView._check_accessc              
   C   s
  | dstd| |rtjj|ddgd}|sRtjjtj|ddgd}|szbtj|	d}|d 	dd	 }|
d|d d
t|d   tjjd|ddgd}W n, tk
r } zt| W 5 d
}~X Y nX |s6| dr6|	dd }tjj|	dd |ddgd}|jddgd}|sf| dsfd| }tjj|ddgd}|sztd| |jj}tjd}	|	r|jdkrt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:
        obj/   Неверный доступ!parentabspath)idfieldsr      r   r   N   r   z--url)namer4   r7   )r7   z/obj/u   Файл не найден: versionr   r    )r6   .error   Нет доступа)
startswith	Exceptionr1   r*   ZCmfRFiler#   r%   r&   Zunquote_plusr!   insertr(   joinr   r    CmfAttachmentZ	get_rfiler5   r,   r"   argsr;   r4   r6   replaceZget_versionZflaskZhelpersZ	send_filejsonify)r   r.   Z	cmf_rfilepartsr-   er0   ZattachZabs_file_pathr<   Zparent_rfileZrfile_versionr   r   r   r#   X   sD    
  


zFileView.get)r.   c           	   
   C   s  | dstd| |s$tdztj  W n tk
rF   Y nX tj	d}|s`tdt
jd| }tjj	|dgd}|std	S tjjr| }t|}t H}|| |  tj|j|d
dstddd}|W  5 Q R  S W 5 Q R X | rRz|| W n8 tk
rN } zt| |   W 5 d}~X Y nX nLz|j |dd W n8 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
        r2   r3   r@   fileu   Не передан файлz/files/r   )r:   r7   u.   Сначала создайте CmfAttachment!ZPOST)Zreq_urlr)   Z	Forbiddenu'   Недопустимый контент)resultr?   NF)Zsmart_backupZOK)rL   Z
attach_url)#rA   rB   r1   r*   r+   Zactivate_admin_modeZCmfPermissionErrorr"   filesr#   r%   r&   ZquoterE   r   Zglobal_settingsZicap_enabler   r   tempfileZNamedTemporaryFiler   flushr$   Z
icap_checkr;   rH   Zsdesk_check_writeZsdesk_upload_stream_fileloggingZ	exceptiondeleteZupload_stream_filer:   r,   )	r   r.   Z	load_filer:   Z
attachmentZcontentZ	temp_fileZresponserJ   r   r   r   post   sL    






zFileView.post)__name__
__module____qualname__Z__url__r   r1   cmfviewsactionr#   strrR   __classcell__r   r   r   r   r      s   A
:r   )rP   rN   Zurllib.parser%   ior   pathlibr   shutilZcmf.includerV   rW   ZBaseViewr   r   r   r   r   <module>   s   