
    "jn                         d dl mZ d dl d dl d dlZd dlZd dl d dlZddZ	 e
ddd      	 	 	 	 	 dd	       Zd
 Zd Zd Zd Zd Zy)    )defaultdict)*Nc                    ddl m}m} t        j                  j	                         }	|	j                  d      }
dt        j                  j                   d|
 d| }t        j                  t        j                  |      }|j                         5  |j                          d d d         |t        | |j                  |||||d|       |j                  S # 1 sw Y   7xY w)	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$      s    : 




!C \\.1N   1 12!N3C1[MRO%%Q^^/%RJ				 **ISCN;>CNHX@H4> 7=4> ? >> s   CC u'   Экспорт данных в файл   T)descriptionpriorityshow_bg_progressbarc                   9<=>?@ABCDEFGHIJKLMNOPQR ddl >ddlmB ddlm< | dk(  GGrd} ddd	d
dFt        t              |    At        j                  j                  |      }dt        fBfd@<@Afd}	d\Cfd	Cd Idt        fAFfd}
s?Aj                  j                         D cg c]  }|j                  s|j                   c}t               }Gr|j                  d       t               }D ]  }Gr|dk(  r|j!                  g d       nj|dk(  rd}dFd<   n]Aj                  j                  |      rBt#        Aj                  j                  |      t$        j                  j&                        r|dz  }|j                  |        | |
      ?i =<=AfdJJfdHt)        j*                         5 }|dk(  rQ| d}t-        |dd !      5 }ddl}|j1                  |d"d#|j2                  $      }g Dt5         |	            D ]  \  K9g }D ]  }Kdk(  rGDj                  ?j                  |             |d%v r#Dj                  ?j                  |       d&        I9|      }t7        A|d      } H9||      }|j                   C|||             |d%v s>j9                   C I9|            d'      }|j                  |j:                          Kdk(  r|j=                  D       |j=                  |        	 ddd       n[|d(k(  r(dd)lm } dd*l!m"}  ||d+      }|jG                  d,      }|jI                  d-d.       |jG                  d/      }|j                  |       |jG                  d0      }d1|_        |j                  |       |jG                  d2      }tJ        jL                  |_        |j                  |       |jG                  d3      }d4|_        |j                  |       |jG                  d5      }d6|_        |j                  |       |jG                  d7      } | jI                  d8d9       |j                  |        |jG                  d:      }!|j                  |!       t5         |	            D ]Y  \  K9|jG                  d;      }"tO               }#|j                  |"       D ]!  }|jQ                  d<      }$Aj                  j                  |$d         }|$d   |#vr1|jG                  |$d         |#|$d   <   |"j                  |#|$d             |#j                  |$d         }%t7        9|$d         }t#        |t$        j                  jR                        r|st        t              |j                     j                  D ]K  }&|&d=k(  r|jT                  |%_        tW        ||&      s'|%jI                  |&tY        t7        ||&                   M |%jI                  d>|jZ                         Gt#        |t$        j                  j\                  t$        j                  j^                  f      rx|s|%jI                  d>|jZ                         |D ]Q  }'|jG                  d?      }(|(jI                  d@|'j`                         |'jT                  |(_        |%j                  |(       S t#        |t$        j                  jb                  t$        j                  jd                  f      r|? H9||      }t#        |t$        j                  jb                        r7||n|jf                  })|tY        |      n|}*|)j                  |*d       |%_        n4||n|jf                  })|)j                  |tY        |      n|d       |%_        |%jI                  d>|jZ                         tY         I9|            |%_        |%jI                  d>?|          $ \ | jI                  dAtY        K             | jI                  dBtY        K             |ji                  |jk                  |             n-|dCk(  rddDl6m7}+ ddEl8m9}, ddFl8m:}- ddGl8m;}. |+jy                         }/| dH}Gr|j                  dI      ndM>?ACDEGHIKLMNO9PQRfdJ}0?DKQfdK}1|/jz                  QdLQ_>        g DGrmtO               EtO               LdMv sdNv rt               \  EL|j                  dOg       }2|j                  dPtO                     N|j                  dQtO                     O|j                  dI      M |	|z         D 3ci c]  }3tY        |3j`                        |3 }4}3dKMrg }5g }6MD ]  }7|7j                  dR      dSk(  rH|7j                  dTd      }8|6D 9cg c]  }9|9j                  dTd      |8k  r|9 }6}9|6j                  |7       _tY        |7j                  d@            }:|4j                  |:      s|5j!                  |6       g }6|5j                  i |7d@|:i        i Ot5        |5dUV      D ]5  \  P}7|7j                  d@      }:|7j                  dR      d7k(  s,|:Ovs1PO|:<   7 |5D ]{  }7|7j                  dR      dSk(  r! |1|7j                  d=      xs dW       KdUz  K8|7j                  d@      R|4j                  Rd      9Oj                  RKdUz         P |0        KdUz  K} nWt5        |2dUV      D ]&  \  PR|4j                  Rd      99s |0        KdUz  K( n t5         |	            D ]  \  K9 |0         |/j                  |       nt        dX|       t-        |dY      5 };Bj                         5  |j                  |;dZdZ[       ddd       ddd       ddd       yc c}w # 1 sw Y   YxY wc c}3w c c}9w # 1 sw Y   5xY w# 1 sw Y   9xY w# 1 sw Y   yxY w)]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                 Z   j                  | j                        }| j                  }t        |t        j
                  j                        xr | j                  }t        |t        j
                  j                        xr | j                  }t        |t        j
                  j                        xr | j                  }t        |t        j
                  j                        xr | j                  }t
        j                  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_dictr4   obj_owner_idobj_parent_idrF   r   s          r#   check_access_objz*export2file_task.<locals>.check_access_objE   s    ))#..9<<$UCJJ,@,@A_cF_F_!%)<)<=R#BRBR"5#***=*=>P3==0:5#**BVBV0W  1F\_  ]F  ]F-##00+#..Zfff}(,Q_d	 1 
 	
    c              3      K   d}d}d| vrdg| z   } g d}g }t        
      r|ddgz  }	 
j                  |||z   g| |z   |z         }|sy ||z  }|D ]  } 	|      s|  >w)Nr   iP  --)rD   access_authorcmf_author_idperm_security_level_idaccess_responsibleresponsible_id
spectators	executors
project_idrE   rB   rF   
logic_typeactivity)filterslicefieldsr   r   )r?   slist)r^   startstepsecurity_fieldspreload_fieldsdatarowr*   r   rN   clsr   r   s          r#   paginate_dataz'export2file_task.<locals>.paginate_dataT   s     vVf_F

 c?+ |Z88N99C$)54<#8$*_$<~$M.>&.	  0D
 TME #C(I s   AA*#A*c                    | yt        | d      rt        | j                        S t        | d      rt        | j                        S t	        | t
              r%dj                  | D cg c]
  } |       c}      S |r^t        |t        j                  j                        r:||n|j                  }|t        |       n| }|j                  |t        |             S |rXt        |t        j                  j                        r4||n|j                  }|j                  |t        |       |       S | |       S | rt        |       S dS c c}w )N r
   r   ,)hasattrstrr
   r   
isinstancelistjoinr?   r@   r^   CmfChoiceIntchoicesget	CmfChoice)val	field_objchoices_overridere   rq   
lookup_keyconvert_vals         r#   rx   z%export2file_task.<locals>.convert_valq   s   ;S&!sxx= S$svv;T"88=#[-=>>:i1H1HI*:*F&IL]L]G%5%ASsJ;;z3s844:i1E1EF*:*F&IL]L]G;;+;+Gs3xRUVVSRUVV"3s8** >s   &Ec                 d    |j                  d      D ]  }t        | |      st        | |      }  | S )u   
        Получить поле объекта. Как getattr, только работает с вложенными полями
        Например: get_included_attr(doc, 'person.second_name')
        r   )splitrk   getattr)rI   	field_strfields      r#   get_included_attrz+export2file_task.<locals>.get_included_attr   s9    
 __S) 	*EsE"c5)	* 
rO   fields_namec                 @    fdi }| D ]  } |      ||<    |S )Nc           
         |	v r	|   S |j                  d      }| j                  j                  |d         }ddi}|sY| j                  |j	                         v r=t        t              || j                        }|j                  j                  |d         }|}t        t        t                    }t        j                  j                  |d<   |r|j                  }t        |      dkD  rft        |d      r|j                  r|j                  d   }nt        |d      r|j                  }n|S | d 
||   dj                  |dd               }|S )	Nr   r   CmfTestplanTestcaseCmfTestcaserA      r   rJ   )rz   r^   rr   r   keysvarsr   copyr@   rA   captionlenrk   rJ   ro   )	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   sE   _,&z22$**3/K$$((Q8E%}M Y11]5G5G5II#'<i>R>R0S#T (//33KNCCd6l+J&)jj&:&:J{#mm{#a'uh/ELL%*\\!_
 0%*[[
"
 E;z*/EsxxP[\]\^P_G`#a"bcCJrO    )r   r   r   r   rf   r   s      @r#   get_captionsz&export2file_task.<locals>.get_captions   s3    	6 % 	;J)#z:C
O	;
rO   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           	      f   t              sy t        | dd       }|sy t        |      t        t        | dd             t        t        | dd             |f}|v r|   S j                  |       }d }|r8|j	                  di       j	                  |      r|d   |   j	                  d      }||<   |S )NrY   logic_type_idactivity_id	ui_fieldsrq   )r?   r{   rl   _build_ui_formrr   )	re   r   rY   	cache_keyui_form_customresultr*   _row_choices_cacherf   s	         r#   get_row_field_choicesz/export2file_task.<locals>.get_row_field_choices   s    #/S,5

O_d34]D12	
	 **%i00++C0n00bAEEjQ#K0<@@KF(.9%rO   c                     |rGt        |t        j                  j                  t        j                  j                  f      r	 | |      S y )N)r?   r@   r^   rp   rs   )re   r   ru   r   s      r#   get_choices_overridez.export2file_task.<locals>.get_choices_override   s8    I

0G0GI]I]/^_(j99rO   csvz/export.csvzw+ri   )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taskr`   0
build_infoitemr   r
   r   valuer   endtotalxlsx)workbook)open_workbook)XL_CELL_DATE)xldate_as_tuplez/export.xlsxroadmap_export_rowsc            
         g } D ]  }dk(  rGj                  j                  |             |dv r#j                  j                  |       d       r|dk(  r| j                  dz          lr`|dk(  r[j                  !g       }|D cg c]  }t        j                  |d              }}| j                  dj                  |             Ήra|dk(  r\j                  !g       }|D cg c]  }t        j                  |d              }}| j                  dj                  |             1r!|d	k(  r| j                  t	                     T |      }t        |d       } ||      }	| j                   |||	             |dv sj                    |            d
      }
| j                  |
j                          dk(  r j                          j                  |        rst        !f         } j                  } j                  |   }t        |d      |_        |dkD  |_         j                  |d      }|j                  d|dz  z   |j                   |_        y y y y c c}w c c}w )Nr   r   r   r.   r   r/   z; r0   r-   r      )re   column    )appendrr   rl   ro   _indicator_textr{   BeautifulSoupr   max_rowrow_dimensionsminoutlineLevelhiddencellr   )"csv_rowr}   predecessorstid sequence_numbers_of_predecessors	followerssequence_numbers_of_followersfield_valueru   rv   soupdepthxl_rowrd
first_cellbs4captionsrf   rx   csv_headr   followers_offrom_roadmapr   r~   ipredecessors_ofr   roadmap_level_ofroadmap_sequence_mapre   seq
sheet_xlsxr   s"                  r#   	write_rowz#export2file_task.<locals>.write_row\  s   ( 6EAv U(;< $;;$OOx||E/B.C<,PQ#1P(Pqs+%%3O*O'6':':3'Cp|;}ilC@T@X@XY\^b@c<d;}8;}tyy1Q'RS%%3L*L$0$4$4S"$=	mv8wfi=Q=U=UVY[_=`9a8w58wtyy1N'OP%%3M*Ms';<&7U&C$+C$=	+?UI+V({;	K['\] $;;#&#4#4[ARSVX]A^5_ag#hD#NN4995366 6%%h/!!'*(;,S#s_=E'//F $226:B&)%mBO %	BI ",VA!FJ!''3.1UQY.?-@AQAQ@R+S
( 4 )<<+ <~ 9xs   "J1"J
c                    g }D ]  }dk(  rGj                  j                  |             |dv r#j                  j                  |       d       |dk(  r|j                  dz          i|dk(  r|j                  |        |j                  d       |dv s|j                  d        dk(  rj                         j                  |       y)uS  Пишет group-header строку плоского XLSX Roadmap.

                Подпись намеренно кладётся в `name`/«Наименование», а override-строка
                держит парные «без html» колонки text/result_text рядом с видимыми.
                r   r   r   r.   r   r
   N)r   rr   )
group_namer   r}   r   r   r   r   r   s      r#   write_group_rowz)export2file_task.<locals>.write_group_row  s     ( 1EAv U(;< $;;$OOx||E/B.C<,PQ ??q1u-&z2t, $;; $NN401" 6%%h/!!'*rO   u   Выгрузкаr/   r0   roadmap_ordered_idsr   r   typegroupr   r   )r`   u   Не назначеноu7   Это формат не поддерживается: rbF)backupmake_preview)NN)Dr   r   r   common.models.cmf_active_entityr*   r   r   r   rr   boolrn   r^   valuesvisibler   r   extendr?   r@   
CmfRelBasetempfileTemporaryDirectoryopenr   writerQUOTE_MINIMAL	enumerater{   r   r   writerow	xml.etreer   pathlibr   Elementsetrequestr   dictrz   CmfRelationBaser
   rk   rl   r   
CmfM2MBaseCmfBackrefBaser   rp   rs   rq   write_bytestostringopenpyxlr   xlrdr   r   r   Workbookactiver   $_prepare_predecessors_followers_mapsr   	Exceptionr   upload_stream_file)Sr   r   r   r   r   r   r   r   r"   rg   r   r}   
new_fieldsadditional_fieldsr   tmpdir	file_pathcsvfiler   r   r   r   ru   rv   r   ETr   r   r   r   r   r&   r   r   r   elementsr   
field_infokeyvr   rq   rw   r   r   r   r   	book_xlsxr   r   r   rI   	id_to_objvisible_export_rowspending_group_rows
export_rowr   re   task_idfr*   r   r   r   rN   rf   r   rx   r   r   r   r   r   r~   r   r   r   r   r   r   r   r   r   sS     `` ``                                                  `  @@@@@@@@@@@@@@@@@@@@@@@r#   r   r   '   sX    #?-L
 %;).&F#A	O v,z
"C%%))->)?J
 
 :+(	$ B 58ZZ5F5F5HZEEMMu''ZJ9:! 
&
J*DD$$ &t u 004J <EO78ZZ^^J'Jszz~~j7QSVS]S]ShSh,i'!J*%
& KK(H*
 
	$	$	& QS&%!(+.Iir2 -gGs.13;L;L $ N'k(BC -FAs G!, 66$OOHLL,?@$(?? (8<<3F2G|0T U&7U&C$+C$=	+?UI+V({;	K['\] $;;#&#4#4[ARSVX]A^5_ag#hD#NN49956  Av1OOG,+-- -8 E!3$VL1I**U#CGGIv&jj+GJJwJJw'E"EJNN5!::f%DDINN4 **]3KLKNN;'**Z0K&KNN;'::f%DHHWc"NN4 L1JNN:&#M+$>? +H3zz&)6t$"- 'HJ","2"23"7KJJNN;q>:E&q>X535::k!n3MQ0H[^$<=!)k!n!=J")#k!n"=K!%)C)CD&'+F|K4J4J'K'R'R X#&&=6A6F6FJO$,#*;#<$.NN3GKQT<U8V$WX 'NN9emmD#ECJJ,A,A3::C\C\+]^&&NN9emmD%0 9(*

7(; %		$ 5-.VV
 * 1 1% 8	9
 $ECJJ,C,CSZZEYEY+Z[&.$+?ZQV+W(%eSZZ-D-DE:J:V&6\a\i\iG=M=Y[)9_jJ.5kk*b.IJO:J:V&6\a\i\iG.5kkN^Nj#k:Jp{}  /AJO"y%--@*-.?Z.P*Q
"y(:2FGO'H	+HZ HHUCF#HHWc!f%!!"++c"23F" **), ))+I!(,/IGS&**-B"CY].T .T .T`+ +< #))J1JH#v"&&/;>B[_jBj4X4Z1L/&,jj1F&K##)::.@$&#I '-zz2H$&'Q$&,jj1F&G#9F{UfGf9gh#S[#-h	h&*,')+&&9 V
%>>&1W< %/NN7A$>E 0B2(+#&777A#6#> !$2. 2 /55jA$"%jnnT&:";$==1/667IJ13./667T*7TdG7TU%V( ,.(+45HPQ+R @Z",.."6%>>&1V;Oc@c<?09@
 ': 

%>>&1W<+JNN6,B,_F_`FA$(nnT2'mmC6266sAEB!Q
 %..A$K S'mmC6"$!Q (k(BC  FAsK  NN9% UVaUbcdd)T" 	Sa $$& S--aE-RS	S[QS QSa [f- -b i2`S S	S 	S[QS QSs   9o
o
o=&Co4A%oI,o=Ao=Bo=Lo=o<:o=6o ?o=A&o=;o= Do=o1o%1o19o=o	o=%o.*o11o:	6o==pc                  B   t        t              } t        t              }g d}g d}t        j                  j	                  ||      D ]R  }| |j
                     j                  |j                         ||j                     j                  |j
                         T | |fS )N)rQ   out_link_id
in_link_id)zrelation_type.codez==zsystem.finish:start)r^   r\   )r   rn   r   CmfRelationOptionr_   r&  r   r'  )r   r   _fields_filterrels        r#   r  r    s    t$L!$'O/G?G''--WW-M @S__%,,S^^<'..s?@ ((rO   c                 2    dddd}|j                  | |       S )Nu   Фиксированная   Не раньше   Не позже0-constz3-afterz4-beforerr   )codestart_restriction_names     r#   _get_start_restriction_labler4    s(    3*)
 "%%dD11rO   c                 2    dddd}|j                  | |       S )Nu   Фиксированныйr-  r.  r0  z1-afterz2-beforer1  )r2  finish_restriction_lables     r#   _get_finish_restriction_labler8    s(    3*) 
 $''d33rO   c                    t        | t        j                        r| j                  d      S t        | t        j                        rDt        j                  | j                  | j
                  | j                        j                  d      S y)Nz%d.%m.%Yri   )rm   r   r   dateyearmonthday)ds    r#   _format_dater?    s^    !X&&'zz*%%!X]]#  !%%8AA*MMrO   c                 V   t        | dd       }|syt        |dd       }|rdt        |       dS g }t        |dd       }|dv rCt        |      }d| d	}t        |d
d       }|r|dt        |       dz  }|j                  |       t        |dd       }|dv rCt	        |      }d| d}t        |dd       }	|	r|dt        |	       dz  }|j                  |       t        | dd       }
t        |dd       }|r%|
r#||
kD  r|j                  dt        |
       d       dj                  |      S )Nop_gantt_taskri   actual_finish_dateu   Была завершена "r   constrain_start_typer/  u/   Установлено ограничение "u    " для "Дата начала"constrain_start_dateu    на "constrain_finish_typer6  u&   " для "Дата окончания"constrain_finish_datedeadlinesched_finish_dateuS   Указана дата окончания позже крайнего срока "
)r{   r?  r4  r   r8  ro   )instance
gantt_taskactual_finishlines	cst_valuelabellinecsd	cft_valuecfdrG  sched_finishs               r#   r   r     s   ?D9J J(<dCM.|M/J.K1MME 
$:DAI66,Y7@Gghj"8$?gl3/022DT 
$;TBI55-i8@Gmnj"94@gl3/022DT xT2H:':DAL\H%<jkw  yA  lB  kC  CD  E  	F99UrO   )NNNr   FN)NNr   FN)collectionsr   r   
cmf.configr   
cmf.fieldsr@   r   r   r$   cmf_deferred_jobr   r  r4  r8  r?  r   r   rO   r#   <module>rY     so    #      8 GRSimn "&!&&+"LS oLSb)24'rO   