B
    f1                 @   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 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}|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	|}|s<t d|  dS t jdkrP| S t jrt j|krt dt j d|  dS tjdkrd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=z.meta)zpreview.doczpreview.pdfzpreview_img.pngZfullviewZexport%   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
startswith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_idZ
is_previewZis_fullviewr   r   r   r   _check_access   sN    




zFileView._check_accessc          
   C   s\  | dstd| |rLtjj|ddgd}|sRtjjtj|ddgd}|sybt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 d
d
}~X Y nX |s| dr|	d}|d }|d }t|dks.|d dkr>|d }|d }tjj||ddgd}	|	sx|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| |jj}
tjd}|r@|jdkr.t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:
        zobj/u   Неверный доступ!parentabspath)idfieldsr      r   r   N      r   iz--url)namer0   r3   z
?version=1)r3   z/obj/u   Файл не найден: version)zpreview_img.pngzpreview.pdfz.meta )r2   .erroru   Нет доступа)r%   	Exceptionr/   r(   ZCmfRFiler    r"   r#   Zunquote_plusr   insertr&   joinr   r   CmfAttachmentZ	get_rfiler1   r*   r   argsr8   r0   r2   replaceZget_versionZflaskZhelpersZ	send_filejsonify)r   r,   Z	cmf_rfilepartsr+   er-   r.   filenameZattachZabs_file_pathr9   Zparent_rfileZrfile_versionr   r   r   r    `   sT    
 



zFileView.get)r,   c       	   
   C   s  | dstdy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 <}|| |  tj|j|d
dstddd}|S W dQ R X | rFy|| W n8 tk
rB } zt| |   W dd}~X Y nX nLy|j |dd W n8 tk
r } zt| |   W dd}~X Y nX td|j!j"dS )u   
        Сохраняем файл в объекте

        :param req_filename: Путь к сохраняемому файлу

        :return: Ответ клиенту
        :rtype: Response
        zobj/u   Неверный доступ!u   Нет доступаfileu   Не передан файлz/files/r   )r7   r3   u.   Сначала создайте CmfAttachment!ZPOST)Zreq_urlr'   Z	Forbiddenu'   Недопустимый контент)resultr<   NF)Zsmart_backupZOK)rH   Z
attach_url)#r%   r=   r(   r)   Zactivate_admin_modeZCmfPermissionErrorr/   r   filesr    r"   r#   Zquoter@   r   Zglobal_settingsZicap_enabler   r   tempfileZNamedTemporaryFiler   flushr!   Z
icap_checkr8   rC   Zsdesk_check_writeZsdesk_upload_stream_fileloggingZ	exceptiondeleteZupload_stream_filer7   r*   )	r   r,   Z	load_filer7   Z
attachmentZcontentZ	temp_fileZresponserE   r   r   r   post   sL    






zFileView.post)__name__
__module____qualname__Z__url__r   r/   cmfviewsactionr    strrN   __classcell__r   r   )r   r   r      s   IEr   )rL   rJ   Zurllib.parser"   ior   Zpathlibr   ZshutilZcmf.includerR   rS   ZBaseViewr   r   r   r   r   <module>   s   