U
    d]s                     @   s   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mZm	Z	 d dl
Z
d dlZd dlmZ d dlT d dlmZ G dd	 d	ejZdS )
    N)deepcopy)Path)DictIterator)cached_property)*)cmf_plugin_csvc                   @   s   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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S )$CmfPluginCsvN_loggerFc                  C   s   dt j t jjddt j t jjddt j t jjddt j t jjddt j t jjddt j	 t j	jddt j
 t j
jdd	t j t jjdd
t j t jjdg	} | S )uR   Собственный магазин при выборе импорта из Jirau#   Поля пользователей)captionfieldsiconu!   Поля контрагентовu   Поля задачu,   Оперативная гант-задачаu   Журнал работu!   Поля комментариевu   Поля проектовu"   Поля списков задачu   Поля групп)models	CmfPersonZimport_shop_fieldsr   Z
CmfCompanyCmfTaskCmfGanttTaskCmfTimeTrackerHistoryZCmfTimeTracker
CmfComment
CmfProjectCmfListCmfPersonGroup)res r   +./modules/settings/models/cmf_plugin_csv.pycalc_models_settings   s6    







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_file,   s&    

zCmfPluginCsv._check_filec              	   c   s   t | j}|jdkrLtt|}|d}| D ]}dd |D V  q4nt|jdkrt	t|}|j
}|jddD ]
}|V  qvn<|jdkrt|d	"}tj|d
ddD ]
}|V  qW 5 Q R X d S )Nz.xlsr   c                 S   s   g | ]
}|j qS r   )value).0itemr   r   r   
<listcomp>H   s     z*CmfPluginCsv._get_file.<locals>.<listcomp>z.xlsxT)Zvalues_onlyz.csvr;")Z	delimiterZ	quotechar)r   r   suffixxlrdZopen_workbookstrZsheet_by_indexZget_rowsopenpyxlZload_workbookZactiveZ	iter_rowsopencsvreader)r(   Zattachment_file_pathZworkbookZ	worksheetelfiler   r   r   r    A   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}|jd }| |}|rVg S | |}| 	 }t
|D ]*\}}	|d	kr|jd
 s qn|dkr qt
|	D ]\}
}d}|d	kr`|r@|jd r@t|jd D ]^}d|krd|kr q@|d dkr
q|d D ]*}|d |kr|d | d} qqq|s|d |d d d d q|d |
 }||d }||d< |r||d< |d |d< qqp|d s| jd g S |gS )Nz-cmf_modified_atidz!=json_settings)Zorder_byfilterr   ZCSV)namer   r   	first_row   Fimport_settingsrA   r   titleT)rF   file_valmodel_fieldr   rG   rH   r   r   )loggerr
   attachmentsr   Z	CmfImportgetr>   r-   r    _default_mapping_csvr!   r?   r   appendr#   )r'   
cmf_importZprev_settingssettingsr(   r)   r*   default_mappingirowjvalfoundZprev_setZ
prev_fieldZrow_settingsrH   r   r   r   calc_import_settingsT   s^    





 

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'$}i }|  D ]P\}}|d(d)}|d*d)}tt|}	||| d+| |	jd,|	jd-||< q>|S ).ug    Структура сопоставления полей из файла CSV по умолчанию. r   r   r   ext_id)
field_name
model_namerA   
logic_typeZcmf_modified_atZ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child_tasks.codeZtask_code_prefixZlogic_prefixZactivityactual_workr   sched_start_datesched_finish_date
sched_workagregat_workactual_myself_workZactual_completeZactual_finish_dater   )$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/   Планируемые трудозатратыu2   Сумма дочерних трудозатратui   Фактические трудозатраты по собственным ресурсам задачиu-   Фактический % завершенияu   Дата финишаu   КомментарийrY    rX   .T)r   rX   field_qualnamer   requiredverbose_name)itemsrK   getattrr   r   rk   )
Zname_cmf_taskZname_cmf_projectZname_cmf_epicrP   Zdefault_local_attrs_mappingrF   Zvalue_modelrY   Z	name_attrmodelr   r   r   rL      sn    '
z!CmfPluginCsv._default_mapping_csvc                 C   s  g }ddg g d}d}|j d }| |}|jd r<t| t|D ]\}}|dkrX qg }	|d |	 t|jD ]l\}
}|d	 sqt|d	 d
 dd }|s|dkrd}|dkrt|dkr|d |d	 d  |	||
  qtqD|d r|| |sd|d< d|d< |S )Nu   СделкиZ	handshake)rF   r   titlesrowsFrB   rC   rD   rp   rH   ri   rh   r   CmfDealT)rq   r   ro   r   u   ЗадачиrF   zcalendar-todayr   )rJ   r    r?   nextr!   rM   Zcsv_import_settings_fieldssplit)r'   rN   resultZdealsZis_dealZattachr*   rQ   rR   Zdata_rowrS   rO   rY   r   r   r   preview   s8    



zCmfPluginCsv.preview)	row_arrayrO   r   c           	      C   s   t  }t|d d D ]\}}|| s(q|d s4qn|d d |jkrHq|d d d}t||d }t|tjjrt	|dkr|d || i||d < qd|| i||d < q|j
d	kr| || ||d < q|| ||d < q|S )
Nr   r   rH   rk   rX   rh   rD   rW   r_   )dictr!   rk   rs   rm   
issubclassZcmfr   Z
CmfRelBaselen
class_nameZcalc_priority)	r'   rv   rO   rn   r   idxZfield_settingsZfield_partsZfieldr   r   r   _map_object   s$    
zCmfPluginCsv._map_objectc                 C   s^   |  || jjd tj}|rZ| jjd | | jtj|\}}|j	tj
  |  d S )NrE   u8   Пытаемся создать пользователя)r|   rN   r?   r   r   rI   infoprocess_any_table_fieldsZrg_member_ofrM   r   Z
user_groupsave)r'   rR   personZ
person_objis_newr   r   r   _process_person   s    zCmfPluginCsv._process_personc                 C   s  d|d j  d|d j  }d|d j d|d j }tjjdd|gd	}|stjjd
d|d jdd  dgd	}tj||| jd}||_|  ||d< dd|d d gdd|gg}tj	j|d	}|stj	| j|d d |d}|  ||d< d|d j  }d|d d  }	tj
j|d}
|
sPtj
jdd}tj
||| jd}
|	|
_||
_|
  tjj|d ||
dd}|s|d |d|
| jd}tjf |}|  d S )NzCSV::parent::rZ   u   БП для проекта u    и типа rW   =r@   r\   LIKEr   r   %)rW   templaterN   workflowrA   ILIKEr^   ==)rN   rA   r   u%   CSV-схема для проекта rW   zsoftdev:defaultr\   r   )rZ   Ztarger_workflow	scheme_wfcmf_model_name)rZ   Ztarget_workflowr   r   rN   )r>   rA   r   ZCmfWorkflowrK   r\   rs   rN   r   Z	CmfStatusZCmfSchemeWfZdefault_task_workflowZCmfSchemeWfRule)r'   taskrW   rA   r   r   Z_filterZtask_statusZscheme_ext_idZscheme_nameZschemeZruleZ	rule_dictr   r   r   _calc_workflow  sN    *  zCmfPluginCsv._calc_workflowc                 C   sn   d }|  || jjd tj}|rj|ds2d|d< |dsNtjjdd|d< | | jtj|\}}t  |S )NrE   Zproject_typeprojectrZ   zproject.agile:defaultr   )	r|   rN   r?   r   r   rK   CmfLogicTyper~   commit_with_event)r'   rR   project_objr   r   r   r   r   _process_project,  s    

zCmfPluginCsv._process_projectc                 C   sZ   d }|  || jjd tj}|rVtjj|dd}||d< ||d< | | jtj|\}}|S )NrE   sprint)tree_parentZsys_typer   r   )r|   rN   r?   r   r   Z	CmfFolderrK   r~   )r'   rR   r   
sprint_objr   Zsprint_folderr   r   r   r   _process_sprint8  s    zCmfPluginCsv._process_sprintc              	   C   sl  |  || jjd tj}|rhz
|dr4d|d< |drFd|d< dD ]"}||rJt|| d ||< qJ|d	d
 |D  |D ]}t|j	j
|||  q|ds|dddg |j	jr|j	jr|j	j|j	j }| d d d }tt|d d}|d d |j	_|j	j
jdd W n< tk
rf   t  | jjd| d|  d| _Y nX d S )NrE   Zconstrain_start_datez0-constZconstrain_start_typeZconstrain_finish_dateZconstrain_finish_type)rd   Z
const_workre   ra   rf   <   c                 S   s   g | ]}d | qS )zop_gantt_task.r   )r/   keyr   r   r   r1   N  s     z/CmfPluginCsv._process_gantt.<locals>.<listcomp>sched_durationzop_gantt_task.sched_start_datez(task_obj.op_gantt_task.sched_finish_datezop_gantt_task.sched_duration   g&?rD      TZ	only_datau:   Не удалось импортировать Гантт u    для задачи )r|   rN   r?   r   r   rK   floatZload_fieldssetattrZop_gantt_taskr.   rb   rc   Ztotal_secondsmaxmathZceilr   r   	Exceptionr   rI   r#   _has_errors)r'   rR   task_objZganttr   ZdeltaZ
delta_daysZ	work_daysr   r   r   _process_ganttB  s8    


 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}| j jd|d   |d d|d d}||}|rtjjdd|d gdgd}|jrd| |j |_nd| d|_|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}|r|jrld| |j |_nd| d|_|jdd |S | j jd d}tjjdd|gd}t	d| d| d|d }| 
| j tj|\}}	t  |S )!N   Подзадачаztask.sub:default)rA   r\   Z	UserStoryztask.userstory:defaultz
Task Agileztask.agile:defaultBugztask.bug:defaultEpicztask.epic:default)zSub-taskZSubtaskr   ZStoryu   ИсторияTasku   Задачаr   u   Багu   Эпикr   u   Тип задачи rZ   rW   rA   r\   r   )r@   r   r   Tr   r   z%::z::%r   u   Ищем по имени ''r   u*   Не нашли, создаем новыйr   )rW   rA   r   r   )rN   rI   r}   rK   r   r   rW   r   striprw   r~   r   )
r'   r   Z	name2coderW   Zlogic_type_dictrZ   Ztemplate_coder   Zlogic_type_paramsr   r   r   r   _process_logic_typeb  s^    
z CmfPluginCsv._process_logic_typec              
   C   s,  | j jd t| j}d}| jD ]}| j  rJd| j _| j    d S | j j| d|  |d7 }tj	j
|d}|s| j jd|  d| _q"| j| D ]}zLtj	j
|dd	d
gd}||_|jjds|jjdr|j|_|  W q tk
r"   | j jd|  d| _Y qX qq"d S )Nu5   Привяжем подзадачи к задачамrD   import-canceling    из r   uE   Не удалось найти родительскую задачу Tr`   r   rZ   )rW   r   ztask.subprojectz	task.epicu4   Не удалось привязать задачу )rN   rI   r}   ry   subtasks	is_cancelr^   r   r   r   rK   errorr   r`   rZ   r\   
startswithr   r   r#   )r'   totalrQ   Zparent_ext_idr`   Zchild_ext_idr   r   r   r   _process_subtasks  s6    


zCmfPluginCsv._process_subtasksc              
   C   s  || _ tdd | |jd D }d| }i | _g | _t| |jd D ]>\}}| j  rxd| j _| j 	   d S |j
|d  d|  |jd r|d	krqLzz| | | |}|r^|| jkr| j| | ||}| ||jd tj}|r^||d< |ds&ddi|d< | ||d< |drJ| | |d}	|	r|d= | j|	d g }
|
|d  |
| j|	d < t  dD ]6}||}|rtjj|d d}|r|||< q| |tj|\}}| || |r|j  |j| |	  |j
d|  | ||jd tj}|r^||d< | |tj|\}}| ||jd tj}|r.| j j
d|  d|d< | j |d< |drtjj|d d 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 W n4 t&k
rd   d
| _'|j
(d| d|  Y nX W 5 | j|7  _|j	d
d t  X qL| )  | jD ]}tj|dd 	  q| j' S )!Nc                 S   s   g | ]}d qS )rD   r   )r/   r+   r   r   r   r1     s     z/CmfPluginCsv.process_import.<locals>.<listcomp>rB   d   r   rD   r   rC   r   Tr   rE   r   rZ   rA   r   r^   r`   rW   )
cmf_authorZ	cmf_ownerr[   ZresponsibleZwaiting_for)Zloginu   Создали задачу u   Грузим журнал closedrN   r   r   )Zminutesu<   Не удалось импортировать строку z: zclose me)r   rA   )*rN   ry   r    rJ   r   Zprojectsr!   r   r^   r   rI   r}   r?   Zprogressr   r   r   rM   r   r|   r   r   rK   r   r   r   r~   r   Zlistsloadr   r   Z
start_dateZ
time_spentr.   datetimeZ	timedeltaZend_dater   r   r#   r   )r'   rN   r   steprQ   rR   r   r   r   r`   r   r   rT   r   r   r   ZcommentZcomment_objZtimetracker_historyhistoryr   r   r   process_import  s    











"

zCmfPluginCsv.process_import)__name__
__module____qualname__r
   ZloggingZgetLoggerClass__annotations__r   staticmethodr   boolr-   r   listr    rV   r   r7   rL   ru   rw   r|   r   r   r   r   r   r   r   r   r   r   r   r   r	      s(   

8<&
 5r	   )r:   r   copyr   r   pathlibr   typingr   r   r8   r6   r   Zcmf.includeZmodules.settings.fieldsr   r	   r   r   r   r   <module>   s   