U
    "cD                     @   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   s  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p 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 ]}|jdd' qT|
d(g D ]}|d }tj j
| |d)d*d+d,d-gd}|st|  d.|  tj | ||d/}d0|_!| D ]"\}
}|
|jkrt||
| q|  qtW 5 Q R X |S )1Nz.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.Z	only_dataZ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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_typerc   
token_userr!   rP   )rF   	CmfPersonr   r   Zrg_member_ofrR   Z
CmfWebhookZwebhook_person_groupZgenerate_webhook_tokenrL   r   r   r
   )r   re   r   r   r   r   _init_webhookf   s"      
   zCmfPluginGit._init_webhookc                 C   s.   | j j}|s*tjd| jd}|  || _ d S )Ngit)r   r!   )r   r	   rF   Z	CmfPluginr!   rL   )r   r   r   r   r   _calc_pluginv   s
    zCmfPluginGit._calc_pluginc                 C   s   | j r| js|   d S r   )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_fieldsr   	__class__r   r   rl      s    z CmfPluginGit.save_preload_fieldsc                    s:   |    |   | js,dtjddd| _t jf |S )Nr   Z>qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM1234567890   )k)ri   rj   r   joinrandomchoicesrk   rL   )r   kwargsrm   r   r   rL      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.githubrv   r	   ZCmfErrorZcaptionrq   rs   )r   rW   rv   r   r   r   r?      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 r6   )rA   r>   r?   rD   rE   r   rF   rG   rI   Zavailable_repospopr,   rJ   r/   rK   rL   rz   rR   Zsetup_webhookr   r   r   r	   rw   r   rT   r!   	sync_repor{   Zset_now)	r   rW   Zlocal_reposZto_sync_reposZ	repo_datar#   r    rZ   r	   r   r   r   rz      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 ]}|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,   r-   r.   r!   z::sync:   add new Branch r0   Fr1   r2   r   )r1      r3   r4   r5   z::sync:   add z new commits from Branch Tr6   z::sync:   del Branch c                 S   s   i | ]}|j j|qS r   ry   )r)   r`   r   r   r   r+     s     r   r7   r8   r9   r:   )Z	only_openr#   z ::sync:   add new Merge Request r;   open)numberz::sync:   close Merge Request z::sync:   del Merge Request )rF   rH   rI   Zget_branchesr#   r	   r|   rA   r,   rJ   r/   rK   rL   rM   rN   Ziter_commitsrO   rP   rQ   r   r4   rR   rT   r!   rU   Zget_merge_requestsstatusZget_merge_requestr   )r   r    rW   r[   rX   rY   r!   r*   rZ   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)rF   rf   rC   )clsr&   Zgit_idZ	git_loginZ	git_emailZgit_nameZpersonr   r   r   find_person5  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findallrF   ZCmfTaskrI   )r   rP   r/   Zcodesr   r   r   rO   >  s    	zCmfPluginGit.find_related_tasks)N)NNNNN)N)__name__
__module____qualname__r   r   ra   rg   ri   rj   rl   rL   r?   rz   r}   classmethodr   recompileASCIIr   rO   __classcell__r   r   rm   r   r   
   s    Q9
]r   )Zurllib.parser   rr   Zflaskr   Zcmf.includeZ!modules.git.fields.cmf_plugin_gitmodulesrh   r/   Zcmf_plugin_gitr   r   r   r   r   <module>   s
   