U
    h)                     @   sz   d dl Zd dlZd dlZd dlmZ d dlmZ d dlm	Z	 d dl
T d dlmZ d dlmZ dd	 ZG d
d dejZdS )    N)permutations)Path)	unidecode)*)cmf_plugin_kaiten)KaitenClientc                    s    fdd}|S )Nc                    s    fdd}|S )Nc                    s   zL| j jd d dd dd | j  r2W dS  | f||}t  |W S  tk
r   t  |  jd7  _| j d  Y dS X d S )Nz===== T)Z	anonymousr      u   Ошибка )
cmf_importlogZ	is_cancel
cmf_commit	ExceptionZcmf_rollback
has_errorsZ	log_error)objargskwargsres)funcname ,./modules/kaiten/models/cmf_plugin_kaiten.pywrapper   s     
z3catch_exception.<locals>.decorator.<locals>.wrapperr   )r   r   r   )r   r   	decorator   s    z"catch_exception.<locals>.decoratorr   )r   r   r   r   r   catch_exception   s    r   c                       s   e Zd ZdZejjd Zejjdg Z fddZe	dd Z
edd	 Zed
d Zedd ZeedddZdd Zdd Zdd Zdd ZedddZdd Zd(d d!Zd"d# Zd$d% Zd&d' Z  ZS ))CmfPluginKaitenN)clientZkaiten_fieldsget_all_projectsc                    s0   t  j|| i | _i | _i | _g | _d| _d S )Nr   )super__init__Zissue_relationsZepicsZsubtasksselected_projectsr   )selfr   r   	__class__r   r   r   -   s    zCmfPluginKaiten.__init__c                 C   sJ   | j sD| ddddg tt| jj| jj | jjj	t
 d| _ | j S )u5    Клиент для работы с Kaiten REST API pluginzplugin.ext_urlzplugin.ext_tokenzplugin.verify_ssl)urltoken
verify_sslZsession)_CmfPluginKaiten__clientload_fieldsr   strr$   Zext_urlZ	ext_tokenZdecryptr'   valueZcmfutilZrequests_sessionr!   r   r   r   r   6   s    

zCmfPluginKaiten.clientc                 C   sR   t | } |  } tdd| } tdd| } tdd| } tdd| } | dS )	N&z and z\+r   z[^\w\s-] z[\s_-]+-)r   lowerresubstrip)textr   r   r   _slugifyH   s    zCmfPluginKaiten._slugifyc                  C   s   g } | S Nr   )r   r   r   r   calc_models_settingsR   s    z$CmfPluginKaiten.calc_models_settingsc                 C   s   |sdS |  |}|S )u`   
        Метод получает значение параметра объекта
        N)get)r   attrr+   r   r   r   
_get_valueW   s    
zCmfPluginKaiten._get_value)
field_namec                 C   s&   |sd S | j |gd}|r"|d S d S )N)Zfields_namer   )Zimport_shop_fields)modelr;   r   r   r   r   _get_field_namea   s    zCmfPluginKaiten._get_field_namec                 C   s0   ddddddddddd	dd
ddg}|S )uO    Сопоставление настроек для модели models.CmfTaskr   titlemodel_fieldr9   r4   descriptionZcmf_created_atZcreatedZcmf_modified_atupdatedZdeadlineZdue_dater   )r!   Zissue_settingsr   r   r   _get_issue_import_settingsh   s    z*CmfPluginKaiten._get_issue_import_settingsc                 C   s    dddddddddg}|S )uQ    Сопоставление настроек для модели models.CmfPersonr   Z	full_namer?   ZemailZdoes_not_workZ	activatedr   )r!   Zuser_settingsr   r   r   _get_user_import_settingst   s
    z)CmfPluginKaiten._get_user_import_settingsc           	         s$  g  |_ j dg  fdd}d }d }j  d}| r D ]$}|d D ]} qjq`|rN qtqNdD ]} qq~|sdd jj	d	d
D }|r|d }|st
d|sdd jjd	d
D }|r|d }|st
d||jtj ||jtj  dg d  S )Nzplugin.plugin.*c                    s`   | }|D ]>} | |d |d< ||d |d< d|d< |j|d< q
 |j|d d S )Nr9   r+   r@   r.   r>   icon)r   fields)r:   r=   rE   appendZverbose_name)r   Zsettings_funcr<   Zobj_settingsZsettingresultr!   r   r   _get_settings   s    z<CmfPluginKaiten.tmplt_import_settings.<locals>._get_settingsprojectsidusersc                 S   s   g | ]}|qS r   r   ).0_r   r   r   
<listcomp>   s     z9CmfPluginKaiten.tmplt_import_settings.<locals>.<listcomp>r	   )limitr   uT   Не найдено ни одной задачи, импорт невозможен!c                 S   s   g | ]}|qS r   r   )rN   r   r   r   r   rP      s     ub   Не найдено ни одного пользователя, импорт невозможен!selectedObjects)r   r+   )r
   r)   get_download_pathjoinpathexists_get_projects_get_project_tasks_simple_getr   Z	get_cardsr   Z	get_usersrC   modelsZCmfTaskrD   Z	CmfPersonrG   )	r!   r
   rJ   ZtaskuserZdump_dirprojecttasksrM   r   rH   r   tmplt_import_settings}   s>    	z%CmfPluginKaiten.tmplt_import_settingsc              
   O   s   |  dg | jj| _g }z| j}| D ]}|d }|d }| |}tj|}	|d rf|d7 }d| j d| d}
tjj	ddd	|
 d	gd
dgd}|r|d7 }||	|d}|
| q,W 5 Q R X W n. tk
r } zt|  W 5 d }~X Y nX |S )Nzplugin.source_hashrL   r>   Zarchivedu    (архивный)z::Zext_idZLIKE%Tz--)filterZinclude_deletedrF   u    [импортирован])rL   keyr   )r)   r$   source_hashr   Z
get_spacesr5   rY   Z
CmfProjectZget_prefix_from_namesgetrG   r   gdebug)r!   r   r   rK   r   spaceZspace_idZ
space_nameZ
space_codeZ	space_keyZproject_ext_idr[   Zproject_dataexcr   r   r   r      s:    


z CmfPluginKaiten.get_all_projectsr   c              	   c   sN   | j  | d}| rJt|d}|D ]}t|V  q.W 5 Q R X d S )Nz.jsonr+)r
   rS   rT   rU   openjsonloads)r!   r   Z	file_pathfrowr   r   r   rX      s    zCmfPluginKaiten._simple_getc              
   c   sf   | j  d}| rbt|D ]>}|dr2q"t| d| dd}t	|V  W 5 Q R X q"d S )NrK   z.dirtyz.meta/z
/info.jsonrg   )
r
   rS   rT   rU   oslistdirendswithrh   ri   load)r!   Zproject_dir
project_idrk   r   r   r   rV      s    
zCmfPluginKaiten._get_projectsr     c           	   
   c   s   | j  d|d}| s:| j jd| d|  d S d}t| D ]r}| sXqJ|j	}|
drjqJ||k r||d7 }qJ||| kr qt|dd	}t|V  W 5 Q R X |d7 }qJd S )
NrK   r\   u   Каталог u    отсутствует. Возможно он был удален или еще не создан. Необходимо повторно запустить импорт проекта r   rm   r	   z	info.jsonrg   )r
   rS   rT   rU   loggerZwarningr   iterdiris_dirr   rq   rh   ri   rr   )	r!   rs   startrQ   Z	tasks_dircountZtask_dirZtask_idrk   r   r   r   rW      s*    
z"CmfPluginKaiten._get_project_tasksc                 C   s   d S r6   r   r,   r   r   r   download_data  s    zCmfPluginKaiten.download_datac                 C   s:   | j d d d }|d s"tddd |d D | _d S )	NrR   r+   r   	isCheckeduA   Нет выбранных проектов для импорта!c                 S   s$   g | ]}|d  r|d r|d  qS )r   r{   r   rN   pr   r   r   rP   	  s    z:CmfPluginKaiten._set_selected_projects.<locals>.<listcomp>Zchildren)settingsr   r    )r!   Zroot_selectedr   r   r   _set_selected_projects  s    z&CmfPluginKaiten._set_selected_projectsc                 C   s  d| _ || _d| j_d| j_d| j_| j  t  | jj| _| jj	j	j
| _
| | jjd | _|   |   | j  d| j_| j  t  | jd dd | jD }|  D ]6}|d }||krq| jjd	|d
  d| d q| jd| jj  | j  S )Nr   u   Импорт из KaitenZimport_settingsd   z2--------------------------------------------------c                 S   s   g | ]}|d  qS )rL   r   r|   r   r   r   rP   %  s     z2CmfPluginKaiten.process_import.<locals>.<listcomp>rL   u'   Импортирован проект 'r   z' ()u-   Импортировано объектов: )r   r
   r   Zimported_object_countZprogressZsaver   Zget_max_processesZmax_processesr$   ra   Z_normalize_settingsZjson_settingsr~   r   rz   r   closer   r    rV   ru   info)r!   r
   Zselected_project_idsr[   rs   r   r   r   process_import  s2    



"zCmfPluginKaiten.process_import)r   rt   )__name__
__module____qualname__r(   r   r   Zui_meta_skipZapi_methodsr   propertyr   staticmethodr5   r7   r:   r*   r=   rC   rD   r]   r   rX   rV   rW   rz   r   r   __classcell__r   r   r"   r   r   #   s4   	

	

		4%


r   )ZdatetimeZdtr1   shutil	itertoolsr   pathlibr   Ztext_unidecoder   Zcmf.includeZmodules.kaiten.fieldsr   Zmodules.kaiten.kaiten_clientr   r   r   r   r   r   r   <module>   s   