U
    1[h'=                     @   sV   d dl T d dlT d dlZd dlZd dlT d dlZdddZeddd	d
dddZ	dS )    )*NcsvFc              
   K   s   ddl m}m} tj }	|	d}
dtjj d|
 d| }t	j
tj|d}|  |  W 5 Q R X |t| |j|||||d|d |jS )	Nr   )schedule_deferred_jobcmfutilz%Y%m%d%H%M%Szexport..)parentname)
class_nameres_attachment_idfield_namesbqlformat_fileinclude_archivedorder_by)kwargs)cmf.includer   r   datetimenowstrftimegZcurrent_useridmodelsCmfAttachmentdisable_aclsaveexport2file_taskurl)r	   r   r   r   r   r   r   r   r   r   Zformatted_timeZexport_filename
attachment r   ./cmf/util/cmf_export.pyexport2file	   s$    


r    u'   Экспорт данных в файл   T)descriptionpriorityZshow_bg_progressbarc           0         s  ddl ddlm | dk		r$d} tt|  tjj|d}tdfdd	 fd
d}	dPfdd	dd 
tdfdd}
sdd j	
 D t }D ]F}|dkrd}n*j	|rtj	|tj	jr|d7 }|| q||
dkrdd< t }|dkrD| d}t|ddd}ddl}|j|dd|jd }g t|	D ]\g }D ]}dkr| |d!kr| d" 
|}t|d}||| |d!kr
|d#}||j qdkr(| || qpW 5 Q R X n(|d$krRdd%lm} dd&lm} ||d'}|d(}|d)d* |d+}|| |d,}d-|_|| |d.}t j!|_|| |d/}d0|_|| |d1}d2|_|| |d3}|d4d5 || |d6}|| t|	D ]\|d7} t" }!||  D ]}|#d8}"j	|"d }|"d |!kr||"d |!|"d < | |!|"d   |!|"d }#t|"d }t|tj	j$rT|rtt|j% j	D ]>}$|$d9kr|j&|#_qt'||$r|#|$t(t||$ q|#d:|j) nt|tj	j*tj	j+fr|r|#d:|j) |D ]0}%|d;}&|&d<|%j, |%j&|&_|#|& qn^t|tj	j-r|dkr֐ql|j.|d|#_|#d:|j) n t(
||#_|#d:|  qlqD|d=t( |d>t( |/|0| n|d?kr^dd@l1m2}' ddAl3m4}( ddBl3m5}) ddCl3m6}* |'7 }+| dD}	
fdEdF},|+j8dG_9g 	r4|dHd}-|dIddJdK |	D }.t|-D ]&\|.ds(q
|,  q
nt|	D ]\|,  q@|+:| nt;dL| t|dM*}/<  |j=|/dNdNdO W 5 Q R X W 5 Q R X W 5 Q R X dS )QzN
    https://bcrm.carbonsoft.ru/project/Document/DOC-007693#spec-007668-b
    r   Nr   Z
CmfRoadmapZCmfTask)r   )returnc                    s     | j}| j}t|tjjo$| j}t|tjjo8| j	}t|tjjoL| j
}t|tjjo`| j}tjj|| j|| j||d|dd	S )NreadF)	initial_acl_keyZobject_modelZobject_owner_idZ	object_idZobject_parent_idZobject_dictZaccess_levelZperm_security_level_allowed_idsZraise_error)Zget_model_by_namer	   __dict__
issubclasscmfr   	CmfEntityperm_effective_acl_idZCmfModelcmf_owner_id	parent_id%perm_security_level_allowed_ids_cacheZCmfAccessListZcheck_accessr   )objmodelZobj_dictr'   Zobj_owner_idZobj_parent_idr/   r$   r   r   check_access_obj;   s"         z*export2file_task.<locals>.check_access_objc                 3   s   d}d}d| krdg|  } dddddd	d
dddddg}j  ||| g| | d}|s\q~||7 }|D ]}|rh|V  qhq6d S )Nr   iP  z--r-   Zaccess_authorZcmf_author_idZperm_security_level_idZaccess_responsibleZresponsible_idZ
spectatorsZ	executorsZ
project_idr.   r,   r/   )filterslicefieldsr   r   )Zslist)r5   startstepZsecurity_fieldsdatarow)r   r2   clsr   r   r   r   paginate_dataJ   s:    
         
z'export2file_task.<locals>.paginate_datac                    s   | d krdS t | dr t| jS t | dr4t| jS t| trVd fdd| D S |r~t|tj	j
tj	jfr~|j| | S | rt| S dS d S )N r   r   ,c                    s   g | ]} |qS r   r   ).0r9   convert_valr   r   
<listcomp>j   s     z9export2file_task.<locals>.convert_val.<locals>.<listcomp>)hasattrstrr   r   
isinstancelistjoinr)   r*   r5   CmfChoiceIntZ	CmfChoicechoicesget)val	field_objr?   r   r   r@   b   s    




z%export2file_task.<locals>.convert_valc                 S   s(   | dD ]}t| |r
t| |} q
| S )u   
        Получить поле объекта. Как getattr, только работает с вложенными полями
        Например: get_included_attr(doc, 'person.second_name')
        r   )splitrB   getattr)r0   Z	field_strfieldr   r   r   get_included_attrp   s    
z+export2file_task.<locals>.get_included_attr)fields_namec                    s,    fdd i }| D ]} |||< q|S )Nc           	   	      s   | d}| j|d }ddi}|sV| j| krVtt|| j  }|j|d }|}ttt}tjj	|d< |r|j
}t|dkrt|dr|jr|jd }nt|dr|j}n|S | d || d|dd   }|S )	Nr   r   ZCmfTestplanTestcaseZCmfTestcaser+      r   r1   )rL   r5   rI   r	   keysvarsr   copyr*   r+   captionlenrB   r1   rF   )	Z	class_obj
field_namepural_namesrN   Zlinked_entityZlinked_class_objresZ
models_clsZ
model_nameget_captionr   r   r[   |   s*    
 
&z;export2file_task.<locals>.get_captions.<locals>.get_captionr   )rP   rY   rW   )r:   rZ   r   get_captions{   s
    z&export2file_task.<locals>.get_captionsc                 S   s   g | ]}|j r|jqS r   )Zvisibler	   )r>   rN   r   r   r   rA      s      z$export2file_task.<locals>.<listcomp>Ztimetracker_historyzop_gantt_task.actual_workz.nameuG   Журнал работ.Фактические трудозатратыr   z/export.csvzw+r<   )newline;")Z	delimiterZ	quotecharZquotingtextZresult_text    без htmllxmlZxml)ElementTree)Pathz
export.xmlrssversionz0.92channeltitleZEvaTeamlinkr"   u+   XML представление данныхlanguagezru-rutaskr6   0
build_infoitemr   r   rU   valuer   endtotalZxlsx)workbook)open_workbook)XL_CELL_DATE)xldate_as_tuplez/export.xlsxc            	         s  g } D ]}dkrB | |dkrB | d 
|}t|d }|  || |dkr 
|d}|  |j qdkr   |  r	 }j}j| }t|d|_|dk|_	j
|dd}|jd k	rd|d	   |j |_d S )
Nr   r`   rb   rc      rQ   )r9   column    )appendrI   rM   BeautifulSoupra   Zmax_rowZrow_dimensionsminZoutlineLevelZhiddenZcellrp   )	csv_rowrN   field_valuerK   soupdepthZxl_rowZrdZ
first_cell)bs4captionsr:   r@   csv_headr   from_roadmaprO   iroadmap_level_ofr9   
sheet_xlsxtidr   r   	write_row  s0    




z#export2file_task.<locals>.write_rowu   Выгрузкаroadmap_ordered_idsr   c                 S   s   i | ]}t |j|qS r   )rC   r   )r>   r0   r   r   r   
<dictcomp>B  s      z$export2file_task.<locals>.<dictcomp>u7   Это формат не поддерживается: rbF)ZbackupZmake_preview)N)>r   r   r   rS   r   r   rI   boolrE   r5   valuesr)   r*   Z
CmfRelBaser{   tempfileZTemporaryDirectoryopenr   writerZQUOTE_MINIMAL	enumeraterM   r|   ra   ZwriterowZ	xml.etreerd   pathlibre   ZElementsetZrequestr   dictrL   ZCmfRelationBaser	   r   rB   rC   rU   Z
CmfM2MBaseZCmfBackrefBaser   rG   rH   write_bytesZtostringZopenpyxlrs   Zxlrdrt   ru   rv   ZWorkbookZactiveri   r   	Exceptionr   Zupload_stream_file)0r	   r
   r   r   r   r   r   r   r   r;   r\   Z
new_fieldsrW   ZtmpdirZ	file_pathZcsvfiler   r   r~   rN   r   rK   r   ZETre   rf   rh   ri   rj   r"   rl   rn   ro   elementsrX   Z
field_infokeyvrp   rs   rt   ru   rv   Z	book_xlsxr   r   Z	id_to_objfr   )r   r   r   r2   r:   r   r@   r   r   r   rO   r   r   r   r   r9   r   r   r   r   %   s   "


 































$#

r   )NNNr   FN)NNr   FN)
r   Z
cmf.configr   Z
cmf.fieldsr*   rT   r   r    Zcmf_deferred_jobr   r   r   r   r   <module>   s   
     