U
    P3f                     @   s   d dl Z d dlZd dlmZ d dl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$d% Zd&d' Zd(d) Z dS )*CmfPluginCsvN_loggerr   c                  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d
t j t jjdg	} | S )uR   Собственный магазин при выборе импорта из Jirau#   Поля пользователей)captionfieldsiconu!   Поля контрагентовu   Поля задачu,   Оперативная гант-задачаu   Журнал работu!   Поля комментариевu   Поля проектовu"   Поля списков задачu   Поля групп)models	CmfPersonimport_shop_fieldsr   
CmfCompanyCmfTaskCmfGanttTaskCmfTimeTrackerHistoryZCmfTimeTracker
CmfComment
CmfProjectCmfListZCmfPersonGroup)res r   +./modules/settings/models/cmf_plugin_csv.pycalc_models_settings   s6    







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  q4n~|jdkrt	t|}|j
}|jddD ]
}|V  qvnF|jdkrtd	 t|d
"}tj|dddD ]
}|V  qW 5 Q R X d S )N.xlsr   c                 S   s   g | ]
}|j qS r   )value).0itemr   r   r   
<listcomp>H   s     z*CmfPluginCsv._get_file.<locals>.<listcomp>.xlsxT)Zvalues_only.csvi r;")Z	delimiterZ	quotechar)r   r    suffixxlrdZopen_workbookstrZsheet_by_indexZget_rowsopenpyxlZload_workbookZactiveZ	iter_rowscsvZfield_size_limitopenreader)r)   Zattachment_file_pathZworkbookZ	worksheetelfiler   r   r   r!   A   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}tjj|dd	d
ddggdgdgd}| |}|rpg 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 ]b}d|krd|kr q^|d dkr(q|d D ]*}|d |kr0|d | d} qq0q|s|d |d d d d q|d |
 }||d }||d< |r||d< |d |d< qq|d s| jd g S |gS )N-cmf_modified_atidz!=json_settings)order_byfilterr   ZCSV)namer   	file_typeINr5   r/   r4   urlparentrF   rE   r   r   	first_row   Fimport_settingsrG   r   titleT)rP   file_valmodel_fieldr   rQ   rR   r   r   )loggerr
   Zattachmentsr   Z	CmfImportgetrC   CmfAttachmentr.   r!   _default_mapping_csvr"   rD   r   appendr$   )r(   
cmf_importZprev_settingssettingsr)   r*   r+   default_mappingirowjvalfoundZprev_setZ
prev_fieldZrow_settingsrR   r   r   r   calc_import_settingsU   sh    




 

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d&dd'$}i }t j D ]}|||d( < q@| D ]P\}}|d)d*}|d+d*}	tt |}
||	| d,|	 |
jd-|
jd.||< q\|S )/ug    Структура сопоставления полей из файла CSV по умолчанию. r   r   r   ext_id)
field_name
model_namerG   
logic_typeZcmf_modified_atZcmf_created_at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   sched_start_datesched_finish_date
sched_workagregat_workactual_myself_workZactual_completeZactual_finish_dater   )$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   Дата финишаu   Комментарийr   rc    rb   .T)r   rb   field_qualnamer   requiredverbose_name)r   r   r   itemsrT   getattrr   ru   )Zname_cmf_taskZname_cmf_projectZname_cmf_epicrZ   Zdefault_local_attrs_mappingZshop_frP   Zvalue_modelrc   Z	name_attrmodelr   r   r   rV      sr    '
z!CmfPluginCsv._default_mapping_csvc                 C   s<  g }ddg g d}d}t jj|ddddd	ggd
gd}|sH| jjd | |}|jd rdt| t	|D ]\}}|dkr qg }	|d 
|	 t	|jD ]l\}
}|d sq|d d dd }|s|dkrd}|dkr|dkr|d 
|d d  |	
||
  qql|d r"|
| |s8d|d< d|d< |S )Nu   СделкиZ	handshake)rP   r   titlesrowsFrH   rI   r5   r/   r4   rB   )rL   rF   rE   u)   Не найден файл импортаrM   rN   rz   rR   rs   rr   r   CmfDealT)r{   r   ry   r   u   ЗадачиrP   zcalendar-todayr   )r   rU   rT   rX   rS   errorr!   rD   nextr"   rW   Zcsv_import_settings_fieldssplit)r(   rX   resultZdealsZis_dealZattachr+   r[   r\   Zdata_rowr]   rY   rc   r   r   r   preview   sD    



zCmfPluginCsv.preview)	row_arrayrY   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   rR   ru   rb   rr   rN   ra   ri   )dictr"   ru   r~   rw   
issubclassZcmfr   Z
CmfRelBaselen
class_nameZcalc_priority)	r(   r   rY   rx   r   idxZfield_settingsZfield_partsZfieldr   r   r   _map_object   s$    
zCmfPluginCsv._map_objectc                 C   st   t jjdd|gd}|spt jjdd| gd}t|dkrd| jjd| dt| d	 t	d
|rp|d }|S )Nrf   ==rF   rG   ILIKErN   u<   Компаний с одинаковым названием z > uF   , укажите код компании вместо названияu]   Найдено несколько компаний с одинаковым названиемr   )
r   r   rT   liststripr   rX   rS   r|   	Exception)r(   ra   companyZ	companiesr   r   r   _get_company  s     zCmfPluginCsv._get_companyc                 C   sX   d }|  || jjd tj}|rTd|d< | jjd | | jtj|\}}|  |S )NrO   TZservicedesk_allowu0   Пытаемся создать компанию)	r   rX   rD   r   r   rS   infoprocess_any_table_fieldssave)r(   r\   company_objr   is_newr   r   r   _process_company  s    zCmfPluginCsv._process_companyc                 C   s~   d }d}|  || jjd tj}|rv|drJ|d d}| ||d< | jjd | 	| jtj|\}}|
  ||fS )NFrO   r   ra   u8   Пытаемся создать пользователя)r   rX   rD   r   r   rT   r   rS   r   r   r   )r(   r\   
person_objr   personZcompany_ext_idr   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}||_|  tj	j|d d d}|sdd|d d gddd gg}tj	j|d	}|stj	|d d | jd}|d d |_
|d}|s$|d d }| |}	|	|_|d d |_|jdd |j  d|d d  }
tjj|
d}|stjjdd|gdd|ggd	}|stjjdd|d d gdd|ggd	}|stj|| j|d}|
|_
|d d |_||_|	|_|j|j d d|d j  }d|d d  }tjj|d}|sbtjjdd}tj||| jd}||_||_|  tjj|d ||dd }|s|d |d|| jd!}tjf |}|  ||fS )"NzCSV::rL   ::rd   u   БП для проекта u    и типа ra   =r   rf   LIKEr   r   %)ra   templaterX   rh   ra   rG   r   )rG   rX   cache_status_typeTZsave_importworkflowstatus_code)r   rX   r   Z	only_datau%   CSV-схема для проекта zsoftdev:defaultrf   r   )rd   Ztarger_workflow	scheme_wfcmf_model_name)rd   Ztarget_workflowr   r   rX   )rC   rG   r   CmfWorkflowrT   rf   r~   rX   r   CmfStatusCodera   Zcalc_status_typestatus_type	CmfStatusr   r   ZCmfSchemeWfZdefault_task_workflowZCmfSchemeWfRule)r(   taskra   rG   r   r   Zcmf_status_code_filterr   r   status_ext_idtask_statusZscheme_ext_idZscheme_nameZschemeZruleZ	rule_dictr   r   r   _process_workflow8  s    *

  zCmfPluginCsv._process_workflowc                 C   s  d }d }d }| dr4|d  dr4|d d  }|rtjj ddd| dgd}|s| jjd| d tjj d	d
|gdgd}|s| jjd| d tjj dd|gdgd}|r|jrd| |j |_nd| d|_|jdd |r|d d  }| jjd| d d	d
|gddd gg}tj	j |d}|rhdd
|gdd
|gg}tj
j |d}|sdd
|gd	d
|gg}tj
j |d}|s| jjd| d dd
|gdd|gg}tj
j |d}|s| jjd | |\}}||d< ||d< d S )Nr   ra   r   %::::%r   u   Ищем БП по коду "r8   rf   r   rF   r   u   Ищем БП по имени "rG   r   r   Tr   rh   u-   Ищем статус в БП по коду "r   r   u/   Ищем статус в БП по имени "uC   Не нашли БП или статус, создаем новые)rT   r   r   r   rX   rS   r   ra   r   r   r   r   )r(   r   Zworkflow_ext_idr   r   r   Zfilter_r   r   r   r   _calc_workflow{  sT    zCmfPluginCsv._calc_workflowc                 C   sr   d }|  || jjd tj}|rn|ds2d|d< |dsNtjjdd|d< | | jtj|\}}|j	  |S )NrO   Zproject_typeprojectrd   zproject.agile:defaultr   )
r   rX   rD   r   r   rT   CmfLogicTyper   dpcommit)r(   r\   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 )NrO   sprint)tree_parentZsys_typerL   r   )r   rX   rD   r   r   Z	CmfFolderrT   r   )r(   r\   r   
sprint_objr   Zsprint_folderr   r   r   r   _process_sprint  s    zCmfPluginCsv._process_sprintc              	   C   st  |  || jjd tj}|rpz
|dr4d|d< |drFd|d< dD ]"}||rJt|| d ||< qJ|d	d
 |D  |D ]}t|j	j
|||  q|ds|dddg |j	jr|j	jr|j	j|j	j }| d d d }tt|d d}|d d |j	_|j	j
jdd W nD tk
rn   t  | jjd| d|  |  jd7  _Y nX d S )NrO   Zconstrain_start_datez0-constZconstrain_start_typeZconstrain_finish_dateZconstrain_finish_type)rn   Z
const_workro   rk   rp   <   c                 S   s   g | ]}d | qS )zop_gantt_task.r   )r1   keyr   r   r   r3     s     z/CmfPluginCsv._process_gantt.<locals>.<listcomp>sched_durationzop_gantt_task.sched_start_datez(task_obj.op_gantt_task.sched_finish_datezop_gantt_task.sched_duration   g&?rN      Tr   u:   Не удалось импортировать Гантт u    для задачи )r   rX   rD   r   r   rT   floatZload_fieldssetattrZop_gantt_taskr0   rl   rm   Ztotal_secondsmaxmathZceilr   r   r   commit_with_eventrS   r$   _has_errors)r(   r\   task_objZganttr   ZdeltaZ
delta_daysZ	work_daysr   r   r   _process_gantt  s8    


 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|d d}||}|rtjjdd|d gdgd}|jrd| |j |_nd| d|_|jdd |S tjjddd| dgd}|r|S | j jd| d tjjdd| gdgd}|r|jrld| |j |_nd| d|_|jdd |S | j jd  d}tjjdd|gd}t	d| d| d!|d"}| 
| j tj|\}}	t  |S )#N   Подзадачаztask.sub:default)rG   rf   Z	UserStoryztask.userstory:defaultz
Task Agileztask.agile:default   Задачаztask.base:defaultBugztask.bug:defaultEpicztask.epic:default)zSub-taskZSubtaskr   ZStoryu   ИсторияZTaskr   r   u   Багu   Эпикr   u   Тип задачи rd   ra   rG   rf   r   r   r   Tr   r   r   r   r   u   Ищем по имени ''r   u*   Не нашли, создаем новыйr   )ra   rG   r   r   )rX   rS   r   rT   r   r   ra   r   r   r   r   r   )
r(   r   Z	name2codera   Zlogic_type_dictrd   Ztemplate_coder   Zlogic_type_paramsr   r   r   r   _process_logic_type  s^    
z CmfPluginCsv._process_logic_typec           	   
   C   sZ  | j jd t| j}d}| jD ]0}| j  r8 d S | j j| d|  |d7 }ddd|gdd|gg}tjj|d}|s| j j	d	|  |  j
d7  _
q"| j| D ]}zfddd|gdd|gg}tjj|d
ddgd}||_|jjds|jjdr|j|_|  W q tk
rP   | j jd|  |  j
d7  _
Y qX qq"d S )Nu5   Привяжем подзадачи к задачамrN       из ORra   r   rf   r   uE   Не удалось найти родительскую задачу rj   r   rd   r   ztask.subprojectz	task.epicu4   Не удалось привязать задачу )rX   rS   r   r   subtasks	is_cancelr   r   rT   r|   r   rj   rd   rf   
startswithr   r   r   r$   )	r(   totalr[   parent_ext_idr   rj   Zchild_ext_idZ_filter_childr   r   r   r   _process_subtasks  s6    

zCmfPluginCsv._process_subtasksc                  C   s"  || _ tjj|dddddggdgdgd}td	d
 | |D }d| }i | _g | _i | _t	| |D ] \}}| j 
 r d S |j|d  d|  |jd r|dkrqjzzB| |}| |\}}	| |}
| ||jd tj}| jdt }|
rt|
jjdkrz|rTtjjdd|
jgdddggd}|j| |  |rz|jj sz| jt|
j!t }|
| jkr| j|
 | "||
}|r|dst#d|
|d< |dr| $||d< |dr| %| |dr|d |d < |d }|r||ds||d = |d!}|sB|d" }| j|g }|d!}|sh|d" }|| || j|< t&  d#D ]R}||}|r|d!rtj'j|d! d$}ntj'jf |}|r|||< q| j (d%|  d&d|j)gd'ddgdd|d gg}| j jj d(d) }|d"rBd)}d"d|d" g}n.|d!rpd)}d*d"d|d! gd!d|d! gg}| j*|tj|||d+\}}|rtj+d,|j, d-|j- d.|j d/d0||d1}|jdd2 |j  | j (d3| d4|d! d5|d" d6|d d7	 n8| j (d8| d4|d! d5|d" d6|d d7	 | .|| |rl|j/0  |j/| |j1r|jdd2 |j  | ||jd tj+}|r||d< | *|tj+|\}}n&|r| j j(d9t2j3d: |  j4d7  _4| ||jd tj5}|r| j jd;|  d<|d< | j |d=< |d>rRtj'j|d> d! d$|d>< |drxtjj|d d! d?|d< tj5f |}|j6r|j7r|j6j t8j9|j7j d@ |_:|jdd |j  |r|	r|j;r|j;j <t=j>s|?|j;j  W nF t#k
r@   |  j4d7  _4|j@dA| dB|  |jA  Y nX W 5 | j|7  _|jdd |j  X qj| B  | j jj dCdr| jC D ]h\}}|sq| j jdDt| dE|  |rtj'jDjE|tF|gdF ntj'jGjEtF|gdF q| j4r| j (dG| j4  | j4 S )HNrH   rI   r5   r/   r4   rB   rJ   rK   c                 S   s   g | ]}d qS )rN   r   )r1   r,   r   r   r   r3   C  s     z/CmfPluginCsv.process_import.<locals>.<listcomp>d   rN   r   rM   r   Tr   rO   zproject.servicedesk:defaultzparent.coder   zproject_role.coder   zsdesk-client:defaultr   rG   u:   Не указано наименование задачи!rL   rd   rh   Zepicrj   ra   rf   )
cmf_authorZ	cmf_ownerre   ZresponsibleZwaiting_for)Zloginu_   Пытаемся создать или обновить задачу по параметрам zcmf_import.pluginZimport_originalZmerge_identic_namesFr   )Z
filter_objdont_updateuB   Задача импортирована из файла: <a href="z" target="_blank">z</a> ()   )rg   Z	log_levelrL   rX   r   u'   Создали новую задачу z ext_id=z code=z name='r   u   Нашли задачу u   Невозможно импортировать задачу без проекта, создайте проект и укажите ид в файле)levelu   Грузим журнал closedrX   r   r   )Zminutesu<   Не удалось импортировать строку z: Zsend_invitesu,   Отправляем приглашения u    пользователям: )argsu#   Ошибок обнаружено: )HrX   r   rU   rT   r   r!   r   Zprojectsperson_emailsr"   r   rS   r   rD   Zprogressr   r   r   r   r   r   r   r   
setdefaultsetr;   rd   rf   ZCmfProjectRoleAssignmembersrW   Z
user_localr0   rC   r   r   r   r   r   r   logZpluginr   r   rJ   rG   r   ZlistsloadZ
is_changedloggingZERRORr   r   Z
start_dateZ
time_spentdatetimeZ	timedeltaZend_dateZemailendswithZconfigZ
ORG_DOMAINaddr$   Zrollbackr   rv   Zregister_sdesk_clientZapply_asyncr   Zregister_persons) r(   rX   Zimport_filer   stepr[   r\   r   r   Zperson_is_newr   r   Zproject_person_emailsZrole_assignr   rj   r   r   Ztask_ext_idr   r^   r   r   r   r   r   ZcommentZcomment_objZtimetracker_historyhistoryr   r   r   r   r   process_import;  s8   











  


:8





zCmfPluginCsv.process_import)!__name__
__module____qualname__r
   r   ZgetLoggerClass__annotations__r   staticmethodr   boolr.   r   r   r!   r`   r   r;   rV   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r	      s.   

=?%C9
 5r	   )r=   r   copyr   r   pathlibr   typingr   r   r<   r:   r   Zcmf.includeZmodules.settings.fieldsr   r	   r   r   r   r   <module>   s   