U
    ;i6                    @   s   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T d dlmZ d d	lmZ G d
d dejZdS )    N)deepcopy)Path)DictIterator)cached_property)ParserError)*)cmf_plugin_csvcmf_contextc                   @   sT  e Zd ZU dZe ed< dZedd Z	e
dddZeee dd	d
Zdd Zeeeef dddZeee
dddZdd ZeeedddZdd Zdd Zdd Zdd Zdd  Zd!d" Zd#d$ Zd%d& Zd'd( Zd)d* Z d+d, Z!d-d. Z"d/d0 Z#d}ed1d2d3Z$d~ed4d5d6Z%d7d8 Z&d9d: Z'ed;d<d=Z(d>d? Z)d@dA Z*dBdC Z+dDdE Z,dFdG Z-dHdI Z.dJdK Z/dLdM Z0e1j2e1j3e4dNdOdPdQdR Z5dSdT Z6dUdV Z7dWdX Z8dYdZ Z9d[d\ Z:d]d^ Z;d_d` Z<dadb Z=ddcddZ>dedf Z?dgdh Z@didj ZAi dfdkdlZBdmdn ZCdodp ZDdqdr ZEdsdt ZFdudv ZGdwdx ZHdydz ZId{d| ZJdS )CmfPluginCsvN_loggerr   c                  C   s|  dt j t jjdddgddt j t jjdgddt j t jjdgddt j t jjdgdd	t j t jjdgdd
t j	 t j	jdddgddt j
 t j
jdddgddt j t jjdgddt j t jjdgddt j t jjdddgddt j t jjddgddt j t jjddgddt j t jjddt j t jjdddt j t jjddg} | S )uR   Собственный магазин при выборе импорта из Jirau#   Поля пользователейCmfTaskCmfTestplanCmfTestcase)captionfieldsiconZavailable_foru!   Поля контрагентовu   Поля задачu,   Оперативная гант-задачаu   Журнал работu!   Поля комментариевu   Поля проектовu"   Поля списков задачu   Поля компонентовu   Поля группu   Поля активовu   Поля локацийu   Поля тесткейсов)r   r   r   u2   Поля тесткейсов тестплановT)r   r   r   Zhiddenu*   Поля выполнения тестов)models	CmfPersonimport_shop_fieldsr   
CmfCompanyr   CmfGanttTaskCmfTimeTrackerHistoryZCmfTimeTracker
CmfComment
CmfProjectCmfListCmfComponentCmfPersonGroupCmfAssetCmfLocationr   CmfTestplanTestcaseZCmfTestcaseRun)res r#   +./modules/settings/models/cmf_plugin_csv.pycalc_models_settings   sz    
 
 
 
 
 
 
 
 
 
 
 
 

 
  z!CmfPluginCsv.calc_models_settings)returnc              	   C   s   |j }d}d}z | |}t|D ]\}}q"W n tk
rn   d| d| }| j| t|dd d}Y nb tk
r   | jd| d|  d}Y n4 tt	fk
r   | jd| d|  d}Y nX |S )	NFr   uK   Не корректный формат загружаемого файла :T)abort*   Приложен пустой файл CSVu5   Не удаётся прочитать строчку)
full_path_file	_get_file	enumerateUnicodeDecodeErrorr   	exceptionZ	cmf_alertStopIterationIOError
ValueError)self
attachmentZ	file_path
have_errorZnum	file_read_msgr#   r#   r$   _check_fileD   s&    

zCmfPluginCsv._check_filec              	   c   s   t | j}|jdkrLtt|}|d}| D ]}dd |D V  q4n~|jdkrt	t|}|j
}|jddD ]
}|V  qvnF|jdkrtd	 t|d
"}tj|dddD ]
}|V  qW 5 Q R X d S )N.xlsr   c                 S   s   g | ]
}|j qS r#   )value).0itemr#   r#   r$   
<listcomp>`   s     z*CmfPluginCsv._get_file.<locals>.<listcomp>.xlsxT)Zvalues_only.csvi r;")Z	delimiterZ	quotechar)r   r*   suffixxlrdZopen_workbookstrZsheet_by_indexZget_rowsopenpyxlZload_workbookZactiveZ	iter_rowscsvZfield_size_limitopenreader)r3   Zattachment_file_pathZworkbookZ	worksheetelfiler#   r#   r$   r+   Y   s"    






zCmfPluginCsv._get_filec              	   C   s   |j | _|jsd S tjjdgdd|jgdgd}dg d}tjj|dd	d
ddggdgdgd}| |}|rpg S | 	|}| 
 }t|D ]j\}}	|dkr|jd s qn|dkr qt|	D ].\}
}d}t|tjr|d}|dkr|r|jd rt|jd D ]}d|kr0d|kr0 q|d dkrBq|d D ]J}|d |krJ|d }|r| |d s|d | d} qqJq|s|d |d d d d q|d |
 }||d }||d< |r||d< |d |d< qq|d s| jd g S d|d < |gS )!N-cmf_modified_atidz!=json_settings)order_byfilterr   ZCSVnamer   	file_typeINr?   r9   r>   urlparentrP   rO   r   r   	first_row   Fz%Y-%m-%d %H:%M:%Simport_settingsrR   r   titlemodel_fieldfield_qualnameT)r[   file_valr\   r   r^   r   r)   r   entity)loggerr   Zattachmentsr   	CmfImportgetrM   CmfAttachmentr8   r+   _default_mapping_csvr,   rN   
isinstancedatetimestrftimer   _is_backref_fieldappendr.   )r2   
cmf_importZprev_settingssettingsr3   r4   r5   default_mappingirowjvalfoundZprev_setZ
prev_fieldr\   Zrow_settingsr#   r#   r$   calc_import_settingsm   sr    




 

z!CmfPluginCsv.calc_import_settingsc               )   C   s  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!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d0dd|ddd0dd1d0dd2d0dd3d0ddd0dd|ddd4dd5d4dd6 i }tj D ]}|||d7 < q8| D ]P\}}|d8d9}	|d:d9}
tt|	}||
|	 d;|
 |jd<|jd=||< qT|S )>ug    Структура сопоставления полей из файла CSV по умолчанию. r   r   r   r   ext_id)
field_name
model_namerR   
logic_typeZcmf_modified_atcmf_created_atcmf_modified_bycodetextstatusZ
alarm_dateZdeadlinepriorityzresponsible.namezresponsible.emailzcmf_author.namezcmf_author.emailzexecutors.namezexecutors.emailparent_taskzparent_task.codeZtask_code_prefixactivity
componentsactual_workr   sched_start_datesched_finish_date
sched_workagregat_workactual_myself_workactual_completeactual_finish_dateoutline_numberr   )'u/   Ид внешней системы задачиu   Тема задачиu   Тип задачиu(   Дата изменения задачиu&   Дата создания задачиu*   ФИО изменившего задачуu   Код задачиu   Описание задачиu   Статус задачиu   Будильник задачиu$   Крайний срок задачиu   Важностьu   ФИО исполнителяu   Email исполнителяu   ФИО автораu   Email автораu!   ФИО соисполнителяu    Email соисполнителяu%   Родительская задачаu$   Код основной задачиu   Название проектаu   Код проектаu   Префикс задачu   Тип проектаu   Вид деятельностиu   Список задачu   Компонентu   Компонентыu   Код компонентаu/   Фактические трудозатратыu&   Плановая дата началаu,   Плановая дата окончанияu/   Планируемые трудозатратыu2   Сумма дочерних трудозатратui   Фактические трудозатраты по собственным ресурсам задачиu-   Фактический % завершенияu   Дата финишаu]   Структурный номер (для поиска родительской задачи)u   Комментарийsched_durationin_linkCmfRelationOptionactual_start_dateconstrain_start_typeconstrain_start_dateis_milestoner   folder	cmf_ownersignificancer!   testplan_testcase_folder)u   СДРu   ИДu   Название_задачиu   Длительностьu   Предшественникиu   Дата_началаu   Дата_окончанияu#   Процент_завершенияu#   Фактическое_началоu)   Фактическое_окончаниеu   Тип_ограниченияu   Дата_ограниченияu   Дата_созданияu7   Запланированные_трудозатратыu/   Фактические_трудозатратыu   ВехаZID   Расположениеu   Наименование   Набор тестовu
   Авторu   Приоритетu   Статусr   u   Названиеr   r   ru    rt   .T)r   rt   r]   r   requiredverbose_name)	updater   r   r   itemsrb   getattrr   r   )Zname_cmf_taskZname_cmf_projectZname_cmf_epicZname_cmf_componentrl   Zdefault_local_attrs_mappingZshop_fr[   Zvalue_modelru   Z	name_attrmodelr#   r#   r$   rd      s    *;
z!CmfPluginCsv._default_mapping_csv)r]   r&   c                 C   sd   |  d^}}t|}|D ]B}t||}t|tjjr> dS t|drN|j	sR q`t|j	}qdS )Nr   Tr   F)
splitcmfutilZget_model_by_namer   
issubclasscmfr   Z
CmfBackrefhasattrr   )r]   ru   Zattrsr   attrfieldr#   r#   r$   rh   5  s    

zCmfPluginCsv._is_backref_fieldc                 C   s<  g }ddg g d}d}t jj|ddddd	ggd
gd}|sH| jjd | |}|jd rdt| t	|D ]\}}|dkr qg }	|d 
|	 t	|jD ]l\}
}|d sq|d d dd }|s|dkrd}|dkr|dkr|d 
|d d  |	
||
  qql|d r"|
| |s8d|d< d|d< |S )Nu   СделкиZ	handshake)r[   r   titlesrowsFrS   rT   r?   r9   r>   rL   )rW   rP   rO   u)   Не найден файл импортаrX   rY   r   r\   r]   r   r   CmfDealT)r   r   r   r   u   Задачиr[   zcalendar-todayr   )r   rc   rb   rj   r`   errorr+   rN   nextr,   ri   Zcsv_import_settings_fieldsr   )r2   rj   resultZdealsZis_dealZattachr5   rm   rn   Zdata_rowro   rk   ru   r#   r#   r$   previewG  sD    



zCmfPluginCsv.preview)	row_arrayrk   r&   c                 C   s  t  }t|d d D ]\}}|| s*q|d s6qn|d d |jkrJq|d d d}t||d }|jdr|jdkrd	|| i||d < qt|t	j
jrt|d
kr|d
 || i||d < nd|| i||d < q|jdkrt|| ||d < q|jdkr&| || ||d < qt|drN| || |j||d < qt|t	j
jr||  }	dddddh}
dddddh}|	|
krd||d < n$|	|krd||d < nd ||d < q|| ||d < q|S )Nr   r   r\   r   rt   r   Zcf_)ZCmfM2MZCmfCascadeChoicerR   rY   rs   r|   choicesu   даtrueZyes1+   нетZfalseno0-TF)dictr,   r   r   r   
class_name
startswithZwidgetr   r   r   Z
CmfRelBaselenrE   Zcalc_priorityr   Zcalc_choicesr   ZCmfBoollower)r2   r   rk   r   r"   idxfield_settingsZfield_partsr   r:   Ztrue_valuesZfalse_valuesr#   r#   r$   _map_objectl  sH    


zCmfPluginCsv._map_objectc                 C   s   d }|  || jjd tj}|rg }dddg}|D ]N}||d}|r2|dkrl|d|d|gdd|gg n||d|g  qq2|rtjj|d}|S )	NrZ   rs   ry   rR   r   OR==rP   )r   rj   rN   r   r   rb   ri   )r2   rn   project_objproject_filteruniq_fields
uniq_fielduniq_field_valuer#   r#   r$   _get_project  s    
zCmfPluginCsv._get_projectc           
      C   s   d }|  || jjd tj}|rg }dddg}|D ]N}||d}|r2|dkrl|d|d|gdd|gg n||d|g  qq2|rtjj|dd	}	|d
d|gdd|	gg tjj|d}|S )NrZ   rs   ry   rR   r   r   r   sprinttree_parentsys_typerW   r   r   )	r   rj   rN   r   r   rb   ri   	CmfFolderextend)
r2   rn   r   
sprint_objr   r   r   r   r   sprint_folderr#   r#   r$   _get_sprint  s"    
zCmfPluginCsv._get_sprintc           
      C   s   dt jj d}g }dd td|D }|D ]x}t||rJdd|g}n
dd	|g}d
|dd|ggdd|gg}t jj|d}	|	r||	 q.| jj	d| dddd q.|S )u  
        Получает список компонентов, найденных по идентификатору(код, название)

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

        Returns:
            list: список компонентов
        ^z-(\d+)$c                 S   s   g | ]}|  r|  qS r#   )strip)r;   
identifierr#   r#   r$   r=     s   z0CmfPluginCsv._get_components.<locals>.<listcomp>z[^,;]+ry   =rR   ILIKEr   rs   rW   r   u   Компонент 'u   ' не найденzERR-0089r   Zobj_type)
r   r   Zcode_prefixrefindallmatchrb   ri   rj   	log_error)
r2   Zcomponent_identifiersr   Zcode_patternr   Zidentifiersr   Zidentifier_filterZcomponent_filterZ	componentr#   r#   r$   _get_components  s0    


zCmfPluginCsv._get_componentsc                 C   sx   t jjdd|gd}|stt jjdd| gd}t|dkrh| jjd| dt| d	d
dd td|rt|d }|S )Nry   r   r   rR   r   rY   u<   Компаний с одинаковым названием z > uF   , укажите код компании вместо названияzERR-0071r   r   u]   Найдено несколько компаний с одинаковым названиемr   )	r   r   rb   listr   r   rj   r   	Exception)r2   rs   company	companiesr#   r#   r$   _get_company  s    zCmfPluginCsv._get_companyc                 C   s   d }|rg }dddg}|D ]V}| |d }|r|dkrX|d|d|gdd|gg n||d| g  qrq|rtjj |d}|std| d	n"tjj d
ddgd}| jj	d |S )Nrs   ry   asset_code_prefixr   r   r   r   u/   Не найдена схема активов "uf   ", создайте схему и укажите префикс кода активов в файле.systemTu   Не указана схема активов. Установлена схема активов по-умолчанию (системная))
rb   r   ri   upperr   CmfAssetSchemer   rj   r`   warning)r2   asset_schemeasset_scheme_objr   r   r   r   r#   r#   r$   _get_asset_scheme  s,    

zCmfPluginCsv._get_asset_schemec                 C   s   d }|r| dp$| dp$| d}|rp| }tjj dd|gdddd| dgdd|gdd	|gggdgd
}|std| d| d|S )Nrs   ry   rR   rW   r   r   LIKE%r   rP   r   u1   Не найдена группа активов "u   " в схеме uY   , создайте группу и укажите ID, код или имя в файле.)rb   r   r   CmfAssetCatr   )r2   	asset_catr   asset_cat_objr   r#   r#   r$   _get_asset_cat"  s(    	zCmfPluginCsv._get_asset_catc                 C   s   d }|rg }dddg}|D ]R}| |d }|r|dkrX|d|d|gdd|gg n||d|g  qnq|r|dd|g tjj |d}|S 	Nrs   ry   rR   r   r   r   rW   r   )rb   r   ri   r   CmfAssetType)r2   
asset_typer   asset_type_objr   r   r   r   r#   r#   r$   _get_asset_type>  s(    
zCmfPluginCsv._get_asset_typec                 C   s   d }|rg }dddg}|D ]R}| |d }|r|dkrX|d|d|gdd|gg n||d|g  qnq|r|dd|g tjj |d}|S r   )rb   r   ri   r   CmfAssetTypeCat)r2   asset_type_catr   asset_type_cat_objr   r   r   r   r#   r#   r$   _get_asset_type_catY  s(    
z CmfPluginCsv._get_asset_type_catc           	   	   C   s   t jj|}|j}|s|S |j}dd | D }|  }||}|s||krdd |	 D }t
d| d|j dd| |p|p|S )	Nc                 S   s   i | ]\}}|  |qS r#   r   r;   kvr#   r#   r$   
<dictcomp>|  s    z9CmfPluginCsv._get_asset_field_choises.<locals>.<dictcomp>c                 S   s   g | ]}d | d qS rB   r#   r;   r   r#   r#   r$   r=     s     z9CmfPluginCsv._get_asset_field_choises.<locals>.<listcomp>&   Не найдено значение "
   " для "2   ". Укажите одно из значений: , )r   r   r   rb   defaultr   r   r   r   valuesr   r   join)	r2   rt   r:   r   field_defaultfield_choisesr   field_valuer  r#   r#   r$   _get_asset_field_choisest  s     
z%CmfPluginCsv._get_asset_field_choisesc                 C   s   d }|r| dr|d  }tjj dddd| dgdd|gdd|gdd|ggd	}|stjj dddd| dgd
d|gdd|ggd	}|s| jjd| dddd |S )Nrs   r   r   r   loginr   emailrR   r   ry   r   u7   Не найдена группа владельцев "rB   zERR-0085r   r   )rb   r   r   r   r   rj   r   )r2   responsibleZresponsible_objZresponsible_ext_idr#   r#   r$   _get_asset_responsible  s4    		
z#CmfPluginCsv._get_asset_responsiblec              	   C   s   g }|r| dr|d }|dD ]}| }tjj dddd| dgdd|gdd|gd	d|ggd
}|stjj dddd| dgdd|gd	d|ggd
}|s| jjd| dddd q$|| q$|S )Nrs   rA   r   r   r   r
  r   r  rR   r   ry   r   u5   Не найдена группа поддержки "rB   zERR-0086r   r   )	rb   r   r   r   r   r   rj   r   ri   )r2   Zsupport_group_datasupport_group_objsZsupport_groupssupport_groupZsupport_group_ext_idZsupport_group_objr#   r#   r$   _get_asset_support_group  s:    		
z%CmfPluginCsv._get_asset_support_groupc                 C   sp   d }|rl| drl|d  }tjj dddd| dgdd|gdd|ggd	}|sl| jjd
| dddd |S )Nrs   r   r   r   ry   r   rR   r   r   u/   Не найдена локация/адрес "rB   ERR-0087r   r   )rb   r   r   r    rj   r   )r2   locationZlocation_objZlocation_ext_idr#   r#   r$   _get_asset_location  s"    	
z CmfPluginCsv._get_asset_locationc                 C   s   t jj|dddgd}|D ]x}z,||d< ||d< | | jt j| t  W q tk
r } z(t  | jj	d| d| d	d
d W 5 d}~X Y qX qt jj
dd|gdgd}t||_|jr|jdd t  dS )u   
        Создает/обновляет компоненты проекта

        Args:
            components (list): список сырых данных компонентов
            project (CmfProject): проект
        r   Ttree_node_is_branch)r   r   Zinclude_systemr   rW   r   uG   Не удалось создать/обновить компонент . zERR-0088r   r   Nr   --r   Zsave_import)r   r   rb   process_any_table_fieldsrj   r   
cmf_commitr   cmf_rollbackr   sgetboolr  
is_changedsave)r2   r   r   Zcomponent_foldercomponent_dataexcZhas_componentr#   r#   r$   _process_components  s>    

z CmfPluginCsv._process_components)r   c                 C   s   |D ]}d|d< | j jd|  | | j tj|\}}|j  |rt|j	j
dkrtjjdd|j
gddd	ggd
}|j| |  qd S )NTZservicedesk_allowu1   Пытаемся создать компанию project.servicedesk:defaultzparent.coder   zproject_role.coder   zsdesk-client:defaultr   )rj   r`   infor  r   r   dpcommitrE   rv   ry   ZCmfProjectRoleAssignrb   membersri   r  )r2   r   r   r   Zcompany_objis_newZrole_assignr#   r#   r$   _process_companies  s    

zCmfPluginCsv._process_companies)personsc           	      C   s   |D ]}d }| dr2|d  d}| ||d< | jjd|  | | jtj|\}}|j	  |rt
|jjdkr|jjst
|j}| j|t }|r|jr|jjtjs||jj qd S )Nr   rs   u9   Пытаемся создать пользователя r"  )rb   r   rj   r`   r#  r  r   r   r$  r%  rE   rv   ry   Z
user_localr:   rM   person_emails
setdefaultsetr  endswithZconfigZ
ORG_DOMAINadd)	r2   r)  r   personZ
project_idZcompany_ext_idZ
person_objZperson_is_newZproject_person_emailsr#   r#   r$   _process_persons&  s*    


zCmfPluginCsv._process_personsc                 C   s>  d|d j  d|d j  }d|d j d|d j }tjjdd|gd	}|s| jjd
 tjjdd|d j	dd  dgd	}|stjjdd}tj||| jdd}||_|j
r|jdd tjj|d d d}|sdd|d d gddd gg}tjj|d	}|s,tj|d d | jdd}|d d |_|d}|sV|d d }| |}	|	|_|d d |_|j
r|jdd |j  d|d d  }
tjj|
d}|stjjdd|gdd|ggd	}|stjjdd|d d gdd|ggd	}|s&| jjd tj|| j|dd}|
|_|d d |_||_|	|_|j
rZ|jdd d|d j  }d|d d  }tjj|d}|stjjd d}tj||| jdd}||_t|d jd!kr||_|j
r|jdd tjj|d ||d"d#}|s4|d |d"|| jdd$}tjf |}|jdd |||fS )%NzCSV::rW   ::rv   u   БП для проекта u    и типа rs   r   r   u/   Не нашли БП, создаем новыйry   r   r'   r   r   zdefault.system:defaultry   T)rs   templaterj   import_originalr  r{   rs   rR   r   )rR   rj   r4  cache_status_typeworkflowstatus_codeu7   Не нашли статус, создаем новый)r7  rj   r8  r4  u%   CSV-схема для проекта softdev:default)task.agile:defaulttask.base:defaultr   )rv   Ztarger_workflow	scheme_wfcmf_model_name)rv   Ztarget_workflowr=  r<  rj   r4  )rM   rR   r   CmfWorkflowrb   rj   r`   r#  ry   r   r  r  CmfStatusCoders   Zcalc_status_typestatus_type	CmfStatusr8  CmfSchemeWfrE   Zdefault_task_workflowZCmfSchemeWfRule)r2   taskrs   rR   r7  r3  Zcmf_status_coder   r6  r@  status_ext_idtask_statusZscheme_ext_idZscheme_nameschemeZruleZ	rule_dictr#   r#   r$   _process_workflow=  s    *


 zCmfPluginCsv._process_workflowc           	      C   s  d }d }d }d }| dr8|d  dr8|d d  }|rtjj ddd| dgd}|s| jjd| d tjj d	d
|gdgd}|s| jjd| d tjj dd|gdgd}|r|jrd| |j |_nd| d|_|jdd |r|d d  }| jjd| d d	d
|gddd gg}tj	j |d}|rldd
|gdd
|gg}tj
j |d}|sdd
|gd	d
|gg}tj
j |d}|s| jjd| d dd
|gdd|gg}tj
j |d}|s| dr| |\}}}n| jjd ||d< ||d< |S )Nr7  rs   r   %::::%r   u   Ищем БП по коду "rB   ry   r   r   u   Ищем БП по имени "rR   r   r1  Tr  r{   u-   Ищем статус в БП по коду "r   r8  u/   Ищем статус в БП по имени "rv   ut   Невозможно создать БП и статус, не указан логический тип задачи)rb   r   r   r>  rj   r`   r#  rs   r  r?  rA  rG  r   )	r2   rC  workflow_schemeZworkflow_ext_idr7  rE  rD  Zfilter_r8  r#   r#   r$   _calc_workflow  sZ    zCmfPluginCsv._calc_workflow)projectsc                 C   s,  |  D ]}|d }|ds(d|d< |dsFtjjdd|d< n| |d|d< |dsrtjjd	d|d< |d
r| ||d
< | | jtj	|\}}|j
  |r| |d |}|r||_|  | |d | | |d | | |d | | |d | | j|j jj qd S )NdataZproject_typer   rv   project.agile:defaultr2  r   r<  r9  r~   	workflowssprintsr   r   r)  )r  rb   r   CmfLogicType_process_logic_typerB  _process_activityr  rj   r   r$  r%  _process_workflowsr<  r  _process_sprintsr!  r(  r0  gantt_project_idsr.  Zmain_gantt_projectloadrM   r:   )r2   rL  r   project_datar   r'  rJ  r#   r#   r$   _process_projects  s.    




zCmfPluginCsv._process_projectsc           
      C   s   t jjdd}t jj|dd}|D ]}z8||d< ||d< ||d< | | jt j|\}}t  W q" tk
r } z(t	  | jj
d| d	| d
dd W 5 d }~X Y q"X q"t jjdd|gdgd}	t|	|_|jr|jdd t  d S )Nzlist.agile_sprint:defaultr2  r   r   rW   r   rv   uA   Не удалось создать/обновить спринт r  zERR-0090r   r   r   r  r   Tr  )r   rQ  rb   r   r  rj   r   r  r   r  r   r  r  r  r  r  )
r2   rP  r   Zsprint_logic_typer   r   r   r'  r   Zhas_sprintsr#   r#   r$   rU    s0    

zCmfPluginCsv._process_sprintsc                 C   sH   d }|D ]:}||d< | dr.| |d|d< | dr| |}q|S )NrW   rv   r   r{   )rb   rR  rK  )r2   rO  r   rJ  r7  r#   r#   r$   rT    s    

zCmfPluginCsv._process_workflowsc                 C   s  |  || jjd tj}d|kr&|d= |rz8d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rp|d}|d   }||}|dkr||d< n|dkrd|d< d |d< ||d< ||d< n|dkr|dkr||d< n d|d< d |d< ||d< ||d< nRd|d< dd tjjj	
 D }	| jjd| dd|	 ddd |  jd7  _|dr |d dkr |d   }
||
|d< |d dkr dd tjjj	
 D }	| jjd|
 dd|	 ddd |  jd7  _d D ]R}||r||d!r@||d d"  ||< t|| d# ||< qd$D ]t}||r\||  d%r||= q\d&}t||| tj}|r\|dd'd(}t|d) d# ||< q\|d*d |D  d+D ]}||ks|| sq|| }t|tjr qd,d-d.d/d0d1d2d3d4d5d6d7d8}| D ]2\}}|| krF| ||||<  qzqF|d9krd ||< qd:D ]:}||ks|| sq|| }tt|}|||< q|D ]}t|jj|||  q|d;sV|d<d=d>d?g |jjrV|jjrVtj j!|j" |jjj|jjj|jj#jd@}||j_$|jj%dAdB W nV t&k
r } z6t'  | jjdC| dD| dEdd |  jd7  _W 5 d }~X Y nX d S )FNrZ   r   0-const1-early2-latter3-after4-before2-before1-after)   фиксированнаяu   как можно раньшеu   как можно позже   не раньше   не позжеu    начало не позднееu   начало не ранее&   окончание не позднее"   окончание не ранее'   фиксированное начало-   фиксированное окончание   фн   фоu   кмрu   кмпu   ннрu   ннп   онр   онп)	u   фиксированныйrb  rc  rg  re  rd  ri  rj  rk  r   r   )r[  r\  r]  r^  )r`  r_  constrain_finish_typeconstrain_finish_date)ra  rf  rh  c                 S   s   g | ]}d | d qS r   r#   r;   tr#   r#   r$   r=   h  s     z/CmfPluginCsv._process_gantt.<locals>.<listcomp>uG   Не найден тип ограничения даты начала "u,   ". Укажите один из типов: r  zERR-0082r   r   rY   )rZ  r`  r_  c                 S   s   g | ]}d | d qS r   r#   rn  r#   r#   r$   r=   x  s     uM   Не найден тип ограничения даты окончания "zERR-0083)r   Z
const_workr   r   r      ч<   )r   Zactual_duration?u*   (\d+[\.,]?\d*)\s*(?:д|дней|день)?,r      c                 S   s   g | ]}d | qS )zop_gantt_task.r#   )r;   keyr#   r#   r$   r=     s     )r   r   r   r   r   rm  ZjanZfebZmarZaprZmayZjunZjulZaugsepoctZnovZ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)ZcalendarZfrom_dtZto_dtZforce_include_endsTZfrom_importu:   Не удалось импортировать Гантт u    для задачи zERR-0072)(r   rj   rN   r   r   rb   r   r   r   r   r  r   r  _has_errorsrl  r-  floatr   search
IGNORECASEgroupreplaceload_fieldsre   rf   r   intsetattrop_gantt_taskr:   r   r   ZCmfCalendarZget_duration_minutesZ_get_calendarZ	is_manualr   check_gantt_projectr   commit_with_event)r2   rn   task_objganttZconstrain_start_type_mappingZconstrain_finish_type_mappingr   Zconstrain_start_type_rawr   typesZconstrain_finish_type_rawrv  patternr   rp   Z_vmappingZmonth_ruZmonth_enZcalendar_durationer#   r#   r$   _process_gantt"  s*   









zCmfPluginCsv._process_ganttc                 C   s  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krdnd}| j jd||   || d|| d  }||}|rVtjjd!d"|d! gdgd#}|jr0||jkr>d$| |j |_nd$| d$|_|jrR|j	d%d& |S tjjdd'd(| d)gd*}|r||S | j jd+| d, tjjd!d"|gdgd#}|stjjd d-|gdgd#}|r|jr||jkrd$| |j |_nd$| d$|_|jr|j	d%d& |S | j jd. |d/kr:d}n|d0krJd}n|d1krXd}tjjd!d"|gd*}	t
d$| d$|||	d2}
| | j tj|
\}}t  |S )3N   Подзадачаztask.sub:defaultrR   ry   Z	UserStoryztask.userstory:defaultz
Task Agiler:     Задачаr;  Bugztask.bug:defaultEpicztask.epic:defaultu&   Проект. Классическийzproject.base:defaultu   Проект. AgilerN  u   Проект. Service Deskr"  Deviceasset.device:defaultSoftwarezasset.software:defaultVMzasset.vm:default)zSub-taskZSubtaskr  ZStoryu   ИсторияZTaskr  r  u   Багu   Эпикr  u   КлассическийZAgilezService DeskZServiceDeskr  r  r  r   rv   default_logic_typeu   Логический тип rs   rR   ry   r   r   r1  Tr  r   rH  rI  r   uF   Ищем логический тип по коду или имени ''r   uF   Не нашли, создаем новый логический типr   r   )r   r   )rs   rR   r=  r3  )rj   r`   r#  rb   r   r   rQ  rs   r  r  r   r  r  )r2   objru   	name2codeZlogic_type_fieldrs   Zlogic_type_dictrv   Ztemplate_coder3  Zlogic_type_paramsr'  r#   r#   r$   rR    s    



z CmfPluginCsv._process_logic_typec                 C   s  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d|d   |d d|d d}||}|rtjjdd|d gdgd}|jr||jkrd| |j |_nd| d|_|jr|jdd |S tjjddd | d!gd"}|r|S | j jd#| d$ tjjdd|	 gdgd}|sltjjdd%|	 gdgd}|r|jr||jkrd| |j |_nd| d|_|jr|jdd |S | j jd& t
d| d|	 d'}| | j tj|\}}t  |S )(u"    Виды деятельности   БизнесZbusinessr     ПродажиZsales   МаркетингZ	marketing   ПроизводствоZ
production   ПоддержкаZhelpdesk   БухгалтерияZfinance!   ИТ инфраструктураZservicedesk%   Хозяйственная частьZ	household   Разработка ПОZsoftdev)	r  r  r  r  r  r  r  r  r  u    Вид деятельности r~   rs   rR   ry   r   r   r1  Tr  r   rH  rI  r   uJ   Ищем вид деятельности по коду или имени 'r  r   uJ   Не нашли, создаем новый вид деятельности)rs   rR   )rj   r`   r#  rb   r   ZCmfActivityrs   r  r  r   r   r  r  )r2   r   r  rs   Zactivity_dictr~   Zactivity_paramsr'  r#   r#   r$   rS     sZ    

zCmfPluginCsv._process_activityc                 C   s8  | j jd t| j}d}t }| jD ]}| j  r@ d S | j j| d|  |d7 }ddd|gdd|gg}tj	j
|dd	gd
}|s| j jd| ddd |  jd7  _q*| j| D ]}zddd|gdd|gg}tj	j
|dddgd
}	||	_|	jjds|	jjdr |	j|	_|	jdd |	j|	j  |	jjdd |	jjjrf|	jjdd W q tk
r }
 z*| j jd| ddd |  jd7  _W 5 d }
~
X Y qX q|jjdr*tj	jddddgdddggdd|ggdgd
}t||_|jr*|jdd q*t | }| j jd|d d! d S )"Nu5   Привяжем подзадачи к задачамrY       из r   rs   r   ry   rv   r  r   uE   Не удалось найти родительскую задачу zERR-0073r   r   r}   r   task.subproject	task.epicTr  ry  u4   Не удалось привязать задачу zERR-0074)r  r  zlogic_type.coder   ztask.subproject%z
task.epic%r   r  u<   Обработка подзадач выполнена за .3f    сек.)rj   r`   r#  r   subtaskstime	monotonic	is_cancelr   r   rb   r   rz  r}   rv   ry   r   r   r  r  r  Zsave_preload_fieldsr  r:   r  r   r  r  r  )r2   totalrm   t1parent_ext_idr   r}   Zchild_ext_idZ_filter_childrC  r  r  t2r#   r#   r$   _process_subtasksX  sx    

"
zCmfPluginCsv._process_subtasksc           
   	   C   s"  | j jd t| j}d}t }| jD ]}z| j  rFW  d S | j j| d|  |d7 }tj	j
|d d}|stj	j
dd|d gd}|s| j jd	|d  d
ddd |  jd7  _W q*tjj
dd|d gd}|s| j jd|d  ddd |  jd7  _W q*tjj
dd|d gd}|s`| j jd|d  ddd |  jd7  _W q*tjj
|||d}|stj|||| j dd}d|kr|d |_d|kr|d |_|jdd W q*   | j jd| ddd |  jd7  _Y q*X q*t | }	| j jd|	d d! d S )"Nu&   Создадим связи задачrY   r  typer2  rR   r   r   u2   Не удалось найти тип связи "rB   zERR-0075CmfRelationTyper   rs   r   u=   Не удалось найти входящую задачу zERR-0076r   out_linku?   Не удалось найти исходящую задачу zERR-0077)relation_typer   r  T)r  r   r  rj   r4  constrain_lagconstrain_lag_pctr  u.   Не удалось создать связь zERR-0078r   u8   Обработка связей выполнена за r  r  )rj   r`   r#  r   	relationsr  r  r  r   r  rb   r   rz  r   r   r  r  r  )
r2   r  rm   r  relation_datar  r   r  Zrelation_optionr  r#   r#   r$   _process_relations  s    





zCmfPluginCsv._process_relationsc                 C   s   |  || jjd tj}|r| jjd|  d|d< | j|d< d|d< |drttjjd	d
|d d gd|d< |drtj	j|d d d|d< tjf |}|j
r|jr|j
jtj|jjd |_|jdd d S )NrZ   u   Грузим журнал closedr{   rj   Tr4  
cmf_authorr
  r   rs   r   rW   r5  )Zminutesr  )r   rj   rN   r   r   r`   r#  rb   r   r   Z
start_dateZ
time_spentr:   rf   Z	timedeltaZend_dater  )r2   rn   Ztimetracker_historyhistoryr#   r#   r$   _process_timetracker  s*    






z!CmfPluginCsv._process_timetracker
      )Z	max_triesZmax_timec                 C   sl  | j jd }| ||tj}| j jjdrHtjj| j jjdd}n
| |}|r,|r,|dspt	d||d< |dr| 
|d|d< |d jd	rtjj|d
d|d< |dr| | |d
r|d
 |d< |dr|d
s|d= dD ]R}||}|r|dr6tjjdd|d gd}ntjjf |}|r|||< qdD ]0}||}|rVt| dkrVd||< qV| j d|  |dd }dd| j jgdddgdd|d gg}	| j jjdd }
| j jjdd}|r4|dr4|d| j jjs4| j j d|d  |d< |d rTd}
d d|d  g}	n.|drd}
d!d d|d gdd|d gg}	|
st|d|d d" |dd" d#   }| jjj|d$d%}|" | j| j tj||	|
d&\}}W 5 Q R X n| j| j tj||	|
d&\}}|rtjd'| jj  d(| jj! d)| j j d*d+|| j dd,}|j"dd- |j#$  | j d.| d/|d d0|d  d1|d d2	 n8| j d3| d/|d d0|d  d1|d d2	 | %|| | j jjd4rtj&j| j jjd4d}n| '||}|r>|j()  |j(*| |rX| +|d ||_,nN| || j jd tj-}|r|dp|d p|d}| +|||_,|j.r|j"dd- |j/jj.r|j/j"dd- |j#$  | ||tj}|rR|d5rR|d6rR||d< | | j tj|\}}n&|rR| j j0d7d8dd9 |  j1d:7  _1| 2| | j j#$  d S );NrZ   target_project_idrM   rR   u:   Не указано наименование задачи!rW   rv   r   r  epicr   r   r{   r}   )r  r   rx   r  Zwaiting_forrs   r
  r   r   )r   )r   Fu_   Пытаемся создать или обновить задачу по параметрам r   cmf_import.pluginr   r4  Tmerge_identic_namesext_id_per_importr'   ry   r   r   .lockx   timeout
filter_objdont_updateuB   Задача импортирована из файла: <a href="" target="_blank"></a> ()   rz   Z	log_levelrW   rj   r4  r  u'   Создали новую задачу  ext_id= code= name='r  u   Нашли задачу Ztarget_list_idrw   rz   u   Невозможно импортировать задачу без проекта, создайте проект и укажите ID в файлеERR-0079r   rY   )3rj   rN   r   r   r   r:   rb   r   r   r   rR  ry   r   r   rK  r   rE   r   logpoppluginrM   hashlibsha256encode	hexdigestredis_dbredislockr  r   import_filerU   rR   r  r$  r%  r  r   r   ZlistsrW  ri   r   r   r   r  r  r   rz  r  )r2   rn   rZ   rC  r   rv  rp   r/  Ztask_componentsr   r  r  lock_keyr  r  Ztask_is_newcommentr   r  Zcomponent_identifierZcomment_objZcomment_is_newr#   r#   r$   _process_task  s    








*(

"
..




zCmfPluginCsv._process_taskc                 C   s  | j jd }zR| ||tj}|s*W d S |ds<td| ||tj}|sZ|d}| |}| ||tj	}|s|d}| 
||}||d< |r|jn||d< |dr| |d|d< dd	i|d
< |dr| | |dr| ||d< | d|d|d< | d|d|d< | d|d|d< | d|d|d< | |d|d< | |d|d< |d}|r|d= | j d|  dd| j jgdddgdd|d gg}	| j jjdd }
|drd}
dd|d g}	nn|drd}
dd|d g}	nN|dr:d}
dd|d g}	n.|drhd}
ddd|d gdd|d gg}	|
s>tt|dt|dd t|dd t|d d t|d!d t|d"d t|dd t|dd d#   }| jjj|d$d%}|" | j| j tj||	|
d&\}}W 5 Q R X n| j| j tj||	|
d&\}}|r| j d'| d(|d d)|d d*|d d+	 n8| j d,| d(|d d)|d d*|d d+	 |j}| ||tj}|s|d-}| ||}|r |j !  |j "| | #|}|r@|j$!  ||_$|j%rT|j&dd. |j'(  W nJ tk
r } z*|  j)d/7  _)| j j*d0| d1dd2 W 5 d }~X Y nX | j j'(  d S )3NrZ   rR   u2   Не указано название актива.rW   r   rv   r   rs   zasset.system:defaultr7  r{   r~   Zownership_typeZdevice_typeZenabled_statusZoperational_statusr  r  r  u[   Попытка создать или обновить актив по параметрам r  r   r4  Tr  Fry   Zserial_numberZimeir   r   Zinv_noZphone_numberZmarkcoder  r  r  r  u#   Создан новый актив r  r  r  r  u   Найден актив asset_typesr  rY   u*   Ошибка импорта актива. zERR-0084r   )+rj   rN   r   r   r   rb   r   r   r   r   r   rW   rR  rK  rS  r	  r  r  r  r  r:   r  r  rE   r  r  r  r  r  r  r   r   r  rW  ri   r  r  r  r  r$  r%  rz  r   )r2   rn   rZ   Zassetr   r   r   r   Zsupport_group_tmpr   r  r  r  Z	asset_objZasset_is_newr   r   r  r   r#   r#   r$   _process_asset  s
   










..



zCmfPluginCsv._process_assetc                 C   sx   d }|rt| drt|d  }|j dddd| dgdd|gdd|ggd	}|st| jjd
|j d| dd|jd |S )Nrs   r   r   r   ry   r   rR   r   r   u   Не найден z "rB   r  r   )rb   r   rj   r   r   )r2   r   Zobj_datar  rs   r#   r#   r$   _get_objecti  s"    	zCmfPluginCsv._get_objectc                 C   s   | j jd }|d }| j jjdr@tjj| j jjdd}n
| |}|sn| j jdddd |  jd	7  _| 	||tj
}|r||d
< | ||d	d  | d S )NrZ   r   r  r  u   Невозможно импортировать тесткейс без проекта: создайте проект или укажите ID в файлеr  r   r   rY   rW   )rj   rN   r:   rb   r   r   r   r   rz  r   r   _process_testcase_rows)r2   r   rZ   main_rowr   testcaser#   r#   r$   _process_testcase  s     
zCmfPluginCsv._process_testcasec                    s   fdd  ds td drtjj d dd}d d	 d
}|  tdt|d  d 	 
 }| jjj|dd}|  ||d< W 5 Q R X tjj ddd< tjj ddd<  drNdgdgdgd}d d	  }	d }
|D ]@}|	|| kr|}tjj ddd gdd|ggd}
 qFq|
d<  drdgdgd gd!gd"gd#}d  }d }|D ]}||| kr|} qq|d<  d$r| tjd$ d$d$< d%D ]} |}|r| d	r@|d	  }tjj d&d	d'd(| d(gd)d*|gd+d*|gdd*|ggd}ntjj f |}|r||< q| jd,  d-d| jjgd.dd/gddd gg} drddd g}n* d	rd&ddd	 gd	dd	 gg}| j| jtj|d0d1\}}|rtjd2| jj d3| jj d4| jj d5d6|| jd/d7}|jd/d8 |j   | jd9| d: d	 d; d d< d d=	 n8| jd>| d: d	 d; d d< d d=	 d?d@dAidBd?d@dCidBd?d@dDidBdEdFidEdGidEdHidI}|D ]}d|i}t!|dJ dK D ]f\}}|| r|dL |ks<q||dL  }|| ||dE < |dK " D ]}|dK | ||< qdq| #| q|j$r|jd/d8 |j   d S )MNc                    sZ   |  }tjjd | |d}|sHtjd | d|d}|  |   |rV ||S |S )NrW   )rW   r   rR   abstractrW   r   r   rR   )r  r   CmfTestcaseFolderrb   r  r   
subfoldersZfolder_namer   
get_folderr  r#   r$   r    s$    
z7CmfPluginCsv._process_testcase_rows.<locals>.get_folderrR   9   Не указано название тест-кейса.r   rW   u   Тест-кейсыrW   rR   rs   /r  rq  r  r  r  ztestcase.base:defaultr2  rv   r7  r{   u%   Требуется доработкаu
   Готовu   Не готов)ZdraftZapprovedZfailr   ry   r   r   r   u   Самый высокийu   Высокийu   Среднийu   Низкийu   Самый низкий)   r  rY   r   rq  r  r  r   rx   r  r   r   r   r
  r   r  ua   Попытка создать или обновить тесткейс по параметрам r  r4  TFr  uD   Тесткейс импортирован из файла: <a href="r  r  r  r  r  r  *   Создан новый тест-кейс r  r  r  r     Найден тест-кейс rz   Zstep_sectionZpre)rt   r   mainZpostrt   Zexpected_resultZ	test_datar  )u   Предусловияu   Шагиu   Постусловияu%   Ожидаемый результатu   Тестовые данныеu   Комментарииr   r   r[   )%rb   r   r   CmfRegistryr   reverser  r  rE   r  r  r  r  r  rQ  r>  r   rA  _get_field_choisesr   r   rj   r  r  r  r   r  rU   rR   ry   r  r$  r%  r,   keys_process_stepr  )r2   r  r   rZ   registryr  r  r  ZstatusesrD  r{   Zvariantr8  ZsignificancesZsignificance_ext_idr   rv  rp   rs   r/  r   r  r'  r  Ztestcase_step_fieldsrn   testcase_steprm   r   r   Zother_fieldr#   r  r$   r    s    



 
	
"
..z#CmfPluginCsv._process_testcase_rowsc           	   	   C   sX  dD ]}| |}|s$|d  |}|r| drx|d  }tjj dddd| dgdd|gd	d|gd
d|ggd}ntjj f |}|r|||< qd }| drdd|d g}n(| drddd|d gdd|d gg}| j| jtj||dd\}}|r| jd| d| d d n | jd| d| d d |jdd |j	
  d S )N)r  r   rx   rW   rs   r   r   r   r
  r   r  rR   r   ry   r   Fr  u   Создан новый шаг r  r  u   Найден шаг Tr  )rb   r   r   r   r  rj   ZCmfTestcaseStepr  r  r$  r%  )	r2   r   rv  rp   rs   r/  r   r  r'  r#   r#   r$   r  E  sL    

	



" zCmfPluginCsv._process_stepc              	   C   s  | j jd }|d }| j jjdr@tjj| j jjdd}n
| |}|sn| j jdddd |  jd	7  _| 	||tj
}|rtjj|d
d}tjj|dd}|s
td|j d   }| jjj|dd}	|	( tj||ddd}|  |  W 5 Q R X tjj||d}
|
sztd|j d   }| jjj|dd}	|	" tj||dd}
|
jdd W 5 Q R X | 	||tj}| tj||d< ||d< | |
||d	d   |jdd d S )NrZ   r   r  r  u   Невозможно импортировать тест-кейс тест-плана без проекта: создайте проект или укажите ID в файлеr  r   r   rY   u   Тест-планыr  u0   Импортированный тест-планtestplanr  r  r  r  r  )rW   tree_parent_foldertestplan_root_folderu2   Импортированные тест-кейсыrW   r  rR   Tr  r  rW   )rj   rN   r:   rb   r   r   r   r   rz  r   r!   r  r   r  r  rM   r  r  r  r  r  r  CmfTestplanTestcaseFolderr   r  _process_testplan_testcase_rows)r2   r   rZ   r  r   testplan_testcaser  r  r  r  r  r  r#   r#   r$   _process_testplan_testcases  sl    
   z'CmfPluginCsv._process_testplan_testcasec                    sP   fdd  ds td drd d d}|  tdt|d	  d
   }| j	j
j|dd}|  ||d< W 5 Q R X dD ]}d  |}|r| dr|d  }	tjj dddd|	 dgdd|	gdd|	gdd|	ggd}
ntjj f |}
|
r|
|< q| jd  dd| jjgdddgddd gg} drpddd g}n* drdddd gddd gg}| j| jtj|dd\}}|r| jd| d d d  d d! d d"	 n8| jd#| d d d  d d! d d"	 |jrB|jdd$ |j  d S )%Nc                    sZ   |  }tjjd | |d}|sHtjd | d|d}|  |   |rV ||S |S )NrW   r  r  )rW   r  r   rR   )r  r   r  rb   r  r  r  r  r#   r$   r    s$    
z@CmfPluginCsv._process_testplan_testcase_rows.<locals>.get_folderrR   r  r   rs   r  r  rq  r  r  r  r  r  r   r   r   r
  r   r  r   uv   Попытка создать или обновить тест-кейс тест-плана по параметрам r  r   r4  Try   Fr  r  r  r  r  r  r  r  )rb   r   r   r  r  r  rE   r  r  r  r  r  r   r   r   rj   r  r  r  r!   r  r  r$  r%  )r2   r  r  r   r  r  r  rv  rp   rs   r/  r   r  r'  r#   r	  r$   r    sx    

 	

..z,CmfPluginCsv._process_testplan_testcase_rowsc           
   	   C   s   |j |}|j}|s|S |j}dd | D }|  }||}|s||krdd | D }	td| d|j	 dd
|	 |p|p|S )	Nc                 S   s   i | ]\}}|  |qS r#   r   r   r#   r#   r$   r   	  s    z3CmfPluginCsv._get_field_choises.<locals>.<dictcomp>c                 S   s   g | ]}d | d qS r   r#   r   r#   r#   r$   r=   	  s     z3CmfPluginCsv._get_field_choises.<locals>.<listcomp>r   r   r  r  )r   rb   r  r   r   r   r   r  r   r   r  )
r2   r   rt   r:   r   r  r  r   r  r  r#   r#   r$   r  	  s     
zCmfPluginCsv._get_field_choisesc           	      C   s,  d}| j jjd}tdd tj| _| j  r6q| \}}|d kr\|	||f qzX| j j
d| d|  |dkr| | |dkr| | n| | | | W q( tk
r } z<| j j  |d	7 }| j jd
| d| d| ddd W 5 d }~X Y q(X q(W 5 Q R X |	| d S )Nr   r_   F)Zinit_views_and_dsu   Импорт строки r  r   r   rY   u<   Не удалось импортировать строку z: r  zERR-0041r   r   )rj   rN   r:   rb   r   ZAPPZREDIS_DBr  r  putr`   r#  r  r  r  r  r   r$  Zrollbackr   )	r2   	row_queuerow_queue_errors
total_rowserrorswhatZrow_numZrow_datar   r#   r#   r$   _process_row_worker'	  s6    


$z CmfPluginCsv._process_row_workerc              
   C   s  ddl m} d}t b t L tjj|dgd}|| _tj	j|ddddd	ggd
gdgd| _
tdd | | j
D }tjdd}t }	g }
t| jD ]N}tj| jd|d  ||	|dd}|
| |  | jjd|  q| jjd }| jjjd}g }d}t| | j
D ]\}}| j r@ q|jd rZ|dkrZq&||k rhq&||krx q|dkrd }|dkr| ||tj}n|dkr| ||tj}|r|r||d |f g }|| |}n
|| n||d |f q&|r6|dkr6||d |f g }|d |
D ]}|   qD|	! sn||	 7 }qTW 5 Q R X W 5 Q R X |S )Nr   r
   r   )rM   r   rS   rT   r?   r9   r>   rL   rU   rV   c                 S   s   g | ]}d qS rY   r#   r;   r6   r#   r#   r$   r=   Z	  s     z2CmfPluginCsv.process_rows_fork.<locals>.<listcomp>i  )maxsizez_process_row_worker rY   )r  r  r  )targetrR   kwargsu.   Параллельный обработчик rZ   r_   rX   r   r   r   r   )NN)"cmf.appr   r   Zdisable_aclZdisable_notifyr   ra   rb   rj   rc   r  r   r+   queueZQueuerangeZthreading_max_forks	threadingThreadr  ri   startr`   r#  rN   r:   r,   r  r   r   r!   r
  r  empty)r2   Zcmf_import_idstart_index	end_indexr   r  rj   r  r  r  threadsrm   threadrZ   r  r   Zi_headrn   r  r#   r#   r$   process_rows_forkK	  s~    	








$zCmfPluginCsv.process_rows_forkc                 C   s   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d}| jd|j d| d|  | j  |S )Nr   z/usr/bin/python3z	manage.pyshellz%plugin = models.CmfPluginCsv.get(id="z'");retcode = plugin.process_rows_fork("z", r  z);Tz"/var/log/eva-import-subprocess.logza+z&/var/log/eva-import-subprocess.err.log)Z	close_fdsZstart_new_sessionstdoutstderru,   Запустили подпроцесс PID u)    для обработки строк с u    по )	
subprocessPopenrj   r  rM   rH   r  pidZ
log_detail)r2   r  r  r&  procr#   r#   r$   _execute_rows	  s      & 
zCmfPluginCsv._execute_rowsc                 C   s
  | j jjd}|dkrd}n| j}tdd | | jD }|| }|| }| j j	d t
 }g }t|D ]H}|| }	|	| }
|d |k r|
d8 }
n|
|7 }
| |	|
}|| qp|D ]"}|  |jr|  j|j7  _qt
 | }| j j	d|dd	 d S )
Nr_   r  rY   c                 S   s   g | ]}d qS r  r#   r  r#   r#   r$   r=   	  s     z.CmfPluginCsv._process_rows.<locals>.<listcomp>u5   Запуск обработки строк файлаuA   Обработка строк файла выполнена за r  r  )rj   rN   r:   rb   max_processesr   r+   r  r`   r#  r  r  r  r*  ri   Zcommunicate
returncoderz  )r2   r  r+  r  Z
chunk_sizeZ	remainderr  Z	processesrm   r  r  r)  r  r#   r#   r$   _process_rows	  s0    
zCmfPluginCsv._process_rowsc                 C   s  |  D ]\}}i }|| d }|r|||d < | jjd|  tj| jdd}|  D ]\}	}
t||	|
 q^|  tjj	t
|jddgd}|r|n|}|jr|jr||_|jdd |j  | jjd	|j  |	d
r| |d
 ||p| qd S )Nr  u"   Обработка локации T)rj   r4  r   rW   rQ   r  u   Создана локация children)r   r   rj   r`   r#  r   r    r  Z
_calc_namerb   rE   rR   r  r4  rW   r  r$  r%  _process_locations)r2   	locationsZparent_location_dataZparent_location_objrR   rM  Zcurrent_locationr  Znew_locationrt   r:   Zexisting_locationr#   r#   r$   r/  	  s4    


zCmfPluginCsv._process_locationsc                 C   sL   t j|dd}|D ]4}||d< ||d< | | jt j|\}}|j  qd S )Nr  rW   r   rW   r   )r   r   r  rj   r   r$  r%  )r2   asset_type_catsr   Zasset_types_folderr   r   r6   r#   r#   r$   _process_asset_type_cats	  s    z%CmfPluginCsv._process_asset_type_catsc                 C   sJ   |D ]@}||d< |  |d ||d< | | jtj|\}}|j  qd S )NrW   r   )r   r  rj   r   r   r$  r%  )r2   r  r   r   r   r6   r#   r#   r$   _process_asset_types
  s    z!CmfPluginCsv._process_asset_typesc           
      C   s   t jj|dd}| D ]}|d }||d< ||d< |drP| |d|d< nt jjdd	|d< | | jt j|\}}|j	
  |r|d
 D ] }| ||}	|	r|j|	 q|jdd qd S )NZassetsr1  rM  rW   r   r  r   r  r2  r2  Tr  )r   r   rb   r  rR  rQ  r  rj   r   r$  r%  r   Zasset_types_catri   r  )
r2   
asset_catsr   Zassets_folderr   asset_cat_datar   r6   r   r   r#   r#   r$   _process_asset_cats
  s(    

z CmfPluginCsv._process_asset_catsc                 C   s   |  D ]}|d }|ds&td|ds<|d |d< dd|d g}| j| jtj||d\}}|j  |r| 	|d | | 
|d | | |d	 | qd S )
NrM  r   uI   У схемы не указан префикс кодов активов.rs   r   )r  r2  r  r5  )r  rb   r   r  rj   r   r   r$  r%  r3  r4  r7  )r2   asset_schemesr   asset_scheme_datar   r   r6   r#   r#   r$   _process_asset_schemes&
  s$    



z#CmfPluginCsv._process_asset_schemesc                 C   s  | d}| d}| d}| d}| d}| d}| d}| d}	| j|d|i d	}
|
d
 |d|i d	}|d
 |d|i d	}|d
 |d|i d	}|d
 |d|i d	}|d
 |d|i d	}|d
 |d|i d	}|	rd|	d|d
 |	< d S )Ncountryareacitystreethouse_numberZfloorZflatZroom)r  rR   r.  r.  )r  rR   )rb   r0  r+  )r2   location_dataZcountry_nameZ	area_nameZ	city_nameZstreet_namer?  Zfloor_numberZflat_numberZroom_numberr;  r<  r=  r>  r#   r#   r$   _prepare_location_data>
  sz    







							z#CmfPluginCsv._prepare_location_datac                 C   sz  | j jd }| ||tj}|rvdddg}|D ].}||d}|r0| j|i }||d<  q`q0|dg }| ||tj}	|	r|	|kr|	|	 ||d< |dg }
| ||tj
}|r|	|d	< ||
kr|
	| |
|d< |d
i }| ||tj}|rndddg}|D ]2}||d}|r||i }||d<  q@q|dg }|	rf|	|krf|	|	 ||d< ||d
< d S )NrZ   rs   r   ry   r   rM  r2  r  r   r5  rR   )rj   rN   r   r   r   rb   r8  r+  r   ri   r   r   )r2   rn   rZ   r9  r   r   r   r   r2  Zasset_type_cat_datar  Zasset_type_datar5  r6  r   r#   r#   r$   _prepare_asset_data
  sJ    





z CmfPluginCsv._prepare_asset_datac           &      C   s  | j jd }| j jjdd}t| | jD ]\}}| j  rH q| j jd r^|dkr^q.| ||t	j
}| ||t	j}| ||t	j}|rldddg}|D ].}	||	d	}
|
r| j|
i }||d
<  qq|dg }| ||t	j}|r||kr|| ||d< |dg }| ||t	j}|rF||krF|| ||d< |dg }| ||t	j}|rH|d}|r|r|| j jjs| j j d|d  }||d< |s|d}|dr|d |d< |d}|rn|dsn|d= |d}|s|d }| j|g }|r8|| n,|  jd7  _| j jd|d  dddd || j|< | ||t	j}|r|rd}|dr|d d }|drz|d d }|dD ]}|||d}|}d|ksd|krd}d|krd}td|\}}|d rFt|d!d }|| d" d# |d$< n|d%rtt|d!d }|| d" |d$< nR|d&rt|d!d }|| |d$< n(|d'rt|d!d }|| |d(< |d)r|d!d* }d|d+< |d,r|d!d* }|d-r|d!d* }d|d+< |d.r6|d!d* }||d/< |r^| j j d|d/  |d/< || jkr| j| q|d/r|d/ d }|dD ]J}|||d}|r| j j d|d/  |d/< || jkr| j| qn,|  jd7  _| j jd|d  d0d1dd |d2|d3|d4d5}||krH|| ||d< | || j jd t	j}|r|d6r|d6 } |d6= |dstd7| }!d8|!} d8|!d!d }"|d| j | < |"| j kr| j |" }|| jkrg | j|< | j| |d |d9g }#|r4||#kr4|#| |#|d9< |d:g }$|rb||$krb|$| |$|d:< n<|r|| j!kr| j!| |r|| j"kr| j"| | ||t	j#}%|%r| $|% | %| q.d!S );u   
        Из строк файла собирает данные проектов, спринтов, БП, компаний и пользователей для последующего импорта
        rZ   r  FrX   r   rs   ry   rR   r   rM  rP  r   rO  r'   r  r}   rY   u   Строка u   : Невозможно создать связь с Epic или родительской задачей. Укажите код или ИД задачи в файлеzERR-0080r   r   zsystem.finish:startr  r   rA   )r  r   r  r   r   rq  z[+-]u   дNrr  ru  r  rp  u   мr   r  u   ОНr  u   ООu   НОu   ННr  uy   : Невозможно создать связи задач. Укажите код или ИД задачи в файлеzERR-0081r7  r{   rv   )r7  r{   rv   r   z[,./+-]r   r   r)  )&rj   rN   r:   rb   r,   r+   r  r  r   r   r   r   r   rL  r+  r   ri   r   r   r   rM   r  rz  r   r   r   r   r-  r  r  r   r  subtasks_outliner   r)  r    rA  rB  )&r2   rZ   r  rm   rn   Zcompany_dataZperson_datarX  r   r   r   r   Zproject_sprintsZsprint_dataZproject_componentsr  Zproject_workflowsrC  Ztask_ext_idr}   r  r  r  r  Zrelated_tasksZrelated_taskZrelationZ	task_linkZminusZlagr7  r  r   Zoutline_listZparent_outlineZproject_companiesZproject_personsr@  r#   r#   r$   _prepare_import_data
  s8   


















z!CmfPluginCsv._prepare_import_datac                 C   s  || _ | j  | _g | _g | _i | _i | _i | _i | _g | _	t
 | _i | _i | _tjj|dddddggdgdgd| _|   | | j | | j | | j | | j | | j t  |   |   |   | jD ]}ttjj|gd	 q| j jj d
dr~| j! D ]h\}}|s&q| j j"#dt$| d|  |rdttj%j&|t'|gd	 nttj%j(t'|gd	 q| j)r| j *d| j)  | j) S )NrS   rT   r?   r9   r>   rL   rU   rV   )argsZsend_invitesTu,   Отправляем приглашения u    пользователям: u#   Ошибок обнаружено: )+rj   Zget_max_processesr+  r   r)  rL  r*  r  rD  r  r,  rV  r0  r8  r   rc   rb   r  rE  r(  r0  rY  r/  r:  r  r-  r  r  Zschedule_deferred_jobr   Z_outline_force_recalcrN   r:   r   r`   r#  r   r   Zregister_sdesk_clientr   Zregister_personsrz  r  )r2   rj   Zgantt_project_idr   r*  r#   r#   r$   process_import  s^    	


zCmfPluginCsv.process_import)N)N)NNr   )K__name__
__module____qualname__r   ZloggingZgetLoggerClass__annotations__rz  staticmethodr%   r  r8   r   r   r+   rr   r   rE   rd   rh   r   r   r   r   r   r   r   r   r   r   r   r	  r  r  r  r!  r(  r0  rG  rK  rY  rU  rT  r  rR  rS  r  r  r  backoffZon_exceptionZexpor   r  r  r  r  r  r  r  r  r  r  r"  r*  r-  r/  r3  r4  r7  r:  rA  rB  rE  rG  r#   r#   r#   r$   r      s   

$H%*-!%+b> 6I8EL
 - 7 ..9c
$P&!O0 Fr   )rG   Zmathcopyr   rf   r  pathlibr   typingr   r   rM  Zmultiprocessingr  r  Zpsutilr  rF   rD   r   r   ZdateutilZdateutil.parserr   Zcmf.includeZmodules.settings.fieldsr	   r  r   r   r#   r#   r#   r$   <module>   s,   