U
    cp                     @   s@   d dl Zd dlmZ d dlZd dlT dZG dd dejj	Z
dS )    N)Path)*i,  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)	config
UPLOAD_DIR
upload_dirospathexistsmakedirssuper__init__)self	__class__ '/opt/crm/./modules/files/views/index.pyr      s    zFileView.__init__c                 C   sB  t jt jt jfkrdS t d| dt j  |d}t|dk sP|d dkrdt d|  d	S tj	d
krt dtj	 d d	S d}t
jrtjd}|rt|}|st d|  d	S n2tj|d }t|}|st d|  d	S t jr&t j|kr&t dt j d|  d	S tjjd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`   Анонимный доступ возможен только к файлам вложений: FGETuW   Анонимный доступ возможен только на чтение(method=)NRefereru_   Не найден или не определён объект для вложения: referer=   uc   Не найден или не определён объект для вложения: path_obj_id=zShare link for z, but attachment for readattachments)access_levelraise_errorinitial_acl_keyobject_modelobject_field)gcurrent_personanonymous_usersharelink_anonymous_userdebugsharelink_access_objsplitlenrequestmethodr   PUBLIC_FILES_HACKheadersgetcmfutilget_url_path_objurllibparseunquoteget_obj_by_idsharelink_access_requestmodelsCmfAccessListcheck_accessperm_effective_acl_idvalue
class_name)r   req_filename
path_partsr   refererobj_idr   r   r   _check_access   sD    	



   zFileView._check_accessc                 C   s:   |  |r*tjtj| jtj|S t	ddiS dS )u{   
        Возвращаем уже сохраненный файл
        :param req_filename:
        :return:
        error   Нет доступаN)
r@   flaskhelpers	send_file	safe_joinr   r1   r2   r3   jsonify)r   r<   r   r   r   r.   I   s    
 zFileView.get)r<   c              
   C   s\  |  |stddiS tjdd}|dk}tjd}|sJtddd	S t| j| }tj	
d
| }tjj|d}|std| }t|td kr|  tdt ddd t| j\}}	}
|
t| dk r|  tddd z|j||d |  W n@ tk
rH } z t| tddd	 W Y S d}~X Y nX td|jjdS )u   
        Сохраняем файл в объекте

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

        :return: Ответ клиенту
        :rtype: Response
        rA   rB   	overwriteFtruefileu   Не передан файлZno_data)rA   
error_codez/files/)urlu.   Сначала создайте CmfAttachment!i@B u   Файл больше, чем u_    МБ. Для загрузки, пожалуйста уменьшите размер файлаT)aborti 5wu3   На диске недостаточно места)rH   u/   Не удалось сохранить файлZno_saveNOK)resultZ
attach_url)r@   rG   r*   formr.   filesr   r   r1   r2   quoter6   CmfAttachment	Exceptionr   r)   MAX_SIZE_MEGABYTEdelete	cmf_alertshutil
disk_usageZupload_filesavelogging	exceptionrL   r:   )r   r<   rH   Z	load_file	file_pathrL   
attachmentZ
bytes_filetotalusedfreeer   r   r   postV   s:    


$zFileView.post)__name__
__module____qualname____url__r   r@   cmfviewsactionr.   strrc   __classcell__r   r   r   r   r      s   5
r   )urllib.parser1   pathlibr   rX   cmf.includerU   rh   ri   BaseViewr   r   r   r   r   <module>   s
   