U
    yb$h?                     @   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.jpgZ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)r8   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)   r1   r3   CmfAttachmentr*   )r8   r9   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r4   r#   r4       F)ZbackupZmake_preview)r   r@   strr!   r3   CmfRFiler*   r   	get_rfileZ_process_imagetmp_readonly_pathrE   delete)r8   Zreq_filename_pathZthumbnail_rfileZthumbnail_idZ	png_rfileZrfiler   r   r   _fallback_preview   s    
zFileView._fallback_previewc              
   C   s6  zt j  W n tk
r"   Y nX |ds6td| |r&| |}|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rt jj	|jjjddd}||}	|	d  d|j }
n||}	|	d }
t jj	|
ddgd}tjj|  d|jjdS t!ddiS d
S )u{   
        Возвращаем уже сохраненный файл
        :param req_filename:
        :return:
        obj/   Неверный доступ!r!   rE   rF   r   r<   r    r   Nr>   r"   z/obj/u   Файл не найден: version)r   r   r   r    rG   r	   .T)Zas_attachmentZdownload_nameerror   Нет доступа)"r3   r5   activate_admin_modeCmfPermissionErrorr0   	Exceptionr;   rN   rJ   r*   r,   r-   unquote_plusr)   insertr1   joinr'   r(   rD   rK   r%   argsr@   r!   r4   r6   replaceZget_versionZflaskZhelpersZ	send_filerL   jsonify)r   r8   Z	cmf_rfilepartsr7   erC   rQ   Zparent_rfileZrfile_versionZ	file_pathr   r   r   r*      sV    

 



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
        rO   rP   rU   fileu   Не передан файлz/files/r   )r?   r#   u.   Сначала создайте CmfAttachment!ZPOST)Zreq_urlr&   u'   Недопустимый контентZ	Forbidden)resultrT   F)Zsmart_backupNZOK)rb   Z
attach_url)&r0   rX   r3   r5   rV   rW   r;   r%   filesr*   r,   r-   quoterA   r'   Zglobal_settingsZicap_enabler   r   tempfileZNamedTemporaryFiler   flushr+   Z
icap_checkr@   Z	cmf_alertr^   Zsdesk_check_writeZsdesk_upload_stream_fileZpub_check_writeZpub_upload_stream_fileZupload_stream_filelogging	exceptionrM   r?   r6   )	r   r8   Z	load_filer?   Z
attachmentZcontentZ	temp_fileZresponser`   r   r   r   post   sH    







zFileView.post)__name__
__module____qualname__Z__url__r   r;   staticmethodrI   rD   rN   cmfviewsactionr*   ri   __classcell__r   r   r   r   r      s   Z
Jr   )rg   re   urllib.parser,   ior   pathlibr   shutilZcmf.includern   ro   ZBaseViewr   r   r   r   r   <module>   s   