U
    9sncf?                     @   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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g} | S )	uR   Собственный магазин при выборе импорта из Jirau   Поля контактов)captionfieldsiconu   Поля организацийu   Поля задачu!   Поля комментариевu   Поля проектовu"   Поля списков задачu   Поля групп)
models	CmfPersonZimport_shop_fieldsr   Z
CmfCompanyCmfTask
CmfCommentZ
CmfProduct
CmfProjectCmfPersonGroup)res r   +./modules/settings/models/cmf_plugin_csv.pycalc_models_settings   s*    





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  q4nn|jdkrt	t|}|j
}|jddD ]
}|V  qvn6|jdkrt|d	}t|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>B   s     z*CmfPluginCsv._get_file.<locals>.<listcomp>z.xlsxT)Zvalues_onlyz.csvr)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)rA   file_valmodel_fieldr   rB   rC   r   r   )loggerr
   attachmentsr   Z	CmfImportgetr9   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_settingsrC   r   r   r   calc_import_settingsN   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   ZCmfListr<   )
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   Список задачrS    rR   .T)r   rR   field_qualnamer   requiredverbose_name)itemsrF   getattrr   r   r\   )
Zname_cmf_taskZname_cmf_projectZname_cmf_epicrK   Zdefault_local_attrs_mappingrA   Zvalue_modelrS   Z	name_attrmodelr   r   r   rG      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)rA   r   titlesrowsFr=   r>   r?   ra   rC   rZ   rY   r   CmfDealT)rb   r   r`   r   u   ЗадачиrA   zcalendar-todayr   )rE   r   r:   nextr   rH   Zcsv_import_settings_fieldssplit)r$   rI   resultZdealsZis_dealZattachr'   rL   rM   Zdata_rowrN   rJ   rS   r   r   r   preview   s8    



zCmfPluginCsv.preview)	row_arrayrJ   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   rC   r\   rR   r<   )dictr   r\   r^   
issubclassZcmfr   Z
CmfRelBase)r$   rg   rJ   r_   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 )Nr@   u8   Пытаемся создать пользователя)rk   rI   r:   r   r   infoprocess_any_table_fieldsZrg_member_ofrH   r   Z
user_groupsave)r$   rM   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    и типа ext_id=)r;   rT   )rs   templaterI   workflowr<   ZILIKErV   z==)rI   r<   rw   u%   CSV-схема для проекта )rs   zsoftdev:defaultr   )rr   Ztarger_workflow	scheme_wfcmf_model_name)rr   Ztarget_workflowry   rx   rI   )r9   r<   r   ZCmfWorkflowrF   rT   rI   rn   Z	CmfStatusZCmfSchemeWfZdefault_task_workflowZCmfSchemeWfRule)r$   taskrs   r<   rw   rv   Z_filterZtask_statusZscheme_ext_idZscheme_nameZschemeZruleZ	rule_dictr   r   r   _calc_workflow   sN      zCmfPluginCsv._calc_workflowc                 C   s~  || _ t| |jd D ]X\}}|jd r8|dkr8q| | | ||jd tj}|r|	dsnd|d< |	dstj
j	dd	|d< | |tj|\}}| ||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r*| | | |tj|\}}| ||jd tj}	|	r||	d
< | |tj|	\}
}q| j S )Nr=   r>   r   r@   Zproject_typeprojectrr   zproject.agile:defaultru   rq   r<   z
Task Agile)r<   u.   Не найден логический тип u.   , создайте перед импортомrV   )rI   r   r   rE   r:   rp   rk   r   r   rF   ZCmfLogicTyperm   r   rD   errorr{   r   _has_errors)r$   rI   rL   rM   r|   Zproject_objro   rz   Ztask_objZcommentZcomment_objr   r   r   process_import  s8    





zCmfPluginCsv.process_import)__name__
__module____qualname__r
   ZloggingZgetLoggerClass__annotations__r~   staticmethodr   boolr*   r   listr   rQ   r   r2   rG   rf   rh   rk   rp   r{   r   r   r   r   r   r	      s   

8,&r	   )r5   copyr   pathlibr   typingr   r   r3   r1   r   Zcmf.includeZmodules.settings.fieldsr   r	   r   r   r   r   <module>   s   