U
    YxvcH                     @   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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::parentz::
logic_typeu   БП для проекта u    и типа rl   =)r?   rX   )rl   templaterM   workflowr@   ZILIKErZ   z==)rM   r@   r{   u%   CSV-схема для проекта )rl   zsoftdev:defaultr   )rw   Ztarger_workflow	scheme_wfcmf_model_name)rw   Ztarget_workflowr}   r|   rM   )r=   r@   r   ZCmfWorkflowrJ   rX   rM   rs   Z	CmfStatusZCmfSchemeWfZdefault_task_workflowZCmfSchemeWfRule)r&   taskrl   r@   r{   rz   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projectrw   zproject.agile:defaultry   )	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:   d }|  || jjd tj}|r6| | jtj|\}}|S )NrD   )rp   rM   r>   r   r   rr   )r&   rQ   r   Zganttrt   r   r   r   _process_gantt)  s
    zCmfPluginCsv._process_ganttc              
   C   s6  || _ tdd | |jd D }d| }t| |jd D ]\}}|j|d  d|  |jd rx|dkrxq@zzX| | | |}|r| ||}| ||jd tj}|r||d< |dsddi|d< tjj|d d d|d< |d s| j jd|d  d |dr4| | t
  | |}	|	rR|	|d< | |tj|\}
}|r|
j  |
j| |
	  |jd|
  | ||jd tj}|r|
|d< | |tj|\}}W n. tk
r   |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   2  s     z/CmfPluginCsv.process_import.<locals>.<listcomp>rA   d   rC   u    из rB   r   T)Z	only_datarD   rv   rw   r@   z
Task Agilerl   )r@   u.   Не найден логический тип u.   , создайте перед импортомrZ   Zop_gantt_tasku   Создали задачу u<   Не удалось импортировать строку z: )rM   lenr   rI   r    rH   rq   r>   Zprogressrs   r   ru   r   r   rp   r   r   rJ   r   errorr   r   rr   ZlistsloadrL   r   	Exceptionr"   _has_errors)r&   rM   totalsteprP   rQ   r   r   r~   Z	gantt_objZtask_objrt   ZcommentZcomment_objr   r   r   process_import0  sT    






"
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	      s$   

8,&
r	   )r9   copyr   pathlibr   typingr   r   r7   r5   r   Zcmf.includeZmodules.settings.fieldsr   r	   r   r   r   r   <module>   s   