U
    g&                     @   sN   d dl T d dlmZ d dlZd dlZd dlmZ d dl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< 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_info_errorsc                 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   s   |d kr|}|d }|D ]|}z6|  d | j|jt||jj  | || W q tk
r } z"| j	
dt|d|j g W 5 d }~X Y qX qd S )Nr*   Z
attachment_dump_attachmentsu.   Ошибка дампа вложения id = )_inc_dump_infor	   writeZfull_path_filestrr   r   _dump_users	Exceptionr   r%   )r   r)   r*   r+   Zattach_pathr   er   r   r   r,   ,   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)r3   r4   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   r0   8   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.*r3   r4   )r6   r!   	info.jsonZdocumentZchildrenZfolder)r   ZCmfDocumentr;   r   r   r	   r<   r/   r&   r-   _dump_documentsr,   r*   r0   Z	CmfFolder)r   r+   r>   r)   Z_filterdocZdoc_dirr   r   r   rB   M   s"    


zCmfExport._dump_documents   )keyvalc                 C   s,   || j kr|| j |< n| j |  |7  < d S )N)r
   )r   rE   rF   r   r   r   r-   g   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   s   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   rG   schemer   r   r   _dump_workflow_schemem   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   r3   r4   )projectr!   r;   ZlistsrA   )r   ZCmfListr;   r-   r	   r<   r/   r   r   r&   rI   scheme_wf_idr(   r'   r0   )r   r)   rJ   Zcmf_listr   r   r   _dumps_lists   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   )rK   r?   r@   r3   r4   )rK   r!   slicetaskrA   )mathr   ZCmfTaskcountrangeZceilr;   r-   r   r   r	   r<   r/   r&   r,   r*   rI   rL   r(   r'   r0   )r   r)   rJ   rQ   Z	tasks_dirstepZcntchunkrP   Ztask_dirZtask_file_pathr   r   r   _dumps_tasks   s&     

zCmfExport._dumps_tasksc                 O   s   t dddg| _t }t|d}t|d}t|dtj| _| j	dd td	}d
ddg}t
jj |dD ]"}zt  | _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 W qt tk
r }
 z"| jdt|
d|j g W 5 d }
~
X Y qtX qtt|ddd}t |!| jg W 5 Q R X | j	|d W 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FunctionErrorZDetailszerror_log.csvz
backup.tmpwz/opt/eva_versionZeva_versionZprojectsr?   r3   r4   )r!   rA   )rJ   zworkflows.jsonzwf_schemes.jsonzdump_info.jsonZstatsprocess_backupu,   Ошибка дампа проекта href= )newline)r   rbF)Zbackup)%r;   r   tempfileZTemporaryDirectoryr   zipfileZipFileZIP_DEFLATEDr	   r.   r   Z
CmfProjectr   r   r"   r
   r(   r'   r   r   r<   r/   r&   rM   rV   rB   Zjsonr1   r%   ZhrefopencsvwriterZ	writerowsr   r$   Zupload_stream_file)r   r   kwargsZtmp_dirZerror_log_fileZbackup_fileZprojects_dir_fieldsrK   Zproject_dirr2   Zcsvfiler   fr   r   r   rY      s<    


&2zCmfExport.process_backupu   Экспорт проектовTF)descriptionZshow_bg_progressbarZ
system_jobZ	only_oncec                 C   s   t jj| d}| S )Nr   )r   r   r$   rY   )Zcmf_export_idr   r   r   r   r      s    zCmfExport.job_create_backup)N)N)rD   )__name__
__module____qualname__r   r   Zapi_methodsr;   __annotations__r^   r_   r"   r   r(   r   r,   r0   rB   r/   intr-   rI   rM   rV   rY   staticmethodZcmf_deferred_jobr   r   r   r   r   r      s*   

%r   )	Zcmf.includeZmodules.export.fieldsr   r^   r]   pathlibr   rb   r   r   r   r   r   <module>   s
   