U
    Af#                     @   sF   d dl T d dlmZ d dlZd dlZd dlmZ G dd dejZdS )    )*)
cmf_exportN)Pathc                   @   s   e Zd ZU ejjdg Zeed< eed< ej	ed< e
ed< dd Zdd	 Zd'eeedddZdd Zd(eedddZd)eedddZedddZeedddZeedddZdd  Zeed!d"d#d"d$d%d& Zd
S )*	CmfExportcreate_backup_dumped_workflows_dumped_workflows_scheme_zipf
_dump_infoc                 C   sr   ddl m } | d}d| d}| dg | jrD| jd }ntj| |d}|  t| j	| j
jgd |S )	Nr   )datetimez%Y%m%d%H%M%SZbackup_z.zipzbackup_files.url)parentname)args)r   Znowstrftimeload_fieldsZbackup_filesmodelsCmfAttachmentZsaveZschedule_deferred_jobjob_create_backupidvalue)selfr   Zcurrent_timeZbackup_file_nameattach r   %./modules/export/models/cmf_export.pyr      s    zCmfExport.create_backupc                 C   sD   |dd | j D krdS tjj|ddgd}| j |jdd dS )	u   Собираем данные по воркфлоу в отдельный список чтобы потом его сохранить

        Args:
            workflow_id (str): TUUID воркфлоу
        c                 S   s   g | ]}|d  qS r   r   .0objr   r   r   
<listcomp>%   s     z,CmfExport._dump_workflow.<locals>.<listcomp>Nz
statuses.*ztrans.**r   fieldsdict)type)r   r   ZCmfWorkflowgetappenddumps)r   workflow_idZworkflowr   r   r   _dump_workflow   s    zCmfExport._dump_workflowN)dump_dirattachmentsroot_dirc                 C   sT   |d kr|}|d }|D ]6}|  d | j|jt||jj  | || qd S )Nr)   Z
attachment)_inc_dump_infor	   writeZfull_path_filestrr   r   _dump_users)r   r(   r)   r*   Zattach_pathr   r   r   r   _dump_attachments*   s    
zCmfExport._dump_attachmentsc           	      C   s
  | ddg t }|d }dD ]F}t||r t||r t||j}t|| | j kr\q || q dD ]V}t||rlt||rlt||	 D ].}t||j
j | j krq||j
j qqltjjddgdd	t|gd
D ]"}| jt||j
j |  qd S )N	executors
spectatorsZusers)Zcmf_author_idZcmf_owner_idZresponsible_idZcmf_modified_by_idZwaiting_for_id)r0   r1   r   zrg_member_of.*r   IN)r    filter)r   sethasattrgetattrr   r-   r	   ZnamelistaddZ
all_nestedr   r   Z	CmfPersonlistwritestrr%   )	r   r(   r   Zuser_idsZ	users_dirZuser_keyZuser_idZ
field_nameuserr   r   r   r.   3   s"    "zCmfExport._dump_users)r*   r(   c                 C   s  dd|g}|dkr|d }t jj|ddddgd	D ]b}||jj }| jt|d
 |  | 	d | 
|||d  | ||j| | || q2t jj|ddddgd	D ]b}||jj }| jt|d
 |  | 	d | 
|||d  | ||j| | || qdS )u   Дампим документы сохраняя иерархию

        Args:
            dump_dir (Path): директория для дампа
            tree_parent (CmfProject, CmfFolder, CmfDocument): родитель в дереве
        tree_parentz==NZ	documents**attachments.*r0   r1   )r3   r    	info.jsonZdocumentZchildrenZfolder)r   ZCmfDocumentr8   r   r   r	   r9   r-   r%   r+   _dump_documentsr/   r)   r.   Z	CmfFolder)r   r*   r;   r(   Z_filterdocZdoc_dirr   r   r   r?   H   s"    


zCmfExport._dump_documents   )keyvalc                 C   s,   || j kr|| j |< n| j |  |7  < d S )N)r
   )r   rB   rC   r   r   r   r+   b   s    
zCmfExport._inc_dump_info)	scheme_idc                 C   s   |dd | j D krdS tjj|ddgd}| j |d | |j | |j | |j	 | |j
 | |j | |j | |j dS )ub   Дампим схему БП

        Args:
            scheme_id (str): TUUID схемы
        c                 S   s   g | ]}|d  qS r   r   r   r   r   r   r   n   s     z3CmfExport._dump_workflow_scheme.<locals>.<listcomp>Nr<   zscheme_wf.scheme_wf_rulesr   r!   )r   r   ZCmfSchemeWfr#   r$   r%   r'   Zdefault_list_workflow_idZdefault_epic_workflow_idZdefault_subproject_workflow_idZdefault_release_workflow_idZdefault_document_workflow_idZdefault_task_workflow_idZdefault_subtask_workflow_id)r   rD   Zschemer   r   r   _dump_workflow_schemeh   s    zCmfExport._dump_workflow_scheme)r(   
project_idc                 C   st   t jj|dddgdD ]X}| d | jt|d |jj d |	  | 
|j | |j | || qd S )Nr   r0   r1   )projectr    r8   Zlistsr>   )r   ZCmfListr8   r+   r	   r9   r-   r   r   r%   rE   scheme_wf_idr'   r&   r.   )r   r(   rF   Zcmf_listr   r   r   _dumps_listsz   s    
&zCmfExport._dumps_listsc                 C   s   dd l }|d }d}tjj|d}td||| D ]}tjj|ddddg|| || | gd	D ]j}| d
 ||jj	 }	|	d }
| j
t|
|  | |	|j | |j | |j | || qdq6d S )Nr   Ztasks2   )rG   r<   r=   r0   r1   )rG   r    slicetaskr>   )mathr   ZCmfTaskcountrangeZceilr8   r+   r   r   r	   r9   r-   r%   r/   r)   rE   rH   r'   r&   r.   )r   r(   rF   rM   Z	tasks_dirstepZcntchunkrL   Ztask_dirZtask_file_pathr   r   r   _dumps_tasks   s&     

zCmfExport._dumps_tasksc              
   O   s  t  l}t|d}t|dtj| _| jdd td}dddg}tj	j
|d	D ]}t
 | _t
 | _t | _| |jj ||jj }| jt|d
 |  | j||jd | j||jd | || | jt|d t| j | jt|d t| j | jt|d td| ji qZW 5 Q R X tjj| d}	t|d}
|	j|
dd W 5 Q R X W 5 Q R X d S )Nz
backup.tmpwz/opt/eva_versionZeva_versionZprojectsr<   r0   r1   )r    r>   )rF   zworkflows.jsonzwf_schemes.jsonzdump_info.jsonZstats)r   rbF)Zbackup)tempfileZTemporaryDirectoryr   zipfileZipFileZIP_DEFLATEDr	   r,   r   Z
CmfProjectr8   r   r   r!   r
   r'   r&   r   r   r9   r-   r%   rI   rR   r?   Zjsonr   r#   openZupload_stream_file)r   r   kwargsZtmp_dirZbackup_fileZprojects_dir_fieldsrG   Zproject_dirr   fr   r   r   process_backup   s,    

.zCmfExport.process_backupu   Экспорт проектовTF)descriptionZshow_bg_progressbarZ
system_jobZ	only_oncec                 C   s   t jj| d}| S )Nr   )r   r   r#   r]   )Zcmf_export_idr   r   r   r   r      s    zCmfExport.job_create_backup)N)N)rA   )__name__
__module____qualname__r   r   Zapi_methodsr8   __annotations__rV   rW   r!   r   r'   r   r/   r.   r?   r-   intr+   rE   rI   rR   r]   staticmethodZcmf_deferred_jobr   r   r   r   r   r      s(   

	r   )Zcmf.includeZmodules.export.fieldsr   rV   rU   pathlibr   r   r   r   r   r   <module>   s   