U
    wcW                     @   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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}i }|  D ]N\}}|dd}|dd}tt|}	||| d| |	jd|	jd||< q|S )ug    Структура сопоставления полей из файла CSV по умолчанию. r   r   r   r@   )
field_name
model_namecodetextstatusZ
alarm_dateZdeadlinepriorityzresponsible.namezresponsible.emailzcmf_author.namezcmf_author.emailzexecutors.namezexecutors.emailzparent_task.codezchild_tasks.codeZtask_code_prefixZlogic_prefixZactivity)u   Тема задачиu   Код задачиu   Описание задачиu   Статус задачиu   Будильник задачиu$   Крайний срок задачиu   Важностьu   ФИО исполнителяu   Email исполнителяu   ФИО автораu   Email автораu!   ФИО соисполнителяu    Email соисполнителяu$   Код основной задачиu$   Код дочерней задачиu   Название проектаu   Код проектаu   Префикс задачu   Тип проектаu   Вид деятельностиu   Список задачrW    rV   .T)r   rV   field_qualnamer   requiredverbose_name)itemsrJ   getattrr   r   r`   )
Zname_cmf_taskZname_cmf_projectZname_cmf_epicrO   Zdefault_local_attrs_mappingrE   Zvalue_modelrW   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   re   rG   r^   r]   r   CmfDealT)rf   r   rd   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   rW   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t||d d }t|tjjrd|| i||d d < q|| ||d d < q|S )Nr   r   rG   r`   rV   ext_id)dictr    r`   rb   
issubclassZcmfr   Z
CmfRelBase)r&   rk   rN   rc   r   idxZfield_settingsZ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   Пытаемся создать пользователя)rp   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	}|svtjj|d j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}
|
s:t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::
logic_typeu   БП для проекта u    и типа rl   =r?   rX   )rl   templaterM   workflowr@   ILIKErZ   ==)rM   r@   r}   u%   CSV-схема для проекта )rl   zsoftdev:defaultr   )rx   Ztarger_workflow	scheme_wfcmf_model_name)rx   Ztarget_workflowr   r   rM   )r=   r@   r   ZCmfWorkflowrJ   rX   rM   rs   Z	CmfStatusZCmfSchemeWfZdefault_task_workflowZCmfSchemeWfRule)r&   taskrl   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projectrx   zproject.agile:defaultr{   )	rp   rM   r>   r   r   rJ   CmfLogicTyperr   commit_with_event)r&   rQ   project_objr   rt   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_typerv   r   )rp   rM   r>   r   r   Z	CmfFolderrJ   rr   )r&   rQ   r   
sprint_objr   Zsprint_folderrt   r   r   r   _process_sprint  s    zCmfPluginCsv._process_sprintc                 C   s   |  || jjd tj}|r|dr.d|d< |dr@d|d< dD ]"}||rDt|| d ||< qD|D ]}t|jj	|||  ql|jj	
  d S )	NrD   Zconstrain_start_datez0-constZconstrain_start_typeZconstrain_finish_dateZconstrain_finish_type)Z
sched_workZ
const_workZ
agreg_workZactual_workZactual_myself_work<   )rp   rM   r>   r   r   rJ   floatsetattrZop_gantt_taskr-   rs   )r&   rQ   task_objZganttkeyr   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@   rX   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   Тип задачи rx   rl   rX   r   )r?   r   rw   TZ	only_dataZLIKEz%::z::%rz   u   Ищем по имени ''r@   r~   u*   Не нашли, создаем новыйr   )rl   r@   r   r|   )rM   rH   rq   rJ   r   r   rl   rs   striprm   rr   r   )	r&   r   Z	name2codeZlogic_type_dictrx   Ztemplate_coder|   Zlogic_type_paramsrt   r   r   r   _process_logic_type8  s\    $ z CmfPluginCsv._process_logic_typec              
   C   sH  || _ tdd | |jd D }d| }t| |jd D ]\}}|j|d  d|  |jd rx|dkrxq@zzd| | | |}|r| ||}| ||jd tj}|r||d< |dsddi|d< | ||d< |dr| | t
  | |tj|\}	}
|d jdrf|dsf|	ddg |	jjs^|	j|	_n|	j|	_| ||	 |r|	j  |	j| |		  |jd|	  | ||jd tj }|r|	|d< | |tj |\}}
W n4 t!k
r   d	| _"|j#d| d|  Y nX W 5 | j|7  _|j	d	d
 t
  X q@| j" S )Nc                 S   s   g | ]}d qS )rC   r   )r.   r*   r   r   r   r0   n  s     z/CmfPluginCsv.process_import.<locals>.<listcomp>rA   d   rC   u    из rB   r   Tr   rD   rv   rx   r@   r   rZ   ztask.subprojectr   parent_tasku   Создали задачу u<   Не удалось импортировать строку z: )$rM   lenr   rI   r    rH   rq   r>   Zprogressrs   r   ru   r   r   rp   r   r   rJ   r   r   rr   rX   
startswithZload_fieldsr   Zis_nullr   rv   r   ZlistsloadrL   r   	Exception_has_errorsr"   )r&   rM   totalsteprP   rQ   r   r   r   r   rt   ZcommentZcomment_objr   r   r   process_importl  sX    






"
zCmfPluginCsv.process_import)__name__
__module____qualname__r
   ZloggingZgetLoggerClass__annotations__r   staticmethodr   boolr,   r   listr   rU   r   r6   rK   rj   rm   rp   ru   r   r   r   r   r   r   r   r   r   r   r	      s&   

8,&
4r	   )r9   copyr   pathlibr   typingr   r   r7   r5   r   Zcmf.includeZmodules.settings.fieldsr   r	   r   r   r   r   <module>   s   