
    Wi,              	           d dl Z d dlm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 d dlmZ d dlmZ d dlmZ d d	lmZ d d
lmZ d dlmZ  G d deeeeej8                        Zy)    N)deepcopy)Path)DictIterator)*)cmf_plugin_csv)CmfPluginCsvAssetsMixin)CmfPluginCsvLocationsMixin)CmfPluginCsvTasksMixin)CmfPluginCsvTestcasesMixincmf_contextc                   R    e Zd ZU dZej                         ed<   dZe f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#defdZd#defdZd Zd Z d Z!d Z"d$dZ#d Z$d Z%d  Z&d! Z'd" Z( xZ)S )%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                  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g}t!        t#               d      r|t"        | I         z  }|S )uR   Собственный магазин при выборе импорта из Jirau#   Поля пользователей)CmfTaskCmfTestplanCmfTestcase)captionfieldsiconavailable_foru!   Поля контрагентовr   u   Поля задачu,   Оперативная гант-задачаu   Журнал работu!   Поля комментариевu   Поля проектовu"   Поля списков задачu   Поля компонентовu   Поля группu   Поля активовr   r   u   Поля локацийcalc_models_settings)models	CmfPersonimport_shop_fieldsr   
CmfCompanyr   CmfGanttTaskCmfTimeTrackerHistoryCmfTimeTracker
CmfComment
CmfProjectCmfListCmfComponentCmfPersonGroupCmfAssetCmfLocationhasattrsuperr   )clsres	__class__s     +./modules/settings/models/cmf_plugin_csv.pyr   z!CmfPluginCsv.calc_models_settings!   sE    >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9VEXEXEkEkEm((--M-9N9N9a9a9c**//Bkm1V__=_=_=a__))]M<Z\1V=O=O=b=b=d'',,}?]_/
4 572357/11C
    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   r5   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.   r6   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rK   rH   rI   urlparentrk   rj   r   r   	first_row   Fz%Y-%m-%d %H:%M:%Simport_settingsrm   r   titlemodel_fieldfield_qualnameT)rw   file_valrx   r   rz   r   r4   r   entity)loggerr   attachmentsr   	CmfImportgetrh   CmfAttachmentrF   r6   _default_mapping_csvr7   ri   
isinstancedatetimestrftimer   _is_backref_fieldappendr9   )r>   
cmf_importprev_settingssettingsr?   rA   rC   default_mappingirowjvalfoundprev_set
prev_fieldrx   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                 ^   i }t         j                  j                         D ]
  }|||d   <    | j                         j	                         D ]^  \  }}|j                  dd      }|j                  dd      }t        t         |      }||| d| |j                  d|j                  d||<   ` |S )ug    Структура сопоставления полей из файла CSV по умолчанию. r   
model_name 
field_name.T)r   r   ry   r   requiredverbose_name)	r   r   r   _get_default_mappingitemsr   getattrr   r   )r+   default_local_attrs_mappingshop_frw   value_modelr   	name_attrmodels           r.   r   z!CmfPluginCsv._default_mapping_csv   s     ')#nn779 	DF=C'y(9:	D"%":":"<"B"B"D 		VE;$r:J#b9IFJ/E=B@IGQlRST]S^D_:?**>BBGBTBT2V'.			V +*r/   ry   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   
CmfBackrefr)   r   )ry   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)rw   r   titlesrowsFrn   ro   rp   rg   )rs   rk   rj   u)   Не найден файл импортаrt   ru   r   rx   ry   r   r   CmfDealT)r   r   r   r   u   Задачиrw   zcalendar-todayr   )r   r   r   r   r|   errorr6   ri   nextr7   r   csv_import_settings_fieldsr   )r>   r   resultdealsis_dealattachrC   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   <    |r||d<   |S )Nr   r   rx   r   r   r   cf_)CmfM2MCmfCascadeChoicerm   ru   ext_idprioritychoices>      да1yestrue+>      нет0nofalse-TFimport_raw_json)dictr7   r   r   r   
class_name
startswithwidgetr   r   r   
CmfRelBaselenrT   calc_priorityr)   calc_choicesr   CmfBoollower)r>   r   r   r   r,   idxfield_settingsfield_partsr   rW   true_valuesfalse_valuess               r.   _map_objectzCmfPluginCsv._map_object   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 %.C!"
r/   c                 h   | j                   j                  j                  j                  d      rMt        j
                  j                  | j                   j                  j                  j                  d            S 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 )Ntarget_project_idrh   rv   r   coderm   r   r   OR==r   rk   )r   ri   rW   r   r   r#   r   r   )r>   r   project_objproject_filteruniq_fields
uniq_fielduniq_field_values           r.   _get_projectzCmfPluginCsv._get_project+  s   ??((..223FG$$((DOO,I,I,O,O,S,STg,h(ii""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 )Nrv   r   r   r   r   r   r   sprint)tree_parentsys_typers   r   r   )	r   r   ri   r   r$   r   r   	CmfFolderextend)
r>   r   r   
sprint_objr   r   r   r   r   sprint_folders
             r.   _get_sprintzCmfPluginCsv._get_sprintB  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                    dt         j                  j                   d}g }t        j                  d|      D cg c]"  }|j                         r|j                         $ }}|D ]  }t        j                  ||      rdd|g}ndd|g}d|d	d|ggd
d|gg}t         j                  j                  |      }	|	r|j                  |	       e| j                  j                  d| ddd        |S c c}w )u  
        Получает список компонентов, найденных по идентификатору(код, название)

        Args:
            component_identifiers (str): любой идентификатор(код, название)
            project (CmfProject): проект

        Returns:
            list: список компонентов
        ^z-(\d+)$z[^,;]+r   =rm   ILIKEr   r   rs   r   u   Компонент 'u   ' не найденzERR-0089r%   obj_type)r   r%   code_prefixrefindallstripmatchr   r   r   	log_error)
r>   component_identifiersr   code_pattern
components
identifieridentifiersidentifier_filtercomponent_filter	components
             r.   _get_componentszCmfPluginCsv._get_componentsY  s,    F//;;<GD

 !jj4IJ
! 
 

 & 	Jxxj1%+S*$=!%+Wj$A! %sJ/
 3(  ++//7G/HI!!),))*:,6IJ+ * #	. 9
s   'C/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   rm   r   ru   u<   Компаний с одинаковым названием z > uF   , укажите код компании вместо названияzERR-0071r   r   u]   Найдено несколько компаний с одинаковым названиемr   )	r   r   r   listr   r   r   r  	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                    t         j                  j                  |dddg      }|D ]B  }	 ||d<   ||d<   | j                  | j                  t         j
                  |       t                D t         j
                  j                  dd|gdg      }t        |      |_        |j                  r|j                  d       t                y# t        $ r8}t                | j                  j                  d| d| d	d
       Y d}~d}~ww xY w)u   
        Создает/обновляет компоненты проекта

        Args:
            components (list): список сырых данных компонентов
            project (CmfProject): проект
        r  Ttree_node_is_branch)r   r   include_systemr   rs   r   uG   Не удалось создать/обновить компонент . zERR-0088r%   r   Nr   z--rk   r   save_import)r   r   r   process_any_table_fieldsr   r%   
cmf_commitr  cmf_rollbackr  sgetboolr  
is_changedsave)r>   r  r   component_foldercomponent_dataexchas_components          r.   _process_componentsz CmfPluginCsv._process_components  s+    "++//!)*	 0 
 ) 	N+2x(0@}---OO''"
 	$ ++00!3(896 1 
 04M/B,&&!!d!3!  ))]^l]mmopsotu+ *  s   ?C

	D.DD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   r|   infor  r   r   dpcommitrT   
logic_typer   CmfProjectRoleAssignr   membersr   r  )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   Пытаемся создать пользователя r&  )r   r  r   r|   r'  r  r   r   r(  r)  rT   r*  r   
user_localrW   rh   person_emails
setdefaultsetemailendswithconfig
ORG_DOMAINadd)	r>   r1  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                 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rm   r   SubtaskStory	UserStoryztask.userstory:defaultu   ИсторияTaskz
Task Agileztask.agile:defaultu   Задачаztask.base:defaultBugztask.bug:defaultu   Багu   ЭпикEpicztask.epic:defaultu   Классическийu&   Проект. Классическийzproject.base:defaultAgileu   Проект. Agilezproject.agile:defaultzService Desku   Проект. Service Deskr&  ServiceDeskDevicezasset.device:defaultSoftwarezasset.software:defaultVMzasset.vm:defaultCmfAssetCatr*  default_logic_typeu   Логический тип r   rm   r   r   r  ::Tr  LIKE%::::%r   uF   Ищем логический тип по коду или имени ''r   uF   Не нашли, создаем новый логический типr   r#   )r'   rP  )r   rm   cmf_model_nametemplate)r   r|   r'  r   r   r   CmfLogicTyper   r  r  r   r  commit_with_event)r>   objr   	name2codelogic_type_fieldr   logic_type_dictr*  template_coderX  logic_type_paramsr.  s               r.   _process_logic_typez CmfPluginCsv._process_logic_type  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"    Виды деятельности   БизнесbusinessrD     Продажиsales   Маркетинг	marketing   Производство
production   Поддержкаhelpdesk   Бухгалтерияfinance!   ИТ инфраструктураservicedesk%   Хозяйственная часть	household   Разработка ПОsoftdev)	rc  re  rg  ri  rk  rm  ro  rq  rs  u    Вид деятельности activityr   rm   r   r   r  rR  Tr  rS  rT  rU  r   uJ   Ищем вид деятельности по коду или имени 'rV  r   uJ   Не нашли, создаем новый вид деятельности)r   rm   )r   r|   r'  r   r   CmfActivityr   r  r  r   r   r  rZ  )r>   r   r\  r   activity_dictru  activity_paramsr.  s           r.   _process_activityzCmfPluginCsv._process_activity6  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                    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   rS  %r   r   rm   r   r   u   Не найден z "rN   zERR-0087r   )r   r   r   r  r   )r>   r   obj_datar[  r   s        r.   _get_objectzCmfPluginCsv._get_objectn  s    X.h'--/F))v6(!}5S&)Wf-	  C ))()9)9(:"VHAF"-- *  
r/   c           	          |sy|j                  d      }|syt        |      j                         }t        j                  j                  ddd|gdd|gdd|gdd|gg	      }|s| j
                  }|S )
uh   Общий метод поиска пользователя по ext_id, login, email или имени.Nr   r   r   loginr7  r   rm   r   )r   rT   r   r   r   _fallback_person)r>   person_datar   r,   s       r.   _get_personzCmfPluginCsv._get_person  s    *V""$""4($''6*&) # 
 ''C
r/   c           
      h   d}t        d      5  t        j                  | _        	 | j                  j                         rng|j                         \  }}||j                  ||f       n>	 | j                  j                  j                  d| d|        | 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   F)init_views_and_dsu   Импорт строки u    из ru   u<   Не удалось импортировать строку z: r  zERR-0041r   r   )r   APPREDIS_DBredis_dbr   	is_cancelr   putr|   r'  _process_rowr  r(  rollbackr  )r>   	row_queuerow_queue_errors
total_rowserrorsrow_numrow_datar!  s           r.   _process_row_workerz CmfPluginCsv._process_row_worker  s1   51 	LLDM??,,.$-MMO!#MM7H"56
OO**//2LWIU[\f[g0hi%%h/ 	0 	V$ ! OO&&//1aKFOO--VW^V__abjakkmnqmrs"!* .  	 	s7   AD(+<C'D(	D%AD D( D%%D((D1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   }g }d}t3        | j                  | j                              D ]  \  }}| j                  j5                         r nq|j0                  d   r|dk(  r7||k(  r|dkD  r| j7                  ||      r|dz  }Y||k  r_||kD  r| j7                  ||      s n| j9                  |||||	|      \  }} |r|	j;                  |dz   |f       |	j;                  d       |D ]  }|j=                           |
j?                         s$||
j                         z  }|
j?                         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   )rh   r   rn   ro   rp   rg   rq   rr   ru   i  )maxsizez_process_row_worker )r  r  r  )targetrm   kwargsu.   Параллельный обработчик rv   rt   )NN) cmf.appr   r   disable_acldisable_notifyr   r~   r   r   r   import_filer   r6   queueQueuerangethreading_max_forks	threadingThreadr  r   startr|   r'  ri   r7   r  _is_group_tail_process_grouped_rowsr  joinempty)r>   cmf_import_idstart_index	end_indexr   r  r   rD   r  r  r  threadsr   threadrv   r   i_headr   s                     r.   process_rows_forkzCmfPluginCsv.process_rows_fork  s   '  " D	1G$:$:$< D	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DF#DNN43C3C$DE l3??,,.++K8Q!V
 #A**3@#q( {?
 y=..sOD#99#PQSWYbdjkf1l2 vz401MM,'!  ',,.*..00 ',,.GD	1 D	1L w KD	1 D	1 D	1L s6   K#A;K-	K6H	K K#KK 	K##K-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", z, 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   pluginrh   r^   log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                 V   t        | j                  | j                        D cg c]  }d c}      }|dk(  r&| j                  j                  j                  d       y d}||z  }|dk  rd}t        || j                        }||z  }||z  }| j                  j                  j                  d| d| d       t        j                         }g }d}	t        |      D ]C  }
||
|k  rdndz   }|	|z   dz
  }|	|k  r#| j                  |	|      }|j                  |       |dz   }	E |D ]>  }|j                          |j                  s | xj                  |j                  z  c_        @ t        j                         |z
  }| j                  j                  j                  d|d	d
       y c c}w )Nru   r   u=   Файл пуст, обработка не требуется2   u    Запуск обработки u    строк в u    процессахuA   Обработка строк файла выполнена за z.3fu    сек.)r   r6   r  r   r|   r'  minmax_processestime	monotonicr  r  r   communicate
returncode_has_errors)r>   rD   r  min_rows_per_processnum_processes
chunk_size	remaindert1	processesr  r   current_chunk_sizer  r  t2s                  r.   _process_rowszCmfPluginCsv._process_rows  s   T^^D4D4D%EF!FG
?OO""''(gh  " #&::1M M4+=+=>=0
.	##&FzlRaboap  qD  %E  	F^^	}% 		(A!+A	Mqq!I#&881<Ii'))+yA  &#a-K		(  	4D  DOO3 	4
 ^^"##&ghjkngoow$xyS Gs   	F&c                 4   | j                   j                  d   }| j                   j                  j                  j                  dd      }| j                   j                  j                  j                  d      }t	        | j                  | j                              D ]x  \  }}| j                   j                         r y%| j                   j                  d   r|dk(  rB| j                  ||t        j                        }| j                  ||t        j                        }| j                  ||t        j                        }|s4|r2t        j                  j                  |      }	|	j                  d	      }|r g 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||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                   j1                  d|dz    ddd       || j,                  |<   | j                  ||t        j2                        }|r|r^d}|j                  d      r|d   d   }|j                  d      r|d   d   }|j5                  d      D ]  }|||d}|}d |v sd!|v rd}d |v rd"}t7        j4                  d#|      \  }}|j9                  d$      rt;        |d%d"       }||z  d&z  d'z  |d(<   nz|j9                  d)      rt;        |d%d"       }||z  d&z  |d(<   nO|j9                  d*      rt;        |d%d"       }||z  |d(<   n'|j9                  d+      rt;        |d%d"       }||z  |d,<   |j9                  d-      r
|d%d. }d|d/<   |j9                  d0      r|d%d. }|j9                  d1      r
|d%d. }d|d/<   |j9                  d2      r|d%d. }||d3<   |r!| j                   j*                   d|d3    |d3<   || j<                  vsw| j<                  j#                  |        |j                  d3      r|d3   d   }|j5                  d      D ]U  }|||d}|r!| j                   j*                   d|d3    |d3<   || j<                  vs;| j<                  j#                  |       W n:| xj.                  dz  c_        | j                   j1                  d|dz    d4d5d       |j                  d6      |j                  d7      |j                  d8      d9} | |vr|j#                  |        ||d<   | j                  || j                   j                  d   t        j>                        }!|!r|!j                  d:      r|!d:   }"|!d:= |j                  d      st7        j4                  d;|"      }#d<jA                  |#      }"d<jA                  |#d%d"       }$|j                  d      | jB                  |"<   |$| jB                  v rY| jB                  |$   }|| j,                  vrg | j,                  |<   | j,                  |   j#                  |j                  d             |j                  d=g       }%|r||%vr|%j#                  |       |%|d=<   |j                  d>g       }&|r||&vr|&j#                  |       |&|d><   | jE                  ||       nV|r)|| jF                  vr| jF                  j#                  |       |r)|| jH                  vr| jH                  j#                  |       | j                  ||t        jJ                        }'|'r| jM                  |'       | jO                  |       { y%)?u   
        Из строк файла собирает данные проектов, спринтов, БП, компаний и пользователей для последующего импорта
        rv   ext_id_per_importFr   rt   r   r   r   )typer   r   datasprintsr  	workflowsr   r2   r   epicparent_taskru   u   Строка u   : Невозможно создать связь с Epic или родительской задачей. Укажите код или ИД задачи в файлеzERR-0080r   r   zsystem.finish:startrelation_typein_linkrM   )r  r  out_linkr   r   z[+-]u   дN<      constrain_lagu   чu   мr{  constrain_lag_pctu   ОНr  u   ООu   НОu   ННr  uy   : Невозможно создать связи задач. Укажите код или ИД задачи в файлеzERR-0081workflowstatusr*  )r  r  r*  outline_numberz[,./+-]r   r  r1  )(r   ri   rW   r   r7   r6   r  r  r   r   r   r   r#   dumpsprojectsr5  r$   r   r%   r   r   rh   subtasksr  r  CmfRelationOptionr   r   r8  int	relationsr   r  subtasks_outline_prepare_import_data_hookr  r1  r(   _prepare_location_data_prepare_asset_data)(r>   rv   r  r   r   r   company_datar  project_datatarget_projectr   r   r   r   project_sprintssprint_dataproject_componentsr   project_workflowstasktask_ext_idr  parent_ext_idr  relation_datar  related_tasksrelated_taskrelation	task_linkminuslagr  ganttr  outline_listparent_outlineproject_companiesproject_personslocation_datas(                                           r.   _prepare_import_dataz!CmfPluginCsv._prepare_import_dataE  s	    //778IJ OO99??CCDWY^_ OO99??CCDWXt/?/? @A 	*FAs((*,,[9a1f++C&BSBSTL**3AQAQRK++C&BSBSTL$5!'!2!2!6!6:K!6!L-333@8"- J'3'7'7
B'G$'"&--":":;KR"P*6 #*++i"<"..sOV^^T;o#E#**;7%4	" &-[[r%B"!%!1!1#H[H[!\!n<N&N&--n=(:%$+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	"..sG<L$FNN)),7;dll#BLL''4 !,,S/6CUCUVM++M: $$S)	*r/   c                 D   || _         | j                   j                         | _        g | _        g | _        i | _        g | _        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                         | j1                  | j                         | j3                          t5                | j7                          | j                  D ]$  }| j9                  |       | j;                  |       & | j=                          | j?                          | j                  D ](  }tA        t        jB                  jD                  |g       * | j                   jF                  jH                  j#                  dd	      r| j                  jK                         D ]  \  }}|s	| j                   jL                  jO                  d
tQ        |       d|        |r1tA        t        jR                  jT                  |tW        |      g       ptA        t        jR                  jX                  tW        |      g        | jZ                  r(| j                   j]                  d| jZ                          | jZ                   S )Nrn   ro   rp   rg   rq   rr   )argssend_invitesTu,   Отправляем приглашения u    пользователям: u#   Ошибок обнаружено: )/r   get_max_processesr  r  r1  r  project_objsr4  r  r  r  r6  gantt_project_ids	locationsasset_schemesr   r   r   r  r  r0  rB  _process_projects_process_locations_process_asset_schemes_global_objsr  r  _hack_replace_creation_date_hack_create_fake_task_process_subtasks_process_relationsschedule_deferred_jobr   _outline_force_recalcri   rW   r   r|   r'  r   r   register_sdesk_clientr  register_personsr  r  )r>   r   r   gantt_project_idr   r4  s         r.   process_importzCmfPluginCsv.process_import  s   $!__>>@ "!$!//33'@A()7	 4 
 	!!#/dll+t}}-/##D$6$67 	,, 		5K
 ,,[9 ''4		5 	 ! !% 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   )*__name__
__module____qualname__r   logginggetLoggerClass__annotations__r  classmethodr   r  rF   staticmethodr   r  r6   r   r   rT   r   r   r   r   r   r   r   r
  r  r#  r0  rB  ra  ry  r}  r  r  r  r  r  r  r  __classcell__)r-   s   @r.   r   r      s9    )-GW##%,K @ * $  &FP +T#t)_ + +( # $  "#J*T *T *T *X..+Z()V#D #"B B.GR6p.0%8JX(*zXG*RR$r/   r   )r\   copyr   r   pathlibr   typingr   r   r  r  r  rX   rR   r   cmf.includemodules.settings.fieldsr   4modules.settings.models.cmf_plugin_csv_mixins.assetsr	   7modules.settings.models.cmf_plugin_csv_mixins.locationsr
   3modules.settings.models.cmf_plugin_csv_mixins.tasksr   7modules.settings.models.cmf_plugin_csv_mixins.testcasesr   r  r   r    r/   r.   <module>r,     s\    
    !      	  2 X ^ V ^ I$I$r/   