B
    Zf,X                 @   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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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syncc          
   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parseZquoteplugintokenvaluewebhookcode)selfZ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   x|  D ]\}}||jkr
y$|dkr2|dd}t||| W q
 tk
r } z<|dkrdt|krt||d  t|  d|  n|W d d }~X Y q
X q
W |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
 |  }y| }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 }x|
d!g D ]}|d }|
|}	|	sRt|  d"|  tj| ||d#}	x.| D ]"\}
}|
|	jkr\t|	|
| q\W t  |	  W d Q R X qW i }|
d$}|rx|D ]}tjj| |d% d&rP tj| |d'}| ||}t  |  W d Q R X x`| j|jjd(gd)D ]H}||jj|}|j| t|  d*|j jd d+  d,| d- q&W qW t|  d.t!| d- xR|" D ]F}tj#$|d/d0 t  |jdd1 W d Q R X tj#$|d/d2 qW x|
d3g D ]}|d }tj%j
| ||d4d5d6d7d8gd9}|sDt|  d:|  tj%| ||d;}d<|_&x.| D ]"\}
}|
|jkrTt||
| qTW t  |  W d Q R X qW W d Q R X |S )=Nz.webhook_call: startprojectszplugin.ext_tokenzplugin.tokenzplugin.ext_urlzplugin.verify_ssltyper   webhook_ext_idwebhook_insecure_sslwebhook_secretzWebhook error, call params:T)flushresponse z::lock::synci,     )timeoutblocking_timeoutz$.webhook_call: update data for repo reponame(ext_id))
git_pluginr-   c             S   s   i | ]}||j jqS r   )r+   r
   ).0branchr   r   r   
<dictcomp>E   s   z-CmfPluginGit.webhook_call.<locals>.<dictcomp>deletedurl)r/   r*   r   Zbranchesz .webhook_call:   add new Branch )r/   r*   r+   Zcommitssha)r/   r5   )r/   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_saveZmerge_requestsr   head_branchbase_branchauthor	merged_by)r/   r*   r-   r   z'.webhook_call:   add new Merge Request )r/   r*   r-   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
   
setdefaultr6   appendr5   lenvaluesCmfAutomationCrudTrigger	crud_hookCmfGitMergeRequestr3   )r   Z_kwargsdriverZrequest_datar%   r*   local_branchesbranch_datar+   r1   r   r
   task_to_saveZcommits_datar   r   taskmr_datar-   mrr   r   r   webhook_call*   s    

(




2

"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)r+   systemZ
user_localF)Zalert u.   Интеграция с Git сервером (z).)Z	hook_typerc   
token_userr+   rR   )rI   	CmfPersonr    r   Zrg_member_ofrT   Z
CmfWebhookZwebhook_person_groupZgenerate_webhook_tokenrN   r   r	   r   )r   re   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giti  )r    r+   sync_period)r   r
   rI   Z	CmfPluginr+   rN   )r   r   r   r   r   _calc_plugin   s
    zCmfPluginGit._calc_pluginc             C   s   | j r| js|   d S )N)Zis_newr   rg   )r   r   r   r   _calc_webhook   s    zCmfPluginGit._calc_webhookc                s   t   dddg S )Nr   r    r   )supersave_preload_fields)r   )	__class__r   r   rm      s    z CmfPluginGit.save_preload_fieldsc                s:   |    |   | js,dtjddd| _t jf |S )Nr&   Z>qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM1234567890   )k)rj   rk   r#   joinrandomchoicesrl   rN   )r   kwargs)rn   r   r   rN      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 d Q R X ||d}nl| j d	kr| jjstd
|  ddd ddl	m} t  | jj }W d 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 )r4   Z
ssl_verifyr	   u#   Не правильно задан r,   u)   ): допустимые значения r&   )r    r   Z	ext_token	cmf_alertZmodules.git.githubrv   rG   rM   ZdecryptZmodules.git.gitlabZext_urlr
   Z
verify_sslZCmfErrorZcaptionrq   rs   )r   rZ   rv   r	   r   r   r   rC      s.    



*zCmfPluginGit._get_driverc       
      C   sN  t |  d | dddddddd	d
ddg |  }tj| j dddd dd tjj| dddddddgdD }g }t |  d y|	 }W n2 t
k
r   td| j  tddd Y nX x|D ]}|d }||d }|st |  d|d    tj| || jd!}d"|_x.| D ]"\}}	||jkr(t|||	 q(W |  |jr|| |j||  |  | jj| j| jjd# qW x4| D ](}t |  d$|j  d|_|  qW xB|D ]:}t |  d%|  |  || |j!"  |jdd& qW W d Q R X | j#j$j%rJt&'|  d' d| j#_$| j#jjdd& d S )(Nz::sync: startzplugin.ext_tokenzplugin.tokenzplugin.ext_urlzplugin.verify_sslzplugin.sync_enabledr   r    r   r!   r"   r#   z::lock::synci,     )r(   r)   c             S   s   i | ]}||j jqS r   )r-   r
   )r0   r*   r   r   r   r2      s   z%CmfPluginGit.sync.<locals>.<dictcomp>r-   r4   Zdefault_branchr   r3   	last_sync)r/   r   z::sync: load reposu&   Ошика синхронизации u   Не удалось подключиться к репозиторию. Проверьте настройки подключения и повторите попытку.T)ru   z::sync:   add new Repo r+   )r/   r-   r    F)r   Zwebhook_namer!   Zinsecure_sslZsecretz::sync:   del Repo z::sync: repo )r:   z& first sync Success, enable auto sync!)(r   rB   rC   rG   rH   r   rI   rJ   rL   Zavailable_reposZCmfAuthErrorlogging	exceptionrw   popr    r3   r   r   r   rN   r   rT   Zsetup_webhookr   r   r!   r
   r"   r#   rV   r+   	sync_repory   set_nowr   sync_enabledZis_nullr@   rA   )
r   rZ   Zlocal_reposZto_sync_reposZavalilable_reposZ	repo_datar-   r*   r   r
   r   r   r   r      sb    


	

zCmfPluginGit.syncNc          	   C   sh  i }dd t jj| |ddgdD }xZ||jjD ]F}|d }||d }|svt|  d|  t j| ||d}d	|_x*|	 D ]\}}	||j
krt|||	 qW |  t jj| |d
 drq6d}
x|j|jj|dD ]}t jj| |d
 drP |
d7 }
t j| |d}| ||}|  x:| j|jjdgdD ]"}||jj|}|j| q8W qW |
r6t|  d|
 d|  q6W x>| D ]2}t j|dd |jdd t j|dd qW x4| D ](}t|  d|j  d|_|  qW dd t jj| |dddddgdD }x|j|jjdd D ]}|d! }||d }|srt|  d"|  t j| ||d#}d	|_x.|	 D ]"\}}	||j
krt|||	 qW |  q2W x| D ]}|jd$krԐq|j|jj|jjd%}|r<t|  d&|j  d	|_xJ|	 D ]"\}}	||j
krt|||	 qW nt|  d'|j  d|_|  qW d S )(Nc             S   s   i | ]}||j jqS r   )r+   r
   )r0   r1   r   r   r   r2     s   z*CmfPluginGit.sync_repo.<locals>.<dictcomp>r3   r4   )r/   r*   r   r+   z::sync:   add new Branch )r/   r*   r+   Fr5   )r/   r5   r   )r5      )r/   r*   r6   )r   z::sync:   add z new commits from Branch r8   r9   T)r:   r;   z::sync:   del Branch c             S   s   i | ]}||j jqS r   )r-   r
   )r0   r`   r   r   r   r2   I  s   r   r<   r=   r>   r?   )Z	only_openr-   z ::sync:   add new Merge Request )r/   r*   r-   open)numberz::sync:   close Merge Request z::sync:   del Merge Request ) rI   rK   rL   Zget_branchesr-   r
   r|   r   r3   r   r   r   rN   rO   rP   Ziter_commitsr   rQ   rR   rS   r   r6   rT   rV   rW   rX   r+   rY   Zget_merge_requestsstatusZget_merge_requestr   )r   r*   rZ   r]   r[   r\   r+   r1   r   r
   Zcommits_countr   r   r^   Z	local_mrsr_   r-   r`   r   r   r   r}     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)rI   rf   rF   )clsr/   Zgit_idZ	git_loginZ	git_emailZgit_nameZpersonr   r   r   find_personk  s     zCmfPluginGit.find_personz(?P<code>[A-Z\d]+-\d+)c             C   s   t jj||| jdS )u   
        Нужно в тексте найти все потенциальные коды. Можно просто все слова...
        )r   r   )rI   ZCmfTaskrQ   r   )r   rR   r   r   r   r   rQ   t  s    zCmfPluginGit.find_related_tasksTz	@minutely)Z	only_onceZ
system_jobZschedulec              C   s>  x6t jjddgdD ]} | js>tt jj d|  d q| jj}|jsbd|_	|
  t  q|jjpld}|jr|jj|k rqtt jj d|   y|   d	|_	|j  W np ttfk
r    Y nX tk
r& } z8td
| t  d|_	|j  |j|_t||_W d d }~X Y nX |
  t  qW d S )Nr   zplugin.*)r   z!.sync_all_plugins: !!! Skip sync z die no plugin configured.Zdisabledi  z.sync_all_plugins: Try sync successzSync %s errorerror)rI   r   rL   r   r@   rA   
class_namer
   r   Zsync_statusrN   Zcommit_with_eventri   Zsync_last_datetimeZager   r~   
SystemExitKeyboardInterruptrD   rz   r{   Zrollback_purge_eventZsync_last_error_datetimer   Zsync_last_error_message)r/   r   Zperiodr   r   r   r   sync_all_pluginsz  s<    
zCmfPluginGit.sync_all_pluginsF)forcec               s6   | j   | j j|ddi| t j|d|i|S )Nr   T)r   loaddeleterl   )r   r   argsrt   )rn   r   r   r     s    
zCmfPluginGit.delete)N)NNNNN)N)!__name__
__module____qualname__modulesrh   r   cmf_plugin_gitr   Zapi_methodsr   r   r   ra   rg   rj   rk   rm   rN   rC   r   r}   classmethodr   recompileASCIIZ_TASK_CODE_SEARCH_RErQ   staticmethodZcmf_deferred_jobr   r   __classcell__r   r   )rn   r   r      s*   XF
^
&r   )rz   Zurllib.parser   rr   Zflaskr   Zcmf.includeZ!modules.git.fields.cmf_plugin_gitr   rh   r   r   r   r   r   r   r   <module>   s   