U
    
hw5                     @   sT   d dl T d dlT 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 )    )*N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           4         s  ddl }ddlm tt|  tjj|d}	tdfdd fdd	}
dH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rd|d< t }|dkr4| 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rp||||d!}||j qp|dkr|| || q`W 5 Q R X nV|d"krBdd#lm} dd$lm} ||d%}|d&}|d'd( |d)} ||  |d*}!d+|!_| |! |d,}"t j!|"_| |" |d-}#d.|#_| |# |d/}#d0|#_| |# |d1}$|$d2d3 | |$ |d4}%| |% t|
|D ]\}}|d5}&t" }'| |& |D ]}|#d6}(j	|(d }|(d |'kr||(d |'|(d < |&|'|(d   |'|(d })t||(d }t|tj	j$rD|rtt|j% j	D ]>}*|*d7kr|j&|)_qt'||*r|)|*t(t||* q|)d8|j) nt|tj	j*tj	j+fr|r|)d8|j) |D ]0}+|d9},|,d:|+j, |+j&|,_|)|, qtn^t|tj	j-r|dkrƐq\|j.|d|)_|)d8|j) n t(||||)_|)d8||  q\q4|$d;t(| |$d<t(| |/|0| nH|d=kr|dd>l1m2}- dd?l3m4}. dd@l3m5}/ ddAl3m6}0 |-7 }1| dB}|1j8}2dC|2_9g }t|
|D ]\}}g }|D ]}|dkr||| |dkr||| d  |||}t|d}||| |dkr||||d!}||j q|dkrb|2| |2| q|1:| nt;dD| t|dE*}3<  |	j=|3dFdFdG W 5 Q R X W 5 Q R X W 5 Q R X dS )IzN
    https://bcrm.carbonsoft.ru/project/Document/DOC-007693#spec-007668-b
    r   Nr   )r   )returnc                    s     | j}| j}t|tjjo$| j}t|tjjo8| j	}t|tjjoL| j
}t|tjjo`| j}tjj|| j|| j||d|dd	S )NreadF)	initial_acl_keyZobject_modelZobject_owner_idZ	object_idZobject_parent_idZobject_dictZaccess_levelZperm_security_level_allowed_idsZraise_error)Zget_model_by_namer   __dict__
issubclasscmfr   	CmfEntityperm_effective_acl_idZCmfModelcmf_owner_id	parent_id%perm_security_level_allowed_ids_cacheZCmfAccessListZcheck_accessr   )objmodelZobj_dictr$   Zobj_owner_idZobj_parent_idr,   r!   r   r   check_access_obj5   s"         z*export2file_task.<locals>.check_access_objc                 3   s   d}d}d| krdg|  } dddddd	d
dddddg}j  ||| g| | d}|s\q~||7 }|D ]}|rh|V  qhq6d S )Nr   iP  z--r*   Zaccess_authorZcmf_author_idZperm_security_level_idZaccess_responsibleZresponsible_idZ
spectatorsZ	executorsZ
project_idr+   r)   r,   )filterslicefieldsr   r   )Zslist)r2   startstepZsecurity_fieldsdatarow)r   r/   clsr   r   r   r   paginate_dataD   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 |r~t|tj	j
tj	jfr~|j| | S | rt| S dS d S )N r   r   ,c                    s   g | ]} |qS r   r   ).0r6   convert_valr   r   
<listcomp>d   s     z9export2file_task.<locals>.convert_val.<locals>.<listcomp>)hasattrstrr   r   
isinstancelistjoinr&   r'   r2   CmfChoiceIntZ	CmfChoicechoicesget)val	field_objr<   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)r-   Z	field_strfieldr   r   r   get_included_attrj   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   r(      r   r.   )rI   r2   rF   copyvarsr   r'   r(   captionlenr?   r.   rC   )Z	class_obj
field_namepural_namesrK   resZ
models_clsZ
model_nameget_captionr   r   rW   v   s    

&z;export2file_task.<locals>.get_captions.<locals>.get_captionr   )rM   rU   rS   )r7   rV   r   get_captionsu   s
    z&export2file_task.<locals>.get_captionsc                 S   s   g | ]}|j r|jqS r   )Zvisibler   )r;   rK   r   r   r   r>      s      z$export2file_task.<locals>.<listcomp>Ztimetracker_historyzop_gantt_task.actual_workz.nameuG   Журнал работ.Фактические трудозатратыr   z/export.csvzw+r9   )newline;")Z	delimiterZ	quotecharZquoting)textZresult_textu    без htmlZlxmlZxml)ElementTree)Pathz
export.xmlrssversionz0.92channeltitleZEvaTeamlinkr    u+   XML представление данныхlanguagezru-rutaskr3   0
build_infoitemr   r   rQ   valuer   endtotalZxlsx)workbook)open_workbook)XL_CELL_DATE)xldate_as_tuplez/export.xlsxu   Выгрузкаu7   Это формат не поддерживается: rbF)ZbackupZmake_preview)N)>bs4r
   r   rP   r   r   rF   boolrB   r2   valuesr&   r'   Z
CmfRelBaseappendtempfileZTemporaryDirectoryopenr   writerZQUOTE_MINIMAL	enumeraterJ   ZBeautifulSoupr\   ZwriterowZ	xml.etreer]   pathlibr^   ZElementsetZrequestr   dictrI   ZCmfRelationBaser   r   r?   r@   rQ   Z
CmfM2MBaseZCmfBackrefBaser   rD   rE   write_bytesZtostringZopenpyxlrl   Zxlrdrm   rn   ro   ZWorkbookZactiverb   r   	Exceptionr   Zupload_stream_file)4r   Zres_attachment_idr   r   r   r   r   _kwargsrq   r   r8   rL   rX   Z
new_fieldsrS   ZcaptionsZtmpdirZ	file_pathZcsvfiler   rw   Zcsv_headir6   Zcsv_rowrK   Zfield_valuerH   ZsoupZETr^   r_   ra   rb   rc   r    re   rg   rh   elementsrT   Z
field_infokeyvri   rl   rm   rn   ro   Z	book_xlsxZ
sheet_xlsxfr   )r   r/   r7   r   r=   r   r   r   r   $   s   "


 






































r   )NNNr   FN)NNr   FN)
r
   Z
cmf.configr   Z
cmf.fieldsr'   rO   ru   r   Zcmf_deferred_jobr   r   r   r   r   <module>   s   

     