
    Ϥkh                         d dl Z d dlmZmZmZ d dlmZ d dlmZ d dlZ	 d dlm	Z
mZ  G d d      Z G d	 d
      Zy# e$ r d dlm
Z
mZ Y $w xY w)    N)datetime	timedeltatimezone)Path)List)CLoaderCDumper)LoaderDumperc                       e Zd Z	 	 	 	 	 	 	 	 	 	 	 	 ddededededededed	ed
edededefdZg dZ	d Z
ed        Zed        Zy)FileVersionNdatefilenameauthor
is_approve	is_public	is_backupdir_pathst_sizecmf_deletedversionmd5sum	base_pathc                    |j                   s |j                  t        j                        }|| _        || _        || _        || _        || _        || _	        || _
        || _        |	| _        |
| _        || _        || _        y )N)tzinfo)r   replacer   utcr   r   r   r   r   r   r   r   r   r   r   r   )selfr   r   r   r   r   r   r   r   r   r   r   r   s                /opt/rdisk/rdisk/version.py__init__zFileVersion.__init__   st      {{<<x||<4D	 $"" &"    )
r   r   r   r   r   r   r   r   r   r   c                     t        |       j                         D ci c]  \  }}|| j                  v s|| c}}S c c}}w N)varsitemsdump_fieldnames)r   kvs      r   to_pyobjzFileVersion.to_pyobj/   s8    !%d!1!1!3QAqD<P<P7P1QQQs   ==c                 j    t         j                  j                  | j                  | j                        S r#   )ospathjoinr   r   r   s    r   abspathzFileVersion.abspath2   s    ww||DMM4==99r!   c                     t         j                  j                  | j                  | j                        j                  | j                  dd      S )N    )r+   r,   r-   r   r   r   r   r.   s    r   r,   zFileVersion.path6   s4    ww||DMM4==9AA$..RTVWXXr!   )NNNFFNNNFr   r1   r1   )__name__
__module____qualname__r   strboolr   intr    r&   r)   propertyr/   r,    r!   r   r   r      s     " $#"! %## # 	#
 # # # # # # # # #> LOR : : Y Yr!   r   c                       e Zd Zddedee   fdZedefd       Zedefd       Z	edefd       Z
eddedd fd	       Zd
 Zd Zededefd       ZddZd Zd Zd ZdefdZdefdZdedefdZdedefdZy)FileVersionsN	file_pathversionsc                 6    || _         |xs g | _        || _        y r#   )r=   r>   _rdisk)r   r=   r>   r@   s       r   r    zFileVersions.__init__<   s    " Br!   returnc                 >    | j                   j                  d       dS )N/z.meta)r=   rstripr.   s    r   	meta_pathzFileVersions.meta_pathA   s    ..'',-U33r!   c                 V    t         j                  j                  | j                  d      S )Nzversions.yamlr+   r,   r-   rE   r.   s    r   version_file_pathzFileVersions.version_file_pathE   s    ww||DNNO<<r!   c                 V    t         j                  j                  | j                  d      S )Nr>   rG   r.   s    r   versions_dir_pathzFileVersions.versions_dir_pathI   s    ww||DNNJ77r!   c           
      V    | ||      }|j                   j                  j                  |j                  d       |j                   j                  j	                  |j
                  d       g }|j                   j                  j                  |j                        }|rot        j                  |t              D ]Q  }|j                  d      r|j                  t        d	i ||j
                  |j                   j                  d       S |j                  d        ||_        |S )
N)r=   r@   T)exist_ok)r
   r   )r   r   c                     | j                   S r#   r   )r(   s    r   <lambda>z,FileVersions.for_file_path.<locals>.<lambda>_   s
    AII r!   )keyr:   )r@   ioio_touchrH   io_mkdirrJ   io_read_bytesyamlloadr
   getappendr   r   sortr>   )clsr=   r@   fvsr>   versions_file_datar(   s          r   for_file_pathzFileVersions.for_file_pathM   s    If5

s44tD

s44tD ZZ]]889N9NO YY1&A r55' pa p#:O:O[^[e[e[o[o pqr 	-.
r!   c                 T    | j                   sy t        d | j                   D              S )Nc              3   N   K   | ]  }|j                   r|j                    y wr#   )r   r   ).0is     r   	<genexpr>z1FileVersions.last_version_date.<locals>.<genexpr>g   s     Ea166Es   %%)r>   maxr.   s    r   last_version_datezFileVersions.last_version_datec   s!    }}E4==EEEr!   c                 T    | j                   sy t        | j                   d d      d   S )Nc                     | j                   S r#   rN   )xs    r   rO   z+FileVersions.last_version.<locals>.<lambda>l   s
    199 r!   T)rP   reverser   )r>   sortedr.   s    r   last_versionzFileVersions.last_versioni   s%    }}dmm)<dKANNr!   namec                    ddl m} dd l}dd l}dd l}|j                  d|       }d}t        |       t        |      z
  t        |      dz  z   }||kD  rd}|j                  |       \  }	}
|	r| j                  d      d	   }|j                  |dz        }| d |d
t        |      z   z
   j                          d|j                  | d       } |r|  d| } t        d| d| d|         | S )Nr2   )cmf_hashlibr   u   [А-Яа-я]      r1   .   -   u0   Слишком длинное название. z > u   . Меняем на )r1   rm   remath	mimetypesfindalllen
guess_typesplitfloorstripshort_str_encprint)rk   rm   ru   rv   rw   
rus_simbolos_max_lengthfile_name_lengthextmimetypeencodingslice_lengths               r   get_filenamezFileVersions.get_filenamen   s   !ZZ6
t9s:6Z19LLm+C!*!5!5d!;Hhjjob)::mAo6L9LACL9:@@BC1[E^E^_cefEgDhiDqDEUDVVYZgYhh|  ~B  }C  D  Er!   c                    t        j                  t        j                        j	                  d      }| j                  |j                  d      dz   | j                  j                  j                  | j                        z         }t        |||dd| j                  | j                  j                  j                  | j                        j                  | j                  j                        S )Nr   )microsecondz%Y%m%d%H%M%Srs   FT)r   r   r   r   r   r   r   r   )r   nowr   r   r   r   strftimer@   rQ   io_namer=   r   rJ   io_statr   r   )r   r   r   r   s       r   cur_versionzFileVersions.cur_version   s    ||HLL)11a1@$$T]]>%BS%H4;;>>KaKabfbpbpKq%qr++[[^^++DNN;CCkk++	
 		
r!   c                 p   | j                  |j                  d            }t        j                  j	                  | j
                  d      }| j                  j                  j                  |      r*| j                  j                  j                  |      |_
        | j                  rM| j                  d   j                  |j                  k(  r'| j                  d   j                  |j                  k(  ry | j                  | j                  |j                         | j                  j                  j!                  |j                        j                  |_        | j                  sd|_        n!| j                  d   j"                  dz   |_        | j                  j%                  |       | j'                          y )Nr   md5rq   r2   )r   rW   r+   r,   r-   rE   r@   rQ   	io_existsio_read_textr   r>   r   	safe_copyr=   r/   r   r   rX   dump_versions_file)r   kwargsnew_versionmd5_paths       r   backupzFileVersions.backup   s?   &&vzz(';<77<<6;;>>##H-!%!<!<X!FK==T]]2.66+:M:MMRVR_R_`bRcRjRjny  oA  oA  SAt~~{':':;"kknn44[5H5HIQQ}}"#K"&--"3";";a"?K[)!r!   c                    | j                         }|r'|j                  rt        j                  t        j
                        |j                  z
  t        d      k  rt        j                  j                  | j                  d      }| j                  j                  j                  |      r%| j                  j                  j                  |      }| j                  j                  j                  | j                         j"                  }|j"                  |k(  r|j$                  k(  ry | j'                  |        | j(                  di | y )N   )minutesr   r:   )rj   r   r   r   r   r   r   r+   r,   r-   rE   r@   rQ   r   r   r   r=   r   r   remover   )r   r   rj   r   r   r   s         r   backup_smartzFileVersions.backup_smart   s    ((*L--8<<3MP\PaPa3admvxdy3yww||DNNE:H{{~~''144X>kknn,,T^^<DDG ##w.<3F3F&3PKK%fr!   c                     | j                   D cg c]  }|j                          }}t        j                  |d      }| j	                  || j
                         y c c}w )NT)allow_unicode)r>   r)   rU   	safe_dumpsafe_write_textrH   )r   ra   pyobjdatas       r   r   zFileVersions.dump_versions_file   sJ    '+}}5!55~~e48T4#9#9: 6s   Ar   c                 X    |j                   }| j                  }| j                  ||       y r#   )r/   r=   r   )r   r   srcdsts       r   restorezFileVersions.restore   s"    oonnsC r!   c                 h    d|_         | j                          | j                  j                  |       y)uW   Фейковое удаление, просто не загружаем в списокTN)r   r   r>   r   )r   r   s     r   r   zFileVersions.remove   s(    "!W%r!   r   r   c                    |j                  d       d}| j                  j                  j                  ||       | j                  j                  j	                  |       | j                  j                  j                  ||       y NrC   z.tmp)rD   r@   rQ   io_write_text	io_unlink	io_rename)r   r   r   dst_tmps       r   r   zFileVersions.safe_write_text   s]    ZZ_%T*$$Wd3  %  #.r!   r   c                    |j                  d       d}| j                  j                  j                  |       | j                  j                  j	                  ||       | j                  j                  j                  ||       y r   )rD   r@   rQ   rR   io_copyr   )r   r   r   r   s       r   r   zFileVersions.safe_copy   s]    ZZ_%T*(sG,  #.r!   )NNNr#   )r3   r4   r5   r6   r   r   r    r9   rE   rH   rJ   classmethodr   r]   rd   rj   staticmethodr   r   r   r   r   r   r   r   r   r:   r!   r   r<   r<   ;   s   # [8I 
 43 4 4 =3 = = 83 8 8 d N  *FO
 3 3  (
"(;
!{ !
&k &/C /c //S /s /r!   r<   )r+   r   r   r   pathlibr   typingr   rU   r   r
   r	   r   ImportErrorr   r<   r:   r!   r   <module>r      sP    	 2 2   $9
+Y +Y\T/ T/e  $##$s   = AA