U
    g0                     @   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_archivedorder_byr   r   r   Zformatted_timeZexport_filename
attachment r   ./cmf/util/cmf_export.pyexport2file
   s     


r!   u'   Экспорт данных в файлT)descriptionZshow_bg_progressbarc           6         s  ddl }ddl}	ddlm}
 tt|  tjj|d} fdd}dE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 }|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 |||}t|d}||| |dkrb|	|||d}||j qb|dkr
|| || qRW 5 Q R X nV|dkr4d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 ]}|#d3}*j	|*d }|*d |)kr||*d |)|*d < |(|)|*d   |)|*d }+t||*d }t|tj	j$r6|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&|._|+|. qfn^t|tj	j-r|dkrqN|j.|d|+_|+d5|j) n t(||||+_|+d5||  qNq&|&d8t(| |&d9t(| |/|0|! nH|d:krndd;l1m2}/ dd<l3m4}0 dd=l3m5}1 dd>l3m6}2 |/7 }3| d?}|3j8}4d@|4_9g }t||D ]\}}g }|D ]}|dkr||| |dkr||| d |||}t|d}||| |dkr|	|||d}||j q|dkrT|4| |4| q|3:| nt;dA| t|dB*}5|
<  |j=|5dCdCdD W 5 Q R X W 5 Q R X W 5 Q R X dS )FzN
    https://bcrm.carbonsoft.ru/project/Document/DOC-007693#spec-007668-b
    r   N)r   )r   c                 3   sZ   d}d}d| krdg|  } j  ||| g| d}|s<qV||7 }|D ]
}|V  qHqd S )Nr   iP  z--)filterslicefieldsr   r   )Zslist)r%   startstepdatarow)r   clsr   r   r   r    paginate_data7   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 |rvt|tj	j
rv|j| | S | rt| S dS d S )N r
   r   ,c                    s   g | ]} |qS r   r   ).0r)   convert_valr   r    
<listcomp>P   s     z9export2file_task.<locals>.convert_val.<locals>.<listcomp>)hasattrstrr
   r   
isinstancelistjoin
issubclasscmfr%   CmfChoiceIntchoicesget)val	field_objr/   r   r    r0   H   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   )splitr2   getattr)objZ	field_strfieldr   r   r    get_included_attrV   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)r>   r%   r;   copyvarsr   r8   rD   captionlenr2   rF   r6   )Z	class_obj
field_namepural_namesrA   resZ
models_clsZ
model_nameget_captionr   r    rO   b   s    

&z;export2file_task.<locals>.get_captions.<locals>.get_captionr   )rC   rM   rK   )r*   rN   r    get_captionsa   s
    z&export2file_task.<locals>.get_captionsc                 S   s   g | ]}|j r|jqS r   )Zvisibler   )r.   rA   r   r   r    r1   {   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
   rI   valuer   endtotalZxlsx)workbook)open_workbook)XL_CELL_DATE)xldate_as_tuplez/export.xlsxu   Выгрузкаu7   Это формат не поддерживается: rbF)ZbackupZmake_preview)N)>shutilbs4r   r   rH   r   r   r;   r5   r%   valuesr7   r8   Z
CmfRelBaseappendtempfileZTemporaryDirectoryopenr   writerZQUOTE_MINIMAL	enumerater?   ZBeautifulSouprT   ZwriterowZ	xml.etreerU   pathlibr   ZElementsetZrequestr   dictr>   ZCmfRelationBaser   r
   r2   r3   rI   Z
CmfM2MBaseZCmfBackrefBaser   r9   r:   write_bytesZtostringZopenpyxlrc   Zxlrdrd   re   rf   ZWorkbookZactiverY   r   	Exceptionr   Zupload_stream_file)6r   Zres_attachment_idr   r   r   r   r   _kwargsrh   ri   r   r   r+   rB   rP   Z
new_fieldsrK   ZcaptionsZtmpdirZ	file_pathZcsvfiler   rn   Zcsv_headir)   Zcsv_rowrA   Zfield_valuer=   ZsoupZETr   rV   rX   rY   rZ   r"   r\   r^   r_   elementsrL   Z
field_infokeyvr`   rc   rd   re   rf   Z	book_xlsxZ
sheet_xlsxfr   )r   r*   r0   r   r   r    r   %   s   "

 






































r   )NNNr   FN)NNr   FN)r   rp   r   Z
cmf.configr   Z
cmf.fieldsr8   builtinsrG   rl   r!   Zcmf_deferred_jobr   r   r   r   r    <module>   s   

     