
    @i                        d dl Z d dlZd dlmZ d dlZd dlZd dlmZ d dlm	Z	m
Z
 d dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlmZ d dlZd dlmZ d dl d dlmZ d d	lmZ  G d
 dej:                        Zy)    N)deepcopy)Path)DictIterator)cached_property)ParserError)*)cmf_plugin_csvcmf_contextc                   F   e Zd ZU dZej                         ed<   dZed        Z	de
fdZedee   fd       Zd Zedeeef   fd	       Zed
ede
fd       Zd ZdededefdZd Zd Zd Zd Zd Zd Zd Zd Zd Zd Z d Z!dDdefdZ"dDdefdZ#d Z$d  Z%d!efd"Z&d# Z'd$ Z(d% Z)d& Z*d' Z+d( Z,d) Z-d* Z. e/j`                  e/jb                  e2d+d,-      d.        Z3d/ Z4d0 Z5d1 Z6d2 Z7d3 Z8d4 Z9d5 Z:d6 Z;dEd7Z<d8 Z=d9 Z>d: Z?i dfd;Z@d< ZAd= ZBd> ZCd? ZDd@ ZEdA ZFdB ZGdC ZHy)FCmfPluginCsvN_loggerr   c                     dt         j                  j                         t         j                  j                  g dddt         j                  j                         t         j                  j                  dgddt         j
                  j                         t         j
                  j                  dgddt         j                  j                         t         j                  j                  dgddt         j                  j                         t         j                  j                  dgdd	t         j                  j                         t         j                  j                  g ddd
t         j                  j                         t         j                  j                  g dddt         j                  j                         t         j                  j                  dgddt         j                  j                         t         j                  j                  g dddt         j                  j                         t         j                  j                  ddgddt         j                  j                         t         j                  j                  ddgddt         j                  j                         t         j                  j                  ddt         j                   j                         t         j                   j                  dddt         j"                  j                         t         j"                  j                  ddg} | S )uR   Собственный магазин при выборе импорта из Jirau#   Поля пользователей)CmfTaskCmfTestplanCmfTestcase)captionfieldsiconavailable_foru!   Поля контрагентовr   u   Поля задачu,   Оперативная гант-задачаu   Журнал работu!   Поля комментариевu   Поля проектовu"   Поля списков задачu   Поля группu   Поля активовr   r   u   Поля локацийu   Поля тесткейсов)r   r   r   u2   Поля тесткейсов тестплановT)r   r   r   hiddenu*   Поля выполнения тестов)models	CmfPersonimport_shop_fieldsr   
CmfCompanyr   CmfGanttTaskCmfTimeTrackerHistoryCmfTimeTracker
CmfComment
CmfProjectCmfListCmfPersonGroupCmfAssetCmfLocationr   CmfTestplanTestcaseCmfTestcaseRun)ress    +./modules/settings/models/cmf_plugin_csv.pycalc_models_settingsz!CmfPluginCsv.calc_models_settings   s    >IYIYIlIlIn%%**=fh;vGXGXGkGkGm&&++ykK-9Z9Z9\^^((I;HFRXReReRxRxRz((--M1V=Y=Y=l=l=n**//9+O;vGXGXGkGkGm&&++>gi3v?P?P?c?c?e&&++>gi<HiHiHk^^((I;H-9N9N9a9a9c**//Bkm1V__=_=_=a__))]M<Z\1V=O=O=b=b=d'',,}?]_76CUCUChChCj'',,.LX^XrXr  YF  YF  YH//44FDPVPePePxPxPz**//4A7
< 
    returnc                    |j                   }d}d}	 | j                  |      }t        |      D ]  \  }} 	 |S # t        $ r6 d| d| }| j                  j                  |       t        |d       d}Y |S t        $ r' | j                  j                  d| d|        d}Y |S t        t        f$ r' | j                  j                  d| d|        d}Y |S w xY w)	NFr   uK   Не корректный формат загружаемого файла :T)abort*   Приложен пустой файл CSVu5   Не удаётся прочитать строчку)
full_path_file	_get_file	enumerateUnicodeDecodeErrorr   	exception	cmf_alertStopIterationIOError
ValueError)self
attachment	file_path
have_errornum	file_read_msgs           r)   _check_filezCmfPluginCsv._check_fileB   s   --	
	z2I#I. Q  " 	_`i_jjklokpqCLL""3'c&J   	LL""#OT]S^^_`c_dQefJ  $ 	LL""#Z_h^iijknjo\pqJ	s   $9 ;C7+C%1CCc              #     K   t        | j                        }|j                  dk(  rat        j                  t        |            }|j                  d      }|j                         D ]  }|D cg c]  }|j                   c}   y |j                  dk(  rFt        j                  t        |            }|j                  }|j                  d      D ]  }|  y |j                  dk(  rMt        j                  d       t        |d      5 }t        j                   |d	d
      D ]  }|  	 d d d        y y c c}w # 1 sw Y   y xY ww)N.xlsr   .xlsxT)values_only.csvi r;")	delimiter	quotechar)r   r1   suffixxlrdopen_workbookstrsheet_by_indexget_rowsvalueopenpyxlload_workbookactive	iter_rowscsvfield_size_limitopenreader)r;   attachment_file_pathworkbook	worksheetelitemfiles          r)   r2   zCmfPluginCsv._get_fileW   s=    #J$=$=>&&&0))#.B*CDH //2I((* 2.01dtzz112 	 "((G3--c2F.GHH I))d);  	 "((F2  -*C0 D**TSCH BH 	 2 	s+   A+E-D: BE"D?0E?EEc           	      ^   |j                   | _        |j                  sy t        j                  j                  dgdd|j                  gdg      }dg d}t        j                  j                  |dd	g d
gdgdg      }| j                  |      }|rg S | j                  |      }| j                         }t        |      D ]A  \  }}	|dkD  r|j                  d   s n'|dkD  r nt        |	      D ]  \  }
}d}t        |t        j                        r|j                  d      }|dk(  r|r|j                  d   rut!        |j                  d         D ]Z  }d|vrd|vr nP|d   dk7  r|d   D ]=  }|d   |k(  s|d   }|r*| j#                  |d         s|d   j%                  |       d} Z \ |r|d   j%                  |d d d d       |d   |
   }|j                  |d         }||d<   |s||d<   |d   |d<    D |d   s| j                  j'                  d       g S d|d<   |gS )N-cmf_modified_atidz!=json_settings)order_byfilterr   CSVnamer   	file_typeINrG   rD   rE   urlparentrg   rf   r   r   	first_row   Fz%Y-%m-%d %H:%M:%Simport_settingsrj   r   titlemodel_fieldfield_qualnameT)rt   file_valru   r   rw   r   r0   r   entity)loggerr   attachmentsr   	CmfImportgetrd   CmfAttachmentrB   r2   _default_mapping_csvr3   re   
isinstancedatetimestrftimer   _is_backref_fieldappendr5   )r:   
cmf_importprev_settingssettingsr;   r=   r?   default_mappingirowjvalfoundprev_set
prev_fieldru   row_settingss                    r)   calc_import_settingsz!CmfPluginCsv.calc_import_settingsk   s   !((%%((,,7I6JTXZ^`j`m`mSn5D4E - G!R0))--'@A()7	 . 

 %%j1
INN:.	335	* *	CFAs1uZ55kBQ#C. %C3 c8#4#45,,':;C6$)D)DEV)W(01L1LM^1_(` *H%X5((:R %'/58 (.6x.@ *
#-g#6##=2<]2KK'24;Q;QR]^nRo;p(0(:(A(A*(M04$)** ! *11CTBFPT3X Y $,H#5a#8L"1"5"5l76K"LK/2L,"6A]3/:6/BV,K%C*	CX !LL""#OPI 'zr+   c                  @   d} d}d}i dd| ddd| dd	d
| ddd| ddd| ddd| ddd| ddd| ddd| ddd| ddd| ddd| ddd| ddd | dd!d"| dd#d$| dd%d&| di d'd(| dd)d*| dd+d,| dd-d|dd.d|dd/d0|dd1d
|dd2d3|dd4d|dd5d6d7dd8d9d7dd:d;d7dd<d=d7dd>d?d7dd@dAd7ddBdCd7ddDdEd7ddFd7dddGddH}|j                  i dIdFd7ddJddddKddddLdMd7ddNdOdPddQd9d7ddRd;d7ddSdCd7ddTdUd7ddVdEd7ddWdXd7ddYdZd7dd[dddd\d=d7dd]d6d7dd^d_ddd`ddadd|dddaddbdaddcdaddddadddadd|dddeddfdeddg	       i }t        j                  j                         D ]
  }|||dh   <    |j	                         D ]^  \  }}|j                  didj      }|j                  dkdj      }	t        t        |      }
||	| dl|	 |
j                  dm|
j                  dn||<   ` |S )oug    Структура сопоставления полей из файла CSV по умолчанию. r   r!   r"   u/   Ид внешней системы задачиext_id)
field_name
model_nameu   Тема задачиrj   u   Тип задачи
logic_typeu(   Дата изменения задачиcmf_modified_atu&   Дата создания задачиcmf_created_atu*   ФИО изменившего задачуcmf_modified_byu   Код задачиcodeu   Описание задачиtextu   Статус задачиstatusu   Будильник задачи
alarm_dateu$   Крайний срок задачиdeadlineu   Важностьpriorityu   ФИО исполнителяzresponsible.nameu   Email исполнителяzresponsible.emailu   ФИО автораzcmf_author.nameu   Email автораzcmf_author.emailu!   ФИО соисполнителяzexecutors.nameu    Email соисполнителяzexecutors.emailu%   Родительская задачаparent_tasku$   Код основной задачиzparent_task.codeu   Название проектаu   Код проектаu   Префикс задачtask_code_prefixu   Тип проектаu   Вид деятельностиactivityu   Список задачu/   Фактические трудозатратыactual_workr   u&   Плановая дата началаsched_start_dateu,   Плановая дата окончанияsched_finish_dateu/   Планируемые трудозатраты
sched_worku2   Сумма дочерних трудозатратagregat_workui   Фактические трудозатраты по собственным ресурсам задачиactual_myself_worku-   Фактический % завершенияactual_completeu   Дата финишаactual_finish_dateoutline_numberr    )u]   Структурный номер (для поиска родительской задачи)u   Комментарийu   СДРu   ИДu   Название_задачиu   Длительностьsched_durationu   Предшественникиin_linkCmfRelationOptionu   Дата_началаu   Дата_окончанияu#   Процент_завершенияu#   Фактическое_началоactual_start_dateu)   Фактическое_окончаниеu   Тип_ограниченияconstrain_start_typeu   Дата_ограниченияconstrain_start_dateu   Дата_созданияu7   Запланированные_трудозатратыu/   Фактические_трудозатратыu   Вехаis_milestoneIDr   folder	cmf_ownersignificancer&   testplan_testcase_folder)	   Расположениеu   Наименование   Набор тестовu
   Авторu   Приоритетu   Статусr   u   Названиеr   r   r    r   .T)r   r   rv   r   requiredverbose_name)	updater   r   r   itemsr|   getattrr   r   )name_cmf_taskname_cmf_projectname_cmf_epicr   default_local_attrs_mappingshop_frt   value_modelr   	name_attrmodels              r)   r~   z!CmfPluginCsv._default_mapping_csv   s.   
 "'!&
=hfs?t&
#F-%X&
 ",m#\&
 7GXhu8v	&

 5EUer6s&
 9IZjw:x&
 "&#V&
 ,FR_-`&
 (P])^&
 .lZg/h&
 3:]j4k&
 z W&
 ,<N^k-l&
 +;N^k,l&
 "2CS`#a&
  !1CS`"a!&
" 0@P`m1n#&
$ /?P`m0n%&
& 4Man5o'&
( 3CUer4s)&
* .fTd/e+&
, $FJZ%[-&
. (8JZj)k/&
0 $LP`%a1&
2 .jXh/i3&
4 &fM'Z5&
6 >mky?z7&
8 5EWgu6v9&
: ;K^n|<};&
< >ljx?y=&
> AQ_o}B~?&
@ x  I]VdzfA&
D <L]m{=|E&
F $4HXf%gG&
H }M  ]k  nl5;<&XK&
N 	 : 
%5^T: 
()D: 

 ,FR[-\: 
 '7GWe(f: 
 -YVi.j: 
 $4FVd%e: 
 *:M]k+l: 
* 2BScq3r+: 
, 2BUes3t-: 
. 8H\lz9{/: 
4 ,<Rbp-q5: 
6 .>Tdr/s7: 
< (8HXa)b=: 
> FVb  sA  HB?: 
B >mky?zC: 
P ~YOQ: 
Z G[: 
\ 8>M](^7=]([6>m'\)4MR1?}"]+3=Q 8>M](^/5EZ [6P`u'vq: 
 :	v ')#nn779 	DF=C'y(9:	D"1"7"7"9 		VE;$r:J#b9IFJ/E=B@IGQlRST]S^D_:?**>BBGBTBT2V'.			V +*r+   rv   c                 8   | j                  d      ^}}t        j                  |      }|D ]m  }t        ||      }t	        |t
        j                  j                        r yt        |d      r|j                  s yt        j                  |j                        }o y)Nr   Tr   F)
splitcmfutilget_model_by_namer   
issubclasscmfr   
CmfBackrefhasattrr   )rv   r   attrsr   attrfields         r)   r   zCmfPluginCsv._is_backref_field.  s    +11#6
U))*5 		;DE4(E%!6!67E7+  --ekk:E		; r+   c                    g }ddg g d}d}t         j                  j                  |ddg dgdg	      }|s%| j                  j                  j                  d
       | j                  |      }|j                  d   rt        |       t        |      D ]  \  }}|dk(  r ng }	|d   j                  |	       t        |j                        D ]f  \  }
}|d   s|d   d   j                  d      d   }|s|dk(  rd}|dv s4|dk(  r|d   j                  |d   d          |	j                  ||
          h  |d   r|j                  |       |s
d|d<   d|d<   |S )Nu   Сделки	handshake)rt   r   titlesrowsFrk   rl   rm   rc   )rp   rg   rf   u)   Не найден файл импортаrq   rr   r   ru   rv   r   r   CmfDealT)r   r   r   r   u   Задачиrt   zcalendar-todayr   )r   r}   r|   r   ry   errorr2   re   nextr3   r   csv_import_settings_fieldsr   )r:   r   resultdealsis_dealattachr?   r   r   data_rowr   r   r   s                r)   previewzCmfPluginCsv.preview@  s   (+UWX%%))'@A() * 

 OO""(()TUNN6*	##K0O	* 	,FAsAvH&M  *()N)NO 	,8.%m45EFLLSQRST
:#:"G!77Avh..x/Fy/QROOCF+	,	,  ?MM% +E'N,E&Mr+   	row_arrayr   c                    t               }t        |d   d         D ]  \  }}||   s|d   s|d   d   |j                  k7  r)|d   d   j                  d      }t	        ||d         }|j
                  j                  d      r|j                  dv rd	||   i||d   <   t        |t        j                  j                        r-t        |      d
kD  r|d
   ||   i||d   <   d||   i||d   <   |j
                  dk(  rt        ||         ||d   <   |j
                  dk(  r| j                  ||         ||d   <   &t        |d      r'| j!                  ||   |j"                        ||d   <   Yt        |t        j                  j$                        rA||   j'                         }	h d}
h d}|	|
v r
d||d   <   |	|v r
d||d   <   d ||d   <   ||   ||d   <    |S )Nr   r   ru   r   r   r   cf_)CmfM2MCmfCascadeChoicerj   rr   r   r   choices>      да1yestrue+>   0nofalse   нет-TF)dictr3   r   r   r   
class_name
startswithwidgetr   r   r   
CmfRelBaselenrP   calc_priorityr   calc_choicesr   CmfBoollower)r:   r   r   r   r(   idxfield_settingsfield_partsr   rS   true_valuesfalse_valuess               r)   _map_objectzCmfPluginCsv._map_objecte  s   f#,Xa[-B#C %	5CS>!-0.~>%BTBTT(7EKKCPKE;q>2E  ++E2LL$BB'-y~&>KN#E3::#8#89{#a'+6q>9S>*JCA'+3Ys^*DCA'!!X-&))C.&9KN#!!Z/&*&8&83&HKN#	*&*&7&7	#&VKN#E3::#5#56!#,,.?BK'*.CA'l**/CA'*.CA'&/nKN#K%	5L 
r+   c                 p   d }| j                  || j                  j                  d   t        j                        }|ryg }g d}|D ]L  }|j                  |d      }|s|dk(  r|j                  d|d|gdd|gg       n|j                  |d|g        n |r t        j                  j                  |      }|S )	Nrs   r   r   rj   r   r   OR==r   rg   )r   r   re   r   r!   r|   r   )r:   r   project_objproject_filteruniq_fields
uniq_fielduniq_field_values           r)   _get_projectzCmfPluginCsv._get_project  s    ""3(E(EFW(XZ`ZkZklG4K) 
#*;;z2#> #!X-z4AQ.RU[]acsTt'uv
D:J'KL $//3373Cr+   c                    d }| j                  || j                  j                  d   t        j                        }|rg }g d}|D ]L  }|j                  |d      }|s|dk(  r|j                  d|d|gdd|gg       n|j                  |d|g        n |rZt        j                  j                  |d	      }	|j                  d
d|gdd|	gg       t        j                  j                  |      }|S )Nrs   r  r   r   r  r  r   sprinttree_parentsys_typerp   r  r  )	r   r   re   r   r"   r|   r   	CmfFolderextend)
r:   r   r  
sprint_objr  r  r	  r
  r  sprint_folders
             r)   _get_sprintzCmfPluginCsv._get_sprint  s   
!!#t'D'DEV'WY_YgYghG4K) 
#)::j"#= #!X-z4AQ.RU[]acsTt'uv
D:J'KL  & 0 0 4 4W_ 4 `4 =tUb?cde#^^//w/?
r+   c                 N   t         j                  j                  dd|g      }|st         j                  j                  dd|j	                         g      }t        |      dkD  r9| j                  j                  d| dt        |       d	d
d       t        d      |r|d   }|S )Nr   r  r  rj   ILIKErr   u<   Компаний с одинаковым названием z > uF   , укажите код компании вместо названияzERR-0071r   obj_typeu]   Найдено несколько компаний с одинаковым названиемr   )	r   r   r|   liststripr   r   	log_error	Exception)r:   r   company	companiess       r)   _get_companyzCmfPluginCsv._get_company  s    ##''f/E'F))..vw6W.XI9~!))RSYRZZ]^abk^l]m n[ \)	 *      A  A#A,r+   c                    d }|rg }g d}|D ]h  }|j                  |d      j                         }|s&|dk(  r|j                  d|d|gdd|gg       n"|j                  |d|j                         g        n |r t        j
                  j                  |      }|st        d| d	      |S t        j
                  j                  g d
      }| j                  j                  j                  d       |S )N)r   r   asset_code_prefixr   r   r  =r   r  u/   Не найдена схема активов "uf   ", создайте схему и укажите префикс кода активов в файле.)systemr$  Tu   Не указана схема активов. Установлена схема активов по-умолчанию (системная))
r|   r  r   upperr   CmfAssetSchemer  r   ry   warning)r:   asset_schemeasset_scheme_objr  r	  r
  r  s          r)   _get_asset_schemezCmfPluginCsv._get_asset_scheme  s   GAK) 
#/#3#3J#C#I#I#K #!X-z3@P.QTZ\_aqSr'st
C9I9O9O9Q'RS #)#8#8#<#<G#<#L #El^ Tz {     &4488@U8VOO""** _  r+   c           	      8   d }|r|j                  d      xs$ |j                  d      xs |j                  d      }|rH|j                         }t        j                  j                  dd|gdddd| dgdd|gdd	|gggdg
      }|st	        d| d| d      |S )Nr   r   rj   rp   r$  r  LIKE%r  rg   r   u1   Не найдена группа активов "u   " в схеме uY   , создайте группу и укажите ID, код или имя в файле.)r|   r  r   CmfAssetCatr  )r:   	asset_catr*  asset_cat_objr  s        r)   _get_asset_catzCmfPluginCsv._get_asset_cat  s    (}}X6h)--:OhS\S`S`agSh#3#9#9#;  & 2 2 6 6!3(89 %v3C2DA/FG#S*:;#W.>?	 %: !7 ! !G	{Rbcsbt un o 
 r+   c                 D   d }|rg }g d}|D ]Z  }|j                  |d      j                         }|s&|dk(  r|j                  d|d|gdd|gg       n|j                  |d|g        n |r4|j                  dd|g       t        j                  j                  |      }|S 	Nr  r   r   r  r$  r   rp   r  )r|   r  r   r   CmfAssetType)r:   
asset_typer*  asset_type_objr  r	  r
  r  s           r)   _get_asset_typezCmfPluginCsv._get_asset_type
  s    G4K) 
#->>*b#A#G#G#I #!X- $!+S2B C!'.> ?  
C9I'JK #/?@A!'!4!4!8!8!8!Hr+   c                 D   d }|rg }g d}|D ]Z  }|j                  |d      j                         }|s&|dk(  r|j                  d|d|gdd|gg       n|j                  |d|g        n |r4|j                  dd|g       t        j                  j                  |      }|S r5  )r|   r  r   r   CmfAssetTypeCat)r:   asset_type_catr*  asset_type_cat_objr  r	  r
  r  s           r)   _get_asset_type_catz CmfPluginCsv._get_asset_type_cat%  s    !G4K) 
#1#5#5j"#E#K#K#M #!X- $!+S2B C!'.> ?  
C9I'JK #/?@A%+%;%;%?%?w%?%O"!!r+   c           
         t         j                  j                  j                  |      }|j                  }|s|S |j
                  }|j                         D ci c]  \  }}|j                         | }}}|j                         j                         }|j                  |      }	|	sR||vrN|j                         D cg c]  }d| d
 }
}t        d| d|j                   ddj                  |
             |	xs |xs |S c c}}w c c}w NrJ   u&   Не найдено значение "u
   " для "u2   ". Укажите одно из значений: , )r   r$   r   r|   defaultr   r   r   r  valuesr  r   join)r:   r   rS   r   field_defaultfield_choiseskvr   field_valuerC  s              r)   _get_asset_field_choisesz%CmfPluginCsv._get_asset_field_choises@  s   &&**:6   &++-
1 GGIqL
 

 ##%kk%(uM9(5(<(<(>?1!Ah?F?8z%-- YBBF))FBSATV 
 4e4}4
 @s   D>D
c           	      n   d }|r|j                  d      r|d   j                         }t        j                  j                  dddd| dgdd|gdd|gdd|gg	      }|s1t        j                  j                  dddd| dgd
d|gdd|gg	      }|s"| j
                  j                  d| ddd       |S )Nr   r  r-  r.  loginr  emailrj   r  r   r$  u7   Не найдена группа владельцев "rJ   zERR-0085r$   r  )r|   r  r   r   r#   r   r  )r:   responsibleresponsible_objresponsible_ext_ids       r)   _get_asset_responsiblez#CmfPluginCsv._get_asset_responsibleX  s   ;??84!,X!6!<!<!>$..22v+=*>a'@Ag'9:g'9:W&89 3 O #"("7"7";";!6Q/A.B!+DE&89*<=	 #< # #))MN`Maabc' *  r+   c           
         g }|r|j                  d      r|d   }|j                  d      D ]  }|j                         }t        j                  j                  dddd| dgdd|gdd|gd	d|gg
      }|s1t        j
                  j                  dddd| dgdd|gd	d|gg
      }|s#| j                  j                  d| ddd       |j                  |        |S )Nr   rI   r  r-  r.  rL  r  rM  rj   r  r   r$  u5   Не найдена группа поддержки "rJ   zERR-0086r$   r  )	r|   r   r  r   r   r#   r   r  r   )r:   support_group_datasupport_group_objssupport_groupssupport_groupsupport_group_ext_idsupport_group_objs          r)   _get_asset_support_groupz%CmfPluginCsv._get_asset_support_groupy  sG   "4"8"8"B/9N!/!5!5c!: A'4':':'<$$*$4$4$8$8!6Q/C.DA+FG '+?@ '+?@*>? %9 %! )(.(=(=(A(A %v3G2H/JK#S*>?#W.BC	  )B )% )OO--OPdOeefg"!+ .  '--.?@9A< "!r+   c                     d }|ry|j                  d      rh|d   j                         }t        j                  j                  dddd| dgdd|gdd|gg	      }|s"| j                  j                  d
| ddd       |S )Nr   r  r-  r.  r   r$  rj   r  r  u/   Не найдена локация/адрес "rJ   ERR-0087r$   r  )r|   r  r   r%   r   r  )r:   locationlocation_objlocation_ext_ids       r)   _get_asset_locationz CmfPluginCsv._get_asset_location  s    X.&x0668O!--11v?*;1'=>S/2Wo6	 2 L  ))EoEVVWX' *  r+   r   c                     |D ]  }d|d<   | j                   j                  j                  d|        | j                  | j                   t        j
                  |      \  }}|j                  j                          |s{t        |j                  j                        dk(  st        j                  j                  dd|j                  gg dg      }|j                  j                  |       |j                           y )	NTservicedesk_allowu1   Пытаемся создать компанию project.servicedesk:defaultzparent.coder  )zproject_role.coder$  zsdesk-client:defaultr  )r   ry   infoprocess_any_table_fieldsr   r   dpcommitrP   r   r   CmfProjectRoleAssignr|   membersr   save)r:   r   r  r  company_objis_newrole_assigns          r)   _process_companieszCmfPluginCsv._process_companies  s      	#G+/G'(OO""''*[\c[d(ef"&"?"?QWQbQbdk"lKNN!!#3w11667;XX$99==&gll;J >  ##**;7  "	#r+   personsc                 *   |D ]  }d }|j                  d      r(|d   j                  d      }| j                  |      |d<   | j                  j                  j	                  d|        | j                  | j                  t        j                  |      \  }}|j                  j                          |rMt        |j                  j                        dk(  r+|j                  j                  st        |j                        }| j                   j#                  |t%                     }|s&|j&                  s4|j&                  j                  j)                  t*        j,                        ri|j/                  |j&                  j                          y )Nr  r   u9   Пытаемся создать пользователя rb  )r|   r!  r   ry   rc  rd  r   r   re  rf  rP   r   r   
user_localrS   rd   person_emails
setdefaultsetrM  endswithconfig
ORG_DOMAINadd)	r:   rn  r  person
project_idcompany_ext_id
person_objperson_is_newproject_person_emailss	            r)   _process_personszCmfPluginCsv._process_persons  s?    	BFJzz)$!'	!2!6!6x!@$($5$5n$Ey!OO""''*cdjck(lm(,(E(EdooW]WgWgio(p%JMM  "G..3348UU&1177 _
$($6$6$A$A*ce$T!"((&,,22;;F<M<MN%))**:*:*@*@A)	Br+   c                    d|d   j                    d|d   j                    }d|d   j                   d|d   j                   }t        j                  j	                  dd|g	      }|s| j
                  j                  j                  d
       t        j                  j	                  dd|d   j                  j                  d      d    dg	      }|s t        j                  j	                  d      }t        j                  ||| j
                  d      }||_        |j                  r|j                  d       t        j                  j	                  |d   d         }|s/dd|d   d   gg dg}t        j                  j	                  |	      }|s(t        j                  |d   d   | j
                  d      }|d   d   |_        |j	                  d      }|s|d   d   }| j                  |      }	|	|_        |d   d   |_        |j                  r|j                  d       |j                    d|d   d    }
t        j                   j	                  |
      }|s(t        j                   j	                  dd|gdd|gg	      }|s.t        j                   j	                  dd|d   d   gdd|gg	      }|sH| j
                  j                  j                  d       t        j!                  || j
                  |d      }|
|_        |d   d   |_        ||_        |	|_        |j                  r|j                  d       d|d   j                    }d |d   d    }t        j$                  j	                  |      }|sCt        j$                  j	                  d!      }t        j%                  ||| j
                  d      }||_        t'        |d   j                        d"v r||_        |j                  r|j                  d       t        j*                  j	                  |d   ||d#$      }|s=|d   |d#|| j
                  dd%}t        j*                  d&i |}|j                  d       |||fS )'NzCSV::rp   ::r   u   БП для проекта u    и типа r   r$  r  u/   Не нашли БП, создаем новыйr   r-  r.   r   r.  zdefault.system:defaultr   T)r   templater   import_originalsave_importr   r   rj   r  r   r  N)rj   r   r  cache_status_typeworkflowstatus_codeu7   Не нашли статус, создаем новый)r  r   r  r  u%   CSV-схема для проекта softdev:default)task.agile:defaulttask.base:defaultr   )r   targer_workflow	scheme_wfcmf_model_name)r   target_workflowr  r  r   r   )rd   rj   r   CmfWorkflowr|   r   ry   rc  r   r   
is_changedri  CmfStatusCoder   calc_status_typestatus_type	CmfStatusr  CmfSchemeWfrP   default_task_workflowCmfSchemeWfRule)r:   taskr   rj   r  r  cmf_status_coder  r  r  status_ext_idtask_statusscheme_ext_idscheme_nameschemerule	rule_dicts                    r)   _process_workflowzCmfPluginCsv._process_workflow  s   h**+2d<.@.C.C-DE,T(^-@-@,AtT`OaOfOfNgh%%))(C1H)IOO""''(YZ))--fflI[I`I`IfIfgjIklmInHoopFq5r-sH!--117O1P))!?? $	 * H MMdM+ ..22$x.:R2Sd8nX&>?AWXG$2266g6FO$22(^H-?? $ 3 O
 "&h!9 HH%89  $Xx 8))*;<&1##H~h7%%  T 2#;;-r$x.*B)CD&&**-*@ **..S(+_57. K
  **..d8nU]F^7_3=tX2N7P. QKOO""''(ab **!??+ $	 + K +>(3"1"-!!.X 1 123=d8nV>T=UV##''}'=))--3D-EH''$!?? $	 ( F "tL!&&'+VV+3F(KKDK)%%))T,5GYa4:9 * V"<0#+"+#"oo#'I ))6I6DII$I'x,,r+   c                    d }d }d }d }|j                  d      r*|d   j                  d      r|d   d   j                         }|r!t        j                  j                  ddd| dg      }|s| j                  j
                  j                  d| d       t        j                  j                  d	d
|gdg      }|sN| j                  j
                  j                  d| d       t        j                  j                  dd|gdg      }|r@|j                  rd| |j                   |_        nd| d|_        |j                  d       |r|d   d   j                         }| j                  j
                  j                  d| d       d	d
|gg dg}t        j                  j                  |      }|r*dd
|gdd
|gg}t        j                  j                  |      }|s*dd
|gd	d
|gg}t        j                  j                  |      }|sS| j                  j
                  j                  d| d       dd
|gdd|gg}t        j                  j                  |      }|sL|j                  d      r| j                  |      \  }}}n%| j                  j
                  j                  d       ||d<   ||d<   |S )Nr  r   r-  %::::%r  u   Ищем БП по коду "rJ   r   r$  r/  u   Ищем БП по имени "rj   r  r  Tr  r   u-   Ищем статус в БП по коду "r  r  u/   Ищем статус в БП по имени "r   ut   Невозможно создать БП и статус, не указан логический тип задачи)r|   r  r   r  r   ry   rc  r   ri  r  r  r  r(  )	r:   r  workflow_schemeworkflow_ext_idr  r  r  filter_r  s	            r)   _calc_workflowzCmfPluginCsv._calc_workflow@  s   88JD$4$8$8$B":.x8>>@O))--h#oM^^aHb5c-dH&&++.KOK\\],^_!--11&#9W:B 2 E  OO**//2QRaQbbc0de%1155fg=_>FZ  6  IH ,..??P*Q,..?r*BMMdM3 $Xx 8 > > @&&++.[\i[jjk,lm"C79OP$2266g6F *C:]CQ\<]^G"("2"2"6"6g"6"FK" *C:VS-<X[G"("2"2"6"6g"6"FK"OO**//2aboappq0rs *C:VWm<\_G"("2"2"6"6g"6"FKxx%9=9O9OPT9U6;&&..  0f  g#Z$Xr+   projectsc                    |j                         D ]  }|d   }|j                  d      sd|d<   |j                  d      s$t        j                  j                  d      |d<   n| j	                  |d      |d<   |j                  d      s#t        j
                  j                  d	      |d<   |j                  d
      r| j                  |      |d
<   | j                  | j                  t        j                  |      \  }}|j                  j                          |s| j                  |d   |      }|r||_        |j                          | j                  |d   |       | j!                  |d   |       | j#                  |d   |       | j$                  j'                  |j(                  j+                         j,                  j.                          y )Ndataproject_typer  r   project.agile:defaultr  r!   r  r  r   	workflowssprintsr   rn  )rC  r|   r   CmfLogicType_process_logic_typer  _process_activityrd  r   r!   re  rf  _process_workflowsr  ri  _process_sprintsrm  r~  gantt_project_idsrw  main_gantt_projectloadrd   rS   )r:   r  r  project_datar  rk  r  s          r)   _process_projectszCmfPluginCsv._process_projects~  s   ( 	[G"6?L##N3/8^,##L1-3-@-@-D-DJa-D-b\*-1-E-ElT`-a\*##K0,2,>,>,B,BHY,B,Z[)
++/+A+A,+OZ("&"?"?QWQbQbdp"qKNN!!#"&"9"9'+:NP["\",;K)$$&%%gi&8+F''(<kJ%%gi&8+F&&**;+I+I+N+N+P+S+S+Y+YZ1	[r+   c                 B   t         j                  j                  d      }|D ]z  }t         j                  j                  |d      }||d<   ||d<   ||d<   | j	                  | j
                  t         j                  |      \  }}|j                  j                          | y )Nzlist.agile_sprint:defaultr  r  r  rp   r  r   )	r   r  r|   r  rd  r   r"   re  rf  )r:   r  r  sprint_logic_typer  r  r  rk  s           r)   r  zCmfPluginCsv._process_sprints  s    "//339T3U 	#F",,00Wx0XM&F8$1F=!#4F< !%!>!>tPVP^P^`f!gJMM  "	#r+   c                     d }|D ]P  }||d<   |j                  d      r| j                  |d      |d<   |j                  d      s@| j                  |      }R |S )Nrp   r   r   r   )r|   r  r  )r:   r  r  r  r  s        r)   r  zCmfPluginCsv._process_workflows  si    ! 	@H!(HX||L))-)A)A(I)V&||H%"&"5"5h"?	@ r+   c                 t   | j                  || j                  j                  d   t        j                        }d|v r|d= |r	 i ddddddd	d
dddddd
dddddddddddddddddd
ddddd}dddddddddd	}|j                  d      r|j                  d      }|d   j                         j                         }|j                  |      }|dv r||d<   n|d v rd|d<   d |d<   ||d!<   ||d"<   n|dk(  r|d#v r||d<   nd|d<   d |d<   ||d!<   ||d"<   nd|d<   t        j                  j                  j                  j                         D 	cg c]  }	d$|	 d$
 }
}	| j                  j                  d%| d&d'j                  |
       d(d)*       | xj                  d+z  c_        |j                  d!      r|d!   d,vr|d!   j                         j                         }|j                  |      |d!<   |d!   d,vrt        j                  j                  j                  j                         D 	cg c]  }	d$|	 d$
 }
}	| j                  j                  d-| d&d'j                  |
       d.d)*       | xj                  d+z  c_        d/D ]m  }|j                  |      s|j                  |      j                  d0      r%|j                  |      d d1 j                         ||<   t!        ||         d2z  ||<   o d3D ]  }|j                  |      s||   j                         j                  d4      r||= ;d5}t#        j$                  |||   t"        j&                        }|sh|j)                  d+      j+                  d6d7      }t!        |      d8z  d2z  ||<    |j-                  |D cg c]  }d9| 	 c}       d:D ]  }||vs||   s||   }t/        |t0        j0                        r-d;d<d=d>d?d@dAdBdCdDdEdFdG}|j3                         D ]<  \  }}||j                         v s|j                         j+                  ||      ||<    n |dHk(  sd ||<    dID ]*  }||vs||   s||   }t5        t!        |            }|||<   , |D ]&  }t7        |j8                  j:                  |||          ( |j                  dJ      s|j-                  g dK       |j8                  j<                  r|j8                  j>                  rt        j@                  jC                  |j8                  jE                         |j8                  j<                  j:                  |j8                  j>                  j:                  |j8                  jF                  j:                  L      }||j8                  _$        |j8                  jK                  dMN       y y c c}	w c c}	w c c}w # tL        $ rM}tO                | j                  j                  dO| dP| dQd)*       | xj                  d+z  c_        Y d }~y d }~ww xY w)RNrs   r      фиксированная0-constu   как можно раньше1-earlyu   как можно позже2-latter   не раньше3-after   не позже4-beforeu    начало не позднееu   начало не ранее&   окончание не позднее2-before"   окончание не ранее1-after'   фиксированное начало-   фиксированное окончание   фн   фоu   кмрu   кмпu   ннрu   ннп)   онр   онп)	u   фиксированныйr  r  r  r  r  r  r  r  r   r   )r  r  r  r  )r  r  constrain_finish_typeconstrain_finish_date)r  r  r  rJ   uG   Не найден тип ограничения даты начала "u,   ". Укажите один из типов: rA  zERR-0082r   r  rr   )r  r  r  uM   Не найден тип ограничения даты окончания "zERR-0083)r   
const_workr   r   r      ч<   )r   actual_duration?u*   (\d+[\.,]?\d*)\s*(?:д|дней|день)?,r      zop_gantt_task.)r   r   r   r   r   r  janfebmaraprmayjunjulaugsepoctnovdec)u   январьu   февральu   мартu   апрельu   майu   июньu   июльu   августu   сентябрьu   октябрьu   ноябрьu   декабрьu   НД)r   r   )zop_gantt_task.sched_start_datezop_gantt_task.sched_finish_datezop_gantt_task.sched_durationzop_gantt_task.is_manual)calendarfrom_dtto_dtforce_include_endsTfrom_importu:   Не удалось импортировать Гантт u    для задачи zERR-0072)(r   r   re   r   r   r|   r  r   r   r   rC  r  rD  _has_errorsr  rt  floatresearch
IGNORECASEgroupreplaceload_fieldsr   r   r   intsetattrop_gantt_taskrS   r   r   CmfCalendarget_duration_minutes_get_calendar	is_manualr   check_gantt_projectr  commit_with_event)r:   r   task_objganttconstrain_start_type_mappingconstrain_finish_type_mappingr   constrain_start_type_rawr   ttypesconstrain_finish_type_rawkeypatternmatchr   _vmappingmonth_rumonth_encalendar_durationes                         r)   _process_ganttzCmfPluginCsv._process_gantt  sd     doo&C&CDU&VX^XkXklu$&'m&00)0 5i0 3J	0
 (0 &z0 7
0 3I0 =j0 9)0 >y0 DY0 I0  I!0" i#0$ j%0& i'0( j)0* ((-0,6 3<)2'1EN:C>H%'(1- 9934+0995K+L(/45K/L/R/R/T/Z/Z/\,+G+K+KLd+e(+/]]8L45-1HH8A458<459M569M56-:3  8I  I<PE"89<EE"89<@E"89=QE"9:=QE"9:8A45393F3F3[3[3c3c3j3j3l ma1QCq m m11ef~e @HHL		RWHXGY[&%3	 2  ((A-( II5656>``056M0N0T0T0V0\0\0^-5R5V5VWp5qE1245=__393F3F3\3\3d3d3k3k3m na1QCq n n11k  mF  lG GHHL		RWHXGY[&%3	 2  ((A-(l <Cyy~ 99S>2248).3)<)B)B)DE#J%*5:%6%;c
< C =Cyy~ :++-66s; !&c
$"O "		'5:r}} M "'++a."8"8c"BC).sa")<E#J= $$%Nse&<%NO a *C%'uSz sB!"h&7&78 (-*/$)(-"'$)$)(-,1*/(-*/G /6mmo "*(#rxxz1)+););Hh)OE#J!" V|%)c
5*8 1 $C%'uSz sBU2YB!#E#J$ ! KCH2288#uSzJKyy!12((  -->>8CYCYCkCk,2,>,>,S,S%-%;%;%I%I%K$,$:$:$K$K$Q$Q"*"8"8"J"J"P"P/7/E/E/O/O/U/U	 -T -) AR..=&&::t:LM B !n  !o6 &Ov  &!#))PQVPWWlmulvw+ * 
   A%  &si   DW! W,CW! >WA W! ,A1W! AW! 1AW! 7WA-W! 1+W! E3W! W! !	X7*AX22X7c                 2   i ddddddddddddddddd	dddd
dddddddddddddddddddddddddddddddddddddddddd dd!d!d"dd#d#d$di}|d%k7  rd&nd'}| j                   j                  j                  d(||           ||   j                  d)||   j                  d*            j	                         }|j                  |      }|rt
        j                  j                  d+d,|d+   gd)g-      }|j                  r%||j                  vr"d.| |j                   |_        nd.| d.|_        |j                  r|j                  d/0       |S t
        j                  j                  d)d1d2| d3g4      }|r|S | j                   j                  j                  d5| d6       t
        j                  j                  d+d,|gd)g-      }|s%t
        j                  j                  d*d7|gd)g-      }|r\|j                  r%||j                  vr"d.| |j                   |_        nd.| d.|_        |j                  r|j                  d/0       |S | j                   j                  j                  d8       |d9k(  rd}n|d:k(  rd}n|d;v rd }t
        j                  j                  d+d,g4      }	t        d.| d.|||	<      }
| j                  | j                   t
        j                  |
      \  }}t                |S )=NzSub-tasku   Подзадачаztask.sub:defaultrj   r   SubtaskStory	UserStoryztask.userstory:defaultu   ИсторияTaskz
Task Agiler  u   Задачаr  Bugztask.bug:defaultu   Багu   ЭпикEpicztask.epic:defaultu   Классическийu&   Проект. Классическийzproject.base:defaultAgileu   Проект. Agiler  zService Desku   Проект. Service Deskrb  ServiceDeskDeviceasset.device:defaultSoftwarezasset.software:defaultVMzasset.vm:defaultr0  r   default_logic_typeu   Логический тип r   rj   r   r  r/  r  Tr  r-  r  r  r  uF   Ищем логический тип по коду или имени ''r  uF   Не нашли, создаем новый логический типr   r!   )r$   r0  )r   rj   r  r  )r   ry   rc  r|   r  r   r  r   r  ri  r   rd  r   )r:   objr   	name2codelogic_type_fieldr   logic_type_dictr   template_coder  logic_type_paramsrk  s               r)   r  z CmfPluginCsv._process_logic_typee  s   
!5?QR
 4>PQ
 !+?I["\
 k3KL	

 {<TU
 \3GH
 ^=PQ
 E+=>
 u.@A
 1DE
 V-@A
 '1Ycy(z
 3=TU
 %AKhi
 $@Jgh
  x1GH!
" 5MN#
$ 4);<%
	( ,6+F<L`##&B3GWCXBY$Z[%&**8S9I5J5N5Nv5VW]]_#--/,,00W]G^8_iqhr0sJ  !2!22*,VHZ5F5F4G(HJ%&(O
!$$D1((,,XvVHTWGX4Y,Z
 	##&lmslttu$vw((,,VT64JT\S],^
,,00&8Q[cZd0eJ  !2!22*,VHZ5F5F4G(HJ%&(O
!$$D1##$lm"0M<'3M662M&&**642O*P "VHB&,0:*24 "::4??;A;N;N;LN
F 	r+   c                 R   ddddddddddd	dd
ddddddddddddddd	}| j                   j                  j                  d|d           |d   j                  d|d   j                  d            }|j                  |      }|rt        j
                  j                  dd|d   gdg      }|j                  r%||j                  vr"d| |j                   |_        nd| d|_        |j                  r|j                  d       |S t        j
                  j                  ddd | d!g"      }|r|S | j                   j                  j                  d#| d$       t        j
                  j                  dd|j                         gdg      }|s3t        j
                  j                  dd%|j                         gdg      }|r\|j                  r%||j                  vr"d| |j                   |_        nd| d|_        |j                  r|j                  d       |S | j                   j                  j                  d&       t        d| d|j                         '      }| j                  | j                   t        j
                  |      \  }}t                |S )(u"    Виды деятельности   Бизнесbusinessr     Продажиsales   Маркетинг	marketing   Производство
production   Поддержкаhelpdesk   Бухгалтерияfinance!   ИТ инфраструктураservicedesk%   Хозяйственная часть	household   Разработка ПОsoftdev)	r*  r,  r.  r0  r2  r4  r6  r8  r:  u    Вид деятельности r   r   rj   r   r  r/  r  Tr  r-  r  r  r  uJ   Ищем вид деятельности по коду или имени 'r"  r  uJ   Не нашли, создаем новый вид деятельности)r   rj   )r   ry   rc  r|   r   CmfActivityr   r  ri  r  r   rd  r   )r:   r  r$  r   activity_dictr   activity_paramsrk  s           r)   r  zCmfPluginCsv._process_activity  s    &4ZH'7I+?"U1KUa(b+?"T/GQZ&[:]gt1u>eoz5{2MW`)a

	 	##&FwzGZF[$\]$((7:3F3J3J63RS!f-))--fdMRXDY5Zdlcm-nH0(*6(8??2C&DHO$&vhb/""$/O%%))(Fc&QTDU1V)WO 	##&pqwpxxy$z{%%))&$1OYaXb)c))--fgv||~5V`h_i-jH0(*6(8??2C&DHO$&vhb/""$/O##$pq 6("oFLLNK889?9K9K9HJ& 	r+   c                    | j                   j                  j                  d       t        | j                        }d}t        j                         }| j                  D ]  }| j                   j                         r y | j                   j                  j                  | d|        |dz  }ddd|gdd|gg}t        j                  j                  |      }|s7| j                   j                  d	| d
d       | xj                  dz  c_        | j                  |   D ]1  }	 ddd|gdd|gg}t        j                  j                  |g d      }	||	_        |	j                  j                  j!                  d      s%|	j                  j                  j!                  d      r|	j                  |	_        |	j%                  d       |	j&                  j)                  |	j&                  j+                                |	j&                  j-                  d       |	j&                  j.                  j0                  r|	j&                  j%                  d       4  t        j                         |z
  }| j                   j                  j                  d|dd       y # t2        $ rA}
| j                   j                  d| dd       | xj                  dz  c_        Y d }
~
d }
~
ww xY w)Nu5   Привяжем подзадачи к задачамrr       из r  r   r  r   r  uE   Не удалось найти родительскую задачу zERR-0073r   r  )r   r  r   r/  ztask.subproject	task.epicTr  r  u4   Не удалось привязать задачу zERR-0074u<   Обработка подзадач выполнена за .3f    сек.)r   ry   rc  r   subtaskstime	monotonic	is_cancelr   r   r|   r  r  r   r   r   r   r  ri  r  r  save_preload_fieldsr  rS   r  r  )r:   totalr   t1parent_ext_idr  r   child_ext_id_filter_childr  r  t2s               r)   _process_subtaskszCmfPluginCsv._process_subtasks  s   ##$[\DMM"^^!]] #	*M((*OO""''1#VE7(;<FAhm<vt]>[\G ..,,G,<K))[\i[jk& * 
   A%  $m < **%)HdL+IFTXZfKg$hM!>>--]Kw-xD'2D$++667HI#33>>{K+/+;+;(II$I/&&2243E3E3Y3Y3[\&&::t:L))//::**//D/A*#	*J ^^"##&bcefibjjr$st ! *OO--N|n]"!* . 
 $$)$$*s   $D-J	K#"6KK#c                    | j                   j                  j                  d       t        | j                        }d}t        j                         }| j                  D ]  }	 | j                   j                         r y | j                   j                  j                  | d|        |dz  }t        j                  j                  |d         }|s&t        j                  j                  dd|d   g      }|s;| j                   j                  d	|d    d
dd       | xj                  dz  c_        t        j                  j                  dd|d   g      }|s;| j                   j                  d|d    dd       | xj                  dz  c_        ;t        j                  j                  dd|d   g      }|s;| j                   j                  d|d    dd       | xj                  dz  c_        t        j                  j                  |||      }|sRt        j                  |||| j                   d      }d|v r
|d   |_        d|v r
|d   |_        |j#                  d        t        j                         |z
  }	| j                   j                  j                  d|	d d!       y #  | j                   j                  d| dd       | xj                  dz  c_        Y xY w)"Nu&   Создадим связи задачrr   r@  typer  rj   r$  r  u2   Не удалось найти тип связи "rJ   zERR-0075CmfRelationTyper  r   r   u=   Не удалось найти входящую задачу zERR-0076r   out_linku?   Не удалось найти исходящую задачу zERR-0077)relation_typer   rS  T)rT  r   rS  r   r  constrain_lagconstrain_lag_pctr  u.   Не удалось создать связь zERR-0078r   u8   Обработка связей выполнена за rB  rC  )r   ry   rc  r   	relationsrE  rF  rG  r   rR  r|   r  r  r   r   rU  rV  ri  )
r:   rI  r   rJ  relation_datarT  r   rS  relation_optionrN  s
             r)   _process_relationszCmfPluginCsv._process_relations  s   ##$LMDNN#^^!^^ @	&M?&??,,.&&++qcw,?@Q & 6 6 : :f@U : V$$*$:$:$>$>vsTabhTiFj$>$kM$OO--Mm\bNcMddfg"!2 . 
 $$)$ ..,,XsMR[D\4],^OO--WXefoXpWqr"!* . 
 $$)$!>>--h]S]E^5_-`OO--YZghrZsYtu"!* . 
 $$)$"(":":">">"/#% #? #
 '&,&>&>&3 '!)#'??(, '? 'O '-78Eo8V5*m;<IJ]<^9#((T(:s@	&D ^^"##&^_abe^ffn$op&))D]OT0 * 
   A%  s(   "J6>B6J65A!J6A!J6;A6J668K1c                    | j                  || j                  j                  d   t        j                        }|r>| j                  j
                  j                  d|        d|d<   | j                  |d<   d|d<   |j                  d      r,t        j                  j                  d	d
|d   d   g      |d<   |j                  d      r)t        j                  j                  |d   d         |d<   t        j                  di |}|j                  rR|j                  rF|j                  j                  t        j                  |j                  j                        z   |_        |j!                  d       y y )Nrs   u   Грузим журнал closedr   r   Tr  
cmf_authorrL  r  r   r  rp   r  )minutesr  r  )r   r   re   r   r   ry   rc  r|   r   r   
start_date
time_spentrS   r   	timedeltaend_dateri  )r:   r   timetracker_historyhistorys       r)   _process_timetrackerz!CmfPluginCsv._process_timetrackera  sm   "..s/3/L/LM^/_/5/K/KM OO""''*DEXDY(Z[,4)04-59 12"&&|44:4D4D4H4H#W.A,.OPX.YZ 5I 5#L1 #&&x0060B0B.x8B 1C 1#H- 22I5HIG!!g&8&8#*#5#5#;#;h>P>PY`YkYkYqYq>r#r LLTL*' r+   
      )	max_triesmax_timec                    | j                   j                  d   }| j                  ||t        j                        }| j                   j                  j
                  j                  d      rNt        j                  j                  | j                   j                  j
                  j                  d            }n| j                  |      }|r|r|j                  d      st        d      ||d<   |j                  d      rW| j                  |d      |d<   |d   j                  j                  d	      r$t        j                  j                  |d
      |d<   |j                  d      r| j                  |       |j                  d
      r|d
   |d<   |j                  d      r|j                  d
      s|d= dD ]u  }|j                  |      }|s|j                  d      r't        j                  j                  dd|d   g      }nt        j                  j                  d:i |}|sq|||<   w dD ]7  }|j                  |      }|st!        |      j#                         dv s3d||<   9 | j                   j%                  d|        dd| j                   j&                  gg ddd|d   gg}| j                   j                  j
                  j                  dd       }	| j                   j                  j
                  j                  dd      }
|
rp|j                  d      r_|j                  d      j                  | j                   j(                  j
                        s!| j                   j(                   d|d    |d<   |j                  d      rd}	dd|d   g}n$|j                  d      rd}	ddd|d   gdd|d   gg}|	st+        j,                  |j                  d      |j                  dd       z   |j                  dd       z   d!z   j/                               j1                         }| j2                  j4                  j7                  |d"#      }|5  | j9                  | j                   t        j                  |||	$      \  }}d d d        n1| j9                  | j                   t        j                  |||	$      \  }}rt        j;                  d%| j<                  j>                   d&| j<                  j@                   d'| j                   j                   d(d)| j                   d*+      }|jC                  d*,       |jD                  jG                          | j                   j%                  d-| d.|j                  d       d/|j                  d       d0|j                  d       d1	       nU| j                   j%                  d2 d.|j                  d       d/|j                  d       d0|j                  d       d1	       | jI                  ||       | j                   j                  j
                  j                  d3      rNt        jJ                  j                  | j                   j                  j
                  j                  d3            }n| jM                  ||      }|r5|jN                  jQ                          |jN                  jS                  |       |jT                  r|jC                  d*,       |jV                  j
                  jT                  r|jV                  jC                  d*,       |jD                  jG                          | j                  ||t        j:                        }|r|j                  d4      rz|j                  d5      ri||d<   | j9                  | j                   t        j:                  |      \  }}n5|r3| j                   jY                  d6d7d8       | xjZ                  d9z  c_-        | j]                  |       | j                   jD                  jG                          y # 1 sw Y   }xY w);Nrs   target_project_idrd   rj   u:   Не указано наименование задачи!rp   r   r   rA  epicr  r  r   r   )r]  r   r   rN  waiting_forr   rL  r  r  )r   )r   Fu_   Пытаемся создать или обновить задачу по параметрам cmf_import.pluginr  r  r  Tmerge_identic_namesext_id_per_importr.   r   r  r   .lockx   timeout
filter_objdont_updateuB   Задача импортирована из файла: <a href="" target="_blank"></a> ()   Tr   	log_levelrp   r   r  r  u'   Создали новую задачу  ext_id= code= name='r"  u   Нашли задачу target_list_idr   r   u   Невозможно импортировать задачу без проекта, создайте проект и укажите ID в файлеERR-0079r  rr   r  )/r   re   r   r   r   rS   r|   r!   r  r  r  r   r   r  r  r   rP   r   logpluginrd   hashlibsha256encode	hexdigestredis_dbredislockrd  r    import_filern   rj   ri  re  rf  r  r"   r  listsr  r   r  r  r  r  re  )r:   r   rs   r  r  r	  r   rx  r  ry  rr  lock_keyr  r  task_is_newcommentr  comment_objcomment_is_news                      r)   _process_taskzCmfPluginCsv._process_task{  sw   
 //778IJ_fnnE??((..223FG ++//4??3P3P3V3V3Z3Z[n3o/pK ++C0K488F# \]](DNxx%%)%=%=dI%N\"%**55kB*0*:*:*>*>;ag*>*hD'xx!##D)xx&*6l]#xx&txx/?'c +hhsmwwx(!'!1!1!5!5gwPST\P]=^!5!_!'!1!1!5!5!<!<$*S	+ ) &hhsm3s8>>+|; %DI&
 OO  #B  CG  BH  !I  J %dDOO,B,BC/tF|,G #oo;;AAEEF[]bccK $ = = C C G GH[]b c TXXh%7@R@]@]^b^m^m^p^p^v^v@w$(OO$6$6#7qh8H!IXxx#!4f6(##T4>2tT(^4  #>>XXf%(<<txxRT?UUX__ggi)+  }}**//#/F ,0,I,I#*$/ -J -)Hk  )-(E(EOONN& + )F )%+  ++%%)%5%5%9%9$::LTM]M]MbMbLc d!__112!5  ##$( , 
 .

!!###=hZxPTPXPXYaPbOc d HHV,-WTXXf5E4FaI
 ##.xj(AS@T U HHV,-WTXXf5E4FaI
 X.,,22667GH#^^//4??3P3P3V3V3Z3Z[k3l/m
!--c;?
##%%%j1""$/%%++66&&+++=KK &&sOV=N=NOG7;;'78W[[=P$,!.2.K.KDOOLRL]L]LS/U+^ OO%% g" & 
 !!!#&!!#Y s   2`66a c                 "   | j                   j                  d   }	 | j                  ||t        j                        }|sy |j                  d      st        d      | j                  ||t        j                        }|s|j                  d      }| j                  |      }| j                  ||t        j                        }|s|j                  d      }| j                  ||      }||d<   |r|j                  n||d<   |j                  d      r| j                  |d      |d<   dd	i|d
<   |j                  d      r| j                  |       |j                  d      r| j                  |      |d<   | j                  d|j                  d            |d<   | j                  d|j                  d            |d<   | j                  d|j                  d            |d<   | j                  d|j                  d            |d<   | j!                  |j                  d            |d<   | j#                  |j                  d            |d<   |j                  d      }|r|d= | j                   j%                  d|        dd| j                   j&                  gg ddd|d   gg}	| j                   j                  j(                  j                  dd       }
|j                  d      rd}
dd|d   g}	n\|j                  d      rd}
dd|d   g}	n@|j                  d      rd}
dd|d   g}	n$|j                  d      rd}
ddd|d   gdd|d   gg}	|
stt+        j,                  t/        |j                  d            t/        |j                  dd            z   t/        |j                  dd            z   t/        |j                  dd            z   t/        |j                  d d            z   t/        |j                  d!d            z   t/        |j                  dd            z   t/        |j                  dd            z   d"z   j1                               j3                         }| j4                  j6                  j9                  |d#$      }|5  | j;                  | j                   t        j                  ||	|
%      \  }}d d d        n1| j;                  | j                   t        j                  ||	|
%      \  }}rV| j                   j%                  d& d'|j                  d       d(|j                  d       d)|j                  d       d*	       nU| j                   j%                  d+ d'|j                  d       d(|j                  d       d)|j                  d       d*	       |j                  }| j                  ||t        j<                        }|s|j                  d,      }| j?                  ||      }|r5|j@                  jC                          |j@                  jE                  |       | jG                  |      }|r!|jH                  jC                          ||_$        |jJ                  r|jM                  d-.       |jN                  jQ                          | j                   jN                  jQ                          y # 1 sw Y   xY w# t        $ r@}| xjR                  d/z  c_)        | j                   jU                  d0| d1d2       Y d }~vd }~ww xY w)3Nrs   rj   u2   Не указано название актива.rp   r1  r   r$   r   zasset.system:defaultr  r   r   ownership_typedevice_typeenabled_statusoperational_statusr\  rN  rV  u[   Попытка создать или обновить актив по параметрам ro  r  rp  rq  Fr   serial_numberimeir  r   inv_nophone_numbermarkcoders  rt  ru  rw  u#   Создан новый актив r  r  r  r"  u   Найден актив asset_typesTr  rr   u*   Ошибка импорта актива. zERR-0084r  )+r   re   r   r   r$   r|   r  r'  r+  r0  r3  rp   r  r  r  rJ  r_  rQ  r  r  rS   r  r  rP   r  r  r  r  r  rd  r6  r9  r  r  r   rY  rV  r  ri  re  rf  r  r  )r:   r   rs   assetr)  r*  r1  r2  support_group_tmpr  ry  r  r  	asset_objasset_is_newr7  r8  rT  excs                      r)   _process_assetzCmfPluginCsv._process_asset  s   //778IJn	$$S/6??KE99V$ TUU  ++C&BWBWXL$yy2#55lC ((ov?Q?QRI!IIk2	 //	;KLM!.E+6Cm22IYE(O yy&&*&>&>uj&Ql# "*+A BE*yy"##E* yy$$($:$:5$Aj! '+&C&C 		*+'E"# $(#@#@		-($E-  '+&C&C 		*+'E"# +/*G*G$		./+E&' !% 8 8:9N OE* $(#>#>uyy?W#XE-  %		/ : /*OO"}  D  ~E  !F  G
 %dDOO,B,BC/uV}-G #oo;;AAEEF[]bccKyy #!4v7?+#*D%2HI6"#!4v78$#T5?3tU8_5  #>>EIIf-.eii<=>eii345 eii"567 eii;<	=
 eii
B789 eii345 eii"567 "" VX )+  }}**//#/F .2.K.K#*$/ /L /+I|  +/*G*GOOOO& + +H +'	< ##9)HUYYW_M`La b!IIf-.geii6G5HK
 ##.yk%))HBUAV W!IIf-.geii6G5HK  -33))#@S@STJ"YY}5
!11*>NON%%**,%%,,^< "&!>!>?P!Q!'',,.*<	'##40LL! 	!!#s b  	!OO%%<SEB# &  	s6   #[ Q[ 2Z87G[ 8[=[ 	\6\		\c                    d }|r|j                  d      rq|d   j                         }|j                  dddd| dgdd|gdd|gg	      }|s9| j                  j                  d
|j                   d| dd|j                         |S )Nr   r  r-  r.  r   r$  rj   r  r  u   Не найден z "rJ   r[  r  )r|   r  r   r  r   )r:   r   obj_datar#  r   s        r)   _get_objectzCmfPluginCsv._get_object  s    X.h'--/F))v6(!}5S&)Wf-	  C ))()9)9(:"VHAF"-- *  
r+   c                 D   | j                   j                  d   }|d   }| j                   j                  j                  j                  d      rNt        j
                  j                  | j                   j                  j                  j                  d            }n| j                  |      }|s3| j                   j                  ddd       | xj                  d	z  c_        | j                  ||t        j                        }|r||d
<   | j                  ||d	d  |       y y )Nrs   r   rk  rl  u   Невозможно импортировать тесткейс без проекта: создайте проект или укажите ID в файлеr  r   r  rr   rp   )r   re   rS   r|   r   r!   r  r  r  r   r   _process_testcase_rows)r:   r   rs   main_rowr  testcases         r)   _process_testcasezCmfPluginCsv._process_testcase  s   //778IJ7??((..223FG ++//4??3P3P3V3V3Z3Z[n3o/pK ++H5KOO%% o& & 
 !##Hov?Q?QR!,HX''$qr(OL r+   c                 h   fdj                  d      st        d      j                  d      rt        j                  j                  d   d      }d   d   j	                  d	      }|j                          t        j                  d
t        |d         z   dz   j                               j                         }| j                  j                  j                  |d      }|5   ||      d<   d d d        t        j                  j                  d      d<   t        j                  j                  d      d<   j                  d      rcdgdgdgd}d   d   j!                         }	d }
|D ]8  }|	||   v s|}t        j"                  j                  ddd   gdd|gg      }
 n |
d<   j                  d      r9dgdgdgd gd!gd"}d   j!                         }d }|D ]  }|||   v s|} n |d<   j                  d#      r3| j%                  t        j&                  d#j                  d#            d#<   d$D ]  }j                  |      }|s|j                  d      rI|d   j!                         }t        j(                  j                  d%dd&d'| d'gd(d)|gd*d)|gdd)|gg      }nt        j(                  j                   dLi |}|s||<    | j*                  j-                  d+        d,d| j*                  j.                  gg d-ddd   gg}j                  d      r	ddd   g}n"j                  d      rd%ddd   gddd   gg}| j1                  | j*                  t        j&                  |d./      \  }}|rt        j3                  d0| j4                  j6                   d1| j4                  j8                   d2| j*                  j:                   d3d4|| j*                  d56      }|j=                  d57       |j>                  jA                          | j*                  j-                  d8| d9j                  d       d:j                  d       d;j                  d       d<	       nU| j*                  j-                  d=| d9j                  d       d:j                  d       d;j                  d       d<	       d>d?d@idAd>d?dBidAd>d?dCidAdDdEidDdFidDdGidH}|D ]s  }d|i}tC        |dI   dJ         D ]H  \  }}||   r|dK   |v s||dK      }||   ||dD   <   |dJ   jE                         D ]  }|dJ   |   ||<    J | jG                  |       u |jH                  r|j=                  d57       |j>                  jA                          y # 1 sw Y   xY w)MNc                    |j                         }t        j                  j                  d   | |      }|s<t        j                  d   | d|      }|j	                          | j	                          |r	 ||      S |S )Nrp   )rp   r  rj   abstractrp   r  r  rj   )popr   CmfTestcaseFolderr|   ri  )r  
subfoldersfolder_namer   
get_folderr  s       r)   r  z7CmfPluginCsv._process_testcase_rows.<locals>.get_folder  s    $..*K--11)'  2 F
 11#H- +'$	 2    "!&*55Mr+   rj   9   Не указано название тест-кейса.r   rp   u   Тест-кейсыrp   rj   r   /r  r  rs  rt  ru  ztestcase.base:defaultr  r   r  r   u%   Требуется доработкаu
   Готовu   Не готов)draftapprovedfailr$  r   r  r  r   u   Самый высокийu   Высокийu   Среднийu   Низкийu   Самый низкий)   r}  rr   r   r  rQ  r]  r   r   rN  r  r-  r.  rL  r  rM  ua   Попытка создать или обновить тесткейс по параметрам ro  rp  Frw  uD   Тесткейс импортирован из файла: <a href="rz  r{  r|  r}  Tr~  r  *   Создан новый тест-кейс r  r  r  r"     Найден тест-кейс r   step_sectionpre)r   r   mainpostr   expected_result	test_datar  )u   Предусловияu   Шагиu   Постусловияu%   Ожидаемый результатu   Тестовые данныеu   Комментарииr   r   rt   r  )%r|   r  r   CmfRegistryr   reverser  r  rP   r  r  r  r  r  r  r  r  r  _get_field_choisesr   r   r   r  r  rd  r    r  rn   rj   r   ri  re  rf  r3   keys_process_stepr  ) r:   r  r   rs   registryr  r  r  statusesr  r   variantr  significancessignificance_ext_idr   r	  r   r   rx  r  r#  rk  r  testcase_step_fieldsr   testcase_stepr   r   r   other_fieldr  s     `                             @r)   r  z#CmfPluginCsv._process_testcase_rows  s   	( ||F#WXX<<!))--Xh5GNc-dH!(+H5;;C@J  ~~$s:b>'::WD ik  ==&&++Hc+BD F%/*%E"F "(!4!4!8!8>U!8!V%1155;R5S<<!#J"M%1N!2 36H %X.x8>>@MF#  HW$55")K#--11#S(:*>?{3:71 8F  "(HX<<'/0$%$%"#./M #+>":"@"@"BL( &-*@@#*L (4H^$ <<#66v7I7I4:HLL<P RHV Q 	+C,,s#C778$ ]002F#--11 %v6(!}=$gv6$gv6#Wf5  2 F $--118C8F$*HSM!	+$ 	  AI  @J  K  	L
 !$(>(>?+T8F+,
 <<tXf%56G\\(#x124(!34G 33OO 4 
V ''!!%!1!1!5!5 66HIYIYI^I^H_ `--.a1 ?? $ ( 
G LLTL*JJOO<SE(,,W_J`Ia b V,-WX\\&5I4J!M
 OO1#hx||H?U>V W V,-WX\\&5I4J!M 6<X]G^&_'-.&9QR5;X^G_&`6BDU5V.:K-H'3Y&? 
  		.C&-M%oa&8&BC W5A5>5I#I!5eGn!E>A!fn\:;#1(#;#@#@#B WK1?1I+1VM+.WW }-		. >>HHH&OF Fs   -V''V1c           
      h   dD ]  }|j                  |      }|s|d   j                  |      }|s-|j                  d      rI|d   j                         }t        j                  j                  dddd| dgdd|gd	d|gd
d|gg      }nt        j                  j                   di |}|s|||<    d }|j                  d      r	dd|d   g}n"|j                  d      rddd|d   gdd|d   gg}| j	                  | j
                  t        j                  ||d      \  }}|r2| j
                  j                  d| d|j                  d       d       n1| j
                  j                  d| d|j                  d       d       |j                  d       |j                  j                          y )N)r]  r   r   rp   r   r  r-  r.  rL  r  rM  rj   r  r   r  Frw  u   Создан новый шаг r  r"  u   Найден шаг Tr  r  )r|   r  r   r   rd  r   CmfTestcaseStepr  ri  re  rf  )	r:   r  r	  r   r   rx  r  r#  rk  s	            r)   r  zCmfPluginCsv._process_step  s   A 	0C##C(C#H-11#6778$ ]002F#--11 %v6(!}=$gv6$gv6#Wf5  2 F $--118C8F)/M#&%	0( V$t]6%:;Gx(}X674x!89G 33OO"" 4 
V OO"A#f]M^M^_eMfLggh ijOO"6se6-BSBSTZB[A\\] ^_T"r+   c                    | j                   j                  d   }|d   }| j                   j                  j                  j                  d      rNt        j
                  j                  | j                   j                  j                  j                  d            }n| j                  |      }|s3| j                   j                  ddd       | xj                  d	z  c_        | j                  ||t        j                        }|r"t        j                  j                  |d
      }t        j                  j                  |d      }|st        j                  d|j                  z   dz   j!                               j#                         }| j$                  j&                  j)                  |d      }	|	5  t        j                  ||dd      }|j+                          |j+                          d d d        t        j,                  j                  ||      }
|
st        j                  d|j                  z   dz   j!                               j#                         }| j$                  j&                  j)                  |d      }	|	5  t        j-                  ||d      }
|
j+                  d       d d d        | j                  ||t        j.                        }| j1                  t        j.                  |      |d<   ||d<   | j3                  |
||d	d         |j+                  d       y y # 1 sw Y   =xY w# 1 sw Y   xY w)Nrs   r   rk  rl  u   Невозможно импортировать тест-кейс тест-плана без проекта: создайте проект или укажите ID в файлеr  r   r  rr   u   Тест-планыr  u0   Импортированный тест-планtestplanrs  rt  ru  r  r  )rp   tree_parent_foldertestplan_root_folderu2   Импортированные тест-кейсыrp   r  rj   Tr  r  rp   )r   re   rS   r|   r   r!   r  r  r  r   r&   r  r   r  r  rd   r  r  r  r  r  ri  CmfTestplanTestcaseFolderr   r  _process_testplan_testcase_rows)r:   r   rs   r  r  testplan_testcaser  r  r  r  r  r  s               r)   _process_testplan_testcasez'CmfPluginCsv._process_testplan_testcase  s   //778IJ7??((..223FG ++//4??3P3P3V3V3Z3Z[n3o/pK ++H5KOO%% D& & 
 ! ,,XHbHbc))--[G\-]H))--")[ . H ">>(++-7??A)+  }}**//#/F $%11*$,!+O	  2  H MMOMMO$ $*#C#C#G#GH $H $> '">>+hkk9GCKKM)+  }}**//#/F @+1+K+K'HQ ,L ,( )--$-?@ ''/6CUCUVH,0,<,<V=O=OQY,Zj)*2h'001EGXZ^_`_aZbcMMdM+I $ $ @ @s   4:L)+L6)L36L?c                 >   fdj                  d      st        d      j                  d      rd   d   j                  d      }|j                          t	        j
                  dt        |d         z   d	z   j                               j                         }| j                  j                  j                  |d
      }|5   ||      d<   d d d        dD ]  }d   j                  |      }|s|j                  d      rI|d   j                         }	t        j                  j                  dddd|	 dgdd|	gdd|	gdd|	gg      }
nt        j                  j                   d$i |}
|
s|
|<    | j                  j!                  d        dd| j                  j"                  gg dddd   gg}j                  d      r	ddd   g}n"j                  d      rdddd   gddd   gg}| j%                  | j                  t        j&                  |d      \  }}|rV| j                  j!                  d| dj                  d       dj                  d       dj                  d       d 	       nU| j                  j!                  d!| dj                  d       dj                  d       dj                  d       d 	       |j(                  r|j+                  d"#       |j,                  j/                          y # 1 sw Y   >xY w)%Nc                    |j                         }t        j                  j                  d   | |      }|s<t        j                  d   | d|      }|j	                          | j	                          |r	 ||      S |S )Nrp   r  r  )rp   r  r  rj   )r  r   r  r|   ri  )r  r  r  r   r  r  s       r)   r  z@CmfPluginCsv._process_testplan_testcase_rows.<locals>.get_folder  s    $..*K5599(2#.  : F
 99,X6'2'$	 :    "!&*55Mr+   rj   r  r   r   r  r  r  rs  rt  ru  r  r  r  r-  r.  rL  r  rM  r  uv   Попытка создать или обновить тест-кейс тест-плана по параметрам ro  r  rp  r   Frw  r  r  r  r  r"  r  Tr  r  )r|   r  r   r  r  r  rP   r  r  r  r  r  r  r   r   r   r  r  rd  r&   r  ri  re  rf  )r:   r  r  r   r  r  r  r	  r   r   rx  r  r#  rk  r  s     `           @r)   r  z,CmfPluginCsv._process_testplan_testcase_rows  s   	( !$$V,WXX  !;<*+EFxPVVWZ[J  ~~,s:b>/BBWL ik  ==&&++Hc+BD 6@J(*A6!"<=6 Q 	4C#J/33C8C778$ ]002F#--11 %v6(!}=$gv6$gv6#Wf5  2 F $--118C8F-3%c*!	4$ 	  U  Vg  Uh  i  	j
 !$(>(>?+T,V45
   (t%6v%>?G""8,0:;4!28!<=G 33OO&& 4 
V OO<SEJ[J_J_`hJiIj k)--f56g>O>S>STZ>[=\\]_
 OO1#h?P?T?TU]?^>_ `)--f56g>O>S>STZ>[=\\]_
 >>HHH&}6 6s   	LLc           
         |j                   j                  |      }|j                  }|s|S |j                  }|j	                         D ci c]  \  }}|j                         | }	}}|j                         j                         }|	j                  |      }
|
sR||vrN|j                         D cg c]  }d| d
 }}t        d| d|j                   ddj                  |             |
xs |xs |S c c}}w c c}w r@  )r   r|   rB  r   r   r   r  rC  r  r   rD  )r:   r   r   rS   r   rE  rF  rG  rH  r   rI  rC  s               r)   r  zCmfPluginCsv._get_field_choisesr  s     ,   &++-
1 GGIqL
 

 ##%kk%(uM9(5(<(<(>?1!Ah?F?8z%-- YBBF))FBSATV 
 4e4}4
 @s   C60C<c           
      B   d}| j                   j                  j                  j                  d      }t	        d      5  t
        j                  | _        	 | j                   j                         rn|j                         \  }}||j                  ||f       n|	 | j                   j                  j                  d| d|        |dk(  r| j                  |       |dk(  r| j                  |       n"| j                  |       | j                  |       d d d        |j                  |       y # t         $ rZ}| j                   j"                  j%                          |d	z  }| j                   j'                  d
| d| d| dd       Y d }~yd }~ww xY w# 1 sw Y   xY w)Nr   rx   F)init_views_and_dsu   Импорт строки r@  r   r   rr   u<   Не удалось импортировать строку z: z. zERR-0041r   r  )r   re   rS   r|   r   APPREDIS_DBr  rG  putry   rc  r  r  r  r  r  re  rollbackr  )	r:   	row_queuerow_queue_errors
total_rowserrorswhatrow_numrow_datar  s	            r)   _process_row_workerz CmfPluginCsv._process_row_worker  s   ,,2266x@51 	LLDM??,,.$-MMO!#MM7H"56OO**//2LWIU[\f[g0hi},..x8},77A**84++H5# 	< 	V$ ! OO&&//1aKFOO--VW^V__abjakkmnqmrs"!* .  +	 	s8   AFA:D/F/	F8AFFFFFc                    ddl m} d}t        j                         5  t        j	                         5  t
        j                  j                  |dg      }|| _        t
        j                  j                  |ddg dgdgd	g
      | _
        t        | j                  | j                        D cg c]  }d c}      }t        j                  d      }	t        j                         }
g }t        | j                         D ]w  }t#        j$                  | j&                  d|dz    |	|
|d      }|j)                  |       |j+                          | j                  j,                  j/                  d|        y | j                  j0                  d   }| j                  j0                  j2                  j                  d      }g }d}t5        | j                  | j                              D ]  \  }}| j                  j7                         r n|j0                  d   r|dk(  r7||k  r=||kD  r n|dv rd }|dk(  r"| j9                  ||t
        j:                        }n&|dk(  r!| j9                  ||t
        j<                        }|r.|r|	j?                  |dz   |f       g }|j)                  |       |}|j)                  |       |	j?                  |dz   |f        |r|dv r|	j?                  |dz   |f       g }|	j?                  d       |D ]  }|jA                           |
jC                         s$||
j                         z  }|
jC                         s$d d d        d d d        |S c c}w # 1 sw Y   xY w# 1 sw Y   |S xY w)Nr   r   r	   )rd   r   rk   rl   rm   rc   rn   ro   rr   i  )maxsizez_process_row_worker )r  r  r  )targetrj   kwargsu.   Параллельный обработчик rs   rx   rq   r   r   r   r   )NN)"cmf.appr   r   disable_acldisable_notifyr   r{   r|   r   r}   r  r   r2   queueQueuerangethreading_max_forks	threadingThreadr  r   startry   rc  re   rS   r3   rG  r   r   r&   r  rD  empty)r:   cmf_import_idstart_index	end_indexr   r  r   r@   r  r  r  threadsr   threadrs   r  r   i_headr   r#  s                       r)   process_rows_forkzCmfPluginCsv.process_rows_fork  sS   '  " H	1G$:$:$< H	1))--u-MJ(DO%3377!#T+DE,-w	  8  D 8H8H)IJAaJKJD1I${{}G4334 g"))33/Aw7%.,<&0 v&&&++.\]c\d,efg #oo;;<MNO??0066::8DDDF#DNN43C3C$DE 03??,,.++K8Q!V{?y=99C},"..sOVEWEWX."..sOVE_E_`%MM6A:t*<=#%DC(!"C(MM1q5#,/708  >>vz401MM,'!  ',,.*..00 ',,.OH	1 H	1T  KH	1 H	1 H	1T s6   M6A;M*-	M%6JM*M6%M**M3	/M66N c                 x   dd l }|j                  dddd| j                  j                  j                   d| j                  j                   d| d| d		gd
d
t        dd      t        dd            }| j                  j                  d|j                   d| d|        | j                  j                          |S )Nr   z/usr/bin/python3z	manage.pyshellz%plugin = models.CmfPluginCsv.get(id="z'");retcode = plugin.process_rows_fork("z", rA  z);Tz"/var/log/eva-import-subprocess.logza+z&/var/log/eva-import-subprocess.err.log)	close_fdsstart_new_sessionstdoutstderru,   Запустили подпроцесс PID u)    для обработки строк с u    по )	
subprocessPopenr   r  rd   rZ   r  pid
log_detail)r:   r  r  r  procs        r)   _execute_rowszCmfPluginCsv._execute_rows  s    "K78N8N8Q8Q7R S77;7I7I6J#k]Z\]f\ggik
 "<dC@$G   

 	J488*T}  J  ~K  KQ  R[  Q\  ]  	^""$r+   c                 (   | j                   j                  j                  j                  d      }|dv rd}n| j                  }t        | j                  | j                        D cg c]  }d c}      }||z  }||z  }| j                   j                  j                  d       t        j                         }g }t        |      D ]B  }	|	|z  }
|
|z   }|	dz   |k  r|dz  }n||z  }| j                  |
|      }|j                  |       D |D ]>  }|j                          |j                   s | xj"                  |j                   z  c_        @ t        j                         |z
  }| j                   j                  j                  d|dd       y c c}w )Nrx   r  rr   u5   Запуск обработки строк файлаuA   Обработка строк файла выполнена за rB  rC  )r   re   rS   r|   max_processesr   r2   r  ry   rc  rE  rF  r  r  r   communicate
returncoder  )r:   r  r  r@   r  
chunk_size	remainderrJ  	processesr   r  r  r  rN  s                 r)   _process_rowszCmfPluginCsv._process_rows	  s   ,,2266x@11 M ..MT^^D4D4D%EF!FG
=0
.	##&[]^^	}% 
	#Aj.K#j0I1u}$Q	Y&	%%k9=DT"
	#  	4D  DOO3 	4
 ^^"##&ghjkngoow$xy5 Gs   %	Fc                 @   |j                         D ]  \  }}i }|j                  |       d }|r?|||d   <   | j                  j                  j	                  d|        t
        j                  | j                  d      }|j                         D ]  \  }	}
t        ||	|
        |j                          t
        j                  j                  t        |j                        ddg      }|r|n|}|j                  rq|j                  re||_        |j                  d       |j                   j#                          | j                  j                  j	                  d	|j                          |j                  d
      sq| j%                  |d
   ||xs |        y )NrQ  u"   Обработка локации T)r   r  r	   rp   ri   r  u   Создана локация children)r   r   r   ry   rc  r   r%   r  
_calc_namer|   rP   rj   r  r  rp   ri  re  rf  _process_locations)r:   	locationsparent_location_dataparent_location_objrj   r  current_locationr\  new_locationr   rS   existing_locations               r)   r  zCmfPluginCsv._process_locations8	  s   #//+ 	mJD$!##$89H15 f.&&++.PQaPb,cd%11#$(  2   *:)?)?)A =%JL*e<='')$*$6$6$:$:\../? %; %!
 1B,|&&8+C+C&9HOMMdM3KK&&(OO**//2PQYQ^Q^P_0`axx
#''Z(8:JHLkXkl=	mr+   c                     t         j                  |d      }|D ]X  }||d<   |t        d<   | j                  | j                  t         j
                  |      \  }}|j                  j                          Z y )Nr  rp   r  rp   r  )r   r  asset_cat_datard  r   r;  re  rf  )r:   asset_type_catsr*  asset_types_folderr<  r=  r@   s          r)   _process_asset_type_catsz%CmfPluginCsv._process_asset_type_catsY	  sz    #--5EP]-^- 	+N'7N8$,>N=)$($A$A&&%!
 !!((*	+r+   c                     |D ]g  }||d<   | j                  |d   |      |d<   | j                  | j                  t        j                  |      \  }}|j
                  j                          i y )Nrp   r<  )r>  rd  r   r   r6  re  rf  )r:   r  r*  r7  r8  r@   s         r)   _process_asset_typesz!CmfPluginCsv._process_asset_typese	  sv    % 	'J#3Jx +/+C+CJO_D`br+sJ'( $ = =##!NA
 $$&	'r+   c                 P   t         j                  j                  |d      }|j                         D ]  }|d   }||d<   ||d<   |j                  d      r| j	                  |d      |d<   n#t         j
                  j                  d	      |d<   | j                  | j                  t         j                  |      \  }}|j                  j                          |s|d
   D ]2  }| j                  ||      }	|	s|j                  j                  |	       4 |j                  d        y )Nassetsr'  r  rp   r  r!  r0  r  r  r)  Tr  )r   r  r|   rC  r  r  rd  r   r0  re  rf  r>  asset_types_catr   ri  )
r:   
asset_catsr*  assets_folderr1  r(  r2  r@   r<  r=  s
             r)   _process_asset_catsz CmfPluginCsv._process_asset_catsp	  s2   ((,,4Dx,X#**, 	5I&v.N'7N8$,9N=)!!"677;7O7OP^`m7n347=7J7J7N7NTj7N7k34#<<"" M1
 ##%&/0A&B QN)-)A)A.Rb)c&)%55<<=OPQ ""t"4+	5r+   c                    |j                         D ]  }|d   }|j                  d      st        d      |j                  d      s|d   |d<   dd|d   g}| j                  | j                  t
        j                  ||      \  }}|j                  j                          |s| j                  |d   |       | j                  |d   |       | j                  |d	   |        y )
Nr  r#  uI   У схемы не указан префикс кодов активов.r   r$  )rx  r)  r  r1  )rC  r|   r  rd  r   r   r'  re  rf  r+  r-  r3  )r:   asset_schemesr)  asset_scheme_datar  r*  r@   s          r)   _process_asset_schemesz#CmfPluginCsv._process_asset_schemes	  s    )002 	WL ,V 4$(()<= kll$((2.?@S.T!(+*C1BCV1WXG"&"?"?%%!"	 #@ #a &&(--l;L.MO_`)),}*EGWX((l)CEUV+	Wr+   c                    |j                  d      }|j                  d      }|j                  d      }|j                  d      }|j                  d      }|j                  d      }|j                  d      }|j                  d      }	| j                  j                  |d|i d	      }
|
d
   j                  |d|i d	      }|d
   j                  |d|i d	      }|d
   j                  |d|i d	      }|d
   j                  |d|i d	      }|d
   j                  |d|i d	      }|d
   j                  |d|i d	      }|	rd|	d|d
   |	<   y y )Ncountryareacitystreethouse_numberfloorflatroom)rQ  rj   r  r  )rQ  rj   )r|   r   rr  )r:   location_datacountry_name	area_name	city_namestreet_namer=  floor_numberflat_numberroom_numberr9  r:  r;  r<  s                 r)   _prepare_location_dataz#CmfPluginCsv._prepare_location_data	  s   $((3!%%f-	!%%f-	#''1$((8$((1#''/#''/..++!$
 z"--!
 J**!
 j!,, #
 j)44&$
 $J/::$
 #:.99#
 #4K
#K0 r+   c                    | j                   j                  d   }| j                  ||t        j                        }|rg d}|D ]9  }|j                  |d      }|s| j                  j                  |i       }||d<    n j                  dg       }| j                  ||t        j                        }	|	r|	|vr|j                  |	       ||d<   |j                  dg       }
| j                  ||t        j                        }|r|	|d<   ||
vr|
j                  |       |
|d<   |j                  di       }| j                  ||t        j                        }|rfg d	}|D ]/  }|j                  |d      }|s|j                  |i       }||d<    n j                  dg       }|	r|	|vr|j                  |	       ||d<   ||d<   y y )
Nrs   )r   r#  r   r   r  r)  r  r<  r1  r  )r   re   r   r   r'  r|   r5  rr  r;  r   r6  r0  )r:   r   rs   r6  r	  r
  r  r)  r)  asset_type_cat_datar  asset_type_datar1  r(  r1  s                  r)   _prepare_asset_dataz CmfPluginCsv._prepare_asset_data	  s   //778IJ !,,S/6CXCXYAK) 
#4#8#8R#H ##'#5#5#@#@AQSU#VL+<L( +../@"EO"&"2"23I_I_"`"':/'Q&&':;.=L*+ '**="=K"..sOVEXEXYO4G 01"+5&&7*5L' &)),;J!--c?FDVDVWN8"- J'5'9'9*b'I$'$.$9$9:JB$O	,:	&) #,--0A2"F&+>o+U#**+>?/>	+,)3L&S r+   c                    | j                   j                  d   }| j                   j                  j                  j                  dd      }t	        | j                  | j                              D ]  \  }}| j                   j                         r y | j                   j                  d   r|dk(  rB| j                  ||t        j                        }| j                  ||t        j                        }| j                  ||t        j                        }|rg d}|D ]9  }	|j                  |	d      }
|
s| j                  j                  |
i       }||d<    n j                  d	g       }| j                  ||t        j                        }|r||vr|j!                  |       ||d	<   |j                  d
g       }| j                  ||t        j"                        }|rR|j                  d      }|rT|rR|j%                  | j                   j&                  j                        s#| j                   j&                   d|d    }||d<   |s|j                  d      }|j                  d      r|d   |d<   |j                  d      }|r|j                  d      s|d= |j                  d      }|s|d   }| j(                  j                  |g       }|r|j!                  |       n:| xj*                  dz  c_        | j                   j-                  d|dz    ddd       || j(                  |<   | j                  ||t        j.                        }|r|r^d}|j                  d      r|d   d   }|j                  d      r|d   d   }|j1                  d      D ]  }|||d}|}d|v sd|v rd}d|v rd}t3        j0                  d|      \  }}|j5                  d      rt7        |d d       }||z  d!z  d"z  |d#<   nz|j5                  d$      rt7        |d d       }||z  d!z  |d#<   nO|j5                  d%      rt7        |d d       }||z  |d#<   n'|j5                  d&      rt7        |d d       }||z  |d'<   |j5                  d(      r
|d d) }d|d*<   |j5                  d+      r|d d) }|j5                  d,      r
|d d) }d|d*<   |j5                  d-      r|d d) }||d.<   |r!| j                   j&                   d|d.    |d.<   || j8                  vsw| j8                  j!                  |        |j                  d.      r|d.   d   }|j1                  d      D ]U  }|||d}|r!| j                   j&                   d|d.    |d.<   || j8                  vs;| j8                  j!                  |       W n:| xj*                  dz  c_        | j                   j-                  d|dz    d/d0d       |j                  d1      |j                  d2      |j                  d3      d4}||vr|j!                  |       ||d
<   | j                  || j                   j                  d   t        j:                        }|r|j                  d5      r|d5   }|d5= |j                  d      st3        j0                  d6|      }d7j=                  |      }d7j=                  |d d       } |j                  d      | j>                  |<   | | j>                  v rY| j>                  |    }|| j(                  vrg | j(                  |<   | j(                  |   j!                  |j                  d             |j                  d8g       }!|r||!vr|!j!                  |       |!|d8<   |j                  d9g       }"|r||"vr|"j!                  |       |"|d9<   nV|r)|| j@                  vr| j@                  j!                  |       |r)|| jB                  vr| jB                  j!                  |       | j                  ||t        jD                        }#|#r| jG                  |#       | jI                  |        y ):u   
        Из строк файла собирает данные проектов, спринтов, БП, компаний и пользователей для последующего импорта
        rs   rr  Frq   r   r  r   r  r  r  r   r.   r   rm  r   rr   u   Строка u   : Невозможно создать связь с Epic или родительской задачей. Укажите код или ИД задачи в файлеzERR-0080r   r  zsystem.finish:startrT  r   rI   )rQ  r   rS  r   r   r  z[+-]u   дNr  r  rU  r  u   мr.  rV  u   ОНrQ  u   ООu   НОu   ННrS  uy   : Невозможно создать связи задач. Укажите код или ИД задачи в файлеzERR-0081r  r   r   )r  r   r   r   z[,./+-]r   r   rn  )%r   re   rS   r|   r3   r2   r  rG  r   r   r   r   r!   r  rr  r"   r   r   r   rd   rD  r  r  r   r   r  rt  r  rW  r   rD  subtasks_outliner   rn  r%   rI  rM  )$r:   rs   rr  r   r   company_dataperson_datar  r	  r
  r  r  project_sprintssprint_dataproject_workflowsr  task_ext_idr   rK  rD  rX  rT  related_tasksrelated_taskrelation	task_linkminuslagr  r  r   outline_listparent_outlineproject_companiesproject_personsrA  s$                                       r)   _prepare_import_dataz!CmfPluginCsv._prepare_import_data 
  sN    //778IJ OO99??CCDWY^_t/?/? @A u	*FAs((*,,[9a1f++C&BSBSTL**3AQAQRK++C&BSBSTL8"- J'3'7'7
B'G$'"&--":":;KR"P*6 #*++i"<"..sOV^^T;o#E#**;7%4	"$+KKR$@!''_fnnM"&((8"4K"'8AWAWX\XgXgXjXjXpXpAq)-););(<Ad8n=M&N)4X&&*hhv&6xx'.26l]+"&((="9K"488F+; /(3(A,,7,?M#'==#4#4]B#G&$OOK8 ,,1, OO55"/Aw 7_ !` *)2	 6  8@m4$($4$4S/6KcKc$dM$&,AM,00A0=o0Nx0X,00;0=i0H0R4A4G4G4L +!HL0=3>4@0&H 1=I'*l':c\>Q01+.,+>46E9;&,9W	3+.<<+=25c#2h-CHMPSVXHX[\H\H_,E-0\\$-?25c#2h-CHMPSVXHXH_,E-0\\$-?25c#2h-CHMPSH_,E-0\\#->25c#2h-CLQTWKH5H,I'0'9'9&'A4=crN	;P(8'0'9'9&'A4=crN	'0'9'9&'A4=crN	;P(8'0'9'9&'A4=crN	;DHZ$8'8BF//BTBTAUUVW_`jWkVl?m(<'/t~~'E(,(=(=h(GW+!HZ  -00<0=j0I(0S4A4G4G4L 	!HL0=3?4?0&H
 (9BF//BTBTAUUVW_`jWkVl?m(<'/t~~'E(,(=(=h(G	!H !,,1, OO55"/Aw 7_ !` *)2	 6  %)HHZ$8"&((8"4&*hh|&< H
  '88)00:'8$((doo.K.KL].^`f`s`styy!12)./?)@!"23#xx6+-88I~+NL-0XXl-CN-0XXl3B6G-HNDHHHXDVD11.A-1F1FF040E0En0U#0#ECEDMM-$@ $m < C CDHHXDV W$+KKR$@!L8I$I%,,\:'8$")++i"<;o#E#**;7%4	"L$FNN)),7;dll#BLL''4 !,,S/6CUCUVM++M: $$S)ku	*r+   c                    || _         | j                   j                         | _        g | _        g | _        i | _        i | _        i | _        i | _        g | _	        t               | _        i | _        i | _        t        j                  j!                  |ddg dgdgdg      | _        | j%                          | j'                  | j                         | j)                  | j                         | j+                  | j
                         | j-                  | j                         | j/                  | j                         t1                | j3                          | j5                          | j7                          | j                  D ](  }t9        t        j:                  j<                  |g       * | j                   j>                  j@                  j!                  dd	      r| j                  jC                         D ]  \  }}|s	| j                   jD                  jG                  d
tI        |       d|        |r1t9        t        jJ                  jL                  |tO        |      g       pt9        t        jJ                  jP                  tO        |      g        | jR                  r(| j                   jU                  d| jR                          | jR                   S )Nrk   rl   rm   rc   rn   ro   )argssend_invitesTu,   Отправляем приглашения u    пользователям: u#   Ошибок обнаружено: )+r   get_max_processesr  r   rn  r  rq  rD  rP  rW  rs  r  r   r5  r   r}   r|   r  ra  rm  r~  r  r  r7  
cmf_commitr  rO  rZ  schedule_deferred_jobr   _outline_force_recalcre   rS   r   ry   rc  r   r   register_sdesk_clientr  register_personsr  r  )r:   r   gantt_project_idr  rq  s        r)   process_importzCmfPluginCsv.process_import
  sr   $!__>>@ "!$!//33'@A()7	 4 
 	!!#/dll+t}}-/##D$6$67 	 	 ! !% 6 6 	f!&"5"5"K"KScRde	f ??((..22>4H*.*<*<*B*B*D &$&&++.Z[^_l[mZn.KM?-\ ])((>>%tM':;
 *((99"=12" OO"EdFVFVEW XY####r+   )N)NNr   )I__name__
__module____qualname__r   logginggetLoggerClass__annotations__r  staticmethodr*   boolrB   r   r  r2   r   r   rP   r~   r   r   r   r   r  r  r!  r+  r3  r9  r>  rJ  rQ  rY  r_  rm  r~  r  r  r  r  r  r  r  r  rO  rZ  re  backoffon_exceptionexpor  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r+  r-  r3  r7  rI  rM  ra  rl  r  r+   r)   r   r      s&   (,GW##%,K   D * $  &FP x+$sDy/ x+ x+t # $  "#J(T (T (T (T*.( >86"650B#"J0#D #"B B.`-D<|[$ [6#s&jGR6p-u^JqX+4 W',,#$&#%(U$	(U$ns$l0M.jZ+\6,r`F50"%HN`($zL BDY] mB
+	'52W0M^.4`|*|E$r+   r   )rX   mathcopyr   r   r  pathlibr   typingr   r   ru  multiprocessingr  r  psutilrE  rT   rN   r  r   dateutildateutil.parserr   cmf.includemodules.settings.fieldsr
   r  r   r   r  r+   r)   <module>r     s[    
      !         	 +  '  2 H,$>.. H,$r+   