
    ZjPy                         d dl Z d dlZd dlZd dlmZ d dl d dlmZ d dl	Z
 G d de
j                  j                  j                  j                        Zy)    N)Response)*)Optionalc                       e Zd Zej                  j
                  j                  j                  j                  ddgz   Zd Z	d Z
d Zeddedee   defd	       Zd
 Zd Zd Zd Z fdZ fdZd Zd Zd ZddZedd       Zej;                  dej<                        ZddZ e e!ddd      dd              Z"dd fd
Z# xZ$S ) CmfPluginGitsyncsync_repo_listc           
         t         j                  }d| dt        j                  j	                  | j
                  j                  j                         dt        j                  j	                  | j                  j                  j                         dt        j                  j	                  | j                  j                         S )Nzhttps://z/pub/webhook?token=z&name=z&plugin=)
configAPP_FQDNurllibparsequoteplugintokenvaluewebhookcode)selfhostnames     &./modules/git/models/cmf_plugin_git.pywebhook_urlzCmfPluginGit.webhook_url   s    ??( $ll(():):)@)@ABV\\''(9(9(?(?@Av||))$))//:;= 	=    c                 .    | j                   j                  S N)idr   r   s    r   webhook_ext_namezCmfPluginGit.webhook_ext_name   s    ww}}r   c                 d   |j                         D ]T  \  }}||j                  v s	 |dk(  r-|j                  dd      }| j                  |      }|||_        t        |||       V |S # t        $ r<}|dk(  r+dt        |      v rt        ||d        t        |  d|        n|Y d }~d }~ww xY w)Nauthor_emailz@@@)	git_emailu6   Неправильный формат ввода emailuN   ::sync: author_email. Неправильный формат ввода email: )	itemsfieldsreplacefind_personauthorsetattrCmfValidationErrorstrprint)r   commitcommit_datakeyr   r'   es          r   _set_commit_datazCmfPluginGit._set_commit_data   s    %++- 	 JCfmm# n, %dC 8!%!1!1E!1!B!-,2FMFC/	    *  n,1impqrms1sT2&tuzt{|} ~ s   ?A**	B/32B**B/git_plugin_idrepo_ext_idreturnc                 $    |  d}|r|d| z  }|S )u  
        Формирует redis lock key для синхронизации git plugin / repository
        - если repo_ext_id=None, то lock уровня плагина
        - если repo_ext_id!=None, то lock уровня репозитория
        z::lock::syncz::repo:: )r1   r2   r.   s      r   get_sync_lock_keyzCmfPluginGit.get_sync_lock_key.   s)     |,Xk]++C
r   c                 
   t         j                  |  d       | j                  g d       | j                         }	 |j	                         }|j                  dd      }|d   d	   }| j                  | j                  |      }	 t        j                  |d
d      5  t         j                  |  d|d   d    d| d       t        j                   j                  | |      }t        j"                  j%                  | |ddg      D ci c]  }|j&                  j(                  | }	}|j                  dg       D ]  }
|
d   }|	j                  |      }|s(t        |  d|        t        j#                  | ||      }|
j+                         D ]!  \  }}||j,                  v st/        |||       # t        j1                         5  |j3                          d d d         i }|j                  d      }|r8|D ]  }t        j4                  j7                  | |d         r nt        j5                  | |      }| j9                  ||      }t        j1                         5  |j3                          d d d        | j;                  |j<                  j(                  dg      D ]n  }|j?                  |j                  j(                  |      }|j@                  jC                  |       t        |  d|jD                  j(                  d d  d | d!       p  t        |  d"tG        |       d!       |jI                         D ]s  }t        jJ                  jM                  |d#d$       t        j1                         5  |j3                  d%       d d d        t        jJ                  jM                  |d#d&       u |j                  d'g       D ]  }|d	   }t        jN                  j                  | ||g d()      }|s(t        |  d*|        t        jO                  | ||+      }d,|_(        |j+                         D ]!  \  }}||j,                  v st/        |||       # t        j1                         5  |j3                          d d d         	 d d d        |S # t
        $ rA t        d       t        t        j                         t        t        j                  d        w xY wc c}w # 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   wxY w# 1 sw Y   OxY w# 1 sw Y   |S xY w# tR        $ r t         j                  |  d-       Y y.w xY w)/Nz.webhook_call: start)
projectsplugin.ext_tokenplugin.tokenplugin.ext_urlplugin.verify_ssltyper   webhook_ext_idwebhook_insecure_sslwebhook_secretzWebhook error, call params:T)flushresponse repoext_id,     timeoutblocking_timeoutz$.webhook_call: update data for repo name())
git_pluginrE   deletedurl)rN   rD   r$   branchesz .webhook_call:   add new Branch rN   rD   rK   commitssharN   rT   rN   rD   git_commitsr$   z.webhook_call:   add bind    z to z new commits.z.webhook_call:   add new updatebefore_save	only_data
after_savemerge_requests)r   head_branchbase_branchr'   	merged_byrN   rD   rE   r$   z'.webhook_call:   add new Merge Request rN   rD   rE   Fz2.webhook_call: repo sync in progress, skip webhookz#repo sync in progress; skip webhook)*gdebugload_fields_get_driverprocess_webhook_request	Exceptionr+   requestheadersdatagetr6   r   cmfutilCmfLockmodels
CmfGitRepoCmfGitBranchlistrK   r   r#   r$   r(   disable_aclsaveCmfGitCommitsgetr0   find_related_taskstext
setdefaultrW   appendrT   lenvaluesCmfAutomationCrudTrigger	crud_hookCmfGitMergeRequestrO   CmfGetLockError)r   _kwargsdriverrequest_datarB   r2   lock_keyrD   branchlocal_branchesbranch_datarK   r.   r   task_to_savecommits_datar-   r,   taskmr_datarE   mrs                         r   webhook_callzCmfPluginGit.webhook_call;   s@   	4&,-. [ 	\ !!#	!99;L  ##J3"6*84))$'';?C	9 3K ="4& D\RXEYZ`EaDbbcdocppqrs((,,[,Q<B<O<O<T<T#'dIu;M =U =O"P28FKK%%v-"P "P $0#3#3J#C 
&K&v.D+//5F!&FtfMN!'!4!44VZ!4![&1&7&7&9 8
U&--/#FC78 !,,. && &
&   "+//	:'3 t "..33tUZI[3\!!'!4!44!4!P!%!6!6v{!K$002 *"KKM*$($;$;FKK<M<MWdVe$;$f tD#/#:#:477==$#OD ,,33F;!TF*DVZZEUEUVXWXEYDZZ^_c^ddq"rstt TF";C<M;Nm\](//1 \D33==dHm\ ,,. 2		D	1233==dHl[\  ,//0@"E "G$X.F2266#'d6Y 7 [B &MfXVW#66$TZ`6a!&BJ&-mmo 4
U"))+#BU34 !,,. "	" ""a="D a  	/0'//"',,d+	$"P& &"* *2 2"" "y="D 	  	9GGvOPQ8	9s   R T% A,TS&A;T"#TS$B	TS10DT6S>	B?T	#T,T=
TT% A
ST$S.)T1S;6T>TTTTT"T% "T% %!U	U	c                 L   t         j                  d| j                   d| j                   dt         j                  j                         t         j                  j                         g      }|j                          |j                  d      }|| j                  _        | j                  j                          t         j	                  | j                  d|| j                   d| j                   d| j                   d| j                   d	
      j                         | _        y )Nu   Интеграция :T)rK   systemrg_member_ofF)alert u.   Интеграция с Git сервером (z).)	hook_typer   
token_userrK   rz   )rq   	CmfPersonr=   r   
CmfWebhookwebhook_person_groupCmfPersonGroup
user_grouprv   generate_webhook_tokenr   r   r   )r   r   r   s      r   _init_webhookzCmfPluginGit._init_webhook   s
   %%(1TYYK@ ++@@BFDYDYDdDdDfg & 

 	111>! ((iiII;a		{+4bcgclclbmmnosoxoxnyy{2| ) ~ C  C  E 	r   c                     | j                   j                  }|s:t        j                  d| j                  d      }|j                          || _         y y )Ngit  )r=   rK   sync_period)r   r   rq   	CmfPluginrK   rv   r   r   s     r   _calc_pluginzCmfPluginGit._calc_plugin   sD    ""%%5tyyd%SFKKM DK	 r   c                 X    | j                   r| j                  s| j                          y y y r   )is_newr   r   r   s    r   _calc_webhookzCmfPluginGit._calc_webhook   s"    ;;t||   ,;r   c                 *    t         |          g dz   S )N)r   r=   r   r@   )supersave_preload_fields)r   	__class__s    r   r   z CmfPluginGit.save_preload_fields   s    w*,/^^^r   c                     | j                          | j                          | j                  s+dj                  t	        j
                  dd            | _        t        |   di |S )NrC   >qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM1234567890   )kr5   )r   r   r@   joinrandomchoicesr   rv   )r   kwargsr   s     r   rv   zCmfPluginGit.save   s^    """$''&.. 	+ #D
 w|%f%%r   c           
      6   d }| j                   dk(  ry| j                  j                  st        d|  dd       ddlm} t        j                         5  | j                  j                  j                         }d d d         |      }n| j                   d	k(  r| j                  j                  st        d
|  dd       ddl	m} t        j                         5  | j                  j                  j                         }d d d         || j                  j                  j                  | j                  j                  j                        }n| j                   dk(  rddlm}  |       }n| j                   dk(  r| j                  j                  st        d|  dd       ddlm} t        j                         5  | j                  j                  j                         }d d d         || j                  j                  j                        }|s_t        d| j                   j                    d| j                   j                   ddj#                  | j                   j$                               |S # 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   xY w)Ngithubu.   У плагина интеграции Github uX    не указан токен доступа в конфигурации плагина.Tabortr   )Driver)r   gitlabu.   У плагина интеграции Gitlab )rP   
ssl_verifyr   evagitgitflicu/   У плагина интеграции Gitflic )rP   r   u#   Не правильно задан rL   u)   ): допустимые значения rC   )r=   r   	ext_token	cmf_alertmodules.git.githubr   ro   ru   decryptmodules.git.gitlabext_urlr   
verify_sslmodules.git.evagitmodules.git.gitflicCmfErrorcaptionr   r   )r   r   r   r   s       r   rh   zCmfPluginGit._get_driver   sA   99 ;;((DTF  Kc  d  lpq1$$& 8--5578%(FYY(";;((DTF  Kc  d  lpq1$$& 8--5578KK''--$++:P:P:V:VF YY("1XFYY)#;;((EdV  Ld  e  mqr2$$& 8--5578 3 3 9 9GF5dii6G6G5H$))//IZ [::<''$))BSBS:T9UWX X ;8 88 88 8s$   %I5%J=%J5I?JJc                     | j                   j                         j                  }d |_        |j	                          t        | j                  ddi       t        d       y )N	is_manualT)r   u   Синхронизация запущена, она может выполняться длительное время. После завершения вы получите уведомление)r   loadr   sync_last_datetimerv   schedule_deferred_jobsync_all_pluginsr   r   s     r   r   zCmfPluginGit.sync   sT    !!#))$(!!!;*=	
 	  X  	Yr   c           	         t        |  d       | j                  g d       | j                         }t        j                  j                  | g d      D ci c]  }|j                  j                  | }}t        |  d       	 |j                         }D ]  }|d
   }|j                  |d       }|s5t        |  d|d           t        j	                  | || j                        }d|_        |j#                         D ]!  \  }}||j$                  v st'        |||       # |j)                          |j*                  s|j-                  || j/                         | j1                         | j2                  j                  | j4                  | j6                  j                          |j9                         D ]@  }|j                   rt        |  d|j:                          d|_        |j)                          B y c c}w # t        $ r3 t        j                  d| j                          t        dd	       Y w xY w)Nz::sync: start)r9   r:   r;   r<   plugin.sync_enabledr8   r=   r   r>   r?   r@   rE   rP   default_branchr   rO   	last_syncr=   rN   r$   z::sync: load reposu&   Ошика синхронизации u   Не удалось подключиться к репозиторию. Проверьте настройки подключения и повторите попытку.Tr   rE   z::sync:   add new Repo rK   )rN   rE   r=   F)r   webhook_namer>   insecure_sslsecretz::sync:   del Repo )r+   rg   rh   rq   rr   rt   rE   r   available_reposCmfAuthErrorlogging	exceptionr   r   popr=   rO   r#   r$   r(   rv   r   setup_webhookr   r   r>   r?   r@   r~   rK   )	r   r   rD   local_reposavalilable_repos	repo_datarE   r.   r   s	            r   r	   zCmfPluginGit.sync_repo_list   sF   m$% g 	h !!# ))..b / 
 KKt#
 
 	()*	J%557
 * 	^Ix(F??640D5i6G5HIJ((Ddii(X DL'oo/ .
U$++%D#u-. IIKyy$$ $ 0 0 2!%!6!6!8I\I\IbIb!%!:!:4CVCVC\C\	 % ^	^2  &&( 	D||TF-dii[9:DLIIK	O
  	J FtwwiPQ } EIJ J	Js   G>H 8H?>H?c                 @   i }g d}t         j                  j                  | |ddg|z   d      D ci c]  }|j                  | }}|j	                  |j
                  j                        D ]  }d}|d   }	|j                  |	d       }|s(t         j                  j                  | ||	ddg|z         }|set        |  d|	        t         j                  | ||	      }|j                         D ]  \  }
}|
|v st        ||
|        |j                          d	}nd}|j                  rd	}|j                         D ]?  \  }
}|
|v s|t        ||
      k7  sd	}t        |  d
|	 d|
 dt        ||
       d| 	       A |rt        |  d
|	        t         j                  j                  | ||	ddg|z         }d|_        |j                         D ]!  \  }
}|
|j                   v st        ||
|       # |j                          d	}t         j"                  j                  | |d         rd}|j%                  |j
                  j                  |	      D ]  }t         j"                  j                  | |d         r n|dz  }t         j#                  | |      }| j'                  ||      }|j                          d	}| j)                  |j*                  j                  dg      D ]C  }|j-                  |j.                  j                  |      }|j0                  j3                  |       E  |rt        |  d| d|	        |st5                 |j7                         D ]p  }t        |  d|        t         j8                  j;                  |dd       |j                  d	       t         j8                  j;                  |dd       t5                r |j7                         D ]k  }t        |  d|j                          t         j                  j                  | ||j                  dg      }d	|_        |j                          t5                m g d}t         j<                  j                  | |ddd dg|z   !      D ci c]  }|j
                  | }}|j?                  |j
                  j                  d	"      D ]  }d}|d    }|j                  |d       }|s(t         j<                  j                  | ||d dg|z   #      }|sft        |  d$|        t         j=                  | ||%      }|j                         D ]  \  }
}|
|v st        ||
|        |j                          d	}nd}|j                  rd	}|j                         D ][  \  }
}|
|v stA        |      tA        t        ||
            k7  s-d	}t        |  d&|j                   d|
 dt        ||
       d| 	       ] |rt        |  d&|j                          t         j<                  j                  | ||d dg|z   #      }d|_        |j                         D ]!  \  }
}|
|j                   v st        ||
|       # |j                          d	}|st5                 |j7                         D ]t  }|jB                  dk7  rt         j<                  j                  | ||j
                  d dg|z   #      }|jE                  |j
                  j                  |jF                  '      }|rt        |  d(|j
                   d)|jF                   d)|j                          d|_        |j                         D ]X  \  }
}|
|v stA        |      tA        t        ||
            k7  r t        |  d*|
 dt        ||
       d|        t        ||
|       Z n;t        |  d+|j
                   d)|jF                   d)|j                          d	|_        |j                          t5                w y c c}w c c}w ),N)rP   etaglast_modifiedrO   rK   F)rN   rD   r$   rO   )rN   rD   rK   r$   z::sync:   add new Branch rR   Tz::sync:   change data Branch z: z old=z new=rT   rU   r   )rT   rG   rV   rW   rX   z::sync:   add z new commits from Branch z::sync:   update task rZ   r[   r\   r^   z::sync:   del Branch )rK   numberhead_branch_name	head_repohead_shabase_branch_name	base_repobase_shar   r   author_nameauthor_loginr    author_ext_idrz   status	mergeablemerged	merge_sha	merged_atmerged_by_namemerged_by_loginmerged_by_ext_idrP   	additions	deletionsrS   r`   ra   r'   rb   openrE   )rN   rD   r   rO   r$   )	only_openrc   z ::sync:   add new Merge Request rd   z::sync:   change data MR )r   z::sync:   close Merge Request r   z$::sync:   close Merge Request data: z::sync:   del Merge Request )$rq   rs   slistrK   get_branchesrE   r   r   rx   r+   r#   r(   rv   rO   getattrrn   r$   rw   iter_commitsr0   ry   rz   r{   r   rW   r|   
cmf_commitr~   r   r   r   get_merge_requestsr*   r   get_merge_requestr   )r   rD   r   r   branch_sync_fieldsr   r   r   have_changesrK   r.   r   need_changecommits_countr-   r,   r   mr_sync_fieldsr   	local_mrsr   rE   s                         r   	sync_repozCmfPluginGit.sync_repo+  s    = /5.A.A.G.GdIv3FI[3[ej /H /lm$*FKKm m "..t{{/@/@A =	K Lv&D#''d3F,,11TSWajlr`s  wI  aI1  J7v>?,,4d,S"-"3"3"5 4JC00U34 ##>>"&K"-"3"3"5 zJC00Ugfc>R5R&*&CD6C5PUV]^dfiVjUkkpqvpwxyz TF"?vFG#00444VZdmoucv  zL  dL4  MF%*FN&1&7&7&9 8
U&--/#FC78 KKM#'L ""''4[=O'PM%224;;3D3D$2O 4 &&++tUAS+T",,4,H..v{C# 33FKK4E4E}o3^ 4D'22477==$GD$$++F344 n]O;TUYTZ[\{=	@ !'') 	DTF078++55dHmTIII%++55dHlSL	 %++- 	FTF/}=>((,,4fkkclbm,nF!FNKKML		O %+$=$=$C$Cd65RZ\eQfguQu %D %wx BIIrMx	 x 001B1Bd0S "	G LX&Fvt,B..33t$W]goqzf{  }K  gK3  L>vhGH..$TRX.Y")--/ 0JCn,C/0 	##::"&K")--/ uJCn,Us72sCS?T1T&*&?y3%uU\]_adUeTffklqkrstu TF";BGG9EF2266$TZ`jrt}i~  BP  jP6  QB!&BJ&-mmo 4
U"))+#BU34 GGI#'LE"	J ""$ 	ByyF"**..$TRTR[R[emoxdy  }K  eK.  LB..t{{/@/@.SG<T[[M299+UVWYW^W^V_`a"
")--/ 0JCn,u:WR-=)>>!TF*NseSXY`acehYiXjjopuov"wxC/	0 :4;;-qSTUWU\U\T]^_!
GGIL'	Sm@xs   ``c                 Z    |r)t         j                  j                  ddd|gdd|gg      S y )NORlogin=email)filter)rq   r   rn   )clsr"   s     r   r&   zCmfPluginGit.find_person  s:    ##''wY6ORY[^`iQj/k'llr   z(?P<code>[A-Z\d]+-\d+)c                 Z    t         j                  j                  ||| j                        S )u   
        Нужно в тексте найти все потенциальные коды. Можно просто все слова...
        )r$   r8   )rq   CmfTaskry   r8   )r   rz   r$   s      r   ry   zCmfPluginGit.find_related_tasks  s$     ~~00ft}}0]]r   Tz	@minutely)	only_once
system_jobscheduleFc                 
   dd l }t        j                  j                  g d      D ]  }t        j                  d| t        j                         |j                  s4t        j                  t        j                  j                   d| d       l|j                  j                  }|j                  sL| sJt        j                  d| t        j                         d	|_        |j                          t                |j                  j                  xs d
}|j                   r@|j                   j"                  |k  r't        j                  dt        j                         @t        j                  t        j                  j                   d|        t        j                  | d       	 |j%                          t                |j5                         }d}d }t        j6                  j                  |g d      D ]  }	t        j                  | d|	        |	j8                  st        j                  | d|	 d       E|j;                  |j<                  |	j>                  j                        }
	 t@        jC                  |
dd      5  t        j                  d|	 t        j                         |jE                  |	|       |	jF                  j-                          |	j                  d       d d d         |j                  j                  jJ                  rOt        j                  | d       d|j                  _        |j                  j                  j                  d       |s"d |_        |j                   j-                          n9d|_        |j                   j-                          |j                   |_        ||_        |j                          t                 y # t&        $ r}t        j(                  d|       t+                d|_        |j                   j-                          |j                   |_        | d|j1                          |_        |j                          t                Y d }~Zd }~ww xY w# 1 sw Y   xY w# tH        $ r t        j                  | d|	        Y t&        $ rB}d}| d|j1                          }t        j(                  d|       t+                Y d }~d }~ww xY w)!Nr   )r   zplugin.*r9   r:   r;   r<   r   r8   r=   r   r>   r?   r@   rX   u   Синхронизируем )levelz!.sync_all_plugins: !!! Skip sync z die no plugin configured.u   Пропускаем disabledr   ue   С последней синхронизации прошло недостаточно времениz.sync_all_plugins: Try sync z::sync_all_plugins: startzsync_repo_list %s errorerror
Fr   r   z::sync: repo z::sync: Skip repo z (sync=False)rF      rH   u;   Синхронизируем гит репозиторий Tr\   z-::sync: repo sync already running, skip repo zSync %s errorz& first sync Success, enable auto sync!success)&	tracebackrq   r   rt   re   rf   r   INFOr   
class_namer   sync_enabledsync_statusrv   commit_with_eventr   r   ager	   rj   r   rollback_purge_eventset_nowsync_last_error_datetime
format_excsync_last_error_messagerh   rr   r   r6   r   rE   ro   rp   r  r   r   is_null)r   r  rN   r   periodr/   r   
has_errorsr  rD   r   s              r   r   zCmfPluginGit.sync_all_plugins  sS    	 !--22 ;k2 l W	 JGG3J<@GU$$**556 7&&0\1KMN &&,,F''9/x8w||L%/"!#''--5F((V-F-F-J-JV-S  IP  IU  IU  VGGv**5566RS]R^_`GGzl";<=))+!#  ++-FJE ))..%b /   :,mD6:;yyGGzl*<TF-PQ%77
t{{GXGXY 3QST 2"]^b]c dlslxlxy",,T6:..0		D	1	2:   --55:,&LMN15
!!.!!'',,t,<%."))113%,"))113282K2K/16.KKMoW	 4  	!!";VD$&%,"))113282K2K/453b9M9M9O8P1Q.!#	:2 2 ' GGzl*WX\W]^_  !%J cI$8$8$:#;<E%%ov>(*sP   2O,9RA'R	8R,	R5BRR	RR#T<T7TT)forcec                    | j                   j                           | j                   j                  |ddi| t        |   |d|i|S )Nr*  T)r   r   deleter   )r   r*  argsr   r   s       r   r,  zCmfPluginGit.delete<  sJ    T888w~t;5;F;;r   r   )F)%__name__
__module____qualname__modulesr   r$   cmf_plugin_gitr   api_methodsr   r   r0   staticmethodr*   r   r6   r   r   r   r   r   rv   rh   r   r	   r  classmethodr&   recompileASCII_TASK_CODE_SEARCH_REry   cmf_deferred_jobr   r,  __classcell__)r   s   @r   r   r      s   ++$$33@@LL$P
 
K=& 
 
8C= 
TW 
 
[zE$!!_	&$LY5nbH  
 ::&?J^ L[  M [ z #( < <r   r   )r   urllib.parser   r   flaskr   cmf.includetypingr   !modules.git.fields.cmf_plugin_gitr1  r   r$   r2  r   r5   r   r   <module>rA     s>          (t<7;;%%44AA t<r   