B
    Ff7*                 @   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 d 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nowZ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 }xN|D ]F}|dkrd}n*j	|rtj	|tj	jr|d7 }|| qW |}||}d|krd|d< t |}|dkr| d}t|ddd}ddl}|j|dd|jd}g }xt|
|D ]\}}g }x|D ]}|dkr||| |dkr||| d |||| |dkrd||||d}||j qdW |dkr|| || qRW W d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}#||# xt|
|D ]\}}|d2}$t! }%||$ x~|D ]t}|"d3}&j	|&d }|&d |%kr||&d |%|&d < |$|%|&d   |%|&d }'t#||&d }(t|tj	j$r6|(rxRtt|(j% j	D ]>})|)d4kr|(j&|'_qt'|(|)r|'|)t(t#|(|) qW |'d5|j) nt|tj	j*tj	j+fr|(r|'d5|j) xZ|(D ]0}*|d6}+|+d7|*j, |*j&|+_|'|+ qhW n t(||||'_|'d5||  qJW qW |"d8t(| |"d9t(| |-|.| n>|d:kr.dd;l/m0}, dd<l1m2}- dd=l1m3}. dd>l1m4}/ |,5 }0| d?}|0j6}1d@|1_7g }xt|
|D ]\}}g }x|D ]}|dkr||| |dkr||| d |||| |dkrz||||d}||j qzW |dkr|1| |1| qhW |08| nt9dA| t|dB*}2|:  |	j;|2dCdCdD W dQ R X W dQ R X W dQ R X dS )EzN
    https://bcrm.carbonsoft.ru/project/Document/DOC-007693#spec-007668-b
    r   N)r   )r   c             3   s^   d}d}d| krdg|  } x>j  ||| g| d}|s:P ||7 }x|D ]
}|V  qHW qW 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)val)r+   r   r   r+   7   s    




z%export2file_task.<locals>.convert_valc             S   s,   x&| dD ]}t| |rt| |} qW | S )u   
        Получить поле объекта. Как getattr, только работает с вложенными полями
        Например: get_included_attr(doc, 'person.second_name')
        r   )splitr-   getattr)objZ	field_strfieldr   r   r   get_included_attrC   s    
z+export2file_task.<locals>.get_included_attr)fields_namec                s0    fdd i }x| D ]} |||< qW |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)r3   r!   getcopyvarsr   cmfr9   captionlenr-   r;   r1   )Z	class_obj
field_namepural_namesr6   resZ
models_clsZ
model_name)get_captionr   r   rE   O   s    

&z;export2file_task.<locals>.get_captions.<locals>.get_captionr   )r8   rD   rB   )r&   )rE   r   get_captionsN   s
    
z&export2file_task.<locals>.get_captionsc             S   s   g | ]}|j r|jqS r   )Zvisibler   )r*   r6   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)ElementTree)r   z
export.xmlrssversionz0.92channeltitleZEvaTeamlinkr   u+   XML представление данныхlanguagezru-rutaskr"   0
build_infoitemr   r	   r@   valuer   endZtotalZxlsx)workbook)open_workbook)XL_CELL_DATE)xldate_as_tuplez/export.xlsxu   Выгрузкаu7   Это формат не поддерживается: rbF)ZbackupZmake_preview)<shutilbs4r   r   r>   r   r   r<   r0   r!   values
issubclassr?   Z
CmfRelBaseappendtempfileZTemporaryDirectoryopenr   writerZQUOTE_MINIMAL	enumerateZBeautifulSouprJ   ZwriterowZ	xml.etreerK   pathlibr   ZElementsetZrequestr   dictr3   r4   ZCmfRelationBaser   r	   r-   r.   r@   Z
CmfM2MBaseZCmfBackrefBaser   Zwrite_bytesZtostringZopenpyxlrX   ZxlrdrY   rZ   r[   ZWorkbookZactiverO   r   	Exceptionr   Zupload_stream_file)3r   Zres_attachment_idr   r   r   Z_kwargsr]   r^   r   r   r'   r7   rF   Z
new_fieldsrB   ZcaptionsZtmpdirZ	file_pathZcsvfiler   rd   Zcsv_headir%   Zcsv_rowr6   ZsoupZETr   rL   rN   rO   rP   r   rR   rT   rU   elementsrC   Z
field_infoZfield_valuekeyvrV   rX   rY   rZ   r[   Z	book_xlsxZ
sheet_xlsxfr   )r   r&   r+   r   r      s   
"







































r   )NNNr   )NNr   )r   rf   r   Z
cmf.configr   Z
cmf.fieldsr?   builtinsr=   rb   r   Zcmf_deferred_jobr   r   r   r   r   <module>   s   

