
    1INiR                         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                   23456789:;<=>?@ABC ddl 2ddlm6 | dk(  ;;rd} dddd	d
:t        t              |    5t        j
                  j                  |      }dt        f6fd445fd}	dR7fd	7d <dt        f5:fd}
s?5j                  j                         D cg c]  }|j                  s|j                   c}t               };r|j                  d       t               }D ]  };r|dk(  r|j                  g d       nj|dk(  rd}d:d<   n]5j                  j                  |      rBt        5j                  j                  |      t         j                  j"                        r|dz  }|j                  |        | |
      3t%        j&                         5 }|dk(  rF| d}t)        |dd      5 }ddl}|j-                  |dd |j.                  !      }g 8t1         |	            D ]  \  =Ag }D ]  }=dk(  rG8j                  3j                  |             |d"v r#8j                  3j                  |       d#        <A|      }t3        5|d      }|j                   7||             |d"v s2j5                   7 <A|            d$      }|j                  |j6                          =dk(  r|j9                  8       |j9                  |        	 ddd       n |d%k(  rdd&lm} dd'lm }  ||d(      }|jC                  d)      }|jE                  d*d+       |jC                  d,      }|j                  |       |jC                  d-      }d.|_        |j                  |       |jC                  d/      }tF        jH                  |_        |j                  |       |jC                  d0      }d1|_        |j                  |       |jC                  d2      }d3|_        |j                  |       |jC                  d4      }|jE                  d5d6       |j                  |       |jC                  d7      } |j                  |        t1         |	            D ]  \  =A|jC                  d8      }!tK               }"|j                  |!       D ]  }|jM                  d9      }#5j                  j                  |#d         }|#d   |"vr1|jC                  |#d         |"|#d   <   |!j                  |"|#d             |"j                  |#d         }$t3        A|#d         }t        |t         j                  jN                        r|st        t              |j                     j                  D ]K  }%|%d:k(  r|jP                  |$_        tS        ||%      s'|$jE                  |%tU        t3        ||%                   M |$jE                  d;|jV                         Gt        |t         j                  jX                  t         j                  jZ                  f      rx|s|$jE                  d;|jV                         |D ]Q  }&|jC                  d<      }'|'jE                  d=|&j\                         |&jP                  |'_        |$j                  |'       S t        |t         j                  j^                        rC|%|j`                  j                  |d      |$_        |$jE                  d;|jV                         dtU         <A|            |$_        |$jE                  d;3|            |jE                  d>tU        =             |jE                  d?tU        =             |jc                  |je                  |             nd|d@k(  rPddAl3m4}( ddBl5m6}) ddCl5m7}* ddDl5m8}+ |(js                         },| dE}235789;<=>?@ABCfdF}-|,jt                  BdGB_;        g 8;rtK               9tK               >dHv sdIv rty               \  9>|j                  dJg       }.|j                  dKtK                     ?|j                  dLtK                     @ |	|z         D /ci c]  }/tU        |/j\                        |/ }0}/d=|.D ]#  C|0j                  Cd      AAs |-        =dMz  =% n t1         |	            D ]  \  =A |-         |,j{                  |       nt}        dN|       t)        |dO      5 }16j                         5  |j                  |1dPdPQ       ddd       ddd       ddd       yc c}w # 1 sw Y   YxY wc c}/w # 1 sw Y   0xY w# 1 sw Y   4xY w# 1 sw Y   yxY w)SzN
    https://bcrm.carbonsoft.ru/project/Document/DOC-007693#spec-007668-b
    r   N)r   
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_dictr3   obj_owner_idobj_parent_idrE   r   s          r#   check_access_objz*export2file_task.<locals>.check_access_objD   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}	 j                  |||z   g| |z   	
      }|sy ||z  }|D ]  } |      s|  ;w)Nr   iP  --)rC   access_authorcmf_author_idperm_security_level_idaccess_responsibleresponsible_id
spectators	executors
project_idrD   rA   rE   )filterslicefieldsr   r   )slist)r[   startstepsecurity_fieldsdatarowr   rM   clsr   r   s         r#   paginate_dataz'export2file_task.<locals>.paginate_dataS   s     vVf_F

 99C$)54<#8$*_$<.>&.	  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 |rZt        |t        j                  j                  t        j                  j                  f      r|j                  j                  | |       S | rt        |       S dS c c}w )N r
   r   ,)hasattrstrr
   r   
isinstancelistjoinr>   r?   r[   CmfChoiceInt	CmfChoicechoicesget)val	field_objra   convert_vals      r#   rr   z%export2file_task.<locals>.convert_valk   s    ;S&!sxx= S$svv;T"88=#[-=>>:i#**2I2I3::K_K_1`a$$((c22"3s8**	 >s   &C'c                 d    |j                  d      D ]  }t        | |      st        | |      }  | S )u   
        Получить поле объекта. Как getattr, только работает с вложенными полями
        Например: get_included_attr(doc, 'person.second_name')
        r   )splitrg   getattr)rH   	field_strfields      r#   get_included_attrz+export2file_task.<locals>.get_included_attry   s9    
 __S) 	*EsE"c5)	* 
rN   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CmfTestcaser@      r   rI   )rt   r[   ro   r   keysvarsr   copyr?   r@   captionlenrg   rI   rk   )	class_obj
field_namepural_namesrw   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JrN    )ry   r   r   r   rb   r   s      @r#   get_captionsz&export2file_task.<locals>.get_captions   s3    	6 % 	;J)#z:C
O	;
rN   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.namecsvz/export.csvzw+re   )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.xlsxc            
         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t        dz   f         }
j                  }j                  |   }t        |
d      |_        |
dkD  |_        j                  |d      }|j                  d|
dz  z   |j                   |_        y y y c c}w c c}w )Nr   r   r   r-   r~   r.   z; r/   r,   r      )ra   column    )appendro   rh   rk   _indicator_textru   BeautifulSoupr   max_rowrow_dimensionsminoutlineLevelhiddencellr   )csv_rowrw   predecessorstid sequence_numbers_of_predecessors	followerssequence_numbers_of_followersfield_valuerq   soupdepthxl_rowrd
first_cellbs4captionsrb   rr   csv_headr   followers_offrom_roadmaprx   ipredecessors_ofroadmap_level_ofroadmap_sequence_mapra   
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$=	{;	'JK $;;#&#4#4[ARSVX]A^5_ag#hD#NN4995366 6%%h/!!'*,S#q1u->?E'//F $226:B&)%mBO %	BI ",VA!FJ!''3.1UQY.?-@AQAQ@R+S
( 4  + <~ 9xs   "I:1"I?u   Выгрузкаr.   r/   roadmap_ordered_idsr   r   r~   u7   Это формат не поддерживается: rbF)backupmake_preview)N)Ar   r   r   r   r   r   ro   boolrj   r[   valuesvisibler   r   extendr>   r?   
CmfRelBasetempfileTemporaryDirectoryopenr   writerQUOTE_MINIMAL	enumerateru   r   r   writerow	xml.etreer   pathlibr   Elementsetrequestr   dictrt   CmfRelationBaser
   rg   rh   r   
CmfM2MBaseCmfBackrefBaser   rl   rn   write_bytestostringopenpyxlr   xlrdr   r   r   Workbookactiver   $_prepare_predecessors_followers_mapsr   	Exceptionr   upload_stream_file)Dr   r   r   r   r   r   r   r   r"   rc   r   rw   
new_fieldsadditional_fieldsr   tmpdir	file_pathcsvfiler   r   r   r   rq   r   ETr   r   r   r   r   r&   r   r   r   elementsr   
field_infokeyvr   r   r   r   r   	book_xlsxr   r   rH   	id_to_objfr   r   rM   rb   r   rr   r   r   r   r   rx   r   r   r   r   ra   r   r   sD     `` ``                                           @@@@@@@@@@@@@@@@@@r#   r   r   '   s    #-L
 %;).&F#A	O v,z
"C%%))->)?J
 
 0+	$ 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		$	$	& @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$=	{;	'JK $;;#&#4#4[ARSVX]A^5_ag#hD#NN49956 Av1OOG,)-- -6 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
 $E3::+B+BC&.$*/--*;*;K*L
"y%--@*-.?Z.P*Q
"y(:2FGA H	$HL HHUCF#HHWc!f%!!"++c"23F" **), ))+I!(,/I.T .T .T` #))J1JH#v"&&/;>B[_jBj4X4Z1L/&,jj1F&K##)::.@$&#I '-zz2H$&'Q$9F{UfGf9gh#S[#-h	h. C#--T2C KFA (k(BC  FAsK  NN9% UVaUbcdd)T" 	Sa $$& S--aE-RS	Sy@S @S' [,- -R i&S S	S 	Sy@S @Ss   ,e	>e	1e7CeA%e4I,e7!Ae7.Be75H?e74eA9e7
e+e0e+8e7e	e7e($e++e4	0e77f 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)rP   out_link_id
in_link_id)zrelation_type.codez==zsystem.finish:start)r[   rY   )r   rj   r   CmfRelationOptionr\   r  r   r	  )r   r   _fields_filterrels        r#   r   r     s    t$L!$'O/G?G''--WW-M @S__%,,S^^<'..s?@ ((rN   c                 2    dddd}|j                  | |       S )Nu   Фиксированная   Не раньше   Не позже0-constz3-afterz4-beforero   )codestart_restriction_names     r#   _get_start_restriction_labler    s(    3*)
 "%%dD11rN   c                 2    dddd}|j                  | |       S )Nu   Фиксированныйr  r  r  z1-afterz2-beforer  )r  finish_restriction_lables     r#   _get_finish_restriction_labler    s(    3*) 
 $''d33rN   c                    t        | t        j                        r| j                  d      S t        | t        j                        rDt        j                  | j                  | j
                  | j                        j                  d      S y)Nz%d.%m.%Yre   )ri   r   r   dateyearmonthday)ds    r#   _format_dater!    s^    !X&&'zz*%%!X]]#  !%%8AA*MMrN   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_taskre   actual_finish_dateu   Была завершена "r   constrain_start_typer  u/   Установлено ограничение "u    " для "Дата начала"constrain_start_dateu    на "constrain_finish_typer  u&   " для "Дата окончания"constrain_finish_datedeadlinesched_finish_dateuS   Указана дата окончания позже крайнего срока "
)ru   r!  r  r   r  rk   )instance
gantt_taskactual_finishlines	cst_valuelabellinecsd	cft_valuecfdr)  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rN   )NNNr   FN)NNr   FN)collectionsr   r   
cmf.configr   
cmf.fieldsr?   r   r   r$   cmf_deferred_jobr   r   r  r  r!  r   r   rN   r#   <module>r;     so    #      8 GRSimn "&!&&+"RS oRSn
)24'rN   