U
    e!                     @   sl   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ed	d
dZdS )    )*PathNcsvc                 C   s~   ddl m} tj }|d}ttjdt	j
j d| d| }|jjdd |t| t|||gd t|tjd	S )
Nr   )schedule_deferred_jobz%Y%m%d%H%M%SZexport.T)exist_ok)argsz/files/)cmf.includer   datetimenowstrftimer   ZconfigZ
UPLOAD_DIRZjoinpathgZcurrent_personidparentmkdirexport2file_taskstrreplace)
class_namefield_namesbqlformat_filer   r   Zformatted_time	file_path r   ./cmf/util/cmf_export.pyexport2file
   s    

&r   u'   Экспорт данных в файл)description)returnc           *         s  ddl }ddl}tt|   fdd}fdddd }	td	fd
d}
|shdd j D }t }|D ]8}j|rtj|t	jj
r|d7 }|| qr|}|
|}t }|dkr| d}t|ddd}ddl}|j|dd|jd}g }t||D ]\}}g }|D ]}|dkrb||| |dkrb||| 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 ]`}|d.}$j|$d }|$d |#krT||$d |#|$d < |"|#|$d   |#|$d }%t ||$d }&t|t!r|&r^tt|&j" jD ]>}'|'d/kr|&j#|%_qt$|&|'r|%|'t%t |&|' q|%d0|j& n|t|t't(fr>|&r^|%d0|j& |&D ]0}(|d1})|)d2|(j) |(j#|)_|%|) q
n t%|	|||%_|%d0||  qq| d3t%| | d4t%| |*|+| nt,d5| |-|| W 5 Q R X dS )6zN
    https://bcrm.carbonsoft.ru/project/Document/DOC-007693#spec-007668-b
    r   Nc                 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 namer   ,c                    s   g | ]} |qS r   r   ).0r%   convert_valr   r   
<listcomp>6   s     z9export2file_task.<locals>.convert_val.<locals>.<listcomp>)hasattrr   r)   r   
isinstancelistjoin)valr,   r   r   r-   .   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_attr:   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   modelsmodel)r4   r!   getcopyvarsr<   cmfr:   captionlenr/   r=   r2   )Z	class_obj
field_namepural_namesr7   resZ
models_clsZ
model_nameget_captionr   r   rH   F   s    

&z;export2file_task.<locals>.get_captions.<locals>.get_captionr   )r9   rF   rD   )r&   rG   r   get_captionsE   s
    z&export2file_task.<locals>.get_captionsc                 S   s   g | ]}|j r|jqS r   )Zvisibler   )r+   r7   r   r   r   r.   _   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   Это формат не поддерживается: ).shutilbs4r@   r<   r1   r!   valuesr>   
issubclassrA   Z
CmfRelBaseappendtempfileZTemporaryDirectoryopenr   writerZQUOTE_MINIMAL	enumerateZBeautifulSouprM   ZwriterowZ	xml.etreerN   pathlibr   ZElementsetZrequestZurldictr4   r5   ZCmfRelationBaser   r)   r/   r   rB   Z
CmfM2MBaseZCmfBackrefBaser   Zwrite_bytesZtostring	Exceptionmove)*r   Zres_file_pathr   r   r   kwargsr\   r]   r'   r8   rI   Z
new_fieldsrD   ZcaptionsZtmpdirr   Zcsvfiler   rc   Zcsv_headir%   Zcsv_rowr7   ZsoupZETr   rO   rQ   rR   rS   r   rU   rW   rX   elementsrE   Z
field_infoZfield_valuekeyvrY   r   )r   r&   r-   r   r      s    "

 



























r   )NNNr   )NNr   )r
   re   r   Z
cmf.configr   Z
cmf.fieldsrA   builtinsr?   ra   r   Zcmf_deferred_jobr   r   r   r   r   r   <module>   s   
