B
    ZfZ                 @   sb   d dl Z d dlT ddlmZ ddlmZ ddlmZ ddlmZ G dd	 d	eZG d
d dZdS )    N)*   )
exceptions)jqlLexer)	jqlParser)
jqlVisitorc            8       s  e Zd Zddddgdddddd	d
ddddgddddddddddidddddddgddddddddddd
ddddgdddddddddddddddddiddddgddddidddddgddddiddidd dd!gddddiddiddiddid"d"dddgddd"d#dddgddd$ddd%d&dd'ddgddd(ddd)ddd)ddd*d
ddddgddddiddiddid+ddd+d,ddd-dddgddd.d/ddgddddddddd0ddd(d1ddgddd(d2d1ddgddd3ddd3d4ddddiddid5d
ddddgddddiddiddiddid67Z fd7d8Zd9d: Zd;d< Zejd=d>d?Z	ej
d=d@dAZejd=dBdCZejd=dDdEZejd=dFdGZejd=dHdIZejd=dJdKZejd=dLdMZejd=dNdOZejd=dPdQZejd=dRdSZejd=dTdUZej d=dVdWZ!ej"d=dXdYZ#ej$d=dZd[Z%ej&d=d\d]Z'ej(d=d^d_Z)ej*d=d`daZ+ej,d=dbdcZ-ej.d=dddeZ/ej0d=dfdgZ1ej2d=dhdiZ3ej4d=djdkZ5ej6d=dldmZ7ej8d=dndoZ9ej:d=dpdqZ;ej<d=drdsZ=ej>d=dtduZ?ej@d=dvdwZAejBd=dxdyZCejDd=dzd{ZEejFd=d|d}ZGejHd=d~dZIejJd=ddZK  ZLS )JQLaffected_versionsZCmfListext_idnameT)fieldmodel	search_by	supportedZapprovers_for)r   r   Zresponsible	CmfPersonZloginZemailattachmentsFzparent.categoryr   ZcommentsZ
componentsZCmfComponentZcmf_created_atcreated)r   replace_field_namer   Z	cmf_ownertextZdeadlineduefix_versionscodeZCmfTask)r   r   r   r   r   ZtagsZCmfTagaliasZparent_taskz"epic link"priorityparentZ
CmfProjectZtask_code_prefixZ
logic_typeZremaining_estimateZ
cmf_authorZstatus_closed_atresolvedZlistsstatusZ	CmfStatusztimetracker_history.time_spentZCmfLogicTypetypeZcmf_modified_atupdatedZ
spectators)7ZaffectedversionZ	approvalsZassigneer   categoryzchange-gating-typecommentZ	componentr   ZcreateddateZcreatordescriptionr   ZduedateZenvironmentfilterZ
fixversionZhierarchylevelZissuekeyZ	issueLinkZissueLinkTypelabelsZ
lastViewedlevelZorganizationsZoriginalEstimater   z	epic linkr   ZprojectZprojecttypeZremainingestimateZtimeestimateZreporterzrequest-channel-typezrequest-last-activity-timeZ
resolutionr   ZresolutiondateZsprintr   Zsummaryr   Z	timespentr   Z	issuetyper   ZupdateddateZvoterZvotesZwatcherZworklogAuthorZworklogCommentZworklogDateZ	workRatioc                s.   t    |j| _t| jjjj| _|| _d S )N)super__init__
cmf_importstrZpluginsource_hash
api_import)selfjira_import)	__class__ ./modules/jira/jql/parser.pyr&      s    
zJQL.__init__c             C   s"   |j j }|jj}|j  ||S )N)startstopZgetInputStreamgetText)r+   ctxr0   r1   r.   r.   r/   	_get_text&  s    zJQL._get_textc          
   C   s   d }y| j |}W n6 tk
rJ } z| jj| d W d d }~X Y nBX | j j|ddd\}}|rvd|j d}n| jjd| d |S )NuG   . Возможно пользователь был удален в JiraF)Zcreateupdate"u   Пользователь "u%   " не найден в системе)r*   Z_get_user_info_from_dump	Exceptionr'   loggerwarningZ_process_personr   )r+   Zuser_keyZ	user_codeZ	user_infoexcuser_r.   r.   r/   _get_user_code+  s    &zJQL._get_user_code)r3   c             C   sX   d}|  r| |  nd }| r4| | nd }|rD||7 }|rT|d| 7 }|S )N  )ZjqlWherevisitZ
jqlOrderBy)r+   r3   ZquerywhereZorder_byr.   r.   r/   visitJqlQuery;  s    zJQL.visitJqlQueryc             C   sD   g }x(|  D ]}| |}|r|| qW |r<d|S |  S )Nz OR )ZjqlAndClauser@   appendjoindefaultResult)r+   r3   clausescZ
and_clauser.   r.   r/   visitJqlOrClauseH  s    
zJQL.visitJqlOrClausec             C   sD   g }x(|  D ]}| |}|r|| qW |r<d|S |  S )Nz AND )jqlNotClauser@   rC   rD   rE   )r+   r3   rF   rG   Z
not_clauser.   r.   r/   visitJqlAndClauseQ  s    
zJQL.visitJqlAndClausec             C   sr   |  r| |  }n.| r0| | }n| rF| | }|rf|jrb|jj d| S |S |  S d S )Nr?   )rI   r@   ZjqlSubClauseZjqlTerminalClauseis_notr   rE   )r+   r3   Zclauser.   r.   r/   visitJqlNotClauseZ  s    zJQL.visitJqlNotClausec             C   s&   |  | }|rd| dS |  S )N())r@   ZjqlOrClauserE   )r+   r3   Z	or_clauser.   r.   r/   visitJqlSubClauseg  s    zJQL.visitJqlSubClausec          
   C   sz   y.|  | }|  | }|d  d| S  tk
rt } z(| jj| d| | d |  S d }~X Y nX d S )Nr   r?   u   . Условие "u/   " будет удалено из запроса)	r@   jqlFieldZjqlTerminalClauseRhsr7   r'   r8   r9   r4   rE   )r+   r3   r   t   terminal_сlauser:   r.   r.   r/   visitJqlTerminalClausek  s    zJQL.visitJqlTerminalClausec             C   s,   |  | }|  |d}| d| S )Nr   r?   )r@   ZjqlEqualsOperatorgetChild)r+   r3   operatorvaluer.   r.   r/   visitJqlEqualsClausev  s    zJQL.visitJqlEqualsClausec             C   s,   |  | }|  |d}| d| S )Nr   r?   )r@   ZjqlLikeOperatorrR   )r+   r3   rS   rT   r.   r.   r/   visitJqlLikeClause|  s    zJQL.visitJqlLikeClausec             C   s,   |  | }|  |d}| d| S )Nr   r?   )r@   ZjqlComparisonOperatorrR   )r+   r3   rS   rT   r.   r.   r/   visitJqlComparisonClause  s    zJQL.visitJqlComparisonClausec             C   s8   |  | }|  |d}|r0| d| S |  S )Nr   r?   )r@   ZjqlInOperatorrR   rE   )r+   r3   rS   rT   r.   r.   r/   visitJqlInClause  s    zJQL.visitJqlInClausec             C   s*   |  | }|  | }| d| S )Nr?   )r@   ZjqlIsOperatorZjqlEmpty)r+   r3   rS   emptyr.   r.   r/   visitJqlIsClause  s    zJQL.visitJqlIsClausec             C   s$   |  | }td| dd S )Nu   Оператор "u#   " не поддерживается)r@   ZjqlWasOperatorr   ClauseError)r+   r3   rS   r.   r.   r/   visitJqlWasClause  s    zJQL.visitJqlWasClausec             C   s$   |  | }td| dd S )Nu   Оператор "u#   " не поддерживается)r@   ZjqlWasInOperatorr   r[   )r+   r3   rS   r.   r.   r/   visitJqlWasInClause  s    zJQL.visitJqlWasInClausec             C   s$   |  | }td| dd S )Nu   Оператор "u#   " не поддерживается)r@   ZjqlChangedOperatorr   r[   )r+   r3   rS   r.   r.   r/   visitJqlChangedClause  s    zJQL.visitJqlChangedClausec             C   s   |  S )N)r2   )r+   r3   r.   r.   r/   visitJqlEqualsOperator  s    zJQL.visitJqlEqualsOperatorc             C   s   |  S )N)r2   )r+   r3   r.   r.   r/   visitJqlLikeOperator  s    zJQL.visitJqlLikeOperatorc             C   s   |  S )N)r2   )r+   r3   r.   r.   r/   visitJqlComparisonOperator  s    zJQL.visitJqlComparisonOperatorc             C   s   |  rdS dS )NzNOT ININ)NOT)r+   r3   r.   r.   r/   visitJqlInOperator  s    zJQL.visitJqlInOperatorc             C   s   |  rdS dS )NzIS NOTZIS)rc   )r+   r3   r.   r.   r/   visitJqlIsOperator  s    zJQL.visitJqlIsOperatorc             C   s   |  rdS dS )NzWAS NOTZWAS)rc   )r+   r3   r.   r.   r/   visitJqlWasOperator  s    zJQL.visitJqlWasOperatorc             C   s   |  rdS dS )Nz
WAS NOT INzWAS IN)rc   )r+   r3   r.   r.   r/   visitJqlWasInOperator  s    zJQL.visitJqlWasInOperatorc             C   s   |  S )N)r2   )r+   r3   r.   r.   r/   visitJqlChangedOperator  s    zJQL.visitJqlChangedOperatorc             C   s  |  r| |  dddd}| j| }|rn|ddrZ|d||d}qtd| d	qtj	jd
d| gddgd}|rt
|jt
|jdd}qtd| dnB| r| | }t
|jt
|jdd}ntd| d|S )N'r>   r6   r   Fr   )r   mapped_fieldu
   Поле "u#   " не поддерживаетсяZcaptionILIKEr   field_custom_type)r"   fieldsT)r   r   customu!   Неизвестное поле ")Z	jqlStringr@   replacefield_mappinggetlowerr   Z
FieldErrormodelsCmfCustFieldr(   r   rl   ZUnknownFieldErrorZjqlCustomField)r+   r3   Zstring_fieldrj   r   
cust_fieldZcustom_fieldr.   r.   r/   visitJqlNonNumberField  s.    




zJQL.visitJqlNonNumberFieldc             C   st   |  }| j d| }d| d| j  }tjjddd|gdd|ggddgd	}|sptd
| d| d|S )Nz::Zcf_r<   ORr   rk   r
   rl   )r"   rm   u+   Пользовательское поле "z" (u   ) не найдено)Z	POSNUMBERr)   rr   rs   rt   rq   r   ZCustomFieldError)r+   r3   Zfield_idZfield_ext_id
field_nameru   r.   r.   r/   visitJqlCustomField  s    
zJQL.visitJqlCustomFieldc             C   s   |  S )N)r2   )r+   r3   r.   r.   r/   visitJqlString  s    zJQL.visitJqlStringc             C   s   |  S )N)r2   )r+   r3   r.   r.   r/   visitJqlEmpty  s    zJQL.visitJqlEmptyc             C   sn  d }|  dddd}yV|jj}t|tjrB| | }n.t|tjrp|jj}t|tjrp| | }W n6 t	k
r } zt
d| d| W d d }~X Y nX |dr|d d}|d d}	|d d	}
d }|d
kr$dddddddddddddd}d||| d}n|	dkr:| |}n|	r|
rdg}x|
D ]}|dkr|dkr|| j d| }n,|dkr| j d| }n| j d| }|ddd| dg n||d| g qRW t|	j|d}|r
t|j}nd| d}nB|drB|ddkr4| |}nd| d}nd| d}|sjt
d | d!| d"|S )#Nri   r>   r6   u1   Невозможно найти значение z. rj   r   r   r   r   u   Минимальныйu   Низкийu   Обычныйu   Высокийu   Критичныйu   Блокирующий)ZLowestu   Самый низкийu   НизшийZLowu   Низкийu   СреднийZMediumZHighu   Высокийu   Высшийu   НаивысшийZHighestu   Критическийr   rw   r
   )r	   r   z
::version:r   z%::z::rk   %)r"   rn   r   )r;   Zusersu   Для поля "uI   " не найден вариант для замены значения "uE   ", возможно объект еще не импортирован)r2   ro   Z	parentCtx
isinstancer   JqlTerminalClauseContextr@   rP   JqlListContextr7   
ValueErrorrq   r=   r)   rC   ZcmfutilZget_model_by_namesgetr(   r   )r+   r3   Z	new_valueZcurrent_valuer   r   Zlist_parentr:   rx   r   r   objZpriority_mappingZfilter_Zsearch_fieldr
   r.   r.   r/   visitJqlValue  st    &





zJQL.visitJqlValuec             C   sh   |  | }|dkr| S |dkrR|  | }|rJdd| dS |  S td| dd S )NZcurrentUserZ	membersOfrM   z, rN   u   Функция "u#   " не поддерживается)r@   ZjqlFunctionNamer2   ZjqlArgumentListrD   rE   r   ZFunctionError)r+   r3   Zfunction_nameZargument_listr.   r.   r/   visitJqlFunctionA  s    zJQL.visitJqlFunctionc             C   s   |  S )N)r2   )r+   r3   r.   r.   r/   visitJqlFunctionNameL  s    zJQL.visitJqlFunctionNamec             C   s2   g }x(|  D ]}| |}|r|| qW |S )N)ZjqlArgumentr@   rC   )r+   r3   argsargumentargr.   r.   r/   visitJqlArgumentListO  s    
zJQL.visitJqlArgumentListc             C   sL   g }x(|  D ]}| |}|r|| qW |rDdd| dS |  S )NrM   z, rN   )Z
jqlOperandr@   rC   rD   rE   )r+   r3   ZoperandsZoperandresultr.   r.   r/   visitJqlListX  s    
zJQL.visitJqlListc             C   s   |  S )N)r2   )r+   r3   r.   r.   r/   visitJqlArgumenta  s    zJQL.visitJqlArgumentc             C   sJ   g }x(|  D ]}| |}|r|| qW |rBdd| S |  S )Nz	ORDER BY z, )ZjqlSearchSortr@   rC   rD   rE   )r+   r3   Zsearch_sortrG   r   r.   r.   r/   visitJqlOrderByd  s    
zJQL.visitJqlOrderByc          
   C   s~   y2|  | }|d }|jr0| d|jj S |S  tk
rx } z(| jj| d| | d | 	 S d }~X Y nX d S )Nr   r?   u'   . Условие сортировки "u/   " будет удалено из запроса)
r@   rP   orderr   r7   r'   r8   r9   r4   rE   )r+   r3   r   rx   r:   r.   r.   r/   visitJqlSearchSortn  s    zJQL.visitJqlSearchSort)M__name__
__module____qualname__rp   r&   r4   r=   r   ZJqlQueryContextrB   ZJqlOrClauseContextrH   ZJqlAndClauseContextrJ   ZJqlNotClauseContextrL   ZJqlSubClauseContextrO   r~   rQ   ZJqlEqualsClauseContextrU   ZJqlLikeClauseContextrV   ZJqlComparisonClauseContextrW   ZJqlInClauseContextrX   ZJqlIsClauseContextrZ   ZJqlWasClauseContextr\   ZJqlWasInClauseContextr]   ZJqlChangedClauseContextr^   ZJqlEqualsOperatorContextr_   ZJqlLikeOperatorContextr`   ZJqlComparisonOperatorContextra   ZJqlInOperatorContextrd   ZJqlIsOperatorContextre   ZJqlWasOperatorContextrf   ZJqlWasInOperatorContextrg   ZJqlChangedOperatorContextrh   ZJqlNonNumberFieldContextrv   ZJqlCustomFieldContextry   ZJqlStringContextrz   ZJqlEmptyContextr{   ZJqlValueContextr   ZJqlFunctionContextr   ZJqlFunctionNameContextr   ZJqlArgumentListContextr   r   r   ZJqlArgumentContextr   ZJqlOrderByContextr   ZJqlSearchSortContextr   __classcell__r.   r.   )r-   r/   r      sR  




		&K		
r   c               @   s   e Zd Zdd Zdd ZdS )JQLNormalizerc             C   s
   || _ d S )N)_jira_import)r+   r,   r.   r.   r/   r&   {  s    zJQLNormalizer.__init__c       	      C   sF   t |}t|}t |}t|}| }t| jd}||}|S )N)r,   )	antlr4ZInputStreamr   ZCommonTokenStreamr   ZjqlQueryr   r   r@   )	r+   ZjqlZinput_streamZlexerstreamparserZtreeZvisitorr   r.   r.   r/   get_modified~  s    


zJQLNormalizer.get_modifiedN)r   r   r   r&   r   r.   r.   r.   r/   r   z  s   r   )	r   Zcmf.includer>   r   r   r   r   r   r   r.   r.   r.   r/   <module>   s       s