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           5         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r`||||d}||j q`|dkr|| || qPW 5 Q R X nV|dkr2d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$r4|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&|-_|*|- qdn^t|tj	j-r|dkrqL|j.|d|*_|*d5|j) n t(||||*_|*d5||  qLq$|%d8t(| |%d9t(| |/|0|  nH|d:krldd;l1m2}. dd<l3m4}/ dd=l3m5}0 dd>l3m6}1 |.7 }2| d?}|2j8}3d@|3_9g }t||D ]\}}g }|D ]}|dkr||| |dkr||| d |||}t|d}||| |dkr||||d}||j q|dkrR|3| |3| q|2:| nt;dA| t|dB*}4|	<  |
j=|4dCdCdD 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   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   | 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>?   s     z9export2file_task.<locals>.convert_val.<locals>.<listcomp>)hasattrstrr
   r   
isinstancelistjoin
issubclasscmfr$   CmfChoiceIntchoicesget)val	field_objr.   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_attrE   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   r7   rC   captionlenr1   rE   r5   )Z	class_obj
field_namepural_namesr@   resZ
models_clsZ
model_nameget_captionr   r   rN   Q   s    

&z;export2file_task.<locals>.get_captions.<locals>.get_captionr   )rB   rL   rJ   )r)   rM   r   get_captionsP   s
    z&export2file_task.<locals>.get_captionsc                 S   s   g | ]}|j r|jqS r   )Zvisibler   )r-   r@   r   r   r   r0   j   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
   rH   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   rG   r   r   r:   r4   r$   valuesr6   r7   Z
CmfRelBaseappendtempfileZTemporaryDirectoryopenr   writerZQUOTE_MINIMAL	enumerater>   ZBeautifulSouprS   ZwriterowZ	xml.etreerT   pathlibr   ZElementsetZrequestr   dictr=   ZCmfRelationBaser   r
   r1   r2   rH   Z
CmfM2MBaseZCmfBackrefBaser   r8   r9   write_bytesZtostringZopenpyxlrb   Zxlrdrc   rd   re   ZWorkbookZactiverX   r   	Exceptionr   Zupload_stream_file)5r   Zres_attachment_idr   r   r   r   _kwargsrg   rh   r   r   r*   rA   rO   Z
new_fieldsrJ   ZcaptionsZtmpdirZ	file_pathZcsvfiler   rm   Zcsv_headir(   Zcsv_rowr@   Zfield_valuer<   ZsoupZETr   rU   rW   rX   rY   r!   r[   r]   r^   elementsrK   Z
field_infokeyvr_   rb   rc   rd   re   Z	book_xlsxZ
sheet_xlsxfr   )r   r)   r/   r   r   r      s   "

 






































r   )NNNr   F)NNr   F)r   ro   r   Z
cmf.configr   Z
cmf.fieldsr7   builtinsrF   rk   r    Zcmf_deferred_jobr   r   r   r   r   <module>   s   

