U
    vmc(/                     @   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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   Поля групп)
modelsZ	CmfPersonZimport_shop_fieldsr   Z
CmfCompanyCmfTaskZ
CmfCommentZ
CmfProduct
CmfProjectZ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_settingsr9   r   titleT)r>   file_valmodel_fieldr   r?   r@   r   r   )loggerr
   attachmentsr   Z	CmfImportgetr6   r'   r   _default_mapping_csvr   r7   r   appendr   )r!   
cmf_importZprev_settingssettingsr"   r#   r$   default_mappingirowjvalfoundZprev_setZ
prev_fieldZrow_settingsr@   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CmfListr9   )
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   Список задачrP    rO   .T)r   rO   field_qualnamer   requiredverbose_name)itemsrC   getattrr   r   rY   )
Zname_cmf_taskZname_cmf_projectZname_cmf_epicrH   Zdefault_local_attrs_mappingr>   Zvalue_modelrP   Z	name_attrmodelr   r   r   rD      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)r>   r   titlesrowsFr:   r;   r<   r^   r@   rW   rV   r   CmfDealT)r_   r   r]   r   u   Задачиr>   zcalendar-todayr   )rB   r   r7   nextr   rE   Zcsv_import_settings_fieldssplit)r!   rF   resultZdealsZis_dealZattachr$   rI   rJ   Zdata_rowrK   rG   rP   r   r   r   preview   s8    



zCmfPluginCsv.preview)	row_arrayrG   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r|jdkrt	t
|jd  }|j|| d}	|	s|| j|| || d}	|	  |	||j< q|| ||j< q| | j||\}
}|
S )	Nr   r   r@   rY   rO   parent)ext_id)rF   rf   r9   )dictr   rY   r[   
issubclassZcmfr   Z
CmfRelBase
class_namevarsr   Zfield_options_list_limitrC   rF   ZsaveZprocess_any_table_fields)r!   rd   rG   r\   _kwargsidxZfield_settingsZfieldZfield_modelrL   r   Zis_newr   r   r   _map_object   s(    
zCmfPluginCsv._map_objectc                 C   sV   || _ t| |jd D ]2\}}|jd r6|dkr6q| ||jd tj}q| j S )Nr:   r;   r   r=   )	rF   r   r   rB   r7   rm   r   r   _has_errors)r!   rF   rI   rJ   Ztaskr   r   r   process_import   s    zCmfPluginCsv.process_import)__name__
__module____qualname__r
   ZloggingZgetLoggerClass__annotations__rn   staticmethodr   boolr'   r   listr   rN   r   r/   rD   rc   rg   rm   ro   r   r   r   r   r	      s   

8,r	   )r2   copyr   pathlibr   typingr   r   r0   r.   r   Zcmf.includeZmodules.settings.fieldsr   r	   r   r   r   r   <module>   s   