U
    -gs9                     @   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   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.pngZ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_accessc              
   C   s  zt j  W n tk
r"   Y nX |ds6td| |rt jj|ddgd}|svt 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 |s|dr|d}|d }|d }t|dksV|d dkrf|d }|d }t jj||ddgd}	|	s|d7 }t jj||ddgd}	|	jddgd}|s|dsd| }t jj|ddgd}|std| tjd}
|
rt|jdkrNt jj|jjjddd}||
}|d  d|j }n||
}|d }t jj|ddgd}tj| S t ddiS d
S )u{   
        Возвращаем уже сохраненный файл
        :param req_filename:
        :return:
        obj/   Неверный доступ!r    abspath)r3   r"   r      r   r   N      r   r   z--url)namer    r"   z
?version=1r!   z/obj/u   Файл не найден: version)r   r   r    )r3   r	   .error   Нет доступа)!r2   r4   activate_admin_modeCmfPermissionErrorr/   	Exceptionr:   ZCmfRFiler)   r+   r,   unquote_plusr(   insertr0   joinr&   r'   CmfAttachmentZ	get_rfiler$   argsrB   r    r3   r5   replaceZget_versionZflaskZhelpersZ	send_fileZtmp_readonly_pathjsonify)r   r7   Z	cmf_rfilepartsr6   er8   r9   filenameZattachrC   Zparent_rfileZrfile_versionZ	file_pathr   r   r   r)   q   s\    
 



zFileView.get)r7   c           	   
   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
        r;   r<   rG   fileu   Не передан файлz/files/r   )rA   r"   u.   Сначала создайте CmfAttachment!ZPOST)Zreq_urlr%   u'   Недопустимый контентZ	Forbidden)resultrF   F)Zsmart_backupNZOK)rV   Z
attach_url)&r/   rJ   r2   r4   rH   rI   r:   r$   filesr)   r+   r,   quoterN   r&   Zglobal_settingsZicap_enabler   r   tempfileZNamedTemporaryFiler   flushr*   Z
icap_checkrB   Z	cmf_alertrQ   Zsdesk_check_writeZsdesk_upload_stream_fileZpub_check_writeZpub_upload_stream_fileZupload_stream_filelogging	exceptiondeleterA   r5   )	r   r7   Z	load_filerA   Z
attachmentZcontentZ	temp_fileZresponserS   r   r   r   post   sH    







zFileView.post)__name__
__module____qualname__Z__url__r   r:   cmfviewsactionr)   strr^   __classcell__r   r   r   r   r      s   Z
Or   )r[   rY   urllib.parser+   ior   pathlibr   shutilZcmf.includerb   rc   ZBaseViewr   r   r   r   r   <module>   s   