U
    g~_                     @   sP   d dl Z d dlZd dlZd dlmZ d dlT d dlZG dd dej	j
jjZdS )    N)Response)*c                       s   e Zd Zejjjjjddg Zdd Z	dd Z
dd Zd	d
 Zdd Zdd Zdd Z fddZ fddZdd Zdd Zdd Zd,ddZed-ddZed ejZd.d!d"Zeed#d#d$d%d&d' Zd(d) fd*d+
Z   Z!S )/CmfPluginGitsyncsync_repo_listc              
   C   sJ   t j}d| dtj| jjj dtj| jj	j dtj| j	j S )Nzhttps://z/pub/webhook?token=z&name=z&plugin=)
ZconfigZAPP_FQDNurllibparsequoteplugintokenvaluewebhookcode)selfhostname r   &./modules/git/models/cmf_plugin_git.pywebhook_url   s    zCmfPluginGit.webhook_urlc                 C   s   | j jS N)idr   r   r   r   r   webhook_ext_name   s    zCmfPluginGit.webhook_ext_namec                 C   s   |  D ]\}}||jkrz$|dkr0|dd}t||| W q tk
r } z<|dkrdt|krt||d  t|  d|  n|W 5 d }~X Y qX q|S )NZauthor_emailz@@@u6   Неправильный формат ввода emailuN   ::sync: author_email. Неправильный формат ввода email: )itemsfieldsreplacesetattrZCmfValidationErrorstrprint)r   commitcommit_datakeyr   er   r   r   _set_commit_data   s    
zCmfPluginGit._set_commit_datac                 K   s  t |  d | dddddddd	d
dg
 |  }z| }W n6 tk
rx   td ttj ttj	dd  Y nX |
dd}tj| j dddd t |  d|d d  d|d d  d tjj
| |d d d}dd tjj| |ddgd D }|
d!g D ]}|d }|
|}	|	sPt|  d"|  tj| ||d#}	| D ]"\}
}|
|	jkrXt|	|
| qXt  |	  W 5 Q R X qi }|
d$}|r|D ]}tjj| |d% d&r qltj| |d'}| ||}t  |  W 5 Q R X | j|jjd(gd)D ]H}||jj|}|j| t|  d*|j jd d+  d,| d- qqt|  d.t!| d- |" D ]F}tj#$|d/d0 t  |jdd1 W 5 Q R X tj#$|d/d2 q|
d3g D ]}|d }tj%j
| ||d4d5d6d7d8gd9}|s2t|  d:|  tj%| ||d;}d<|_&| D ]"\}
}|
|jkr@t||
| q@t  |  W 5 Q R X qW 5 Q R X |S )=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,     timeoutZblocking_timeoutz$.webhook_call: update data for repo reponame(ext_id))
git_pluginr8   c                 S   s   i | ]}|j j|qS r   r6   r   .0branchr   r   r   
<dictcomp>E   s     z-CmfPluginGit.webhook_call.<locals>.<dictcomp>deletedurlr:   r5   r   Zbranchesz .webhook_call:   add new Branch r:   r5   r6   Zcommitsshar:   rD   r:   r5   git_commitsr   z.webhook_call:   add bind    z to z new commits.z.webhook_call:   add new updatebefore_saveZ	only_data
after_saveZmerge_requestsr   head_branchbase_branchauthor	merged_by)r:   r5   r8   r   z'.webhook_call:   add new Merge Request r:   r5   r8   F)'gdebugload_fields_get_driverZprocess_webhook_request	Exceptionr   ZrequestZheadersdatagetcmfutilCmfLockr   models
CmfGitRepoCmfGitBranchlistr   r   r   disable_aclsaveCmfGitCommitsgetr#   find_related_taskstextr   
setdefaultrG   appendrD   lenvaluesCmfAutomationCrudTrigger	crud_hookCmfGitMergeRequestr@   )r   _kwargsdriverZrequest_datar.   r5   local_branchesbranch_datar6   r>   r!   r   task_to_saveZcommits_datar    r   taskmr_datar8   mrr   r   r   webhook_call*   s            
$  



.
  
 zCmfPluginGit.webhook_callc              
   C   s   t jd| j d| j ddd}|jt j  |jdd}|	  || j
_| j
	  t j| jd|| j d| j d| j d| j d	d
	 | _d S )Nu   Интеграция :T)r6   systemZ
user_localF)Zalert u.   Интеграция с Git сервером (z).)Z	hook_typerw   
token_userr6   re   )r\   	CmfPersonr)   r   Zrg_member_ofrg   Z
CmfWebhookZwebhook_person_groupZgenerate_webhook_tokenra   r
   r   r   )r   ry   r   r   r   r   _init_webhook   s"      
   zCmfPluginGit._init_webhookc                 C   s0   | j j}|s,tjd| jdd}|  || _ d S )Ngit  )r)   r6   sync_period)r
   r   r\   Z	CmfPluginr6   ra   r   r
   r   r   r   _calc_plugin   s
    zCmfPluginGit._calc_pluginc                 C   s   | j r| js|   d S r   )Zis_newr   r{   r   r   r   r   _calc_webhook   s    zCmfPluginGit._calc_webhookc                    s   t   dddg S )Nr
   r)   r   )supersave_preload_fieldsr   	__class__r   r   r      s    z CmfPluginGit.save_preload_fieldsc                    s:   |    |   | js,dtjddd| _t jf |S )Nr/   Z>qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM1234567890   )k)r   r   r,   joinrandomchoicesr   ra   )r   kwargsr   r   r   ra      s    
zCmfPluginGit.savec              	   C   s  d }| j dkrb| jjs*td|  ddd ddlm} t  | jj }W 5 Q R X ||d}nl| j d	kr| jjstd
|  ddd ddl	m} t  | jj }W 5 Q R X || jj
j| jjj|d}|std| j j d| j j dd| j j |S )NZgithubu.   У плагина интеграции Github uX    не указан токен доступа в конфигурации плагина.Tabortr   )Driver)r   Zgitlabu.   У плагина интеграции Gitlab )rA   Z
ssl_verifyr   u#   Не правильно задан r7   u)   ): допустимые значения r/   )r)   r
   Z	ext_token	cmf_alertZmodules.git.githubr   rZ   r`   ZdecryptZmodules.git.gitlabZext_urlr   Z
verify_sslZCmfErrorZcaptionr   r   )r   rn   r   r   r   r   r   rV      s<    

 


 
 &zCmfPluginGit._get_driverc                 C   s&   | j  j}d |_|  td d S )Nu   Синхронизация запущена, она может выполняться длительное время. После завершения вы получите уведомление)r
   loadr   sync_last_datetimera   r   r   r   r   r   r      s    zCmfPluginGit.syncc           	      C   s  t |  d | dddddddd	d
ddg |  }dd tjj| dddddddgdD }t |  d z| }W n2 tk
r   t	d| j
  tddd Y nX |D ]}|d }||d }|st |  d|d   tj| || jd}d|_| D ]"\}}||jkrt||| q|  |jr|j||  |  | jj| j| jjd q| D ](}t |  d |j  d|_|  qfd S )!Nz::sync: startr%   r&   r'   r(   plugin.sync_enabledr$   r)   r   r*   r+   r,   c                 S   s   i | ]}|j j|qS r   r8   r   )r=   r5   r   r   r   r?      s    z/CmfPluginGit.sync_repo_list.<locals>.<dictcomp>r8   rA   default_branchr   r@   	last_syncr:   r   z::sync: load reposu&   Ошика синхронизации u   Не удалось подключиться к репозиторию. Проверьте настройки подключения и повторите попытку.Tr   z::sync:   add new Repo r6   )r:   r8   r)   F)r   Zwebhook_namer*   Zinsecure_sslZsecretz::sync:   del Repo )r   rU   rV   r\   r]   r_   Zavailable_reposZCmfAuthErrorlogging	exceptionr   r   popr)   r@   r   r   r   ra   r   Zsetup_webhookr   r   r*   r   r+   r,   ri   r6   )	r   rn   Zlocal_reposZavalilable_reposZ	repo_datar8   r5   r!   r   r   r   r   r      sj               zCmfPluginGit.sync_repo_listNc              	   C   sB  i }dd t jj| |ddgdD }||jjD ]>}|d }||d }|srt|  d|  t j| ||d}d	|_|	 D ]\}}	||j
krt|||	 q|  t jj| |d
 drq2d}
|j|jj|dD ]}t jj| |d
 dr qV|
d7 }
t j| |d}| ||}|  | j|jjdgdD ]"}||jj|}|j| q0q|
r2t|  d|
 d|  q2| D ]2}t j|dd |jdd t j|dd q|| D ](}t|  d|j  d|_|  qdd t jj| |dddddgdD }|j|jjdd D ]|}|d! }||d }|sZt|  d"|  t j| ||d#}d	|_|	 D ]"\}}	||j
krht|||	 qh|  q| D ]}|jd$krq|j|jj|jjd%}|rt|  d&|j  d	|_|	 D ]"\}}	||j
krt|||	 qnt|  d'|j  d|_|  qd S )(Nc                 S   s   i | ]}|j j|qS r   r;   r<   r   r   r   r?     s     z*CmfPluginGit.sync_repo.<locals>.<dictcomp>r@   rA   rB   r6   z::sync:   add new Branch rC   FrD   rE   r   )rD      rF   rG   rH   z::sync:   add z new commits from Branch rJ   rK   TrL   rM   z::sync:   del Branch c                 S   s   i | ]}|j j|qS r   r   )r=   rt   r   r   r   r?   @  s     r   rN   rO   rP   rQ   )Z	only_openr8   z ::sync:   add new Merge Request rR   open)numberz::sync:   close Merge Request z::sync:   del Merge Request ) r\   r^   r_   Zget_branchesr8   r   r   r   r@   r   r   r   ra   rb   rc   Ziter_commitsr#   rd   re   rf   r   rG   rg   ri   rj   rk   r6   rl   Zget_merge_requestsstatusZget_merge_requestr   )r   r5   rn   rq   ro   rp   r6   r>   r!   r   Zcommits_countr    r   rr   Z	local_mrsrs   r8   rt   r   r   r   	sync_repo  s      
  zCmfPluginGit.sync_repoc                 C   s,   d }|r(t jjddd|gdd|ggd}|S )NORZlogin=Zemail)filter)r\   rz   rY   )clsr:   Zgit_idZ	git_loginZ	git_emailZgit_nameZpersonr   r   r   find_personb  s     zCmfPluginGit.find_personz(?P<code>[A-Z\d]+-\d+)c                 C   s   t jj||| jdS )u   
        Нужно в тексте найти все потенциальные коды. Можно просто все слова...
        )r   r$   )r\   ZCmfTaskrd   r$   )r   re   r   r   r   r   rd   k  s    zCmfPluginGit.find_related_tasksTz	@minutely)Z	only_onceZ
system_jobZschedulec                  C   s  t jjddddddddd	d
dddgdD ]} | jsPtt jj d|  d q(| jj}|jstd|_	|
  t  q(|jjp~d}|jr|jj|k rq(tt jj d|   t|  d z|   t  W nn tk
r< } zNtd| t  d|_	|j  |j|_t||_|
  t  W Y q(W 5 d }~X Y nX |  }d}d }tj| j dddd t jj| ddddd d!d	gd"D ]}t|  d#|  |jst|  d$| d% qz&| || |j  |j
d&d' W nH tk
r. } z(d&}|}td(| t  W Y qW 5 d }~X Y nX qW 5 Q R X | jjj rrt|  d) d&| j_| jjj
d&d' |sd*|_	|j  n"d|_	|j  |j|_t||_|
  t  q(d S )+Nr   zplugin.*r%   r&   r'   r(   r   r$   r)   r   r*   r+   r,   rH   z!.sync_all_plugins: !!! Skip sync z die no plugin configured.Zdisabledr}   z.sync_all_plugins: Try sync z::sync_all_plugins: startzsync_repo_list %s errorerrorFr0   r1      r3   r8   rA   r   r   r@   r   r   z::sync: repo z::sync: Skip repo z (sync=False)TrL   zSync %s errorz& first sync Success, enable auto sync!success)!r\   r   r_   r
   rS   rT   
class_namer   Zsync_enabledZsync_statusra   Zcommit_with_eventr~   r   Zager   rW   r   r   Zrollback_purge_eventZset_nowZsync_last_error_datetimer   Zsync_last_error_messagerV   rZ   r[   r   r]   r   r   r   Zis_null)r:   r
   Zperiodr"   rn   Z
has_errorsr   r5   r   r   r   sync_all_pluginsq  s         




*

zCmfPluginGit.sync_all_pluginsF)forcec                   s6   | j   | j j|ddi| t j|d|i|S )Nr   T)r   r   deleter   )r   r   argsr   r   r   r   r     s    
zCmfPluginGit.delete)N)NNNNN)N)"__name__
__module____qualname__modulesr|   r   cmf_plugin_gitr   Zapi_methodsr   r   r#   ru   r{   r   r   r   ra   rV   r   r   r   classmethodr   recompileASCIIZ_TASK_CODE_SEARCH_RErd   staticmethodZcmf_deferred_jobr   r   __classcell__r   r   r   r   r      s2    X6
^
Rr   )r   urllib.parser   r   Zflaskr   Zcmf.includeZ!modules.git.fields.cmf_plugin_gitr   r|   r   r   r   r   r   r   r   <module>   s   