
    Lis                         d dl Z d dlZd dlZd dlmZ d dl d dlZ G d dej                  j                  j                  j                        Zy)    N)Response)*c                   n    e Zd Zej                  j
                  j                  j                  j                  ddgz   Zd Z	d Z
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j3                  dej4                        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                 .   |j                         D ]9  \  }}||j                  v s	 |dk(  r|j                  dd      }t        |||       ; |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@@@u6   Неправильный формат ввода emailuN   ::sync: author_email. Неправильный формат ввода email: )itemsfieldsreplacesetattrCmfValidationErrorstrprint)r   commitcommit_datakeyr   es         r   _set_commit_datazCmfPluginGit._set_commit_data   s    %++- 	 JCfmm#
 n, %dC 8FC/	   *  n,1impqrms1sT2&tuzt{|} ~ s   $A	B2BBc                 2
   t         j                  |  d       | j                  g d       | j                         }	 |j	                         }|j                  dd      }t        j                  | j                   dd	d
      5  t         j                  |  d|d   d    d|d   d    d       t        j                  j                  | |d   d         }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        j/                         5  |j1                          d d d         i }|j                  d      }|r8|D ]  }t        j2                  j5                  | |d         r nt        j3                  | |      }| j7                  ||      }t        j/                         5  |j1                          d d d        | j9                  |j:                  j&                  dg      D ]n  }|j=                  |j                  j&                  |      }|j>                  jA                  |       t        |  d|jB                  j&                  d d   d!| d"       p  t        |  d#tE        |       d"       |jG                         D ]s  }t        jH                  jK                  |d$d%       t        j/                         5  |j1                  d&       d d d        t        jH                  jK                  |d$d'       u |j                  d(g       D ]  }|d   }t        jL                  j                  | ||g d)*      }|s(t        |  d+|        t        jM                  | ||,      }d-|_'        |j)                         D ]!  \  }
}|
|j*                  v st-        ||
|       # t        j/                         5  |j1                          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).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 ::lock::sync,     timeoutblocking_timeoutz$.webhook_call: update data for repo reponame(ext_id))
git_pluginrC   deletedurl)rE   r@   r"   branchesz .webhook_call:   add new Branch rE   r@   rA   commitssharE   rK   rE   r@   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_branchauthor	merged_byrE   r@   rC   r"   z'.webhook_call:   add new Merge Request rE   r@   rC   F)(gdebugload_fields_get_driverprocess_webhook_request	Exceptionr'   requestheadersdatagetcmfutilCmfLockr   models
CmfGitRepoCmfGitBranchlistrA   r   r!   r"   r$   disable_aclsaveCmfGitCommitsgetr,   find_related_taskstext
setdefaultrN   appendrK   lenvaluesCmfAutomationCrudTrigger	crud_hookCmfGitMergeRequestrF   )r   _kwargsdriverrequest_datar8   r@   branchlocal_branchesbranch_datarA   r*   r   task_to_savecommits_datar)   r(   taskmr_datarC   mrs                       r   webhook_callzCmfPluginGit.webhook_call*   s   	4&,-. [ 	\ !!#	!99;L  ##J3 __y5sUW_X @	GG&  (01<3G3Q2RRSUV $$((DfAUV^A_(`D8>8K8K8P8P#$	57I 9Q 9KL.4!!6)LN L  ,//
B? 
""6*'++D1TF"B4&IJ#00DtRV0WF"-"3"3"5 4JCfmm+U34 ((* "KKM" "
"  L'++I6L#/ pK **//4[QVEW/X#00Dt0LF!226;GF ,,. && $ 7 78I8IS`Ra 7 b p+66tww}}dK((//7&@AQAQRTSTAU@VVZ[_Z``mnopp 7L8I7J-XY$++- X//99$-X((* .III-.//99$,WX (++,<bA  *..22#$vU 3 W TF"I&RS22dV\2]B"
")--/ 0JCbii'C/0 ((* GGI g@	B W  	/0'//"',,d+	 L" ""& &. .$ @	B s   R A8T<SA;T#T9S
B	TS%$DT*S2=B?T=#T S?1
TA
STS"T%S/*T2S<7T?T	TTc                 F   t         j                  d| j                   d| j                   dd      }|j                  j                  t         j                  j                                |j                          |j                  d      }|| j                  _        | j                  j                          t         j                  | j                  d|| j                   d| j                   d| j                   d| j                   d	
      j                         | _        y )Nu   Интеграция :T)rA   system
user_localF)alert u.   Интеграция с Git сервером (z).)	hook_typer   
token_userrA   rr   )ri   	CmfPersonr3   r   rg_member_ofrt   
CmfWebhookwebhook_person_grouprn   generate_webhook_tokenr   r   r   )r   r   r   s      r   _init_webhookzCmfPluginGit._init_webhook   s   %%(1TYYK@Z^ & `
&&v'8'8'M'M'OP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  )r3   rA   sync_period)r   r   ri   	CmfPluginrA   rn   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   r3   r   r6   )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 )Nr9   >qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM1234567890   )k )r   r   r6   joinrandomchoicesr   rn   )r   kwargsr   s     r   rn   zCmfPluginGit.save   s^    """$''&.. 	+ #D
 w|%f%%r   c           
         d }| j                   dk(  rx| 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}  |       }|s_t        d| j                   j                   d| j                   j                   ddj!                  | j                   j"                               |S # 1 sw Y   XxY w# 1 sw Y   xY w)Ngithubu.   У плагина интеграции Github uX    не указан токен доступа в конфигурации плагина.Tabortr   )Driver)r   gitlabu.   У плагина интеграции Gitlab )rG   
ssl_verifyr   evagitu#   Не правильно задан rB   u)   ): допустимые значения r9   )r3   r   	ext_token	cmf_alertmodules.git.githubr   rg   rm   decryptmodules.git.gitlabext_urlr   
verify_sslmodules.git.evagitCmfErrorcaptionr   r   )r   r{   r   r   s       r   r`   zCmfPluginGit._get_driver   s   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5dii6G6G5H$))//IZ [::<''$))BSBS:T9UWX X +8 88 8s   %G%GGG$c                     | j                   j                         j                  }d |_        |j	                          t        | j                  ddi       t        d       y )N	is_manualT)r   u   Синхронизация запущена, она может выполняться длительное время. После завершения вы получите уведомление)r   loadr   sync_last_datetimern   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)r/   r0   r1   r2   plugin.sync_enabledr.   r3   r   r4   r5   r6   rC   rG   default_branchr   rF   	last_syncr3   rE   r"   z::sync: load reposu&   Ошика синхронизации u   Не удалось подключиться к репозиторию. Проверьте настройки подключения и повторите попытку.Tr   rC   z::sync:   add new Repo rA   )rE   rC   r3   F)r   webhook_namer4   insecure_sslsecretz::sync:   del Repo )r'   r_   r`   ri   rj   rl   rC   r   available_reposCmfAuthErrorlogging	exceptionr   r   popr3   rF   r!   r"   r$   rn   r   setup_webhookr   r   r4   r5   r6   rv   rA   )	r   r{   r@   local_reposavalilable_repos	repo_datarC   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)rG   etaglast_modifiedrF   rA   F)rE   r@   r"   rF   )rE   r@   rA   r"   z::sync:   add new Branch rI   Tz::sync:   change data Branch z: z old=z new=rK   rL   r   )rK      rM   rN   rO   z::sync:   add z new commits from Branch z::sync:   update task rQ   rR   rS   rU   z::sync:   del Branch )rA   numberhead_branch_name	head_repohead_shabase_branch_name	base_repobase_shar   r   author_nameauthor_loginr   author_ext_idrr   status	mergeablemerged	merge_sha	merged_atmerged_by_namemerged_by_loginmerged_by_ext_idrG   	additions	deletionsrJ   rW   rX   rY   rZ   openrC   )rE   r@   r   rF   r"   )	only_openr[   z ::sync:   add new Merge Request r\   z::sync:   change data MR )r   z::sync:   close Merge Request r   z$::sync:   close Merge Request data: z::sync:   del Merge Request )$ri   rk   slistrA   get_branchesrC   r   r   rp   r'   r!   r$   rn   rF   getattrrf   r"   ro   iter_commitsr,   rq   rr   rs   r   rN   rt   
cmf_commitrv   rw   rx   ry   get_merge_requestsr&   r   get_merge_requestr   )r   r@   r{   r   branch_sync_fieldsr}   r~   r   have_changesrA   r*   r   need_changecommits_countr)   r(   r   mr_sync_fieldsr   	local_mrsr   rC   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                 `    d }|r)t         j                  j                  ddd|gdd|gg      }|S )NORlogin=email)filter)ri   r   rf   )clsrE   git_id	git_login	git_emailgit_namepersons          r   find_personzCmfPluginGit.find_person  s@    %%))$#y8QT[]`bkSl1m)nFr   z(?P<code>[A-Z\d]+-\d+)c                 Z    t         j                  j                  ||| j                        S )u   
        Нужно в тексте найти все потенциальные коды. Можно просто все слова...
        )r"   r.   )ri   CmfTaskrq   r.   )r   rr   r"   s      r   rq   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 }t6        j9                  |j:                   ddd      5  t        j<                  j                  |g d      D ]  }	t        j                  | d|	        |	j>                  st        j                  | d|	 d       E	 t        j                  d|	 t        j                         |jA                  |	|       |	jB                  j-                          |	j                  d        	 d d d        |j                  j                  jD                  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 }~8d }~ww xY w# t&        $ rB}d}| d|j1                          }t        j(                  d|       t+                Y d }~d }~ww xY w# 1 sw Y   xY w)!Nr   )r   zplugin.*r/   r0   r1   r2   r   r.   r3   r   r4   r5   r6   rO   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;      r=   r   r   z::sync: repo z::sync: Skip repo z (sync=False)u;   Синхронизируем гит репозиторий TrS   zSync %s errorz& first sync Success, enable auto sync!success)#	tracebackri   r   rl   r]   r^   r   INFOr   
class_namer   sync_enabledsync_statusrn   commit_with_eventr   r   ager   rb   r   rollback_purge_eventset_nowsync_last_error_datetime
format_excsync_last_error_messager`   rg   rh   r   rj   r   r   r   is_null)
r   r  rE   r   periodr+   r{   
has_errorsr  r@   s
             r   r   zCmfPluginGit.sync_all_plugins  s    	 !--22 ;k2 l R	 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 JMM?,!?_ab %"--22#-j 3  %D :,mD6 BC#yyGGzl2DTF-$XY$%GG&abfag$h*1,, $ 8&00v> NN224 III5%%0   --55:,&LMN15
!!.!!'',,t,<%."))113%,"))113282K2K/16.KKMeR	 4  	!!";VD$&%,"))113282K2K/453b9M9M9O8P1Q.!#	D  ) %)-J'(cI,@,@,B+C$DE#--ovF02$%#% %sQ   2O
A)R5/A&Q'R5
	Q$BQQ$'	R2	07R-	'R5-R2	2R55R?	)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   )NNNNN)F)"__name__
__module____qualname__modulesr   r"   cmf_plugin_gitr   api_methodsr   r   r,   r   r   r   r   r   rn   r`   r   r   r   classmethodr	  recompileASCII_TASK_CODE_SEARCH_RErq   staticmethodcmf_deferred_jobr   r'  __classcell__)r   s   @r   r   r      s    ++$$33@@LL$P
 
K= VpE !!_	&<Y6pbH   ::&?J^ LV  M V p #( < <r   r   )r   urllib.parser   r   flaskr   cmf.include!modules.git.fields.cmf_plugin_gitr,  r   r"   r-  r   r   r   r   <module>r;     s;         (R<7;;%%44AA R<r   