U
    scG                     @   sH   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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edddZ  ZS ) CmfPluginGitc              
   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              
   K   s0  t |  d | dddddg |  }z| }W n6 tk
rn   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 ]t}|d }|
|}	|	sFt|  d|  tj| ||d}	| D ]"\}
}|
|	jkrNt|	|
| qN|	  qi }|
d}|rL|D ]}tjj| |d  d!r q4tj| |d"}| D ]"\}
}|
|jkrt||
| q|  | j|jjd#gd$D ]"}||jj|}|j| qqt|  d%t| d& | D ]2}tj !|d'd( |jdd) tj !|d'd* qT|
d+g D ]}|d }tj"j
| |d,d-d.d/d0gd}|st|  d1|  tj"| ||d2}d3|_#| D ]"\}
}|
|jkrt||
| q|  qW 5 Q R X |S )4Nz.webhook_call: startplugin.ext_tokentyper
   webhook_ext_id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_pluginr#   c                 S   s   i | ]}|j j|qS r   r!   r	   .0branchr   r   r   
<dictcomp>0   s     z-CmfPluginGit.webhook_call.<locals>.<dictcomp>deletedurlr&   r    fieldsZbranchesz .webhook_call:   add new Branch r&   r    r!   Zcommitsshar&   r1   r&   r    git_commitsr/   z.webhook_call:   add new z new commits.updatebefore_saveZ	only_data
after_saveZmerge_requestsr   head_branchbase_branchauthor	merged_byz'.webhook_call:   add new Merge Request r&   r    r#   F)$gdebugload_fields_get_driverZprocess_webhook_request	ExceptionprintZrequestZheadersdatagetcmfutilCmfLockr   models
CmfGitRepoCmfGitBranchlistitemsr/   setattrsaveCmfGitCommitsgetfind_related_taskstextr	   
setdefaultr4   appendlenvaluesCmfAutomationCrudTrigger	crud_hookCmfGitMergeRequestr,   )r   _kwargsdriverZrequest_datar   r    local_branchesbranch_datar!   r*   keyr	   task_to_saveZcommits_datacommit_datacommittaskmr_datar#   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)r!   systemZ
user_localF)Zalert u.   Интеграция с Git сервером (z).)Z	hook_typerh   
token_userr!   rS   )rI   	CmfPersonr   r   Zrg_member_ofrU   Z
CmfWebhookZwebhook_person_groupZgenerate_webhook_tokenrO   r   r   r
   )r   rj   r   r   r   r   _init_webhooki   s"      
   zCmfPluginGit._init_webhookc                 C   s.   | j j}|s*tjd| jd}|  || _ d S )Ngit)r   r!   )r   r	   rI   Z	CmfPluginr!   rO   )r   r   r   r   r   _calc_pluginy   s
    zCmfPluginGit._calc_pluginc                 C   s   | j r| js|   d S r   )Zis_newr
   rl   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   rq      s    z CmfPluginGit.save_preload_fieldsc                    s:   |    |   | js,dtjddd| _t jf |S )Nr   Z>qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM1234567890   )k)rn   ro   r   joinrandomchoicesrp   rO   )r   kwargsrr   r   r   rO      s    
zCmfPluginGit.savec              	   C   sz   d }| j dkrF| jjs*td|  ddd ddlm} || jjjd}|svtd	| j j d
| j j dd	| j j
 |S )NZgithubu.   У плагина интеграции Github uX    не указан токен доступа в конфигурации плагина.T)abortr   )Driver)r   u#   Не правильно задан r"   u)   ): допустимые значения r   )r   r   Z	ext_tokenZ	cmf_alertZmodules.git.githubr{   r	   ZCmfErrorZcaptionrv   rx   )r   r\   r{   r   r   r   rB      s    

 &zCmfPluginGit._get_driverc           	   
   C   s  t |  d | dddddddg |  }tj| j d	d
ddh dd tjj| ddddddgdD }g }t |  d |	 D ]}|d }|
|d }|st |  d|d   tj| |d}d|_| D ]\}}||jkrt||| q|  |jr|| |j||  |  | jj| j| jjd q| D ](}t |  d|j  d|_|  qB|D ]:}t |  d|  | || |j  |jdd qpW 5 Q R X d S ) Nz::sync: startr   zplugin.tokenr   r
   r   webhook_insecure_sslr   r   r      r   c                 S   s   i | ]}|j j|qS r   r#   r	   )r)   r    r   r   r   r+      s    z%CmfPluginGit.sync.<locals>.<dictcomp>r#   r-   Zdefault_branchsyncr,   	last_sync)r&   r/   z::sync: load reposz::sync:   add new Repo r!   r%   F)r   Zwebhook_namer   Zinsecure_sslZsecretz::sync:   del Repo Tz::sync: repo r8   )rD   rA   rB   rG   rH   r   rI   rJ   rL   Zavailable_repospopr,   rM   r/   rN   rO   r   rU   Zsetup_webhookr   r   r   r	   r|   r   rW   r!   	sync_repor   Zset_now)	r   r\   Zlocal_reposZto_sync_reposZ	repo_datar#   r    r_   r	   r   r   r   r      sd         

  
zCmfPluginGit.syncNc              	   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}|	 D ]"\}}	||j
krt|||	 q|  | j|jjdgdD ]"}||jj|}|j| qPq|
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rt|||	 q|  q:| D ]}|jd$krԐq|j|jj|jjd%}|r8t|  d&|j  d	|_|	 D ]"\}}	||j
krt|||	 qn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,   r-   r.   r!   z::sync:   add new Branch r0   Fr1   r2   r   )r1      r3   r4   r5   z::sync:   add z new commits from Branch r6   r7   Tr8   r9   z::sync:   del Branch c                 S   s   i | ]}|j j|qS r   r~   )r)   re   r   r   r   r+     s     r   r:   r;   r<   r=   )Z	only_openr#   z ::sync:   add new Merge Request r>   open)numberz::sync:   close Merge Request z::sync:   del Merge Request )rI   rK   rL   Zget_branchesr#   r	   r   rD   r,   rM   r/   rN   rO   rP   rQ   Ziter_commitsrR   rS   rT   r   r4   rU   rW   rX   rY   r!   rZ   Zget_merge_requestsstatusZget_merge_requestr   )r   r    r\   r`   r]   r^   r!   r*   r_   r	   Zcommits_countra   rb   rc   Z	local_mrsrd   r#   re   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   rk   rF   )clsr&   Zgit_idZ	git_loginZ	git_emailZgit_nameZpersonr   r   r   find_person;  s     zCmfPluginGit.find_personz(?P<code>[A-Z\d]+-\d+)c                 C   s"   | j |}tjjdd|g|dS )u  
        Нужно в тексте найти все потенциальные коды. Можно просто все слова...
        Какие сложности:
            - код может быть практически любым max_len = 64
            - в имени ветки нельзя пробелы
        ОСВ: код вначале, и содержит ^([A-Z0-9]+-[0-9]+).*
        r   IN)r   r/   )_TASK_CODE_SEARCH_REfindallrI   ZCmfTaskrL   )r   rS   r/   Zcodesr   r   r   rR   D  s    	zCmfPluginGit.find_related_tasks)N)NNNNN)N)__name__
__module____qualname__r   r   rf   rl   rn   ro   rq   rO   rB   r   r   classmethodr   recompileASCIIr   rR   __classcell__r   r   rr   r   r   
   s    T9
`r   )Zurllib.parser   rw   Zflaskr   Zcmf.includeZ!modules.git.fields.cmf_plugin_gitmodulesrm   r/   Zcmf_plugin_gitr   r   r   r   r   <module>   s
   