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   sf  t jt jt jfkrdS t jjs&tdt d| dt j  |	d}|d dkrht d|  d	S d
}t
jrtjd}|rt|}|st d|  |stj|d }t|dks|d dkrt d|  d	S t|}|st d|  d	S t jr6t j|kr6t dt j d|  d	S tjdkrFd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
        Tz
SD Error??uA   Попытка анонимного доступа к файлу z, sharelink=/r   obju`   Анонимный доступ возможен только к файлам вложений: FNZRefereru_   Не найден или не определён объект для вложения: referer=%   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_userZcurrent_userZ
user_local	ExceptiondebugZsharelink_access_objsplitr   ZPUBLIC_FILES_HACKrequestZheadersgetZcmfutilZget_url_path_objurllibparseZunquote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
  | dstd| |rtjj|ddgd}|sRt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 |s6| dr6|	dd }tjj|	dd |ddgd}|jddgd}|sf| dsfd| }tjj|ddgd}|szt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:
        obj/   Неверный доступ!parentabspath)idfieldsr      r   r   N   z--url)namer.   r1   )r1   z/obj/u   Файл не найден: version)zpreview_img.pngzpreview.pdfz.meta )r0   .error   Нет доступа)
startswithr   r+   r$   ZCmfRFiler   r    r!   Zunquote_plusr   insertr"   joinr   r   CmfAttachmentZ	get_rfiler/   r&   r   argsr6   r.   r0   replaceZget_versionZflaskZhelpersZ	send_filejsonify)r   r(   Z	cmf_rfilepartsr'   er*   ZattachZabs_file_pathr7   Zparent_rfileZrfile_versionr   r   r   r   P   sD    
  


zFileView.get)r(   c              
   C   s>  | dstd| |s$tdztj  W n tk
rF   Y nX tj	d}|s`tdt
jd| }tjj	|dgd}|st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,   r-   r;   fileu   Не передан файлz/files/r   )r5   r1   u.   Сначала создайте CmfAttachment!NF)Zsmart_backupZOK)resultZ
attach_url)r<   r   r+   r$   r%   Zactivate_admin_modeZCmfPermissionErrorr   filesr   r    r!   Zquoter?   Zsdesk_check_writeZsdesk_upload_stream_fileZloggingZ	exceptiondeleteZupload_stream_filerB   r5   r&   )r   r(   Z	load_filer5   Z
attachmentrD   r   r   r   post   s:    



zFileView.post)__name__
__module____qualname__Z__url__r   r+   cmfviewsactionr   strrI   __classcell__r   r   r   r   r   	   s   <
/r   )
Zurllib.parser    pathlibr   shutilZcmf.includerM   rN   ZBaseViewr   r   r   r   r   <module>   s   