U
    f&)                     @   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 ]8}j	|rtj	|tj	jr|d7 }|| q|}||}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|| || q.W 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,d- ||" |d.}#||# t|
|D ]\}}|d/}$t! }%||$ |D ]l}|"d0}&j	|&d }|&d |%krn||&d |%|&d < |$|%|&d   |%|&d }'t#||&d }(t|tj	j$r |(rtt|(j% j	D ]>})|)d1kr|(j&|'_qt'|(|)r|'|)t(t#|(|) q|'d2|j) nt|tj	j*tj	j+frd|(r|'d2|j) |(D ]0}*|d3}+|+d4|*j, |*j&|+_|'|+ q0n t(||||'_|'d2||  qq|"d5t(| |"d6t(| |-|.| n6|d7krdd8l/m0}, dd9l1m2}- dd:l1m3}. dd;l1m4}/ |,5 }0| d<}|0j6}1d=|1_7g }t|
|D ]\}}g }|D ]}|dkrv||| |dkrv||| d |||| |dkr8||||d}||j q8|dkr|1| |1| q(|08| nt9d>| t|d?*}2|:  |	j;|2d@d@dA W 5 Q R X W 5 Q R X W 5 Q R X dS )BzN
    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.namer   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   

