U
    Įwh4@                     @   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.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)r9   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*   r2   r4   CmfAttachmentr+   )r9   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r5   r$   r5       F)ZbackupZmake_preview)r   rA   strr"   r4   CmfRFiler+   r   	get_rfileZ_process_imagetmp_readonly_pathrF   delete)r9   Zreq_filename_pathZthumbnail_rfileZthumbnail_idZ	png_rfileZrfiler   r   r   _fallback_preview   s    
zFileView._fallback_previewc              
   C   sf  zt j  W n tk
r"   Y nX |ds6td| |rV| |}|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d| }t jj|d}|jj}|r@|j}t j!j"|# d|dS t$ddiS d
S )u{   
        Возвращаем уже сохраненный файл
        :param req_filename:
        :return:
        obj/   Неверный доступ!r"   rF   rG   r   r=   r!   r   Nr?   r#   z/obj/u   Файл не найден: version)r   r   r   r   r    rH   r	   ./files/)r@   T)Zas_attachmentdownload_nameerror   Нет доступа)%r4   r6   activate_admin_modeCmfPermissionErrorr1   	Exceptionr<   rO   rK   r+   r-   r.   unquote_plusr*   insertr2   joinr(   r)   rE   rL   r&   argsrA   r"   r5   r7   replaceZget_versionquoterB   sgetZflaskZhelpersZ	send_filerM   jsonify)r   r9   Z	cmf_rfilepartsr8   erD   rR   Zparent_rfileZrfile_versionZ	file_pathr@   
attachmentrV   r   r   r   r+      s`    

 



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
        rP   rQ   rX   fileu   Не передан файлrU   r   )r@   r$   u.   Сначала создайте CmfAttachment!ZPOST)Zreq_urlr'   u'   Недопустимый контентZ	Forbidden)resultrW   F)Zsmart_backupNZOK)rh   Z
attach_url)&r1   r[   r4   r6   rY   rZ   r<   r&   filesr+   r-   r.   ra   rB   r(   Zglobal_settingsZicap_enabler   r   tempfileZNamedTemporaryFiler   flushr,   Z
icap_checkrA   Z	cmf_alertrc   Zsdesk_check_writeZsdesk_upload_stream_fileZpub_check_writeZpub_upload_stream_fileZupload_stream_filelogging	exceptionrN   r@   r7   )	r   r9   Z	load_filer@   rf   ZcontentZ	temp_fileZresponsere   r   r   r   post   sH    







zFileView.post)__name__
__module____qualname__Z__url__r   r<   staticmethodrJ   rE   rO   cmfviewsactionr+   rn   __classcell__r   r   r   r   r      s   Z
Pr   )rl   rj   urllib.parser-   ior   pathlibr   shutilZcmf.includers   rt   ZBaseViewr   r   r   r   r   <module>   s   