U
    H|cvh                     @   sv   d dl Z d dlm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g} | S )
uR   Собственный магазин при выборе импорта из Jirau#   Поля пользователей)captionfieldsiconu!   Поля контрагентовu   Поля задачu,   Оперативная гант-задачаu!   Поля комментариевu   Поля проектовu"   Поля списков задачu   Поля групп)models	CmfPersonZimport_shop_fieldsr   Z
CmfCompanyCmfTaskCmfGanttTask
CmfComment
CmfProjectCmfListCmfPersonGroup)res r   +./modules/settings/models/cmf_plugin_csv.pycalc_models_settings   s0    






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>D   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   =   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_settingsr@   r   titleT)rE   file_valmodel_fieldr   rF   rG   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_settingsrG   r   r   r   calc_import_settingsP   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&#}i }|  D ]P\}}|d'd(}|d)d(}tt|}	||| d*| |	jd+|	jd,||< q6|S )-ug    Структура сопоставления полей из файла CSV по умолчанию. r   r   r   ext_id)
field_name
model_namer@   
logic_typeZcmf_modified_atZcmf_created_atZ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   Zsched_start_dateZsched_finish_date
sched_workagregat_workactual_myself_workZactual_completeZactual_finish_date)#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   Дата финишаrX    rW   .T)r   rW   field_qualnamer   requiredverbose_name)itemsrJ   getattrr   r   rg   )
Zname_cmf_taskZname_cmf_projectZname_cmf_epicrO   Zdefault_local_attrs_mappingrE   Zvalue_modelrX   Z	name_attrmodelr   r   r   rK      sl    &
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)rE   r   titlesrowsFrA   rB   rC   rl   rG   re   rd   r   CmfDealT)rm   r   rk   r   u   ЗадачиrE   zcalendar-todayr   )rI   r   r>   nextr    rL   Zcsv_import_settings_fieldssplit)r&   rM   resultZdealsZis_dealZattachr)   rP   rQ   Zdata_rowrR   rN   rX   r   r   r   preview   s8    



zCmfPluginCsv.preview)	row_arrayrN   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   rG   rg   rW   rd   rC   rV   r]   )dictr    rg   ro   ri   
issubclassZcmfr   Z
CmfRelBaselen
class_nameZcalc_priority)	r&   rr   rN   rj   r   idxZfield_settingsZfield_partsZfieldr   r   r   _map_object   s$    
zCmfPluginCsv._map_objectc                 C   s\   |  || jjd tj}|rX| jd | | jtj|\}}|jtj	
  |  d S )NrD   u8   Пытаемся создать пользователя)rx   rM   r>   r   r   infoprocess_any_table_fieldsZrg_member_ofrL   r   Z
user_groupsave)r&   rQ   Z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::rY   u   БП для проекта u    и типа rV   =r?   rZ   LIKEr   r   %)rV   templaterM   workflowr@   ILIKEr\   ==)rM   r@   r   u%   CSV-схема для проекта rV   zsoftdev:defaultrZ   r   )rY   Ztarger_workflow	scheme_wfcmf_model_name)rY   Ztarget_workflowr   r   rM   )r=   r@   r   ZCmfWorkflowrJ   rZ   ro   rM   r{   Z	CmfStatusZCmfSchemeWfZdefault_task_workflowZCmfSchemeWfRule)r&   taskrV   r@   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 )NrD   Zproject_typeprojectrY   zproject.agile:defaultr   )	rx   rM   r>   r   r   rJ   CmfLogicTyperz   commit_with_event)r&   rQ   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 )NrD   sprint)tree_parentZsys_typer~   r   )rx   rM   r>   r   r   Z	CmfFolderrJ   rz   )r&   rQ   r   
sprint_objr   Zsprint_folderr|   r   r   r   _process_sprint3  s    zCmfPluginCsv._process_sprintc              	   C   s   |  || jjd tj}|rz|dr0d|d< |drBd|d< dD ]"}||rFt|| d ||< qF|d	d
 |D  |D ]}t|j	j
|||  q|j	j
jdd W n: tk
r   t  | jjd| d|  d| _Y nX d S )NrD   Zconstrain_start_datez0-constZconstrain_start_typeZconstrain_finish_dateZconstrain_finish_type)r`   Z
const_workra   r_   rb   <   c                 S   s   g | ]}d | qS )zop_gantt_task.r   )r.   keyr   r   r   r0   I  s     z/CmfPluginCsv._process_gantt.<locals>.<listcomp>TZ	only_datau:   Не удалось импортировать Гантт u    для задачи )rx   rM   r>   r   r   rJ   floatZload_fieldssetattrZop_gantt_taskr-   r{   	Exceptionr   rH   r"   _has_errors)r&   rQ   task_objZganttr   r   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}| j jd|d   ||d d }|rtjjdd|d gdgd}|jrd|d d  |j |_nd|d d  d|_|jdd |S tjjddd|d d  dgd}|r|S | j jd|d d  d tjjdd|d d  gd}|r|jrd|d d  |j |_nd|d d  d|_|jdd |S | j jd d}tjjdd|gd}t	d|d d  d|d d  d|d }| 
| j tj|\}}t  |S )!N   Подзадачаztask.sub:default)r@   rZ   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   Тип задачи rY   rV   rZ   r   )r?   r   r   Tr   r   z%::z::%r   u   Ищем по имени ''r@   r   u*   Не нашли, создаем новыйr   )rV   r@   r   r   )rM   rH   ry   rJ   r   r   rV   r{   striprs   rz   r   )	r&   r   Z	name2codeZlogic_type_dictrY   Ztemplate_coder   Zlogic_type_paramsr|   r   r   r   _process_logic_typeR  s\    $ z CmfPluginCsv._process_logic_typec              
   C   s  | j d t| j}d}| jD ]}| j  rFd| j _| j    d S | j j| d|  |d7 }tj	j
|d}|s| j jd|  d| _q | j| D ]x}zBtj	j
|dd	d
gd}||_|jjdr|j|_|jdd W q tk
r   | j jd|  d| _Y qX qq d S )Nu5   Привяжем подзадачи к задачамrC   import-canceling    из r   uE   Не удалось найти родительскую задачу Tr^   r   rY   )rV   r   ztask.subprojectr   u4   Не удалось привязать задачу )rM   rH   ru   subtasks	is_cancelr\   r{   ry   r   r   rJ   errorr   r^   rY   rZ   
startswithr   r   r"   )r&   totalrP   Zparent_ext_idr^   Zchild_ext_idr   r   r   r   _process_subtasks  s2    



zCmfPluginCsv._process_subtasksc              
   C   s  || _ tdd | |jd D }d| }i | _g | _t| |jd D ]2\}}| j  rxd| j _| j 	   d S |j
|d  d|  |jd r|d	krqLzzx| | | |}|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  | |tj|\}}| || |r|j  |j| |	  |j
d|  | ||jd tj}|r"||d< | |tj|\}}W n4 tk
rX   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 )rC   r   )r.   r*   r   r   r   r0     s     z/CmfPluginCsv.process_import.<locals>.<listcomp>rA   d   r   rC   r   rB   r   Tr   rD   r~   rY   r@   r   r\   r^   rV   u   Создали задачу u<   Не удалось импортировать строку z: zclose me)r~   r@   )"rM   ru   r   rI   r   Zprojectsr    r   r\   r{   rH   ry   r>   Zprogressr   r}   r   rL   r   rx   r   r   rJ   r   r   rz   r   Zlistsloadr   r   r   r"   r   )r&   rM   r   steprP   rQ   r   r   r   r^   r   r   r|   ZcommentZcomment_objr   r   r   process_import  sp    







"

zCmfPluginCsv.process_import)__name__
__module____qualname__r
   ZloggingZgetLoggerClass__annotations__r   staticmethodr   boolr,   r   listr   rU   r   r6   rK   rq   rs   rx   r}   r   r   r   r   r   r   r   r   r   r   r   r	      s(   

8;&
4r	   )r9   copyr   pathlibr   typingr   r   r7   r5   r   Zcmf.includeZmodules.settings.fieldsr   r	   r   r   r   r   <module>   s   