
    +YhE                         d dl mZ d dlZd dlT 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dS )
    )OptionalN)*)fields)cmf_import_plugin)	CmfImport)DictUnionListr   c                       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                      j        |i | t          j                            d          | _        t          j        | _        t          j	        | _
        d S )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__   sW    $)&))) & 2 6 6I 6 F F#)#8 ,2,J)))    namereturnc                     g dg dddgg dd}|                                 D ]&\  }}|D ]}||                                 v r|c c S 'dS )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   s    	 	 	   
  3!
 !
F #*--// 	' 	'K ' '4::<<''&&&&&& (' vr    c                     dgdgddgddgg dd}|                                 D ]&\  }}|D ]}||                                 v r|c c S 'd	S )
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>   s     
01L)>>>
 
  '}} 	$ 	$OHe $ $4::<<''#OOOOO ($ qr    c                    | r|sdS t          |                                                                           }|                                D ]q\  }}|t          |                                                                          t          |                                                                          fv r|c S r| S )u  
        Находит ключ по значению или ключу в атрибуте choices у field
        Args:
            value: Значение для поиска
            choices: значения поля
        
        Returns:
            Найденный ключ или исходное значение, если ничего не найдено
        N)strstripr9   r8   )valuechoices	str_valuekeychoice_values        r   calc_choiceszCmfImportPlugin.calc_choicesN   s      	G 	FJJ$$&&,,..	 ") 	 	CS..4466<<>>C@P@P@V@V@X@XYYY


 Zr    c                     dgg ddgdgdgd}|                                 D ]&\  }}|D ]}||                                 v r|c c S 'dS )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_typed   s     &YLLL!+$1?#H
 
 $+==?? 	( 	(L% ( (4::<<'''''''' (( r    
obj_fieldsc                     i }i }i }|                                 D ]\  }}t          |t          t          f          r| j                            |          }|dk    r%d |                                D             d         }nC|dv r%d |                                D             d         }n|                                d         }t          |t          j        j	                  r	||d||<   ||d||<   |||<   |||fS )Nparentc                 (    g | ]}|j         d k    |S )
CmfProject__name__.0ms     r   
<listcomp>z9CmfImportPlugin._get_any_table_fields.<locals>.<listcomp>~   s%    $j$j$j1qz]iOiOiQOiOiOir    r   )	executors
spectatorsc                 (    g | ]}|j         d k    |S )	CmfPersonr]   r_   s     r   rb   z9CmfImportPlugin._get_any_table_fields.<locals>.<listcomp>   s%    $i$i$i1qz]hOhOhQOhOhOhr    )modelr   )
r8   
isinstancedictlistr   r   related_models
issubclasscmf
CmfM2MBase)	rg   rX   related_objscurrent_objm2m_objs
field_namerI   
main_fieldrelated_models	            r   _get_any_table_fieldsz%CmfImportPlugin._get_any_table_fieldst   s4   !+!1!1!3!3 	0 	0J%$.. 0"\--j99
))$j$j
0I0I0K0K$j$j$jkl$mMM#>>>$i$i
0I0I0K0K$i$i$ijk$lMM$.$=$=$?$?$BMj#**?@@ Y5Be+T+THZ((9FRW/X/XL,,*/J''[(22r    NF
cmf_import
filter_objc                 	   |                      ||          \  }}}|                                D ]1\  }	}
|                     ||
d         |
d                   \  }}|||	<   2|                                D ]\  }	}
|                    |	          g ||	<   g d}|D ]}|
d                             |d          }|rn|                    d          }|D ]T}||                                i}|                     ||
d         |          \  }}||	                             |           U n|t          j        k    ry|swd|d	<   d
 |                    dg           D             }d|v r
d|d	<   d|d<   d|v r@d|vr<t          j                            dd|d         gdg          }|r|dfS |d         |d<   |t          j	        k    rIdd|d         gdd|d         gg}|                    d          r|                    dd|d         g           |t          j
        k    rIdd|d         gdd|d         gddt          j                            |d         d          gdd|d         gg}|r|}ng }g d}|D ]Y}|                    |d          }|r?|dk    r|                    d|d|gd d|gg           n|                    |d|g            nZ|s|                                D ]{\  }}|rtt          |t          j        j                  s(t#          t%          ||          t&          j                  r-|                    | d!dt+          |j                  g           |d}|r8d" |D             }|                    d#           |                    ||          }|s2|t          j        k    r"d|vr|                    d$| d%d&d'(           d)S |rdnd}|r|n  |||                    d          d*          }|                                D ]\  }}t1          |||           |rU|j        rNd} |||                    d          d*          }|                                D ]\  }}t1          |||           |j        rC|j        r<|j        r|j        d+k    r|                                 |                    d,           |}||fS )-u.  
        Создание объектов на основании моделей при импорте
        :param CmfImport cmf_import: Объект импорта для хранения настроек, статуса по текущему импорту
        :param model: Модель по которой создается объект
        :param dict obj_fields: Параметры объекта
        :param Optional[list] filter_obj: Фильтр для проверки на существование объекта в БД
        rg   r   )rg   rX   N)ext_idr   emaillogin ,T
user_localc                 &    g | ]}|j         j        S  )r   rI   )r`   pgs     r   rb   z<CmfImportPlugin.process_any_table_fields.<locals>.<listcomp>   s     ] ] ]2 ] ] ]r    rg_member_ofServiceDeskClientFemail_if_self_changesrz   r{   ILIKEz**filterr   r;   ==workflowr!   rZ   
cmf_authorcmf_created_at)dayfirsttext)ry   r   r!   rz   r{   ry   ORr   _idc                     g | ]}|S r   r   )r`   rr   s     r   rb   z<CmfImportPlugin.process_any_table_fields.<locals>.<listcomp>   s    @@@jz@@@r    r   uN   Не удается найти или создать пользователя uf   . Проверьте правильность ввода логина/email пользователя. zERR-0115rf   )obj_typeNF)rv   r!   import_originalr\   )save_import)ru   r8   process_any_table_fieldsr   splitrH   appendr   rf   	CmfStatus
CmfCommentdateutilparserparserh   rm   	CmfEntityrl   getattrr   
CmfRelBaserG   id	log_errorsetattr
is_changedr   is_new
class_namesave)clsrv   rg   rX   rw   dont_updatero   rp   rq   main_field_namerelated_inforelated_obj_field_namesrr   field_valuevaluesrI   related_obj_fieldsrg_member_of_codeexisted_person_filteruniq_field_namesuniq_field_nameuniq_field_valueexisting_obj_fieldsr   new_objs                                r   r   z(CmfImportPlugin.process_any_table_fields   sd    /2.G.Gz.Z.Z+k8 .:-?-?-A-A 	7 	7)O\ 99*LY`LaEQRZE[ : ] ]NK+6K((-5^^-=-= 	 	)O\//7/1O,>>>K) 
 

*8488RHH (..s33F!' I I.8%++---H*),)E)EjXdelXmQc *F *e *eQ#O4;;KHHHHE F$$$Z$(,K% ] ]Y[9\9\ ] ] ]"&777,1L)7<34+%%g.D.D!'!1!5!5gwP[\cPd=eosnt!5!u!u! 1)500'27';G$F$$$k-&@AT;z#:;J v&& G!!64V1D"EFFFF%%%4X!67t[%>?!4)>)>{K[?\gk)>)l)lm{623	J  	R GGGKKK#3  #.???B#G#G # &(22FV.WZ`bfhxYy'z{{{{?O'PQQQE  R)4):):)<)< R R%J R*UCJ4H"I"I R%/z0J0JFL]%^%^R:(:(:(:D#eh--'PQQQ 	E@@K@@@GNN3 99GG9DDL 	))){**   xak x x x$	 !    ;&0D".  E,,EEZVaVeVeflVmVm  @D  5E  5E  5E!,!2!2!4!4 	0 	0JGZ//// 	47- 	4Fez8O8OaefffG%0%6%6%8%8 4 4!
EU3333 	+'"9 	+~ %"2l"B"BLLTL*** V##r    c           
          | j         rdS t          j        d| j        | j        | j        |||d|}|                                 || _         dS )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  sh     ; 	F! gtytdg*1YR[g g_eg gr    r   )depthr   r   r   c                v    | j         r|                     |||            t                      j        |d|i|S )Nr   )r   r   r   r   )r   r   r   r   r   r   r   r   s          r   r   zCmfImportPlugin.save  sE    ; 	=gy)<<<uww|T99&999r    )forcec                    t           j                            dd| j        gg d          }|                                  t                      j        |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.delete$  sc    !%%gtTW-E-[-[-[ & ] ]uww~t;5;F;;;r    c                     t                      )uJ   
        Формирование шаблона настроек
        NotImplementedr   rv   s     r   tmplt_import_settingsz%CmfImportPlugin.tmplt_import_settings*       r    c                     t                      )u9   
        Предпросмотр импорта
        r   r   s     r   previewzCmfImportPlugin.preview0  r   r    c                     t                      )u-   
        Запуск импорта
        r   r   s     r   process_importzCmfImportPlugin.process_import6  r   r    c                      t                      )uC   
        Маппинг полей по умолчанию
        r   r   r    r   calc_models_settingsz$CmfImportPlugin.calc_models_settings<  s    
 r    c                     t                      )uK   
        Тестирование подключения к апи
        r   )r   r   r   s      r   testzCmfImportPlugin.testC  r   r    c                     t                      Nr   r   s    r   download_datazCmfImportPlugin.download_dataI      r    c                     t                      r   r   r   s    r   download_fileszCmfImportPlugin.download_filesL  r   r    c                    ddl m dd l}dd l}fd}t	          | j        | j        j        d| j        j        | j	                  } d          }|
                    dd	|d
         d          }|                    |          }|
                    dd          }d|d<   d|d<   d|d<   ||d<   d|d<   d|d<   |                    |           |
                    dd| j        j                  }	|
                    d          }
|
                     || j	                             |
                    dd          }|                    | j        j         d| j        j                    |	                    |
           |	                    |           |                    |	           t          | t          j                  rv|
                    dd| j                                        j        j        j         d          }d |d<   | j        j        j        j        |_        |	                    |           |S )!Nr   )BeautifulSoupc                 L    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_modelT  s{     $Z  k I aDY&& , =  "A  lp  "A  "A  "A  KX  Y  Y  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randomri   r   r!   rI   r   r   new_tagdumpsr   r   rh   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_linkO  sv   %%%%%%	Y 	Y 	Y 	Y 	Y WZW]Wcoro}~~~}m444||CVATdh|ii**[11||# $ 
 
 )0_%-3)*&>]#1@-. 0W(WD!!! ||F+QY\YaYg|hhLL((	77888LL/DLEE	CHN>>chn>>???IID c6>** 	%,,^3:??+<+<+B+H+N^^^ '  K $1K !$!1!6!<KKK$$$r    c                     d S r   r   r   r  s     r   calc_ext_hrefzCmfImportPlugin.calc_ext_href      tr    c                     d S r   r   r  s     r   calc_dump_pathzCmfImportPlugin.calc_dump_path  r  r    settingsc                     d | D             S )Nc                      i | ]}|d          |S )r!   r   )r`   ss     r   
<dictcomp>z7CmfImportPlugin._normalize_settings.<locals>.<dictcomp>  s    ///&	1///r    r   )r  s    r   _normalize_settingsz#CmfImportPlugin._normalize_settings  s    //h////r    r   )$r^   
__module____qualname__r   staticmethodrG   r>   intrE   rN   rW   ri   ru   classmethodr   r   rj   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 K K K K )s )s ) ) ) \)V C C    \   \* c c    \ 3 34t:L 3 3 3 \30 inD$ D$) D$48D$FNtnD$twy}s~D$ D$ D$ [D$L	 	 	 !"444 : : : : : : :
 #( < < < < < < <         \       0 0 \0f     0d4j 0T 0 0 0 \0 0 0 0 0r    r   )typingr   r   cmf.includerm   r   common.fieldsr   common.models.cmf_importr   r   r	   r
   r   r   r    r   <module>r#     s                     + + + + + + . . . . . . . . . . . . . . . . . .@0 @0 @0 @0 @0'7 @0 @0 @0 @0 @0r    