U
    g*                     @   sh   d dl T d dlmZ d dlT d dlZ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ZdS )    )*PathNcsvFc              	   C   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||||gd |
jS )Nr   )schedule_deferred_jobcmfutilz%Y%m%d%H%M%Szexport..)parentname)args)cmf.includer   r   datetimenowstrftimegZcurrent_useridmodelsCmfAttachmentdisable_aclsaveexport2file_taskurl)
class_namefield_namesbqlformat_fileinclude_archivedr   r   r   Zformatted_timeZexport_filename
attachment r   ./cmf/util/cmf_export.pyexport2file
   s    


r    u'   Экспорт данных в файлT)descriptionZshow_bg_progressbarc           4         s^  ddl }ddl}ddlm}	 tt|  tjj|d}
 fdd}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rd|d< t X}|dkr| 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 |||| |dkr^||||d}||j q^|dkr|| || qNW 5 Q R X n|dkrdd lm} dd!lm} ||d"}|d#}|d$d% |d&}|| |d'} d(| _||  |d)}!tj |!_||! |d*}"d+|"_||" |d,}"d-|"_||" |d.}#|#d/d0 ||# |d1}$||$ t||D ]\}}|d2}%t! }&||% |D ]l}|"d3}'j	|'d }|'d |&kr||'d |&|'d < |%|&|'d   |&|'d }(t#||'d })t|tj	j$r |)rtt|)j% j	D ]>}*|*d4kr|)j&|(_qt'|)|*r|(|*t(t#|)|* q|(d5|j) nt|tj	j*tj	j+fr|)r|(d5|j) |)D ]0}+|d6},|,d7|+j, |+j&|,_|(|, qPn t(||||(_|(d5||  q8q|#d8t(| |#d9t(| |-|.| n6|d:krdd;l/m0}- dd<l1m2}. dd=l1m3}/ dd>l1m4}0 |-5 }1| d?}|1j6}2d@|2_7g }t||D ]\}}g }|D ]}|dkr||| |dkr||| d |||| |dkrX||||d}||j qX|dkr|2| |2| qH|18| nt9dA| t|dB*}3|	:  |
j;|3dCdCdD W 5 Q R X W 5 Q R X W 5 Q R X dS )EzN
    https://bcrm.carbonsoft.ru/project/Document/DOC-007693#spec-007668-b
    r   N)r   )r   c                 3   sX   d}d}d| krdg|  } j  ||| g| d}|s:qT||7 }|D ]
}|V  qFqd S )Nr   iP  z--)filterslicefieldsr   )Zslist)r$   startstepdatarow)r   clsr   r   r   paginate_data*   s    
z'export2file_task.<locals>.paginate_datac                    s^   | sdS t | drt| jS t | dr0t| jS t| trRd fdd| D S t| S d S )N r
   r   ,c                    s   g | ]} |qS r   r   ).0r(   convert_valr   r   
<listcomp>?   s     z9export2file_task.<locals>.convert_val.<locals>.<listcomp>)hasattrstrr
   r   
isinstancelistjoin)valr.   r   r   r/   7   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   )splitr1   getattr)objZ	field_strfieldr   r   r   get_included_attrC   s    
z+export2file_task.<locals>.get_included_attr)fields_namec                    s,    fdd i }| D ]} |||< q|S )Nc              	      s   | d}| j|d }|}ttt}tjj|d< |r|j}t	|dkrt
|drh|jrh|jd }nt
|drz|j}n|S | d || d|dd   }|S )Nr   r   	CmfEntity   r   model)r7   r$   getcopyvarsr   cmfr=   captionlenr1   r?   r5   )Z	class_obj
field_namepural_namesr:   resZ
models_clsZ
model_nameget_captionr   r   rJ   O   s    

&z;export2file_task.<locals>.get_captions.<locals>.get_captionr   )r<   rH   rF   )r)   rI   r   get_captionsN   s
    z&export2file_task.<locals>.get_captionsc                 S   s   g | ]}|j r|jqS r   )Zvisibler   )r-   r:   r   r   r   r0   h   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_textu    без htmlZlxmlZxml)ElementTreer   z
export.xmlrssversionz0.92channeltitleZEvaTeamlinkr!   u+   XML представление данныхlanguagezru-rutaskr%   0
build_infoitemr   r
   rD   valuer   endtotalZxlsx)workbook)open_workbook)XL_CELL_DATE)xldate_as_tuplez/export.xlsxu   Выгрузкаu7   Это формат не поддерживается: rbF)ZbackupZmake_preview)<shutilbs4r   r   rB   r   r   r@   r4   r$   values
issubclassrC   Z
CmfRelBaseappendtempfileZTemporaryDirectoryopenr   writerZQUOTE_MINIMAL	enumerateZBeautifulSouprO   ZwriterowZ	xml.etreerP   pathlibr   ZElementsetZrequestr   dictr7   r8   ZCmfRelationBaser   r
   r1   r2   rD   Z
CmfM2MBaseZCmfBackrefBaser   write_bytesZtostringZopenpyxlr^   Zxlrdr_   r`   ra   ZWorkbookZactiverT   r   	Exceptionr   Zupload_stream_file)4r   Zres_attachment_idr   r   r   r   _kwargsrc   rd   r   r   r*   r;   rK   Z
new_fieldsrF   ZcaptionsZtmpdirZ	file_pathZcsvfiler   rj   Zcsv_headir(   Zcsv_rowr:   ZsoupZETr   rQ   rS   rT   rU   r!   rW   rY   rZ   elementsrG   Z
field_infoZfield_valuekeyvr[   r^   r_   r`   ra   Z	book_xlsxZ
sheet_xlsxfr   )r   r)   r/   r   r   r      s   "

 



































r   )NNNr   F)NNr   F)r   rl   r   Z
cmf.configr   Z
cmf.fieldsrC   builtinsrA   rh   r    Zcmf_deferred_jobr   r   r   r   r   <module>   s   

