U
    3f7*                     @   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csvc           
   	   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_filer   r   r   Zformatted_timeZexport_filename
attachment r   ./cmf/util/cmf_export.pyexport2file
   s    


r   u'   Экспорт данных в файлT)descriptionZshow_bg_progressbarc           3         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|| || qLW 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&|+_|'|+ qNn t(||||'_|'d5||  q6q|"d8t(| |"d9t(| |-|.| n6|d:krdd;l/m0}, dd<l1m2}- dd=l1m3}. dd>l1m4}/ |,5 }0| d?}|0j6}1d@|1_7g }t|
|D ]\}}g }|D ]}|dkr||| |dkr||| d |||| |dkrV||||d}||j qV|dkr|1| |1| qF|08| nt9dA| t|dB*}2|:  |	j;|2dCdCdD 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   sV   d}d}d| krdg|  } j  ||| g| d}|s8qR||7 }|D ]
}|V  qDqd S )Nr   iP  z--)filterslicefields)Zslist)r#   startstepdatarow)r   clsr   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   )splitr0   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)r6   r#   getcopyvarsr   cmfr<   captionlenr0   r>   r4   )Z	class_obj
field_namepural_namesr9   resZ
models_clsZ
model_nameget_captionr   r   rI   O   s    

&z;export2file_task.<locals>.get_captions.<locals>.get_captionr   )r;   rG   rE   )r(   rH   r   get_captionsN   s
    z&export2file_task.<locals>.get_captionsc                 S   s   g | ]}|j r|jqS r   )Zvisibler   )r,   r9   r   r   r   r/   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
   rC   valuer   endtotalZxlsx)workbook)open_workbook)XL_CELL_DATE)xldate_as_tuplez/export.xlsxu   Выгрузкаu7   Это формат не поддерживается: rbF)ZbackupZmake_preview)<shutilbs4r   r   rA   r   r   r?   r3   r#   values
issubclassrB   Z
CmfRelBaseappendtempfileZTemporaryDirectoryopenr   writerZQUOTE_MINIMAL	enumerateZBeautifulSouprN   ZwriterowZ	xml.etreerO   pathlibr   ZElementsetZrequestr   dictr6   r7   ZCmfRelationBaser   r
   r0   r1   rC   Z
CmfM2MBaseZCmfBackrefBaser   Zwrite_bytesZtostringZopenpyxlr]   Zxlrdr^   r_   r`   ZWorkbookZactiverS   r   	Exceptionr   Zupload_stream_file)3r   Zres_attachment_idr   r   r   _kwargsrb   rc   r   r   r)   r:   rJ   Z
new_fieldsrE   ZcaptionsZtmpdirZ	file_pathZcsvfiler   ri   Zcsv_headir'   Zcsv_rowr9   ZsoupZETr   rP   rR   rS   rT   r    rV   rX   rY   elementsrF   Z
field_infoZfield_valuekeyvrZ   r]   r^   r_   r`   Z	book_xlsxZ
sheet_xlsxfr   )r   r(   r.   r   r      s   "

 



































r   )NNNr   )NNr   )r   rk   r   Z
cmf.configr   Z
cmf.fieldsrB   builtinsr@   rg   r   Zcmf_deferred_jobr   r   r   r   r   <module>   s   

