U
    e#                     @   s<   d dl 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)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t jt jfkrdS t d| dt j  |d}|d dkrXt d|  dS d	}tjrt	j
d
}|r|t|}|st d|  |stj|d }|dr|d dkrtj|d }t|dks|d dkrt d|  dS t|}|st d|  dS t jrLt j|krLt dt j d|  dS t	jdkr\d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
        TuA   Попытка анонимного доступа к файлу z, sharelink=/r   obju`   Анонимный доступ возможен только к файлам вложений: FNZRefereru_   Не найден или не определён объект для вложения: referer=.metazpreview_img.pngzpreview.pdf%   i:u;   Недопустимый путь для вложения: uc   Не найден или не определён объект для вложения: path_obj_id=zShare link for z, but attachment for )ZGETZHEADreadwriteZattachments)access_levelZraise_errorZinitial_acl_keyZobject_modelZobject_field)gZcurrent_personZanonymous_userZsharelink_anonymous_userdebugZsharelink_access_objsplitr   ZPUBLIC_FILES_HACKrequestZheadersgetZcmfutilZget_url_path_objurllibparseZunquoteendswithlenZget_obj_by_idZsharelink_access_requestmethodmodelsCmfAccessListZcheck_accessZperm_effective_acl_idvalue
class_name)r   req_filename
path_partsr   Zrefererobj_idr   r   r   r   _check_access   sJ    	


  zFileView._check_accessc              
   C   s  |  |rtjj|ddgd}|s@tjjtj|ddgd}|szbt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 }tjj|dd |ddgd}|jddgd}|sT|d
sTd| }tjj|ddgd}|shtd| |jj}tjd}	|	r|jdkrt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:
        parentabspath)idfieldsr      r   r   N   zobj/r   z--url)namer0   r3   )r3   z/obj/u   Файл не найден: versionr   r    )r2   .error   Нет доступа)r/   r(   ZCmfRFiler"   r#   r$   Zunquote_plusr    insertr&   join	Exceptionr   r   
startswithCmfAttachmentZ	get_rfiler1   r*   r!   argsr7   r0   r2   replaceZget_versionZflaskZhelpersZ	send_filejsonify)r   r,   Z	cmf_rfilepartsr+   er.   ZattachZabs_file_pathr8   Zparent_rfileZrfile_versionr   r   r   r"   O   s@      


zFileView.get)r,   c              
   C   s,  |  |stdztj  W n tk
r4   Y nX tjd}|sNtdt	j
d| }tjj|dgd}|s~tdS | rz|| W n6 tk
r } zt| |   W 5 d}~X Y nX nLz|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<   fileu   Не передан файлz/files/r   )r6   r3   u.   Сначала создайте CmfAttachment!NF)Zsmart_backupZOK)resultZ
attach_url)r/   r?   r(   r)   Zactivate_admin_modeZCmfPermissionErrorr!   filesr"   r#   r$   ZquoterA   Zsdesk_check_writeZsdesk_upload_stream_fileZloggingZ	exceptiondeleteZupload_stream_filerD   r6   r*   )r   r,   Z	load_filer6   Z
attachmentrF   r   r   r   post|   s6    



zFileView.post)__name__
__module____qualname__Z__url__r   r/   cmfviewsactionr"   strrK   __classcell__r   r   r   r   r   	   s   =
,r   )
Zurllib.parser#   pathlibr   shutilZcmf.includerO   rP   ZBaseViewr   r   r   r   r   <module>   s   