
    ;iJ                         d dl mZ d dlZd dlZd dl d dlmZ d dlmZ d dl	m
Z
 d dl mZmZmZmZ  G d d	ej                        Zy)
    )OptionalN)*)fields)cmf_import_plugin)	CmfImport)DictUnionListr   c                   l    e Zd Z fdZededefd       Zededefd       Zed        Z	ededefd       Z
ededeeeffd	       Ze	 	 	 d!dededee   deeffd       Zd Zdd
d
d
d fd
Zdd fd
Zd Zd Zd Zed        Zd Zd Zd Zed        Zd Zd Z ede!e   defd        Z" xZ#S )"CmfImportPluginc                     t        |   |i | t        j                  j	                  d      | _        t        j                  | _        t        j                  | _
        y )Nsoftdev)code)super__init__modelsCmfActivitygetdefault_activityconfigIMPORT_THREADSthreading_max_forksIMPORT_DOWNLOAD_THREADSdownload_threading_max_forks)selfargskwargs	__class__s      $./common/models/cmf_import_plugin.pyr   zCmfImportPlugin.__init__   sM    $)&) & 2 2 6 6I 6 F#)#8#8 ,2,J,J)    namereturnc                     g dg dddgg dd}|j                         D ]$  \  }}|D ]  }|| j                         v s|c c S  & y)N)u   открытopenu   к выполнениюtodonewpausedu
   зарегsubmit)u
   работprogressindeterminateactive
inProgressu   обсуждdiscusreviewu
   ревью)closeu   закрытu
   готовdonearchived	cancelled)OPENIN_PROGRESS	IN_REVIEWCLOSEDr3   itemslower)r!   mappingstatus_typewordswords        r   calc_status_typez CmfImportPlugin.calc_status_type   sj    	 
3!
F #*--/ 	'K '4::<'&&'	'
 r    c                     dgdgddgddgg dd}|j                         D ]$  \  }}|D ]  }|| j                         v s|c c S  & y	)
u+    Поиск priority по синониму u   минu   низкu
   обычнu   нормальнu   срокu
   высок)u   блокирующu
   большu   крит)r         r   r7   )r!   r:   priorityr<   r=   s        r   calc_priorityzCmfImportPlugin.calc_priority?   sk     
01L)>
  '}} 	$OHe $4::<'#O$	$ r    c                 6   | r|syt        |       j                         j                         }|j                         D ]Y  \  }}|t        |      j                         j                         t        |      j                         j                         fv sW|c S  | S )u  
        Находит ключ по значению или ключу в атрибуте choices у field
        Args:
            value: Значение для поиска
            choices: значения поля
        
        Returns:
            Найденный ключ или исходное значение, если ничего не найдено
        N)strstripr9   r8   )valuechoices	str_valuekeychoice_values        r   calc_choiceszCmfImportPlugin.calc_choicesO   s     GJ$$&,,.	 ") 	CS.446<<>C@P@V@V@XYY
	 r    c                     dgg ddgdgdgd}|j                         D ]$  \  }}|D ]  }|| j                         v s|c c S  & y)ue    Поиск программных типов workflow для проектов по синониму agile)baseu   основнu   классическhelpdeskservicedeskwiki)project.agilezproject.basezproject.helpdeskzproject.servicedeskzproject.wikirU   r7   )r!   r:   logic_prefixr<   r=   s        r   calc_logic_typezCmfImportPlugin.calc_logic_typee   sf     &YL!+$1?#H
 $+==? 	(L% (4::<'''(	( r    
obj_fieldsc                 4   i }i }i }|j                         D ]  \  }}t        |t        t        f      r| j                  j                  |      }|dk(  r2|j                         D cg c]  }|j                  dk(  s| c}d   }	nI|dv r2|j                         D cg c]  }|j                  dk(  s| c}d   }	n|j                         d   }	t        |t        j                  j                        r	|	|d||<   |	|d||<   |||<    |||fS c c}w c c}w )Nparent
CmfProjectr   )	executors
spectators	CmfPerson)modelr   )r8   
isinstancedictlistr   r   related_models__name__
issubclasscmf
CmfM2MBase)
r_   rX   related_objscurrent_objm2m_objs
field_namerI   
main_fieldmrelated_models
             r   _get_any_table_fieldsz%CmfImportPlugin._get_any_table_fieldsu   s"   !+!1!1!3 	0J%$."\\--j9
)0:0I0I0K$j1qzz]iOiQ$jkl$mM#>>0:0I0I0K$i1qzz]hOhQ$ijk$lM$.$=$=$?$BMj#***?*?@5Be+THZ(9FRW/XL,*/J'	0" [(22 %k %js   %D:DD0DNF
cmf_import
filter_objc           
      ~
   | j                  ||      \  }}}	|j                         D ]'  \  }
}| j                  ||d   |d         \  }}|||
<   ) |	j                         D ]  \  }
}|j                  |
      g ||
<   g d}|D ]  }|d   j                  |d      }|st	        j
                  d|      }|D ]  }||j                         i}|
j                  d      }| j                  ||d   ||	      \  }}|6|j                  d
|j                          d|
 dd|d   j                         ||
   j                  |           |t        j                  k(  r|sd|d<   |j                  dg       D cg c]  }|j                  j                   }}d|v r
d|d<   d|d<   d|v r:d|vr6t        j                  j                  dd|d   gdg      }|r|dfS |d   |d<   |t        j                  k(  r8dd|d   gdd|d   gg}|j                  d      r|j                  dd|d   g       |t        j                   k(  r=dd|d   gdd|d   gd dt"        j$                  j'                  |d    d!      gd"d|d"   gg}|r|}ng }g d}|D ]L  }|j                  |d      }|s|d#k(  r|j                  d$|d|gd%d|gg       n|j                  |d|g        n |s|j                         D ]{  \  }}|s	t)        |t*        j                  j,                        s%t/        t1        ||      t2        j4                        sR|j                  | d&dt7        |j8                        g       } d}|r}|j                  d      r9|t        j:                  t        j<                  fv r|j                  dd'|d   g       |D cg c]  }| }}|j                  d(       |j                  ||      }|s0|t        j                  k(  rd|vr|j                  d)| d*d+d,       y-|rdnd}|r|r||fS i }|j                  d      r|d   |d<   |r|n |d1||j                  d      dd.|} |j                         D ]  \  }}t?        | ||        |rN| j@                  rBd} |d1||j                  d      dd.|} |j                         D ]  \  }}t?        | ||        | j@                  rI| jB                  r=| jD                  r|j                  d/k(  r| jG                          | jG                  d0       | }||fS c c}w c c}w )2u  
        Создание объектов на основании моделей при импорте
        :param CmfImport cmf_import: Объект импорта для хранения настроек, статуса по текущему импорту
        :param model: Модель по которой создается объект
        :param dict obj_fields: Параметры объекта
        :param Optional[list] filter_obj: Фильтр для проверки на существование объекта в БД
        :param bool dont_create: Не создавать объект
        :param bool dont_update: Не обновлять объект
        r_   r   )r_   rX   N)ext_idr   r!   emaillogin z[,;]cf_)r_   rX   dont_createu&   Не найдено значение 'u   ' поля ''zERR-0135)obj_typeT
user_localrg_member_ofServiceDeskClientFemail_if_self_changesrt   ru   ILIKEz**filterr   r;   ==workflowr!   rZ   
cmf_authorcmf_created_at)dayfirsttextrs   ORr   _id=r   uN   Не удается найти или создать пользователя uf   . Проверьте правильность ввода логина/email пользователя. zERR-0115r^   )NF)rp   r!   import_originalr[   )save_import )$ro   r8   process_any_table_fieldsr   resplitrH   
startswith	log_error
class_nameappendr   r^   r   rI   	CmfStatus
CmfCommentdateutilparserparser`   rf   	CmfEntityre   getattrr   
CmfRelBaserG   idCmfComponentCmfListsetattr
is_changedr   is_newsave)!clsrp   r_   rX   rq   rx   dont_updaterh   ri   rj   main_field_namerelated_inforelated_obj_field_namesrk   field_valuevaluesrI   related_obj_fieldsrelated_dont_createpgrg_member_of_codeexisted_person_filteruniq_field_namesuniq_field_nameuniq_field_valueexisting_obj_fieldsr   r   new_objs!                                    r   r   z(CmfImportPlugin.process_any_table_fields   s2   & /2.G.Gz.Z+k8 .:-?-?-A 	7)O\ 99*LY`LaEQRZE[ : ]NK+6K(	7
 .6^^-= 	)O\/7/1O,FK) 
*8488RHXXg{;F!' I.8%++--H*.=.H.H.O+),)E)E&".w"7'9(;	 *F *Q '.&00"HWcdscttu v *)5g)>)I)I 1 
 $O4;;KH!I" +		6 F$$$Z(,K%9DY[9\ ]2 ] ]"&77,1L)7<34+%g.D!'!1!1!5!5gwP[\cPd=eosnt!5!u!)500'27';G$F$$$k-&@AT;z#:;J v&!!64V1D"EFF%%%4X!67t[%>?!4)>)>{K[?\gk)>)lm{623	J  GGK#3 #.???B#G #&(2FV.WZ`bfhxYy'z{?O'PQ )4):):)< R%J*UCJJ4H4H"I%/z0JFL]L]%^:,c(:D#ehh-'PQR
 x(Uv7J7JFNN6\-\#{8/DEF4?@jz@G@NN3 99GG9DL ))){*   `ak`l mw x$	 !  &D6''??8$*84F8 #/,E 5
!( 5
 	5
 "-!2!2!4 	0JGZ/	07--F % __V, $ 	G &1%6%6%8 4!
EU34 '"9"9~~%"2"2l"BLLTL* V##i !^h As   8T5<	T:c           
          | j                   ryt        j                  d| j                  | j                  | j
                  |||d|}|j                          || _         y)u3   
        Дает доступ из вне
        N)r!   typetokenext_url	ext_login	ext_tokenr   )pluginr   	CmfPluginr   r   r   r   )r   r   r   r   r   r   s         r   _init_secretzCmfImportPlugin._init_secret=  sX     ;;!! gtyytdgg*1YR[g_egr    r   )depthr   r   r   c                d    | j                   r| j                  |||       t        |   |d|i|S )Nr   )r   r   r   r   )r   r   r   r   r   r   r   r   s          r   r   zCmfImportPlugin.saveH  s5    ;;gy)<w|T99&99r    )forcec                    t         j                  j                  dd| j                  gg d      }|j	                          t        |   |d|i|S )Nr   r   )r   r   r   r   r   r   )r   r   r   r   deleter   )r   r   r   r   r   r   s        r   r   zCmfImportPlugin.deleteM  sQ    !!%%gtTWW-E-[ & ]w~t;5;F;;r    c                     t               )uJ   
        Формирование шаблона настроек
        NotImplementedr   rp   s     r   tmplt_import_settingsz%CmfImportPlugin.tmplt_import_settingsS       r    c                     t               )u9   
        Предпросмотр импорта
        r   r   s     r   previewzCmfImportPlugin.previewY  r   r    c                     t               )u-   
        Запуск импорта
        r   r   s     r   process_importzCmfImportPlugin.process_import_  r   r    c                      t               )uC   
        Маппинг полей по умолчанию
        r   r   r    r   calc_models_settingsz$CmfImportPlugin.calc_models_settingse  s    
 r    c                     t               )uK   
        Тестирование подключения к апи
        r   )r   r   r   s      r   testzCmfImportPlugin.testl  r   r    c                     t               Nr   r   s    r   download_datazCmfImportPlugin.download_datar      r    c                     t               r   r   r   s    r   download_fileszCmfImportPlugin.download_filesu  r   r    c                    ddl m dd l}dd l}fd}t	        | j
                  | j                  j                  d| j                  j                  | j                        } d      }|j                  dd	|d
   d      }|j                  |      }|j                  dd      }d|d<   d|d<   d|d<   ||d<   d|d<   d|d<   |j                  |       |j                  dd| j                  j                        }	|j                  d      }
|
j                   || j                               |j                  dd      }|j                  | j                  j                   d| j                  j                          |	j                  |
       |	j                  |       |j                  |	       t        | t        j                         r|j                  dd| j"                  j%                         j                  j&                  j                   d      }d |d<   | j"                  j                  j                  j                  |_        |	j                  |       |S )!Nr   )BeautifulSoupc                 @    ddd}d}| |v r||    } d| dd      S )	NztM6,2A2,2 0 0,0 4,4V20A2,2 0 0,0 6,22H18A2,2 0 0,0 20,20V8L14,2H6M6,4H13V9H18V20H6V4M8,12V14H16V12H8M8,16V18H13V16H8Za	  M19,3H14.82C14.4,1.84 13.3,1 12,1C10.7,1 9.6,1.84 9.18,3H5A2,2 0 0,0 3,5V19A2,2 0 0,0 5,21H19A2,2 0 0,0 21,19V5A2,2 0 0,0 19,3M12,3A1,1 0 0,1 13,4A1,1 0 0,1 12,5A1,1 0 0,1 11,4A1,1 0 0,1 12,3M7,7H17V5H19V19H5V5H7V7M7.5,13.5L9,12L11,14L15.5,9.5L17,11L11,17L7.5,13.5Z)CmfDocumentCmfTaska  M6.2 12.3a1 1 0 011.4 1.4l-2.1 2a2 2 0 102.7 2.8l4.8-4.8a1 1 0 000-1.4 1 1 0 111.4-1.3 2.9 2.9 0 010 4L9.6 20a3.9 3.9 0 01-5.5-5.5l2-2zm11.6-.6a1 1 0 01-1.4-1.4l2-2a2 2 0 10-2.6-2.8L11 10.3a1 1 0 000 1.4A1 1 0 119.6 13a2.9 2.9 0 010-4L14.4 4a3.9 3.9 0 015.5 5.5l-2 2zz<svg viewBox="0 0 24 24" class="ng-star-inserted" style="width: 20px; height: 20px; margin-bottom: -4px;"><path fill="currentColor" d="z"></path></svg>html.parserfeaturesr   )
model_name	icon_pathpathr   s      r   get_icon_modelz7CmfImportPlugin.create_tag_link.<locals>.get_icon_model}  sg     $Z  kI aDY& ,   $k  lp  kq  q@  "A  KX  Y  Yr    r   )hreftitleviewModeobjId	modelNamer   r   ainheritr   T)contenteditabler   cmf_convertedspanfalse)r   zdata-renderedtruezdata-internal-linkzwiki-link-presentationzdata-macroszdata-macros-parameterszwiki-link-wrapclasszwiki-card-textz$inline-card-icon-and-title link-view)class_r   zpadding-right: 5px;)stylez: zbackground-color: z; color: #fff;zcard-status)bs4r   jsonrandomra   r   r!   rI   r   r   new_tagdumpsr   r   r`   r   r   statusloadcolorstring)objr   r   r   link_paramssouplinklink_params_strspan_wrapperr   	icon_span	name_spanstatus_spanr   s                @r   create_tag_linkzCmfImportPlugin.create_tag_linkx  s   %	Y WZW]W]WcWcoro}o}~m4||CVATdh|i**[1||# $ 
 )0_%-3)*&>]#1@-. 0W(WD! ||F+QY\YaYaYgYg|hLL(	78LL/DLE	CHHNN+2chhnn-=>?IID c6>>*,,*3::??+<+B+B+H+H+N+N*O~^ ' K $1K !$!1!1!6!6!<!<KKK$r    c                      y r   r   r   r   s     r   calc_ext_hrefzCmfImportPlugin.calc_ext_href      r    c                      y r   r   r  s     r   calc_dump_pathzCmfImportPlugin.calc_dump_path  r  r    settingsc                 4    | D ci c]  }|d   |
 c}S c c}w )Nr!   r   )r  ss     r   _normalize_settingsz#CmfImportPlugin._normalize_settings  s    &./&	1///s   )NFF)$rd   
__module____qualname__r   staticmethodrG   r>   intrE   rN   rW   ra   ro   classmethodr   r   rb   anyboolr   r   r   r   r   r   r   r   r   r   r   r	  r  r  r
   r  __classcell__)r   s   @r   r   r      s   K )s )s ) )V C C    * c c   3 34t:L 3 30  &*l$l$ 	l$
 TNl$ tl$ l$\	 !"444 :
 #( <   0 0f 0d4j 0T 0 0r    r   )typingr   r   r   cmf.includerf   r   common.fieldsr   common.models.cmf_importr   r   r	   r
   r   r   r    r   <module>r      s5      	   + . . .h0'77 h0r    