U
    e#                     @   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_aclZ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           -         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 "}|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 ]`}|"d0}&j	|&d }|&d |%krn||&d |%|&d < |$|%|&d   |%|&d }'t#||&d }(t|t$r|(rxtt|(j% j	D ]>})|)d1kr|(j&|'_qt'|(|)r|'|)t(t#|(|) q|'d2|j) n|t|t*t+frX|(rx|'d2|j) |(D ]0}*|d3}+|+d4|*j, |*j&|+_|'|+ q$n t(||||'_|'d2||  qq|"d5t(| |"d6t(| |-|.| nt/d7| t|d8*},|0  |	j1|,d9d9d: W 5 Q R X W 5 Q R X W 5 Q R X dS );zN
    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   )splitr/   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)r5   r"   getcopyvarsr   cmfr;   captionlenr/   r=   r3   )Z	class_obj
field_namepural_namesr8   resZ
models_clsZ
model_nameget_captionr   r   rH   O   s    

&z;export2file_task.<locals>.get_captions.<locals>.get_captionr   )r:   rF   rD   )r'   rG   r   get_captionsN   s
    z&export2file_task.<locals>.get_captionsc                 S   s   g | ]}|j r|jqS r   )Zvisibler   )r+   r8   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
   rB   valuer   endtotalu7   Это формат не поддерживается: rbF)ZbackupZmake_preview)2shutilbs4r   r   r@   r   r   r>   r2   r"   values
issubclassrA   Z
CmfRelBaseappendtempfileZTemporaryDirectoryopenr   writerZQUOTE_MINIMAL	enumerateZBeautifulSouprM   ZwriterowZ	xml.etreerN   pathlibr   ZElementsetZrequestr   dictr5   r6   ZCmfRelationBaser   r
   r/   r0   rB   Z
CmfM2MBaseZCmfBackrefBaser   Zwrite_bytesZtostring	Exceptionr   Zupload_stream_file)-r   Zres_attachment_idr   r   r   _kwargsr]   r^   r   r   r(   r9   rI   Z
new_fieldsrD   ZcaptionsZtmpdirZ	file_pathZcsvfiler   rd   Zcsv_headir&   Zcsv_rowr8   ZsoupZETr   rO   rQ   rR   rS   r   rU   rW   rX   elementsrE   Z
field_infoZfield_valuekeyvrY   fr   )r   r'   r-   r   r      s    "

 




























r   )NNNr   )NNr   )r   rf   r   Z
cmf.configr   Z
cmf.fieldsrA   builtinsr?   rb   r   Zcmf_deferred_jobr   r   r   r   r   <module>   s   

