U
    ]d/                     @   s   d dl Z d dlZd dlmZmZ d dlZd dlmZ d dlT d dlm	Z	 d dl
mZ d dlmZ d dlmZ G d	d
 d
ejeZdS )    N)datetimetimezone)Path)*)CmfModel)cmf_hashlib)CmfPluginConvertMixin)cmf_attachmentc                       s  e Zd Zejjjd Zdd Z fddZdd Z	dd	 Z
d
d Z fddZedd ZddddZeedddZdddedddZdd Zd2dd Zeedd!d"Zeedd#d$Zdd% fd&d'
Z fd(d)Zd3d*d+Zd,d- Z fd.d/Zd0d1 Z  ZS )4CmfAttachment)file_existsc                 C   s   | j jsd S td| j j}d}t| j jt| t|d  }d}t| j ddkrh| j dd }||krt|d }| j jd |dt|   	  d	t
| j jd
 | _ |r| j  d| | _ d S )Nu   [А-Яа-я]       .      -   )name
is_changedrefindallvaluelensplitmathZfloorstripr   Zshort_str_enc)selfZ
rus_simbolZos_max_lengthZfile_name_lengthextZslice_length r    (./modules/files/models/cmf_attachment.py
_calc_name   s     8zCmfAttachment._calc_namec                    s   t   ddddg S )Nurlurl_previewurl_preview_imgparent)supersave_preload_fieldsr   	__class__r    r!   r(       s    z!CmfAttachment.save_preload_fieldsc                 C   sD   | j   | j sd S tjtj| j  }tj|s@t	| |S N)
r&   loadospathjoinconfig
UPLOAD_DIRget_files_direxistsmakedirs)r   
upload_dirr    r    r!   r6   #   s    

zCmfAttachment.upload_dirc                 C   s4   t jjj }|| j}|jr*|j| _nd| _d S )Nr   )	modelsCmfRFiledpdata_driverget_rd	get_rfile
_file_namer4   st_sizer   rdiskrfiler    r    r!   _calc_st_size,   s
    
zCmfAttachment._calc_st_sizec                 C   s4   t jjj }|| j}|jr0t j	| dd d S )NZ
attachmentZ
after_save)
r7   r8   r9   r:   r;   r<   r=   r4   ZCmfAutomationCrudTriggerZ	crud_hookr?   r    r    r!   _call_automation_hook4   s    z#CmfAttachment._call_automation_hookc                    s2   |    |   |   t j||}|   |S r,   )r"   	_calc_urlrB   r'   saverC   )r   argskwargsresr*   r    r!   rE   ;   s    zCmfAttachment.savec                 C   s   |    | j S r,   )r6   r   r)   r    r    r!   	file_pathC   s    zCmfAttachment.file_pathN)fieldsc                O   sH   | j js| jjsd S dtj| j | _| j d| _| j d| _	d S )Nz/filesz.meta/preview.pdfz.meta/preview_img.png)
r   r   r#   Zis_nullurllibparseZquoter=   r$   r%   )r   rJ   rF   rG   r    r    r!   rD   H   s
    zCmfAttachment._calc_url)returnc                 C   s   t ttj| j S )u<    Полный фактический путь к файлу )strr   r1   r2   r=   r)   r    r    r!   full_path_fileO   s    zCmfAttachment.full_path_fileTFbackupsmart_backup)contentc                O   s>   t jjj }|| j}|jdddd |j|||d dS )u    Загрузка файла FT)is_direxist_okparentsrP   N)	r7   r8   r9   r:   r;   r<   r=   createwrite)r   rS   rQ   rR   rF   rG   r@   rA   r    r    r!   upload_fileT   s    zCmfAttachment.upload_filec                 O   s   | j dd}|j|| d S )NT)rW   )r<   Zstream_write)r   rF   rG   rA   r    r    r!   upload_stream_file[   s    z CmfAttachment.upload_stream_filec              
   K   s@   |   }||}t|d d}| W  5 Q R  S Q R X d S )Nabspathrb)r<   Zget_versionopenread)r   versionrG   rA   Zrfile_versionfiler    r    r!   get_content`   s    
zCmfAttachment.get_contentc                 C   s    t jjj }|| j}|jS r,   )r7   r8   r9   r:   r;   r<   r=   r4   r?   r    r    r!   r   f   s    zCmfAttachment.file_existsc                 C   s>   | j j}| j  | jr0tj| j | j j}tjd|S )uT    Имя файла вложения в зависимости от родителя /)r   r   r&   r-   r.   r/   r0   r3   )r   	file_namer    r    r!   r=   l   s
    
zCmfAttachment._file_name)forcec                   s   |  dddg | jr| jjdrt| j }rtj| jkr|z|j	d| j
d W q tk
rx   |j	d| j
d Y qX n|j	d| j
d | jr|  }|r|j| jjd t j|d	|i|S )
Nroot_parent_idr&   	cmf_ownerCmfProject:zPPP-ATT-DELETE-ALLobjzPPP-ATT-DELETE-OWN)prefixrd   )load_fieldsre   r   
startswithcmfutilget_obj_by_idgZcurrent_userrf   check_project_role_accessr&   ZCmfPermissionErrorr=   r<   Zmove_to_trashcoder'   delete)r   rd   rF   rG   projectrA   r*   r    r!   rr   v   s    zCmfAttachment.deletec                    s6   t  jf |}tjj| jj d| jj | jd |S )N_)r   Z
target_dir)	r'   restorer7   r8   Zrestore_from_trashrq   r   r   r=   )r   rG   rH   r*   r    r!   ru      s    $zCmfAttachment.restorec                 K   sd   dd l }tjj| j|d}|s`|r`tj| jdd}| j|_tjj|j|jj	dd|_
|  |S )Nr   )idrJ   F)r   rT   T)rv   mkdir)r.   r7   r8   getr=   r   rv   r/   dirnamer   r&   rE   )r   rJ   rW   _kwargsr.   rH   r    r    r!   r<      s    zCmfAttachment.get_rfilec                 C   s8   | j r4| j jdr4t| j  }r4|jd| jd d S )Nrg   zPPP-ATT-CREATErh   )re   r   rl   rm   rn   rp   r&   )r   rs   r    r    r!   _check_project_perm   s    z!CmfAttachment._check_project_permc                    s*   |    |   |   t j|| d S r,   )r"   rD   rB   r'   _save_import)r   rF   rG   r*   r    r!   r|      s    zCmfAttachment._save_importc              
   C   s^   ddl m} d}| ddddg ||dd	jf | j| j| j| j| j	| j
jd
d}|jS )Nr   )BeautifulSoupap  
        <div contenteditable="false" class="app-tinymce-card-preview app-tinymce-is-preview"
            data-attach-id="{id}" data-mce-contenteditable="false"
            bis_skin_checked="1"><a class="app-tinymce-href-preview app-tinymce-is-preview"
                title="{title}"
                rel="{urlPreview}"
                download="{url}">
                <span class="app-tinymce-img-preview-block app-tinymce-is-preview"> <span
                        class="app-tinymce-img-preview-size app-tinymce-is-preview"> <img
                            class="app-tinymce-img-preview app-tinymce-is-preview"
                            src="{urlPreviewImg}"
                            alt="attachment"
                            data-mce-src="{urlPreviewImg}">
                    </span> </span> <span class="app-tinymce-file-preview-block app-tinymce-is-preview"> <span
                        class="app-tinymce-file-name-block app-tinymce-is-preview"> <span
                            class="app-tinymce-file-name-view app-tinymce-is-preview">{title}</span>
                        </span> <span
                        class="app-tinymce-file-create-view app-tinymce-is-preview display-contents">{createDate}</span> <svg class="remove-file-icon" style="width: 24px; height: 24px;" viewBox="0 0 24 24"
                        data-mce-style="width: 24px; height: 24px;">
                        <path style="pointer-events: none;" fill="#e8e8e8"
                            d="M19,3H5A2,2 0 0,0 3,5V19A2,2 0 0,0 5,21H19A2,2 0 0,0 21,19V5A2,2 0 0,0 19,3M19,19H5V5H19V19M17,8.4L13.4,12L17,15.6L15.6,17L12,13.4L8.4,17L7,15.6L10.6,12L7,8.4L8.4,7L12,10.6L15.6,7L17,8.4Z"
                            data-mce-style="pointer-events: none;"></path>
                    </svg> </span> </a>
            <div contenteditable="false" class="app-tinymce-preview-actions" data-mce-contenteditable="false"
                bis_skin_checked="1">
                <div data-obj-id="{id}" bis_skin_checked="1"><svg
                        class="preview-action edit-preview" viewBox="0 0 24 24"
                        style="width: 18px; height: 18px; color: #444444;"
                        data-mce-style="width: 18px; height: 18px; color: #444444;">
                        <path _ngcontent-mjc-c10="" fill="#444"
                            d="M20.71,7.04C21.1,6.65 21.1,6 20.71,5.63L18.37,3.29C18,2.9 17.35,2.9 16.96,3.29L15.12,5.12L18.87,8.87M3,17.25V21H6.75L17.81,9.93L14.06,6.18L3,17.25Z">
                        </path>
                    </svg><br></div>
                <div bis_skin_checked="1"><svg class="preview-action show-preview" viewBox="0 0 24 24"
                        style="width: 18px; height: 18px; color: #202020;"
                        data-mce-style="width: 18px; height: 18px; color: #202020;">
                        <path _ngcontent-chu-c10="" fill="#202020"
                            d="M12,9A3,3 0 0,1 15,12A3,3 0 0,1 12,15A3,3 0 0,1 9,12A3,3 0 0,1 12,9M12,4.5C17,4.5 21.27,7.61 23,12C21.27,16.39 17,19.5 12,19.5C7,19.5 2.73,16.39 1,12C2.73,7.61 7,4.5 12,4.5M3.18,12C4.83,15.36 8.24,17.5 12,17.5C15.76,17.5 19.17,15.36 20.82,12C19.17,8.64 15.76,6.5 12,6.5C8.24,6.5 4.83,8.64 3.18,12Z">
                        </path>
                        <defs _ngcontent-chu-c10="">
                            <linearGradient _ngcontent-chu-c10="" id="MyGradient" x1="0" x2="0" y1="0" y2="1">
                                <stop _ngcontent-chu-c10="" offset="20%" stop-color="#ffd19e"></stop>
                                <stop _ngcontent-chu-c10="" offset="80%" stop-color="#ffeec2"></stop>
                            </linearGradient>
                        </defs>
                    </svg><br></div>
                <div bis_skin_checked="1"><svg class="preview-action download-preview" viewBox="0 0 24 24"
                        style="width: 18px; height: 18px; color: #202020;"
                        data-mce-style="width: 18px; height: 18px; color: #202020;">
                        <path _ngcontent-chu-c10="" fill="#202020" d="M5,20H19V18H5M19,9H15V3H9V9H5L12,16L19,9Z"></path>
                    </svg><br></div>
            </div>
        </div>
        r%   r$   r#   cmf_created_at
r   )titlerv   ZurlPreviewImgZ
urlPreviewr#   Z
createDatezhtml.parser)Zbs4r}   rk   replaceformatr   rv   r%   r$   r#   r~   ZjsonZ
currentTag)r   r}   ZTAG_TMPLsr    r    r!   create_preview_tag   s    6z CmfAttachment.create_preview_tag)N)NF) __name__
__module____qualname__Zcmfr7   Z	CmfEntityZui_meta_skipr"   r(   r6   rB   rC   rE   propertyrI   rD   rN   rO   bytesrY   rZ   ra   boolr   r=   rr   ru   r<   r{   r|   r   __classcell__r    r    r*   r!   r
      s2   	

	

r
   )r   rK   r   r   shutilpathlibr   Zcmf.includeZ
cmf.modelsr   Zcmf.utilr   Z&common.models.cmf_plugin_convert_mixinr   Zmodules.files.fieldsr	   r
   r    r    r    r!   <module>   s   