
     j (                     x    d dl  d dlmZ d dlZd dlZd dlmZ d dlZd dlm	Z	m
Z
  G d dej                        Zy)    )*)
cmf_exportN)Path)OptionalListc            	       p   e Zd ZU ej                  j
                  dgz   Zeed<   eed<   ej                  ed<   e
ed<   eed<   d!d	Zd
eddfdZ	 d"deded   dee   ddfdZd Zd"dedee   ddfdZd#dededdfdZdeddfdZdededdfdZdededdfdZd$dZe edddd      d$d               Zy)%	CmfExportcreate_backup_dumped_workflows_dumped_workflows_scheme_zipf
_dump_info_errorsreturnCmfAttachmentc                 ^   ddl m } |j                         j                  d      }d| d}| j                  dg       | j                  r| j                  d   }n't
        j                  | |      }|j                          t        | j                  | j                  j                  g       |S )	un   
        Создаем backup
        Добавляем дату и время в имя файла
        r   )datetimez%Y%m%d%H%M%Sbackup_z.zipzbackup_files.url)parentname)args)r   nowstrftimeload_fieldsbackup_filesmodelsr   saveschedule_deferred_jobjob_create_backupidvalue)selfr   current_timebackup_file_nameattachs        %./modules/export/models/cmf_export.pyr
   zCmfExport.create_backup   s    
 	&||~..~>$\N$7,-.&&q)F))<L)MFKKMd44DGGMM?K    workflow_idNc                     || j                   D cg c]  }|d   	 c}v ryt        j                  j                  |ddg      }| j                   j	                  |j                  d             yc c}w )u   
        Собираем данные по воркфлоу в отдельный список чтобы потом его сохранить

        workflow_id - TUUID воркфлоу
        r    Nz
statuses.*ztrans.**r    fieldsdict)type)r   r   CmfWorkflowgetappenddumps)r"   r(   objworkflows       r&   _dump_workflowzCmfExport._dump_workflow&   sj     0F0FG3t9GG%%))[,PZA[)\%%hnn&n&AB Hs   A0dump_dirattachmentsroot_dirc                    ||}|dz  }|D ]l  }	 | j                  d       | j                  j                  |j                  t	        ||j
                  j                  z               | j                  ||       n y # t        $ r>}| j                  j                  dt	        |      d|j
                   g       Y d }~d }~ww xY w)Nr6   
attachment_dump_attachmentsu.   Ошибка дампа вложения id = )_inc_dump_infor   writefull_path_filestrr    r!   _dump_users	Exceptionr   r0   )r"   r5   r6   r7   attach_pathr%   es          r&   r:   zCmfExport._dump_attachments1   s     H.! 	AFA##L1

  !6!6K&))//<Y8Z[  62		A
  A##%8#a&Drsys|s|r}B~$  A  AAs   A)A<<	C4B>>Cc                 j   |j                  ddg       t               }|dz  }dD ]l  }t        ||      st        ||      st        ||      j                  }t        ||z        | j                  j                         v r\|j                  |       n dD ]  }t        ||      st        ||      st        ||      j                         D ]d  }t        ||j                  j                  z        | j                  j                         v r@|j                  |j                  j                         f  t        j                  j                  ddgdd	t        |      g
      D ]L  }| j                  j                  t        ||j                  j                  z        |j                                N y )N	executors
spectatorsusers)cmf_author_idcmf_owner_idresponsible_idcmf_modified_by_idwaiting_for_id)rD   rE   r   zrg_member_of.*r    IN)r+   filter)r   sethasattrgetattrr!   r>   r   namelistadd
all_nestedr    r   	CmfPersonlistwritestrr1   )	r"   r5   r2   user_ids	users_diruser_keyuser_id
field_nameusers	            r&   r?   zCmfExport._dump_users?   sr   l345w&	s 	&HsH%'#x*@!#x066y7*+tzz/B/B/DDW%	& 6 	0JZ(WS*-E$S*5@@B 0T9tww}}459L9L9NN LL/0	0 $$))#7G1HRVX\^bck^lQm)n 	NDJJI$= >

M	Nr'   c                 P   dd|g}||dz  }t         j                  j                  |g d      D ]  }||j                  j                  z  }| j
                  j                  t        |dz        |j                                | j                  d       | j                  |||d	z         | j                  ||j                  |       | j                  ||        t         j                  j                  |g d      D ]  }||j                  j                  z  }| j
                  j                  t        |dz        |j                                | j                  d
       | j                  |||d	z         | j                  ||j                  |       | j                  ||        y)u   
        Дампим документы сохраняя иерархию

        dump_dir - директория для дампа
        tree_parent (CmfProject, CmfFolder, CmfDocument) - родитель в дереве
        tree_parentz==N	documents**zattachments.*rD   rE   )rM   r+   	info.jsondocumentchildrenfolder)r   CmfDocumentrU   r    r!   r   rV   r>   r1   r;   _dump_documentsr:   r6   r?   	CmfFolder)r"   r7   r^   r5   _filterdocdoc_dirs          r&   rg   zCmfExport._dump_documentsS   sp    !$4+-H%%**'Bs*t 	,C-GJJGk$9 :CIIKH
+  3*0DE""7COOXFXs+	, ##((@q(r 	,C-GJJGk$9 :CIIKH)  3*0DE""7COOXFXs+	,r'   keyvalc                 n    || j                   vr|| j                   |<   y | j                   |xx   |z  cc<   y N)r   )r"   rl   rm   s      r&   r;   zCmfExport._inc_dump_infom   s0    doo%#&DOOC OOC C' r'   	scheme_idc                 b   || j                   D cg c]  }|d   	 c}v ryt        j                  j                  |ddg      }| j                   j	                  |j                  d             | j                  |j                         | j                  |j                         | j                  |j                         | j                  |j                         | j                  |j                         | j                  |j                         | j                  |j                         yc c}w )uT   
        Дампим схему БП

        scheme_id - TUUID схемы
        r    Nra   zscheme_wf.scheme_wf_rulesr*   r,   )r   r   CmfSchemeWfr/   r0   r1   r4   default_list_workflow_iddefault_epic_workflow_iddefault_subproject_workflow_iddefault_release_workflow_iddefault_document_workflow_iddefault_task_workflow_iddefault_subtask_workflow_id)r"   rp   r2   schemes       r&   _dump_workflow_schemezCmfExport._dump_workflow_schemes   s     d.K.KLsTLL##''9dD_=`'a%%,,V\\&-ABF;;<F;;<FAABF>>?F??@F;;<F>>? Ms   D,
project_idc                    t         j                  j                  |g d      D ]  }| j                  d       | j                  j                  t        |dz  |j                  j                  z  dz        |j                                | j                  |j                         | j                  |j                         | j                  ||        y )N)r   rD   rE   )projectr+   rU   listsrb   )r   CmfListrU   r;   r   rV   r>   r    r!   r1   r{   scheme_wf_idr4   r(   r?   )r"   r5   r|   cmf_lists       r&   _dumps_listszCmfExport._dumps_lists   s    ++JGg+h 	1H'JJHw$69J9J$J[$X Y[c[i[i[kl&&x'<'<= 4 45Xx0	1r'   c                    dd l }|dz  }d}t        j                  j                  |      }t	        d|j                  ||z              D ]  }t        j                  j                  |g d||z  ||z  |z   g      D ]  }| j                  d       ||j                  j                  z  }	|	dz  }
| j                  j                  t        |
      |j                                | j                  |	|j                         | j!                  |j"                         | j%                  |j&                         | j)                  ||         y )	Nr   tasks2   )r~   r`   )r~   r+   slicetaskrb   )mathr   CmfTaskcountrangeceilrU   r;   r    r!   r   rV   r>   r1   r:   r6   r{   r   r4   r(   r?   )r"   r5   r|   r   	tasks_dirstepcntchunkr   task_dirtask_file_paths              r&   _dumps_taskszCmfExport._dumps_tasks   s*   w&	nn"":"61diid
34 	1E++J Hc384<PTAT2U , W 
1 ##F+$tww}}4!)K!7

##C$7F&&x1A1AB**4+<+<=##D$4$45  40
1	1r'   c           
      8   t        g d      | _        t        j                         5 }t	        |d      }t	        |d      }t        j                  |dt
        j                        5 | _        | j                  j                  dd       t	        d      }g d}t        j                  j                  |	      D ]  }	 g | _        g | _        i | _        | j                  |j                   j"                         ||j$                  j"                  z  }	| j                  j'                  t)        |	d
z        |j+                                | j-                  |	|j$                         | j/                  |	|j$                         | j1                  |	|       | j                  j'                  t)        |	dz        t2        j+                  | j                               | j                  j'                  t)        |	dz        t2        j+                  | j                               | j                  j'                  t)        |	dz        t2        j+                  d| j                  i              t;        |dd      5 }t=        j>                  |      jA                  | j                  g       d d d        | j                  j                  |d       d d d        t        jB                  jE                  | dg      }t;        |d      5 }|jG                  |d       d d d        d d d        y # t4        $ r?}
| j                  j7                  dt)        |
      d|j8                   g       Y d }
~
d }
~
ww xY w# 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   uxY w# 1 sw Y   y xY w)N)FunctionErrorDetailszerror_log.csvz
backup.tmpwz/opt/eva_versioneva_versionprojects)ra   rD   rE   )r+   rb   )r|   zworkflows.jsonzwf_schemes.jsonzdump_info.jsonstatsprocess_backupu,   Ошибка дампа проекта href= )newline	file_type)r   r+   rbF)backup)$rU   r   tempfileTemporaryDirectoryr   zipfileZipFileZIP_DEFLATEDr   r<   r   
CmfProjectr   r   r   r4   r(   r!   r    rV   r>   r1   r   r   rg   jsonr@   r0   hrefopencsvwriter	writerowsr   r/   upload_stream_file)r"   r   kwargstmp_direrror_log_filebackup_fileprojects_dir_fieldsr~   project_dirrB   csvfiler%   fs                 r&   r   zCmfExport.process_backup   s$   <=((* $	;g!'?;Nw5Kc73G3GH BDJ

  !3]C#J/;%0055W5E GGG13.8:5*,++G,?,?,E,EF&2WZZ5E5E&E

++Ck0I,JGMMO\))+'**)M))+'**)M,,['B

++C>N0N,OQUQ[Q[\`\r\rQst

++.? ?@$**TMjMjBk 

++.> >?WVZVeVeLfAg#G, .#r: BgJJw'114<<.AB 

  A;B> ))--T;--PFk4( ;A))!E):;G$	; $	;6 % G++-=s1vIuv}  wC  wC  vD  HE  -F  G  GGB B5B B@; ;G$	; $	;s   >N%AM8;F&L!!M820M,"$M86N<NN!	M)	*4M$	M8$M)	)M8,M51M88N	=NN		NNu   Экспорт проектовTF)descriptionshow_bg_progressbar
system_job	only_oncec                 d    t         j                  j                  |       } |j                         S )N)r    )r   r	   r/   r   )cmf_export_idr   s     r&   r   zCmfExport.job_create_backup   s.     %%))]);
(z((**r'   )r   r   ro   )   )r   N)__name__
__module____qualname__r   r	   api_methodsrU   __annotations__r   r   r,   r
   r>   r4   r   r   r   r:   r?   rg   intr;   r{   r   r   r   staticmethodcmf_deferred_jobr    r'   r&   r	   r	   
   sS    &&22o5FFK""??M$	C# 	C$ 	C bfA A/3O/DAPXY]P^AAN(, ,Xd^ ,_c ,4(# (C ( (@s @t @$1T 1s 1t 11T 1s 1t 1$&;P "CY]jo{  A+ A +r'   r	   )cmf.includemodules.export.fieldsr   r   r   pathlibr   r   typingr   r   r	   r   r'   r&   <module>r      s+     ,   
 !A+
$$ A+r'   