U
    Eh@                     @   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                       sx   e Zd ZdZdd fddZdd Zeedd	d
Zeed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   s&  t jdkrdnd}td| dtj  |d}|d dkrTtd	|  d
S d}tjrt j	d}|rxt
|}|std|  |sTtj|d }|dr|d dk}|d d}|s|rtj|d }|d dkrtj|d }t|dks|d dkr*td|  d
S t
j|dgd}|sTtd|  d
S tjdkrt|tjr||jr|j S d
S | S tjdkr|dkrt|tjr||jr|j S d
S | S tjr
tj|kr
tdtj d|  d
S 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
        )ZGETZHEADreadwriteuA   Попытка анонимного доступа к файлу z, sharelink=/r   obju`   Анонимный доступ возможен только к файлам вложений: FNZRefereru_   Не найден или не определён объект для вложения: referer=.meta)zpreview.docpreview.pdfpreview_img.pngthumbnail.jpgpreview.jpgfullviewZexport%   :u;   Недопустимый путь для вложения: parentfieldsuc   Не найден или не определён объект для вложения: path_obj_id=Zsd_apiZpub_apizShare link for z, but attachment for Zattachments)access_levelZraise_errorZinitial_acl_keyZobject_modelZobject_field)"requestmethodgdebugZsharelink_access_objsplitr   ZPUBLIC_FILES_HACKZheadersgetcmfutilZget_url_path_objurllibparseunquoteendswith
startswithlenZget_obj_by_idZ	api_scope
isinstancemodelsZ
CmfCommentZcheck_visibilityidr#   Z_sdesk_check_accessZ_pub_check_writeZsharelink_access_requestCmfAccessListZcheck_accessZperm_effective_acl_idvalue
class_name)	r   req_filenamer&   
path_partsr   Zrefererobj_idZ
is_previewZis_fullviewr   r   r   _check_access   sh    




  zFileView._check_access)r:   c                 C   s~   |  d}|d }|d }t|dks2|d dkrB|d }|d }tjj||dd	gd
}|sz|d7 }tjj||dd	gd
}|S )Nr         r    r!   r"      z--url)namer#   r%   z
?version=1)r+   r3   r5   CmfAttachmentr,   )r:   r;   r<   filenameattachr   r   r   _get_attachmentq   s    
zFileView._get_attachmentc                 C   s   t | }d }|jdkrt|jd }tjj|ddgd}tjj| ddgd}|r|stj|d}|jdddd	 tjj|ddgd}| }|	|
 t|j |  |S )
Nr   r   r#   abspathr6   r%   r6       F)ZbackupZmake_preview)r   rB   strr#   r5   CmfRFiler,   r   	get_rfileZ_process_imagetmp_readonly_pathrG   delete)r:   Zreq_filename_pathZthumbnail_rfileZthumbnail_idZ	png_rfileZrfiler   r   r   _fallback_preview   s    
zFileView._fallback_previewc              
   C   st  zt j  W n tk
r"   Y nX |ds6td| |rd| |}|sdt jj	|ddgd}|st jj	t
j|ddgd}|szbt
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 |sH|drH| |}|jddgd}|sx|dsxd| }t jj	|ddgd}|std| tj	d}|r|jdks|jdrt jj	|jjjddd}||}	|	d  d|j }
n||}	|	d }
t jj	|
ddgd}t
jd| }t jj|d}|jj}|rN|j}t j!j"|# d|dS t$ddiS d
S )u{   
        Возвращаем уже сохраненный файл
        :param req_filename:
        :return:
        obj/   Неверный доступ!r#   rG   rH   r   r>   r"   r   Nr@   r$   z/obj/u   Файл не найден: version)r   r   zfullview.pdfr   r   r   r    rI   r	   ./files/)rA   T)Zas_attachmentdownload_nameerror   Нет доступа)%r5   r7   activate_admin_modeCmfPermissionErrorr2   	Exceptionr=   rP   rL   r,   r.   r/   unquote_plusr+   insertr3   joinr)   r*   rF   rM   r'   argsrB   r#   r6   r8   replaceZget_versionquoterC   sgetZflaskZhelpersZ	send_filerN   jsonify)r   r:   Z	cmf_rfilepartsr9   erE   rS   Zparent_rfileZrfile_versionZ	file_pathrA   
attachmentrW   r   r   r   r,      sd    

 




zFileView.getc           	   
   C   s  | dstdztj  W n tk
r4   Y nX | |sHtdtj	d}|s`tdt
jd| }tjj	|dgd}|std	S tjjr| }t|}t P}|| |  tj|j|d
dstd tddd}|W  5 Q R  S W 5 Q R X z>| r || n$| r6|| n|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
        rQ   rR   rY   fileu   Не передан файлrV   r   )rA   r%   u.   Сначала создайте CmfAttachment!ZPOST)Zreq_urlr(   u'   Недопустимый контентZ	Forbidden)resultrX   F)Zsmart_backupNZOK)ri   Z
attach_url)&r2   r\   r5   r7   rZ   r[   r=   r'   filesr,   r.   r/   rb   rC   r)   Zglobal_settingsZicap_enabler   r   tempfileZNamedTemporaryFiler   flushr-   Z
icap_checkrB   Z	cmf_alertrd   Zsdesk_check_writeZsdesk_upload_stream_fileZpub_check_writeZpub_upload_stream_fileZupload_stream_filelogging	exceptionrO   rA   r8   )	r   r:   Z	load_filerA   rg   ZcontentZ	temp_fileZresponserf   r   r   r   post   sH    







zFileView.post)__name__
__module____qualname__Z__url__r   r=   staticmethodrK   rF   rP   cmfviewsactionr,   ro   __classcell__r   r   r   r   r      s   Z
Qr   )rm   rk   urllib.parser.   ior   pathlibr   shutilZcmf.includert   ru   ZBaseViewr   r   r   r   r   <module>   s   