
    D"jn                         d dl mZ 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Z	 e
ddd	
          	 	 	 	 	 dd            Zd Zd Zd Zd Zd ZdS )    )defaultdict)*NcsvFc                    ddl m}m} t          j                                        }	|	                    d          }
dt          j        j         d|
 d| }t          
                    t          j        |          }|                                5  |                                 d d d            n# 1 swxY w Y    |t          | |j        |||||d|           |j        S )	Nr   )schedule_deferred_jobcmfutilz%Y%m%d%H%M%Szexport..)parentname)
class_nameres_attachment_idfield_namesbqlformat_fileinclude_archivedorder_by)kwargs)cmf.includer   r   datetimenowstrftimegcurrent_useridmodelsCmfAttachmentdisable_aclsaveexport2file_taskurl)r   r   r   r   r   r   r   r   r   r   formatted_timeexport_filename
attachments                ./cmf/util/cmf_export.pyexport2filer%      sJ   :::::::: 



!
!C \\.11N S 1RRNRR[RRO%%Q^/%RRJ					                **ISCN;>CNHX@H4> 4> 7=4> ? ? ? ? >s   B11B58B5u'   Экспорт данных в файл   T)descriptionpriorityshow_bg_progressbarc                 X  9:;<=>?@ABCDEFGHIJKLMNOPQ ddl ;ddlm? ddlm9 | dk    EErd} ddd	d
dDt          t                    |          >t          j                            |          }dt          f?fd=9=>fd}	d_@fd	@d Gdt          f>Dfd}
s#d >j                                        D             t                      }Er|                    d           t                      }D ]}Er|dk    r|                    g d           nd|dk    rd}dDd<   nV>j                            |          r<t          >j                            |          t           j        j                  r|dz  }|                    |           | |
          <i :9:>fdHHfdFt%          j                    5 }|dk    r| d}t)          |d d!"          5 }ddl}|                    |d#d$|j        %          }g At1           |	                    D ]+\  INg }D ]}Idk    rWA                    <                    |                     |d&v r+A                    <                    |           d'            GN|          }t3          >|d          } FN||          }|                     @|||                     |d&v rC;                     @ GN|                    d(          }|                    |j                   Idk    r|                    A           |                    |           -	 ddd           n# 1 swxY w Y   	n8|d)k    rdd*lm} dd+lm }  ||d,          }|!                    d-          }|"                    d.d/           |!                    d0          }|                    |           |!                    d1          }d2|_        |                    |           |!                    d3          }tF          j$        |_        |                    |           |!                    d4          }d5|_        |                    |           |!                    d6          }d7|_        |                    |           |!                    d8          } | "                    d9d:           |                    |            |!                    d;          }!|                    |!           t1           |	                    D ]\  IN|!                    d<          }"tK                      }#|                    |"           D ]>}|&                    d=          }$>j                            |$d                   }|$d         |#vrE|!                    |$d                   |#|$d         <   |"                    |#|$d                             |#                    |$d                   }%t3          N|$d                   }t          |t           j        j'                  r|rt          t                    |j(                 j        D ]V}&|&d>k    r|j)        |%_        tU          ||&          r1|%"                    |&tW          t3          ||&                               W|%"                    d?|j,                   qt          |t           j        j-        t           j        j.        f          ru|rq|%"                    d?|j,                   |D ]S}'|!                    d@          }(|("                    dA|'j/                   |'j)        |(_        |%                    |(           Tt          |t           j        j0        t           j        j1        f          r|J FN||          }t          |t           j        j0                  r:||n|j2        })|tW          |          n|}*|)                    |*d!          |%_        n7||n|j2        })|)                    |tW          |          n|d!          |%_        |%"                    d?|j,                   tW           GN|                    |%_        |%"                    d?<|                    @| "                    dBtW          I                     | "                    dCtW          I                     |3                    |4                    |                     n|dDk    riddEl5m6}+ ddFl7m8}, ddGl7m9}- ddHl7m:}. |+;                                }/| dI}Er|                    dJ          ndK;<>@ACEFGIJKLMNOPQfdK}0<AIPfdL}1|/j<        PdMP_=        g AErtK                      CtK                      JdNv sdOv rt}                      \  CJ|                    dPg           }2|                    dQtK                                L|                    dRtK                                M|                    dJ          KdS  |	|z             D             }3dIKrg }4g }5KD ]}6|6                    dT          dUk    r:|6                    dVd          BBfdW|5D             }5|5                    |6           UtW          |6                    dA                    }7|3                    |7          r2|4                    |5           g }5|4                    i |6dA|7i           i Mt1          |4dXY          D ]<\  O}6|6                    dA          }7|6                    dT          d8k    r	|7MvrOM|7<   =|4D ]}6|6                    dT          dUk    r& |1|6                    d>          pdZ           IdXz  IA|6                    dA          Q|3                    Qd          NM                    QIdXz             O |0             IdXz  Inht1          |2dXY          D ]-\  OQ|3                    Qd          NNs |0             IdXz  I.n(t1           |	                    D ]\  IN |0             |/?                    |           nt          d[|           t)          |d\          5 }8?A                                5  |B                    |8d]d]^           ddd           n# 1 swxY w Y   ddd           n# 1 swxY w Y   ddd           dS # 1 swxY w Y   dS )`zN
    https://bcrm.carbonsoft.ru/project/Document/DOC-007693#spec-007668-b
    r   N)r   )CmfActiveEntity
CmfRoadmapCmfTasku   Индикаторыu   №u   Предшественникиu   Последлователи)custom_column_indicatorscustom_column_sequence_numbercustom_column_predecessorscustom_column_followers)r   returnc                                         | j                  }| j        }t          |t          j        j                  o| j        }t          |t          j        j                  o| j	        }t          |t          j        j                  o| j
        }t          |t          j        j                  o| j        }t
          j                            || j        || j        ||d|d	  	        S )NreadF)	initial_acl_keyobject_modelobject_owner_id	object_idobject_parent_idobject_dictaccess_levelperm_security_level_allowed_idsraise_error)get_model_by_namer   __dict__
issubclasscmfr   	CmfEntityperm_effective_acl_idCmfModelcmf_owner_id	parent_id%perm_security_level_allowed_ids_cacheCmfAccessListcheck_accessr   )objmodelobj_dictr5   obj_owner_idobj_parent_idrG   r   s          r$   check_access_objz*export2file_task.<locals>.check_access_objE   s    ))#.99<$UCJ,@AA_cF_!%)<==R#BR"5#**=>>P3=0:5#*BV0W0W  1F\_  ]F-#00+#.Zff}(,Q_d	 1 
 
 	
    c              3      K   d}d}d| vrdg| z   } g d}g }t          
          r|ddgz  }	 
                    |||z   g| |z   |z             }|sd S ||z  }|D ]} 	|          r|V  C)	Nr   iP  --)rE   access_authorcmf_author_idperm_security_level_idaccess_responsibleresponsible_id
spectators	executors
project_idrF   rC   rG   
logic_typeactivityT)filterslicefieldsr   r   )r@   slist)r_   startstepsecurity_fieldspreload_fieldsdatarowr+   r   rO   clsr   r   s          r$   paginate_dataz'export2file_task.<locals>.paginate_dataT   s      vVf_F
 
 

 c?++ 	9 |Z88N	99C$)54<#8$*_$<~$M.>&.	  0 0D
  TME  ##C(( III	rP   c                    | dS t          | d          rt          | j                  S t          | d          rt          | j                  S t	          | t
                    r!d                    fd| D                       S |r`t          |t          j	        j
                  rA||n|j        }|t          |           n| }|                    |t          |                     S |rQt          |t          j	        j                  r2||n|j        }|                    |t          |           n| |           S | rt          |           ndS )N r   r   ,c                 &    g | ]} |          S  rm   ).0rf   convert_vals     r$   
<listcomp>z9export2file_task.<locals>.convert_val.<locals>.<listcomp>y   s#    ===#[[--===rP   )hasattrstrr   r   
isinstancelistjoinr@   rA   r_   CmfChoiceIntchoicesget	CmfChoice)val	field_objchoices_overriderw   
lookup_keyro   s        r$   ro   z%export2file_task.<locals>.convert_valq   sP   ;2S&!! 	+sx== S$ 	+sv;;T"" 	+88=======>>> 		+:i1HII 		+*:*F&&IL]G%5%ASsJ;;z3s88444 	+:i1EFF 	+*:*F&&IL]G;;+;+Gs3xxxSRUVVV"*3s888*rP   c                 v    |                     d          D ]"}t          | |          rt          | |          } #| S )u   
        Получить поле объекта. Как getattr, только работает с вложенными полями
        Например: get_included_attr(doc, 'person.second_name')
        r	   )splitrq   getattr)rJ   	field_strfields      r$   get_included_attrz+export2file_task.<locals>.get_included_attr   sF    
 __S)) 	* 	*EsE"" *c5))
rP   fields_namec                 B    fdi }| D ]} |          ||<   |S )Nc           
         |	v r	|         S |                     d          }| j                            |d                   }ddi}|s`| j        |                                v rEt          t                    || j                          }|j                            |d                   }|}t          t          t                              }t          j        j	        |d<   |r|j
        }t          |          dk    rqt          |d          r|j        r|j        d         }nt          |d          r|j        }n|S | d 
||         d                    |dd                               }|S )	Nr	   r   CmfTestplanTestcaseCmfTestcaserB      r   rK   )r   r_   rx   r   keysvarsr   copyrA   rB   captionlenrq   rK   ru   )	class_obj
field_namepural_namesr   linked_entitylinked_class_objres
models_cls
model_nameforced_captionsget_captions            r$   r   z;export2file_task.<locals>.get_captions.<locals>.get_caption   s}   _,,&z22$**3//K$((Q88E%}M  DY1]5G5G5I5III#'<<i>R0S#T (/33KNCCCd6ll++J&)j&:J{# 	dm{##a''uh// #EL #%*\!_

 00 #%*[

"
 cc;;z*/EsxxP[\]\^\^P_G`G`#a#accCJrP   rm   )r   r   r   r   rg   r   s      @r$   get_captionsz&export2file_task.<locals>.get_captions   sT    	 	 	 	 	 	6 % 	; 	;J)k#z::C
OO
rP   c                 *    g | ]}|j         	|j        S rm   )visibler   )rn   r   s     r$   rp   z$export2file_task.<locals>.<listcomp>   s"    ZZZEEMZu'ZZZrP   r/   r.   )z op_gantt_task.actual_finish_datezop_gantt_task.sched_finish_datez"op_gantt_task.constrain_start_typez"op_gantt_task.constrain_start_datez#op_gantt_task.constrain_finish_typez#op_gantt_task.constrain_finish_datetimetracker_historyzop_gantt_task.actual_workuG   Журнал работ.Фактические трудозатратыz.namec           	         t                    sd S t          | dd           }|sd S t          |          t          t          | dd                     t          t          | dd                     |f}|v r|         S                     |           }d }|rJ|                    di                               |          r!|d         |                             d          }||<   |S )NrZ   logic_type_idactivity_id	ui_fieldsrw   )r@   r   rr   _build_ui_formrx   )	rf   r   rZ   	cache_keyui_form_customresultr+   _row_choices_cacherg   s	         r$   get_row_field_choicesz/export2file_task.<locals>.get_row_field_choices   s   #// 	4S,55
 	4
OO_d3344]D1122	
	 ***%i00++C00 	Ln00bAAEEjQQ 	L#K0<@@KKF(.9%rP   c                     |r<t          |t          j        j        t          j        j        f          r | |          S d S N)r@   rA   r_   rv   ry   )rf   r   r{   r   s      r$   get_choices_overridez.export2file_task.<locals>.get_choices_override   sC     	:I
0GI]/^__ 	:((j999trP   r   z/export.csvzw+rj   )newline;")	delimiter	quotecharquotingtextresult_text    без htmllxmlxml)ElementTree)Pathz
export.xmlrssversionz0.92channeltitleEvaTeamlinkr'   u+   XML представление данныхlanguagezru-rutaskra   0
build_infoitemr	   r   r   valuer   endtotalxlsx)workbook)open_workbook)XL_CELL_DATE)xldate_as_tuplez/export.xlsxroadmap_export_rowsc            	      X   g } D ]}dk    rW                                         |                     |dv r+                                         |           d           r|dk    r|                      dz              rS|dk    rM                     g           }fd|D             }|                      d                    |                     ։rT|d	k    rN                     g           }fd
|D             }|                      d                    |                     ,r*|dk    r$|                      t                               X |          }t	          |d           } ||          }|                       |||                     |dv rC                      |                    d          }	|                      |	j                   dk    r                                                     |            rst           f                   }
j        }j	        |         }t          |
d          |_        |
dk    |_                            |d          }|j        d|
dz  z   |j         |_        d S d S d S d S )Nr   r   r   r/   r   r0   c                 V    g | ]%}t                              |d                     &S r   rr   rx   rn   tidroadmap_sequence_maps     r$   rp   z7export2file_task.<locals>.write_row.<locals>.<listcomp>i  s5    ;};};}ilC@T@X@XY\^b@c@c<d<d;};};}rP   z; r1   c                 V    g | ]%}t                              |d                     &S r   r   r   s     r$   rp   z7export2file_task.<locals>.write_row.<locals>.<listcomp>m  s5    8w8w8wfi=Q=U=UVY[_=`=`9a9a8w8w8wrP   r.   r      )rf   column    )appendrx   ru   _indicator_textr   BeautifulSoupr   rr   max_rowrow_dimensionsminoutlineLevelhiddencellr   )!csv_rowr   predecessors sequence_numbers_of_predecessors	followerssequence_numbers_of_followersfield_valuer{   r|   soupdepthxl_rowrd
first_cellbs4captionsrg   ro   csv_headr   followers_offrom_roadmapr   r   ipredecessors_ofr   roadmap_level_ofr   rf   seq
sheet_xlsxr   s!                 r$   	write_rowz#export2file_task.<locals>.write_row\  s.   ( 6 6EAvv U(;(;<<< $;;;$OOx||E/B/B,P,P,PQQQ# 61P(P(Pqs++++% 6%3O*O*O'6':':3'C'C;};};};}p|;};};}8tyy1Q'R'RSSSS% 6%3L*L*L$0$4$4S"$=$=	8w8w8w8wmv8w8w8w5tyy1N'O'OPPPP% 	6%3M*M*Ms';';<<<<&7&7U&C&C$+C$=$=	+?+?UI+V+V({{;	K['\'\]]] $;;;#&#4#4[[ARARSVX]A^A^5_5_ag#h#hD#NN4955566%%h///!!'*** T(; T,S#s__=E'/F $26:B&)%mmBO %	BI ",VA!F!FJ!'3.1UQY.?+SAQ+S+S
(((T T T T 43rP   c                    g }D ]}dk    rW                                         |                     |dv r+                                         |           d           |dk    r|                     dz              ~|dk    r|                     |            |                     d           |dv r|                     d           ɉdk    r                                                     |           dS )uS  Пишет group-header строку плоского XLSX Roadmap.

                Подпись намеренно кладётся в `name`/«Наименование», а override-строка
                держит парные «без html» колонки text/result_text рядом с видимыми.
                r   r   r   r/   r   r   N)r   rx   )
group_namer   r   r   r   r   r   r   s      r$   write_group_rowz)export2file_task.<locals>.write_group_row  s     ( 1 1EAvv U(;(;<<< $;;;$OOx||E/B/B,P,P,PQQQ ???q1u----&z2222t,,, $;;; $NN400066%%h///!!'*****rP   u   Выгрузкаr0   r1   roadmap_ordered_idsr   r   c                 8    i | ]}t          |j                  |S rm   )rr   r   )rn   rJ   s     r$   
<dictcomp>z$export2file_task.<locals>.<dictcomp>  s"    hhh#S[[#hhhrP   typegroupr   c                 H    g | ]}|                     d d          k     |S )r   r   rx   )rn   rf   r   s     r$   rp   z$export2file_task.<locals>.<listcomp>  s<     2 2 2(+#&777A#6#6#>#> !$#>#>#>rP   r   )ra   u   Не назначеноu7   Это формат не поддерживается: rbF)backupmake_preview)NN)Cr   r   r   common.models.cmf_active_entityr+   r   r   r   rx   boolrt   r_   valuesr   extendr@   rA   
CmfRelBasetempfileTemporaryDirectoryopenr   writerQUOTE_MINIMAL	enumerater   r   r   writerow	xml.etreer   pathlibr   Elementsetrequestr    dictr   CmfRelationBaser   r   rq   rr   r   
CmfM2MBaseCmfBackrefBaser   rv   ry   rw   write_bytestostringopenpyxlr   xlrdr   r   r   Workbookactiver   $_prepare_predecessors_followers_mapsr   	Exceptionr   upload_stream_file)Rr   r   r   r   r   r   r   r   r#   rh   r   
new_fieldsadditional_fieldsr   tmpdir	file_pathcsvfiler   r  r   r   r   r{   r|   r   ETr   r   r   r   r   r'   r   r   r   elementsr   
field_infokeyvr   rw   r}   r   r   r   r   	book_xlsxr   r   r   	id_to_objvisible_export_rowspending_group_rows
export_rowtask_idfr+   r   r   r   rO   rg   r   ro   r   r   r   r   r   r   r   r   r   r   r   r   r   rf   r   r   r   sR     `` ``                                                  @@@@@@@@@@@@@@@@@@@@@@@@@r$   r   r   '   s    JJJ######??????-L 
 %;).&F#A	 O v,,z
"C%))->)??J
 
 
 
 
 
 
         :+ + + + + +(	 	 	$       B  [ZZSZ5F5F5H5HZZZJ ;9:::! 
& 
&
 	"J*DDD$$ &t &t &t u u u u 0004J <EO788Z^^J'' 	"Jsz~~j7Q7QSVS]Sh,i,i 	"'!J*%%%%K|K((H      *    
 
	$	&	& QS&%!...Iir222 -g


Gs.13;L $ N N'k(B(BCC - -FAs G!, 6 666$OOHLL,?,?@@@$(??? (8<<3F3F0T0T0T U U U&7&7U&C&C$+C$=$=	+?+?UI+V+V({{;	K['\'\]]] $;;;#&#4#4[[ARARSVX]A^A^5_5_ag#h#hD#NN49555Avv111OOG,,,,+-- - - - - - - - - - - - - - -8 E!!333333$$$$$$VL11I**U##CGGIv&&&jj++GJJwJJw''E"EJNN5!!!::f%%DDINN4   **]33KLKNN;'''**Z00K&KNN;'''::f%%DHHWc"""NN4   L11JNN:&&&#MM+$>$>?? +H +H3zz&))66t$$$"- 'H 'HJ","2"23"7"7KJNN;q>::E&q>X5535::k!n3M3MQ0H[^$<===!)k!n!=!=J")#k!n"="=K!%)CDD H& E'+F||K4J'K'R X X#&&==6A6FJO$,#*;#<#< !X$.NN3GKQT<U<U8V8V$W$W$W&NN9emDDD#ECJ,A3:C\+]^^ H& 9&NN9emDDD%0 9 9(*

7(;(; %		$ 5 5 5-.V
 * 1 1% 8 8 8 8#ECJ,CSZEY+Z[[ H&.$+?+?ZQV+W+W(%eSZ-DEE A:J:V&6&6\a\iG=M=Y[)9)9)9_jJ.5kk*b.I.IJOO:J:V&6&6\a\iG.5kkN^Nj#k:J:J:Jp{}  /A  /AJO"y%-@@@@*-.?.?Z.P.P*Q*Q
"y(:2FGGGGO'HR HHUCFF###HHWc!ff%%%!!"++c"2"23333F"" *)))))******)))))),,,,,, ))++I!///IGS"]&**-B"C"C"CY].T .T .T .T .T .T .T .T .T .T .T .T .T .T .T .T .T .T .T .T .T .T .T`+ + + + + + + + +< #)J1JH < #vv"&&&/;>>B[_jBjBj4X4Z4Z1L/&,jj1F&K&K##)::.@$&&#I#I '-zz2H$&&'Q'Q$&,jj1F&G&G#hh{UfGf9g9ghhh	& .*,')+&&9 V V
%>>&11W<< %/NN7A$>$>E2 2 2 2/A2 2 2. /55jAAA$"%jnnT&:&:";";$==11 V/667IJJJ13./667T*7TdG7T7TUUU+-(+45HPQ+R+R+R @ @Z",.."6"6%>>&11V;;Oc@c@c<?09&9 
 

%>>&11W<<+OJNN6,B,B,_F_```FA$(nnT22'mmC66266sAEBB!	Q
 %..A$K$K$K  S'mmC66" %$!	Q (k(B(BCC    FAsIKKKKNN9%%%% cVaccddd)T"" 	Sa $$&& S S--aE-RRRS S S S S S S S S S S S S S S	S 	S 	S 	S 	S 	S 	S 	S 	S 	S 	S 	S 	S 	S 	S[QS QS QS QS QS QS QS QS QS QS QS QS QS QS QS QS QS QSs   t*E*M!t!M%	%t(M%	)et6ts0$t0s44t7s48t;tt	tt	tt#&t#c                  F   t          t                    } t          t                    }g d}g d}t          j                            ||          D ]L}| |j                                     |j                   ||j                                     |j                   M| |fS )N)rR   out_link_id
in_link_id)zrelation_type.codez==zsystem.finish:start)r_   r]   )r   rt   r   CmfRelationOptionr`   r3  r   r4  )r   r   _fields_filterrels        r$   r  r    s    t$$L!$''O///G???G'--WW-MM @ @S_%,,S^<<<'..s????((rP   c                 :    dddd}|                     | |           S )Nu   Фиксированная   Не раньше   Не позже0-constz3-afterz4-beforer   )codestart_restriction_names     r$   _get_start_restriction_labler@    s0    3*) 
 "%%dD111rP   c                 :    dddd}|                     | |           S )Nu   Фиксированныйr:  r;  r=  z1-afterz2-beforer   )r>  finish_restriction_lables     r$   _get_finish_restriction_lablerD    s0    3*)   
 $''d333rP   c                    t          | t          j                  r|                     d          S t          | t          j                  r8t          j        | j        | j        | j                                      d          S dS )Nz%d.%m.%Yrj   )rs   r   r   dateyearmonthday)ds    r$   _format_daterK    sl    !X&'' &zz*%%%!X]## N !%88AA*MMM2rP   c                    t          | dd           }|sdS t          |dd           }|rdt          |           dS g }t          |dd           }|dv rSt          |          }d| d	}t          |d
d           }|r|dt          |           dz  }|                    |           t          |dd           }|dv rSt	          |          }d| d}t          |dd           }	|	r|dt          |	           dz  }|                    |           t          | dd           }
t          |dd           }|r.|
r,||
k    r&|                    dt          |
           d           d                    |          S )Nop_gantt_taskrj   actual_finish_dateu   Была завершена "r   constrain_start_typer<  u/   Установлено ограничение "u    " для "Дата начала"constrain_start_dateu    на "constrain_finish_typerB  u&   " для "Дата окончания"constrain_finish_datedeadlinesched_finish_dateuS   Указана дата окончания позже крайнего срока "
)r   rK  r@  r   rD  ru   )instance
gantt_taskactual_finishlines	cst_valuelabellinecsd	cft_valuecfdrS  sched_finishs               r$   r   r     s   ?D99J r J(<dCCM NM|M/J/JMMMME 
$:DAAI666,Y77hhhhj"8$?? 	32l3//2222DT 
$;TBBI555-i88nnnnj"94@@ 	32l3//2222DT xT22H:':DAAL F F\H%<%<  Ekw  yA  lB  lB  E  E  E  	F  	F  	F99UrP   )NNNr   FN)NNr   FN)collectionsr   r   
cmf.configr   
cmf.fieldsrA   r   r  r%   cmf_deferred_jobr   r  r@  rD  rK  r   rm   rP   r$   <module>re     s   # # # # # #                     8 GRSimnnn "&!&&+"LS LS LS onLSb) ) )2 2 24 4 4  ' ' ' ' 'rP   