U
     eRc                     @   s   d dl Z d dlZd dlZd dlmZmZ d dlmZ d dlmZ d dlmZ d dl	m
Z
 d dlZd dlZd dlZd dlZddlmZ dd	lmZ G d
d dZG dd dZdS )    N)datetimetimezone)
guess_type)remove)Path)rmtree   )config_load)FileVersionsc                   @   sF   e Zd ZdddZdd Zedd Zdd	 Zed
d Zdd Z	dS )
RFilePermsNc                 C   s   || _ |pdg| _d S )Nzall allow read,write)ownerrules)selfr   r    r   /opt/rdisk/rdisk/rfile.py__init__   s    zRFilePerms.__init__c                 C   sh   || j kr|d k	rdS t| jD ]B}| \}}}||dksH|dkr ||dkr |dk  S q dS )NT,allallowF)r   reversedr   split)r   whowhatruleZrwhoZrallowZrwhatr   r   r   can   s    zRFilePerms.canc                 C   s<   t |}|sd S z| f |}W n tk
r6   Y d S X |S N)yamlload	TypeError)clssoresr   r   r   from_str!   s    
zRFilePerms.from_strc                 C   s   t | jS r   )r   dump__dict__r   r   r   r   to_str,   s    zRFilePerms.to_strc                 C   s   |  | S r   )r#   read)r   fpr   r   r   from_fp/   s    zRFilePerms.from_fpc                 C   s   | |  S r   )writer'   r   r)   r   r   r   to_fp3   s    zRFilePerms.to_fp)NN)
__name__
__module____qualname__r   r   classmethodr#   r'   r*   r-   r   r   r   r   r      s   




r   c                   @   s  e Zd Zedd ZedddZdd Zdd	 Ze	d
d Z
e	dd Ze	dd Ze	dd Ze	dd Ze	dd Ze	dd Ze	dd Ze	dd Ze	dd Zejdd Zdd  Zd!d" Ze	d#d$ Ze	d%d& Ze	d'd( Ze	d)d* Ze	d+d, Ze	d-d. Ze	d/d0 Ze	d1d2 Ze	d3d4 Ze	d5d6 Z e jd7d6 Z e	d8d9 Z!e	d:d; Z"e	d<d= Z#e	d>d? Z$e	d@dA Z%e	dBdC Z&e	dDdE Z'e	dFdG Z(e	dHdI Z)e	dJdK Z*e	dLdM Z+dNdO Z,e	dPdQ Z-e	dRdS Z.e	dTdU Z/e	dVdW Z0e	dXdY Z1dZd[ Z2dd]d^Z3d_d` Z4ddadbZ5dcdd Z6ededfdgZ7dhdi Z8e9djdkdlZ:dmdn Z;dodp Z<eee=dqdrdsdtZ>eeedqdudvdwZ?ede=eeee=dydzd{Z@ee=eedqd|d}d~ZAee=edqdddZBeeCe=dddZDedd ZEedd ZFdd ZGdddZHdd ZIedd ZJdd ZKdd ZLdd ZMdddZNddddddZOedddZPdd ZQdd ZRdqS )RFilec                 C   s4   | st d| d}d|ks&d|kr0t d| d S )Nu.   Путь не может быть пустым/.z..u!   Недопустимый путь)
ValueErrorr   )idpartsr   r   r   _id_validation8   s
    
zRFile._id_validationr6   c                 K   sD   |  | || _d | _d | _d | _| D ]\}}t| || q*d S r   )r8   r6   _rdisk_tokenZ_token_unpackitemssetattr)r   r6   kwargskvr   r   r   r   @   s    
zRFile.__init__c                 C   s   |   rd S d S r   is_dirr&   r   r   r   historyJ   s    zRFile.historyc                 C   s   d S r   r   r&   r   r   r   saveN   s    z
RFile.savec                 C   s   | j jS r   )r:   rootr&   r   r   r   _rootQ   s    zRFile._rootc                 C   s   | j jS r   )rF   r6   r&   r   r   r   _root_idU   s    zRFile._root_idc                 C   s   | j jS r   )rF   _pathr&   r   r   r   
_root_pathY   s    zRFile._root_pathc                 C   s   | j jS r   )r:   	base_pathr&   r   r   r   
_base_path]   s    zRFile._base_pathc                 C   s   t | jjt | jd S Nr3   )r   r:   rJ   r6   lstripr&   r   r   r   rH   a   s    zRFile._pathc                 C   s
   | j dkS rL   r9   r&   r   r   r   _is_roote   s    zRFile._is_rootc                 C   s   | j S r   )is_rootr&   r   r   r   rO   i   s    zRFile.is_rootc                 C   s
   | j  S r   )rH   existsr&   r   r   r   _existsm   s    zRFile._existsc                 C   s   | j S r   )rQ   r&   r   r   r   rP   q   s    zRFile.existsc                 C   s   | j }| r| S d S r   )_meta_tuuid_pathrP   	read_text)r   Z
tuuid_pathr   r   r   
meta_tuuidu   s    zRFile.meta_tuuidc                 C   s   | j | d S r   )rR   
write_text)r   valuer   r   r   rT   {   s    c                 C   s   | j d|   S )Nflag-)	meta_pathrP   )r   flagr   r   r   meta_get_flag   s    zRFile.meta_get_flagc                 C   s2   | j d|  }|r"|jdd n|jdd d S )NrW   Texist_ok)
missing_ok)rX   touchunlink)r   rY   rV   Z	flag_pathr   r   r   meta_set_flag   s    zRFile.meta_set_flagc                 C   s$   | j jddd dd | j  D S )NTr\   parentsc                 S   s*   g | ]"}|j d r|j td d qS )rW   N)name
startswithlen).0	file_pathr   r   r   
<listcomp>   s   z$RFile.meta_flags.<locals>.<listcomp>)rX   mkdiriterdirr&   r   r   r   
meta_flags   s    zRFile.meta_flagsc                 C   s   t | jS )u   Для json поля)orjsondumpsrk   r&   r   r   r   flags   s    zRFile.flagsc                 C   s   t t| jd S )N.meta)r   strrH   r&   r   r   r   rX      s    zRFile.meta_pathc                 C   s
   | j d S )NtuuidrX   r&   r   r   r   rR      s    zRFile._meta_tuuid_pathc                 C   s
   | j d S )NrC   rr   r&   r   r   r   _meta_history_path   s    zRFile._meta_history_pathc                 C   s
   | j d S )Nzhistory.logrr   r&   r   r   r   _meta_history_log_path   s    zRFile._meta_history_log_pathc                 C   s
   | j d S )Nz	perms.ymlrr   r&   r   r   r   _meta_perms_path   s    zRFile._meta_perms_pathc                 C   s
   | j d S )Nattachrr   r&   r   r   r   _meta_attach_path   s    zRFile._meta_attach_pathc              
   C   s>   | j  s|   | j  }t|W  5 Q R  S Q R X d S r   )ru   rP   _create_metaopenr   r*   r,   r   r   r   _permissions   s    
zRFile._permissionsc                 C   s   | j }|sd S | S r   )rz   r'   )r   permsr   r   r   perm_str   s    zRFile.perm_strc              	   C   s0   t |}| jd}|| W 5 Q R X d S )Nw)r   r#   ru   ry   r-   )r   r    Zpermlistr)   r   r   r   r|      s    
c                 C   s$   | j r
dS d| jkr| jjS | jjS )Nu   Общая папкаdocument_is_internal)rN   rk   rH   stemrc   r&   r   r   r   rc      s
    
z
RFile.namec                 C   s
   | j  S r   )rH   rB   r&   r   r   r   rB      s    zRFile.is_dirc                 C   s   t | j S r   )rp   rH   absoluter&   r   r   r   abspath   s    zRFile.abspathc                 C   s4   | j r
d S d| jdd d }|dkr0d}|S )Nr3    )rN   joinr6   r   )r   rr   r   r   	parent_id   s    zRFile.parent_idc                 C   s   | j s
d S t| j | jdS )Nr:   )r   r2   r:   r&   r   r   r   parent   s    zRFile.parentc                 C   s   t | ds| j | _| jS )NZ__stat)hasattrrH   statZ_RFile__statr&   r   r   r   _stat   s    
zRFile._statc                 C   s   t | jjjtjdS N)tzinfo)r   utcfromtimestampr   st_mtimereplacer   utcr&   r   r   r   r      s    zRFile.st_mtimec                 C   s   t | jjjtjdS r   )r   r   r   st_ctimer   r   r   r&   r   r   r   r      s    zRFile.st_ctimec                 C   s   t t| j\}}|S r   )r   rp   rH   )r   mimetypeencodingr   r   r   r      s    zRFile.mimetypec                 C   s   | j jS r   )r   st_sizer&   r   r   r   r      s    zRFile.st_sizec                 C   s   | j }|sg S |j|g S r   )r   rb   )r   r   r   r   r   rb      s    zRFile.parentsc                    s  | j dks| j dr | js dS | jr*dS | j dkr8dS | j drrd| j }| j |ksj| j |d rndS dS | j}|sdS |j| jkr| jd k	rdS |jD ]v}|d\ }} d	 |d	}|d
k}||krqd kr|  S | j kst	 fdd| j
D r|  S qdS )Nz/objz/obj/FTz/Trashz/Users/r3    r   r   r   c                 3   s   | ]}| kV  qd S r   r   )rf   r    Zr_whor   r   	<genexpr>,  s     zRFile.can.<locals>.<genexpr>)r6   rd   _is_obj_api	_is_admin_loginrz   r   r   r   any_scope)r   r   Zuser_dirr{   Z	rule_lineZr_allowZr_whatr   r   r   r     s8    



$
z	RFile.canc                 C   sd   | j s
d S g }| j D ]F}|jdkr(qt| jdd |j | jd}|	dsTq|
| q|S )Nro   r3   r   r(   )rB   rH   rj   suffixr2   r6   rstriprc   r:   r   append)r   filesfiler   r   r   children1  s    	
 
zRFile.childrenc                 C   s   | j js| j jS | j jd S )Nlogin)r:   tokenr   r&   r   r   r   r   G  s    zRFile._loginc                 C   s   | j jS r   )r:   is_adminr&   r   r   r   r   M  s    zRFile._is_adminc                 C   s   | j jS r   )r:   
is_obj_apir&   r   r   r   r   Q  s    zRFile._is_obj_apic                 C   s,   | j dkrdgS | jjsg S | jjd p*g S )Nzsergey.osintsev@carbonsoft.ruZ
topmanagerscope)r   r:   r   r&   r   r   r   r   V  s
    
zRFile._scopec              	   C   s   | j jddd | jjddd | jjddd z6| j  | jd}t| j	| W 5 Q R X W n t
k
rz   Y nX | jjdd d S )NTra   r}   r[   )rX   ri   rw   rs   ru   r^   ry   r   r   r-   FileExistsErrorrt   r,   r   r   r   rx   a  s    
zRFile._create_metaFc                 C   sX   |r| j r| j jdddd |   | jr:|r2d S t| |rJ| j  n
| j  d S )NT)rB   r\   rb   )r   createrx   rQ   r   rH   ri   r^   )r   rB   r\   rb   r   r   r   r   p  s    
zRFile.createc                 C   s:   | j rd| }n| jd | }t|| jd}|| |S )Nr3   r   )rN   r6   r2   r:   r   )r   rc   rB   
child_namer   r   r   r   	add_child  s    

zRFile.add_childc                 O   s0   t || jd}|js,|r(|jdd |S d S |S )Nr   TrA   )r2   r:   rQ   r   )r   r6   ri   argsr>   rfr   r   r   find_child_by_id  s    zRFile.find_child_by_idc                 C   s8   t j| jrt| j | jr*t| j n
t| j d S r   )ospathrP   rX   r   rB   rH   r   r&   r   r   r   delete  s
    
zRFile.delete)new_idc                 C   s   d| j kr|ds|d7 }| j|}|jr@td|j d| j|jkrPd S | j|jjkrxtd| j d|j d| j	|j | j
	|j
 |S )Nr~   z.htmlu   Файл c именем "u   " уже существуетu1   Не могу переместить папку "u   " в "")rk   endswithr:   	get_rfilerQ   r   rc   rH   rb   renamerX   )r   r   targetr   r   r   r     s    

zRFile.renamec                 C   s   d S r   r   r&   r   r   r   r(     s    z
RFile.read)returnc                 C   s   t | j}|S r   )r
   Zfor_file_pathrH   r   fvsr   r   r   file_versions  s    zRFile.file_versionsc                 C   s   |   }|j| jd d S )Nauthor)r   backup_smartr   r   r   r   r   r     s    zRFile.backup_smartc                 C   s6   | j d}| s|   |  }|j| jd d S )Nmd5r   )rX   joinpathrP   	write_md5r   backupr   )r   md5_pathr   r   r   r   r     s
    zRFile.backupN)path_img	pdf_bytesr   c                 C   s4   ddl }|d|}|d}| }||  dS )5   
        Конвертирует PDF -> PNG
        r   Npdf)fitzry   ZloadPageZ
get_pixmaprD   )r   r   r   r   pageimagesr   r   r   pdf_bytes_to_img  s
    
zRFile.pdf_bytes_to_img)path_pdfr   r   c              	   C   s8   t j| r4t| d}tj|| d W 5 Q R X dS )r   rb)r   r   N)r   r   rP   ry   r2   r   r(   )r   r   Zfile_pdfr   r   r   
pdf_to_img  s    zRFile.pdf_to_imgr   )datar   	to_formatr   r   c                 C   sJ   t jtjd| i|||dd}|jdkr@td| d|j n|jS dS )u*  
        Конвертация данных в HTML через libreoffice
        :param data: Данные файла в виде байт
        :param suffix: Расширение файла
        :param to_format: Формат файла который хотим получить
        r   )r   formatr   r   r      u4   Не удалось конвертировать в z: N)requestspostconfigCONVERTER_URLstatus_code	Exceptioncontent)r   r   r   r   r"   r   r   r   obj_to_format  s    

zRFile.obj_to_format)r   output_pathr   r   c              	   C   s.   t |d}|t| |d W 5 Q R X dS )u(  
        Конвертация данных в PDF через libreoffice
        :param data: Данные файла в виде байт
        :param output_path: Путь сохранения итогового pdf файла
        :param suffix: Расширение файла
        wb+r   N)ry   r+   r2   r   )r   r   r   fr   r   r   
obj_to_pdf  s    zRFile.obj_to_pdf)r   meta_dirr   c              	   C   s   ddl }| d}tjtjd| iddid}|jdkrFtd	|j t|d
}|	|j W 5 Q R X |j
dddg|ddd}t| dS )un   
        Конвертация в PDF через libreoffice, каждый лист отдельно
        r   Nz/fullview.tarr   r   Z
pdf_sheetsr   r   u9   Не удалось конвертировать в pdf: r   tarz-xfzfullview.tar<   T)cwdtimeoutcheck)
subprocessr   r   r   r   r   r   r   ry   r+   runr   r   )r   r   r   Ztar_pathr"   r   procr   r   r   excel_to_pdf_sheets  s    

zRFile.excel_to_pdf_sheets)msg_filer   c                 C   s   ddl }ddlm} t }|| }|jr:|d|jg |jrP|d|jg |jrf|d|jg |jr||d|jg |j	r|d|j	g |j
rd	d
 |j
D }|dd|g ||ddgdd }||j 7 }t|dS )u   
        Метод извлекает данные из файла MSG и возвращает байтовую строку
        :param msg_file: Путь до файла MSG
        :return content: Байтовая строка
        r   N)tabulateu   ОТ:u	   КОМУ:u   КОПИЯ:u   СКРЫТАЯ КОПИЯ:u	   ТЕМА:c                 S   s&   g | ]}d |j  dt|j dqS )<z (u    байт)>)rc   re   r   )rf   rv   r   r   r   rh     s     z)RFile.get_content_msg.<locals>.<listcomp>u   ВЛОЖЕНИЯ:z,    @   )Zmaxcolwidthsz

zutf-8)extract_msgr   listZopenMsgsenderr   toccbccsubjectattachmentsr   bodybytes)r   r   r   tablemsgr   r   r   r   r   get_content_msg  s(    
zRFile.get_content_msgc                   C   s
   dddgS )Nz.xlsz.xlsxz.odsr   r   r   r   r   excel_extensions$  s    zRFile.excel_extensionsc                   C   s   ddddgS )Nz.docz.docxz.rtfz.odtr   r   r   r   r   word_extensions(  s    zRFile.word_extensionsc              	   C   s   ddl }| j d| jj }td || j| t|dX}|	 }| jj| 
 krf| || j | jj|  kr| jd }| ||| jj W 5 Q R X dS )u^    Для макроса документов office делаем fullview - превью в pdfr   Nz	/fullviewr   r   fullview.pdf)shutilrX   rH   r   geventsleepcopyr   ry   r(   r   r   r   r   )r   r   rg   Zfile_fullviewr   Zurl_fullview_pathr   r   r   make_fullview,  s    

zRFile.make_fullviewTc                 C   s   g }| j }| jj|  krvt|D ]N}tjtj||r$|	dr$t
d| jdd }|tt
|| q$nN| jj|  krtj|d}tj|rt
d| jdd }|t| |r|s|   | jdd}|S )	NZfullview_pagez/filesr3   ro   r   z.meta/fullview.pdfF)r   )rX   rH   r   r   r   listdirr   isfiler   rd   r   r6   rM   r   rp   r   rP   r  get_fullview)r   r   r"   rX   r   Zint_dirZfullview_nameZint_filenamer   r   r   r  <  s      zRFile.get_fullviewc              	   C   s*  t d |   dd l}| jd }| jd }tdd tdd tt| j	\}}z|
d	rdd
lm} || j	}|| n|dkr|| j| | | j	| n|
drddlm} |t| j	}	|	j|dd n|dkr| | j	}
| |
|| j	j | || nh| j d| j	j }td || j| t|d,}| }
| |
|| j	j | || W 5 Q R X |  }|jd }| r|||j|j  d|j!  | r|||j|j  d|j!  | "  W n, t#k
r$   t $d| j  |  Y S X d S )Nzcall make_previewr   zpreview.pdfzpreview_img.pngzapplication/vnd.ms-outlookz.msgz
text/plainz.logimage)Imagezapplication/pdfvideo)VideoFileClipg        )tz/previewr   r   r   r4   u,   Не удалось создать preview: )%logginginforx   r   rX   	mimetypesadd_typer   rp   rH   rd   PILr	  ry   rD   r  r   r   Zmoviepy.editorr  Z
save_framer   r   r   r  r  r(   r   versionsrP   Zversions_dir_pathr   filenamerc   r  r   	exception)r   r   Zurl_preview_pathZurl_preview_img_pathr   _r	  imgr  clipr   rg   Zfile_previewr   Zcurrent_versionr   r   r   make_previewS  sR    








"
"zRFile.make_previewc              	      sP   dd l }| }t| d( t fdddD ]}|| q.W 5 Q R X | S )Nr   r   c                      s
     dS )Ni   )r(   r   r   r   r   <lambda>      zRFile.md5.<locals>.<lambda>r  )hashlibr   ry   iterupdate	hexdigest)rg   r  Zhash_md5chunkr   r  r   r     s    z	RFile.md5c                 C   s8   |  | j}| jd}|j s*|   || d S Nr   )r   rH   rX   r   r   rP   rx   rU   )r   md5sumr   r   r   r   r     s
    
zRFile.write_md5c                 C   s$   | j d}| s|   | S r!  )rX   r   rP   r   rS   )r   r   r   r   r   get_md5  s    zRFile.get_md5c                 C   sD   |  | j}|  }| jjdr@||kr@| jjdjdd d S )NCmfDocumentdirtyTr[   )	r   rH   r#  r   rc   rd   rX   r   r^   )r   Z
md5sum_newZ
md5sum_oldr   r   r   
calc_dirty  s    zRFile.calc_dirtyc                 C   sT   | j rtd| j| |   |   |rD|r<|   n|   t	| j
 d S )N:   Не могу записывать в директории)rB   r5   rH   write_bytesr&  r   r   r   r  spawnr  )r   r   r   smart_backupr   r   r   r+     s    
zRFile.write)r   r*  r  c             	   O   sf  dd l }dd l}| jrtd|| j\}	}
}d}d}zt| }t|d}|	| }r|t
|7 }|tjd krtdtj d|| dk rtd	||  d
|| |d k rtd	||  d|d  d|| qRW 5 Q R X ||| j W n    | r|   Y nX |   |   |rP|rH|   n|   |rbt| j d S )Nr   r'  i    r   i@B u   Файл больше, чем u_    МБ. Для загрузки, пожалуйста уменьшите размер файлаi 5wu4   На диске недостаточно места u    < 2_000_000_000 байт   z < u	    байт)r   tempfilerB   r5   
disk_usagerI   r   mktempry   r(   re   r   MAX_SIZE_MEGABYTEr   r+   moverH   rP   r_   r&  r   r   r   r  r)  r  )r   streamr   r*  r  r   r>   r   r,  totalusedfree
chunk_size	file_sizeZtemp_filenamer   r   r   r   r   stream_write  s@    

zRFile.stream_write)textc                 K   s   | j | f|S r   )r+   encode)r   r8  r>   r   r   r   rU     s    zRFile.write_textc                 C   s
   t | jS r   )rp   r6   r&   r   r   r   __str__  s    zRFile.__str__c                 C   s   d| j  dS )NzRFile('z')r9   r&   r   r   r   __repr__  s    zRFile.__repr__)FF)F)r   )T)TT)Sr.   r/   r0   staticmethodr8   rp   r   rC   rD   propertyrF   rG   rI   rK   rH   rN   rO   rQ   rP   rT   setterrZ   r`   rk   rn   rX   rR   rs   rt   ru   rw   rz   r|   rc   rB   r   r   r   r   r   r   r   r   rb   r   r   r   r   r   r   rx   r   r   r   r   r   r(   r
   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r  r   r   r#  r&  r+   r7  rU   r:  r;  r   r   r   r   r2   7   s   


































0






	

	



4

&r2   )r  r  r   r   r   r   r   pathlibr   r   r   r  rl   r   r   r   r	   r   versionr
   r   r2   r   r   r   r   <module>   s   %