U
    Cey                     @   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_loggerr   c                  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	CmfPerson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_settingsrB   r   titleT)rG   file_valmodel_fieldr   rH   rI   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_settingsrI   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 }t j D ]}|||d( < q@| 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_namerB   
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   Комментарийr   rZ    rY   .T)r   rY   field_qualnamer   requiredverbose_name)r   r   r   itemsrL   getattrr   rl   )Zname_cmf_taskZname_cmf_projectZname_cmf_epicrQ   Zdefault_local_attrs_mappingZshop_frG   Zvalue_modelrZ   Z	name_attrmodelr   r   r   rM      sr    '
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)rG   r   titlesrowsFrC   rD   rE   rq   rI   rj   ri   r   CmfDealT)rr   r   rp   r   u   ЗадачиrG   zcalendar-todayr   )rK   r!   r@   nextr"   rN   Zcsv_import_settings_fieldssplit)r(   rO   resultZdealsZis_dealZattachr+   rR   rS   Zdata_rowrT   rP   rZ   r   r   r   preview   s8    



zCmfPluginCsv.preview)	row_arrayrP   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   rI   rl   rY   ri   rE   rX   r`   )dictr"   rl   rt   rn   
issubclassZcmfr   Z
CmfRelBaselen
class_nameZcalc_priority)	r(   rw   rP   ro   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 )NrF   u8   Пытаемся создать пользователя)r}   rO   r@   r   r   rJ   infoprocess_any_table_fieldsZrg_member_ofrN   r   Z
user_groupsave)r(   rS   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< tj	j|d d d}|sdd|d d gddd gg}tj	j|d	}|stj	|d d | jd}|d d |_
|d}|s.|d d }| |}	|	|_|d d |_|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	}|stj|| j|d}|
|_
|d d |_||_|	|_|j|j d ||d< d|d j  }d|d d  }tjj|d}|stt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::r[   u   БП для проекта u    и типа rX   =rA   r]   LIKEr   r   %)rX   templaterO   workflowr_   rX   rB   ==)rB   rO   cache_status_typeTZsave_importstatus_code)r   rO   r   Z	only_datau%   CSV-схема для проекта zsoftdev:defaultr]   r   )r[   Ztarger_workflow	scheme_wfcmf_model_name)r[   Ztarget_workflowr   r   rO   )r?   rB   r   ZCmfWorkflowrL   r]   rt   rO   r   ZCmfStatusCoderX   Zcalc_status_typestatus_typeZ	CmfStatusr   r   ZCmfSchemeWfZdefault_task_workflowZCmfSchemeWfRule)r(   taskrX   rB   r   r   Zcmf_status_code_filterr   r   Zstatus_ext_idZtask_statusZscheme_ext_idZscheme_nameZschemeZruleZ	rule_dictr   r   r   _calc_workflow	  s    *

  zCmfPluginCsv._calc_workflowc                 C   sr   d }|  || jjd tj}|rn|ds2d|d< |dsNtjjdd|d< | | jtj|\}}|j	  |S )NrF   Zproject_typeprojectr[   zproject.agile:defaultr   )
r}   rO   r@   r   r   rL   CmfLogicTyper   dpcommit)r(   rS   project_objr   r   r   r   r   _process_projectL  s    


zCmfPluginCsv._process_projectc                 C   sZ   d }|  || jjd tj}|rVtjj|dd}||d< ||d< | | jtj|\}}|S )NrF   sprint)tree_parentZsys_typer   r   )r}   rO   r@   r   r   Z	CmfFolderrL   r   )r(   rS   r   
sprint_objr   Zsprint_folderr   r   r   r   _process_sprintX  s    zCmfPluginCsv._process_sprintc              	   C   st  |  || jjd tj}|rp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 nD tk
rn   t  | jjd| d|  |  jd7  _Y nX d S )NrF   Zconstrain_start_datez0-constZconstrain_start_typeZconstrain_finish_dateZconstrain_finish_type)re   Z
const_workrf   rb   rg   <   c                 S   s   g | ]}d | qS )zop_gantt_task.r   )r0   keyr   r   r   r2   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&?rE      Tr   u:   Не удалось импортировать Гантт u    для задачи )r}   rO   r@   r   r   rL   floatload_fieldssetattrZop_gantt_taskr/   rc   rd   Ztotal_secondsmaxmathZceilr   r   	Exceptioncommit_with_eventrJ   r$   _has_errors)r(   rS   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)rB   r]   Z	UserStoryztask.userstory:defaultz
Task Agileztask.agile:default   Задачаztask.base:defaultBugztask.bug:defaultEpicztask.epic:default)zSub-taskZSubtaskr   ZStoryu   ИсторияZTaskr   r   u   Багu   Эпикr   u   Тип задачи r[   rX   rB   r]   r   rA   r   r   Tr   r   z%::z::%r   u   Ищем по имени ''ZILIKEu*   Не нашли, создаем новыйr   )rX   rB   r   r   )rO   rJ   r~   rL   r   r   rX   r   striprx   r   r   )
r(   r   Z	name2coderX   Zlogic_type_dictr[   Ztemplate_coder   Zlogic_type_paramsr   r   r   r   _process_logic_type  s^    
z CmfPluginCsv._process_logic_typec           	   
   C   sZ  | j jd t| j}d}| jD ]0}| j  r8 d S | j j| d|  |d7 }ddd|gdd|gg}tjj|d}|s| j j	d	|  |  j
d7  _
q"| j| D ]}zfddd|gdd|gg}tjj|d
ddgd}||_|jjds|jjdr|j|_|  W q tk
rP   | j jd|  |  j
d7  _
Y qX qq"d S )Nu5   Привяжем подзадачи к задачамrE       из ORrX   r   r]   r   uE   Не удалось найти родительскую задачу ra   r   r[   r   ztask.subprojectz	task.epicu4   Не удалось привязать задачу )rO   rJ   r~   rz   subtasks	is_cancelr   r   rL   errorr   ra   r[   r]   
startswithr   r   r   r$   )	r(   totalrR   parent_ext_idr   ra   Zchild_ext_idZ_filter_childr   r   r   r   _process_subtasks  s6    

zCmfPluginCsv._process_subtasksc                 C   sr  || _ | j dg tdd | |jd D }d| }i | _g | _t| |jd D ]\}}| j  rt d S |j	
|d  d|  |jd r|d	krqZzxz*| | | |}| ||jd tj}|r|| jkr| j| | ||}|r|dstd||d< |dr8| ||d< |drN| | |drf|d |d< |d}	|	r|ds|d= |	d}
|
s|	d }
| j|
g }|d}|s|d }|| || j|
< t  dD ]R}||}|r|drtjj|d d}ntjjf |}|r|||< q| j d|  dd|jgddd
gdd|d gg}d
}|drd}dd|d g}n.|drd}ddd|d gdd|d gg}| j|tj|||d\}}|r| j d| d |d d!|d d"|d d#	 n8| j d$| d |d d!|d d"|d d#	 |  || |rx|j!"  |j!| |j#r|jd
d% |j  | ||jd tj$}|r||d< | |tj$|\}}n&|r| j jd&t%j&d' |  j'd7  _'| ||jd tj(}|r| j j	
d(|  d)|d< | j |d*< |d+r^t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 |j  W nF tk
r   |  j'd7  _'|j	/d.| d/|  |j0  Y nX W 5 | j|7  _|jd
d |j  X qZ| 1  | j'rj| j d0| j'  | j' S )1NrK   c                 S   s   g | ]}d qS )rE   r   )r0   r,   r   r   r   r2     s     z/CmfPluginCsv.process_import.<locals>.<listcomp>rC   d   rE   r   rD   r   Tr   rF   rB   u:   Не указано наименование задачи!r   r[   r_   Zepicra   rX   r]   )
cmf_authorZ	cmf_ownerr\   ZresponsibleZwaiting_for)Zloginu_   Пытаемся создать или обновить задачу по параметрам zcmf_import.pluginr   Zimport_originalFr   )Z
filter_objdont_updateu'   Создали новую задачу z ext_id=z code=z name='r   u   Нашли задачу r   u   Невозможно импортировать задачу без проекта, создайте проект и укажите ид в файле)levelu   Грузим журнал closedrO   r   r   )Zminutesu<   Не удалось импортировать строку z: u#   Ошибок обнаружено: )2rO   r   rz   r!   rK   r   Zprojectsr"   r   rJ   r~   r@   Zprogressr   r   r   r   r   r}   r   r   rN   r   rL   r   r   r   r   r   logZpluginr   r   ZlistsloadZ
is_changedr   loggingZERRORr   r   Z
start_dateZ
time_spentr/   datetimeZ	timedeltaZend_dater$   Zrollbackr   )r(   rO   r   steprR   rS   r   r   r   ra   r   r   Ztask_ext_idr   rU   r   r   r   r   r   ZcommentZcomment_objZtimetracker_historyhistoryr   r   r   process_import  s    











  
:8




zCmfPluginCsv.process_import)__name__
__module____qualname__r
   r   ZgetLoggerClass__annotations__r   staticmethodr   boolr.   r   listr!   rW   r   r8   rM   rv   rx   r}   r   r   r   r   r   r   r   r   r   r   r   r   r	      s(   

8?C
 5r	   )r;   r   copyr   r   pathlibr   typingr   r   r9   r7   r   Zcmf.includeZmodules.settings.fieldsr   r	   r   r   r   r   <module>   s   