U
    лhz                     @   s   d dl Z d dlZd dlm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
 dd	lmZ G d
d deZG dd dZdS )    N)fields)*)JiraBaseImport   )
exceptions)jqlLexer)	jqlParser)
jqlVisitorc                4       s  e Zd Zdejjddgdddejjdddejjddd	ejjd
ddd
idd
idejj	d
ddejj
ddgdddejjddgddejjdddejjdddejjddgddejjddd
dddgddejjddgdddd
idejjddgddddgddd
idd
id ejjdd!gdddd
idd
idd
id
d"gdd#ejjddgddd$ejjddgdddd
id%ejjddd&ejjd'gdd(ddgdd)dd
id
d*gdd+ejjdddd
idd
idd
idd
id,ejjdd-gdd.ejjddgddd/ejjddgddd0ejjddd1ejjdddd
id2ejjdd3gdd4ejjdd5gddd
idd
id6ejjd
ddd
idd
idd
idd
id73Z fd8d9Zd:d; Zd<d= Z d>d? Z!e"j#d@dAdBZ$e"j%d@dCdDZ&e"j'd@dEdFZ(e"j)d@dGdHZ*e"j+d@dIdJZ,e"j-d@dKdLZ.e"j/d@dMdNZ0e"j1d@dOdPZ2e"j3d@dQdRZ4e"j5d@dSdTZ6e"j7d@dUdVZ8e"j9d@dWdXZ:e"j;d@dYdZZ<e"j=d@d[d\Z>e"j?d@d]d^Z@e"jAd@d_d`ZBe"jCd@dadbZDe"jEd@dcddZFe"jGd@dedfZHe"jId@dgdhZJe"jKd@didjZLe"jMd@dkdlZNe"jOd@dmdnZPe"jQd@dodpZRe"jSd@dqdrZTe"jUd@dsdtZVe"jWd@dudvZXe"jYd@dwdxZZe"j[d@dydzZ\e"j]d@d{d|Z^e"j_d@d}d~Z`e"jad@ddZbe"jcd@ddZde"jed@ddZf  ZgS )JQLaffectedversionext_idnameT)r   	cmf_field	search_by	supported	approvals)r   r   r   assigneeattachmentsFr   comment	componentcreatedZcreateddate)r   r   r   aliasescreatordescriptiondueZduedateenvironmentZrequestZsavedfilterZsearchrequest)r   r   
fixversioncodeidZissuekey)r   r   r   r   r   tagsaliasZtimeoriginalestimateparent_taskz"epic link"priorityprojectZ
CmfProjectZtask_code_prefix)r   r   modelsr   r   ZtimeestimatereporterresolvedZresolutiondatesprintstatussummarytexttypeZ	issuetypeupdatedZupdateddatewatcher)3r   r   r   r   categoryzchange-gating-typer   r   r   r   r   r   r   filterr   ZhierarchylevelZissuekeyZ	issueLinkZissueLinkTypelabelsZ
lastViewedlevelZorganizationsZoriginalEstimateparentz	epic linkZparentprojectr#   r$   ZprojecttypeZremainingestimater&   zrequest-channel-typezrequest-last-activity-timezrequest typeZ
resolutionr'   r(   r)   r*   r+   Z	timespentr,   r-   ZvoterZvotesr.   ZworklogAuthorZworklogCommentZworklogDateZ	workRatioc                    s"   t    |j| _|| _|| _d S N)super__init__
cmf_importsource_hash
api_import)selfr9   r8   	__class__ ./modules/jira/jql/parser.pyr6     s    
zJQL.__init__c                    s2   | j  }|s.tt fdd| j  d }|S )Nc                    s    |  dg kS )Nr   )get)fr   r=   r>   <lambda>*      z JQL._get_field.<locals>.<lambda>)field_mappingr?   nextr0   values)r:   r   fieldr=   rA   r>   
_get_field%  s    
zJQL._get_fieldc                 C   s"   |j j }|jj}|j  ||S r4   )startstopZgetInputStreamgetText)r:   ctxrI   rJ   r=   r=   r>   	_get_text1  s    zJQL._get_textc              
   C   s   d }z| j |}W n6 tk
rJ } z| jj| d W 5 d }~X Y n:X | j j|ddd\}}|rn|j}n| jjd| d |S )NuG   . Возможно пользователь был удален в JiraF)Zcreateupdateu   Пользователь "u%   " не найден в системе)r9   Z_get_user_info_from_dump	Exceptionr7   loggerwarningZ_process_personr   )r:   Zuser_keyZ	user_codeZ	user_infoexcuser_r=   r=   r>   _get_user_code6  s    &zJQL._get_user_code)rL   c                 C   s   d}g }|  r| |  nd }| r8| | nd }|rZ||d 7 }||d  |r||d|d  7 }||d  ||fS )N ubql2bql )ZjqlWherevisitZ
jqlOrderByappend)r:   rL   rW   rX   whereorder_byr=   r=   r>   visitJqlQueryF  s    zJQL.visitJqlQueryc                 C   s   g }|  D ]}| |}|r|| q|s6|  S ddd |D }t|dkrd|d d }n0t|dkrdg}|dd |D  n|  }||d	S )
Nz OR c                 S   s   g | ]}|d  qS rW   r=   .0clauser=   r=   r>   
<listcomp>`  s     z(JQL.visitJqlOrClause.<locals>.<listcomp>r   r   rX   ORc                 S   s   g | ]}|d  qS rX   r=   r`   r=   r=   r>   rc   e  s     rW   rX   )ZjqlAndClauserZ   r[   defaultResultjoinlenextend)r:   rL   clausescZ
and_clauserW   rX   r=   r=   r>   visitJqlOrClauseV  s    
zJQL.visitJqlOrClausec                 C   s   g }|  D ]}| |}|r|| q|s6|  S ddd |D }t|dkrd|d d }n0t|dkrdg}|dd |D  n|  }||d	S )
Nz AND c                 S   s   g | ]}|d  qS r_   r=   r`   r=   r=   r>   rc   u  s     z)JQL.visitJqlAndClause.<locals>.<listcomp>r   r   rX   ZANDc                 S   s   g | ]}|d  qS re   r=   r`   r=   r=   r>   rc   z  s     rf   )jqlNotClauserZ   r[   rg   rh   ri   rj   )r:   rL   rk   rl   Z
not_clauserW   rX   r=   r=   r>   visitJqlAndClausek  s    
zJQL.visitJqlAndClausec                 C   s   |  r| |  }n.| r0| | }n| rF| | }|sR|  S |jrn|jj d|d  n|d |d d}|S )NrY   rW   rX   rf   )rn   rZ   ZjqlSubClauseZjqlTerminalClauserg   is_notr+   )r:   rL   rb   resultr=   r=   r>   visitJqlNotClause  s    "zJQL.visitJqlNotClausec                 C   s8   |  | }|s|  S d|d  d|d d}|S )N(rW   )rX   rf   )rZ   ZjqlOrClauserg   )r:   rL   Z	or_clauserq   r=   r=   r>   visitJqlSubClause  s    zJQL.visitJqlSubClausec              
   C   sF  z|  | }|  | }|d }|j}t|tjrXt| dt	j
sX| d}|d  d|d  ||d d |d d	 gd
}|d dkr|d d	 }|d d }ddd|ddgdd|ddgd||gd||gg}	|	|d< |W S  tk
r@ }
 z0| jj|
 d| | d |   W Y S d }
~
X Y nX d S )Nr   r   z.coder   rY   rW   rX   operatorvaluerf   r+   rd   r   =%rV   r   u   . Условие "/   " будет удалено из запроса)rZ   jqlFieldZjqlTerminalClauseRhs
class_name
issubclassr   Z
CmfRelBase
isinstancegetChildr   JqlFunctionContextreplacerO   r7   rP   rQ   rM   rg   )r:   rL   rG   t   terminal_сlauser   
field_namerq   Z	bql_valueZbql_operatorrX   rR   r=   r=   r>   visitJqlTerminalClause  s@    



	zJQL.visitJqlTerminalClausec                 C   sD   |  | }|  |d}| d|d  ||d dd}|S Nr   rY   rW   rX   rv   rw   rf   )rZ   ZjqlEqualsOperatorr   r:   rL   rv   rw   rq   r=   r=   r>   visitJqlEqualsClause  s    zJQL.visitJqlEqualsClausec                 C   sT   |  | }|  |d}|d  d|d  |d d|d  ddd}|S )Nr   rW   rY   rX   ry   r   rf   )rZ   ZjqlLikeOperatorr   r   r=   r=   r>   visitJqlLikeClause  s    zJQL.visitJqlLikeClausec                 C   sD   |  | }|  |d}| d|d  ||d dd}|S r   )rZ   ZjqlComparisonOperatorr   r   r=   r=   r>   visitJqlComparisonClause  s    zJQL.visitJqlComparisonClausec                 C   sx   |  | }|  |d}| d|d  ||d dd}t|dtjrt|  |  dkrtd|d d	< |S )
Nr   rY   rW   rX   r   rf   	membersOfZ	MEMBER_OFrv   )rZ   ZjqlInOperatorr   r~   r   r   ZjqlFunctionjqlFunctionNamer   r=   r=   r>   visitJqlInClause  s    zJQL.visitJqlInClausec                 C   sJ   |  | }|  | }|d  d|d  |d |d dd}|S )NrW   rY   rX   r   rf   )rZ   ZjqlIsOperatorZjqlEmpty)r:   rL   rv   emptyrq   r=   r=   r>   visitJqlIsClause  s    zJQL.visitJqlIsClausec                 C   s$   |  | }td| dd S Nu   Оператор "#   " не поддерживается)rZ   ZjqlWasOperatorr   ClauseErrorr:   rL   rv   r=   r=   r>   visitJqlWasClause  s    zJQL.visitJqlWasClausec                 C   s$   |  | }td| dd S r   )rZ   ZjqlWasInOperatorr   r   r   r=   r=   r>   visitJqlWasInClause  s    zJQL.visitJqlWasInClausec                 C   s$   |  | }td| dd S r   )rZ   ZjqlChangedOperatorr   r   r   r=   r=   r>   visitJqlChangedClause  s    zJQL.visitJqlChangedClausec                 C   s   |  S r4   rK   r:   rL   r=   r=   r>   visitJqlEqualsOperator  s    zJQL.visitJqlEqualsOperatorc                 C   s&   ddd}|  ||  d}|S )NILIKEz	NOT ILIKE)~z!~rf   )rK   r?   )r:   rL   Zoperator_mappingrq   r=   r=   r>   visitJqlLikeOperator  s    zJQL.visitJqlLikeOperatorc                 C   s   |  S r4   r   r   r=   r=   r>   visitJqlComparisonOperator*  s    zJQL.visitJqlComparisonOperatorc                 C   s   |  rdS dS )NzNOT ININZNOTr   r=   r=   r>   visitJqlInOperator-  s    zJQL.visitJqlInOperatorc                 C   s&   |  rdnd|  rdndd}|S )NzIS NOTZIS!=rx   rf   r   r:   rL   rq   r=   r=   r>   visitJqlIsOperator0  s    zJQL.visitJqlIsOperatorc                 C   s   |  rdS dS )NzWAS NOTZWASr   r   r=   r=   r>   visitJqlWasOperator7  s    zJQL.visitJqlWasOperatorc                 C   s   |  rdS dS )Nz
WAS NOT INzWAS INr   r   r=   r=   r>   visitJqlWasInOperator:  s    zJQL.visitJqlWasInOperatorc                 C   s   |  S r4   r   r   r=   r=   r>   visitJqlChangedOperator=  s    zJQL.visitJqlChangedOperatorc                 C   s\  |  r| |  dddd}| | }|rT|d std| dqtjj	dd| gd	d
gd}|rt
|jttjt
|jd}qtd| dnH| r| | }t
|jttjt
|jd}ntd| d|d }|	dg }|s*t|dr*|jr*||j |sPt|drP|jrP||j ||d< |S )N'rV   "r   u
   Поле "r   Zcaptionr   r   field_custom_typer0   r   )r   r   u!   Неизвестное поле "r   r%   model)Z	jqlStringrZ   r   rH   lowerr   Z
FieldErrorr%   CmfCustFieldr?   strr   getattrCmfTaskZUnknownFieldErrorZjqlCustomFieldhasattrr   r[   rj   )r:   rL   Zstring_fieldrG   custom_fieldr   field_modelsr=   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 )N::Zcf_rT   rd   r   r   r   r   r   u+   Пользовательское поле "z" (   ) не найдено)Z	POSNUMBERr8   r   r%   r   r?   r   ZCustomFieldError)r:   rL   field_idfield_ext_idr   r   r=   r=   r>   visitJqlCustomFieldg  s    zJQL.visitJqlCustomFieldc                 C   s   |  S r4   r   r   r=   r=   r>   visitJqlStringy  s    zJQL.visitJqlStringc                 C   s   dd d}|S )NZEMPTYrf   r=   r   r=   r=   r>   visitJqlEmpty|  s    zJQL.visitJqlEmptyc              
   C   sN  d }|  dddd}zV|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 5 d }~X Y nX |d }|j}	|dg }
|d}d }|	d	krt|}d| d|d
}n|	dkrbtjjdd|gddd ggd}|sNtjjddd| dgddd ggd}|rt|j}nt|tjtjtjfrtd|r|d| d
}|d dkrd| |d< n|}n.d|
kr| |}n|
r|rdg}|
D ]}|D ]}|dkrd|	dkr| j d| }n,|	dkr:| j d | }n| j d!| }|ddd"| d"g n||d| g qt|j|d}|r|j} qqnH|j r|j!d#kr|rtj"|dd$d%}n|}d| d|d
}n|}|st
d&|	 d'| d(t#|t$k	r"d| dn|d) t#|t$k	r>t|n|d d
}|S )*Nr   rV   r   u1   Невозможно найти значение z. r   r%   r   r#   rf   
logic_typer   r   r   r   r0   r!   ZLIKEz%"z"%z^-?[0-9]+(w|d|h|m?)( +)?$now()r   -znow()+rX   Z	CmfPersonrd   )affected_versionsfix_versionsz
::version:r)   z%::r   ry   Z	CmfChoice    )seplengthu   Для поля "uI   " не найден вариант для замены значения "uE   ", возможно объект еще не импортированrW   )%rK   r   Z	parentCtxr~   r   JqlTerminalClauseContextrZ   r{   JqlListContextrO   
ValueErrorr|   r?   r   Z_get_priorityr%   ZCmfLogicTyper   r   r}   r   ZCmfDateTimeZCmfDateZCmfTimerematchrU   r8   r[   ZcmfutilZget_model_by_namesgetZcustomZwidgetZtranslit_stripr,   dict)r:   rL   Z	new_valueZcurrent_valuer3   rG   Zlist_parentrR   r   r   r   r   objZpriority_keyr   Zfilter_Zfield_modelZsearch_fieldr   Z
choice_keyrq   r=   r=   r>   visitJqlValue  s    &









 zJQL.visitJqlValuec                 C   s   |  | }|dkr&| dd}np|dkrl|  | }|rRdd| dn|  dd	 |D d}n*|d
kr| dd}ntd| d|S )NZcurrentUserZ__G_CURRENT_USERrf   r   z
membersOf(, rt   c                 S   s    g | ]}| d d ddqS )r   rV   r   )r   )ra   argr=   r=   r>   rc     s     z(JQL.visitJqlFunction.<locals>.<listcomp>Znowr   u   Функция "r   )rZ   r   rK   ZjqlArgumentListrh   rg   r   ZFunctionError)r:   rL   Zfunction_namerq   Zargument_listr=   r=   r>   visitJqlFunction  s     zJQL.visitJqlFunctionc                 C   s   |  S r4   r   r   r=   r=   r>   visitJqlFunctionName  s    zJQL.visitJqlFunctionNamec                 C   s.   g }|  D ]}| |}|r|| q|S r4   )ZjqlArgumentrZ   r[   )r:   rL   argsargumentr   r=   r=   r>   visitJqlArgumentList  s    
zJQL.visitJqlArgumentListc                 C   s   g }|  D ]d}z| |}|r*|| W q tk
rn } z$| jj| d| | d W 5 d }~X Y qX q|std| | ddd	dd |D  d	d
d |D d}|S )Nu   . Операнд "u-   " будет удален из условияu   Для операндов 'u   ' не найдены варианты для замены, возможно объекты еще не импортированыrs   r   c                 S   s   g | ]}|d  qS r_   r=   ra   operandr=   r=   r>   rc      s     z$JQL.visitJqlList.<locals>.<listcomp>rt   c                 S   s   g | ]}|d  qS re   r=   r   r=   r=   r>   rc   !  s     rf   )
Z
jqlOperandrZ   r[   rO   r7   rP   rQ   rM   r   rh   )r:   rL   ZoperandsZjql_operandr   rR   rq   r=   r=   r>   visitJqlList  s$    
zJQL.visitJqlListc                 C   s   |  S r4   r   r   r=   r=   r>   visitJqlArgument&  s    zJQL.visitJqlArgumentc                 C   sj   g }|  D ]}| |}|r|| q|s6|  S dddd |D  dddd |D gd}|S )	Nz	ORDER BY r   c                 S   s   g | ]}|d  qS r_   r=   ra   rG   r=   r=   r>   rc   5  s     z'JQL.visitJqlOrderBy.<locals>.<listcomp>r]   rx   c                 S   s   g | ]}|d  qS re   r=   r   r=   r=   r>   rc   6  s     rf   )ZjqlSearchSortrZ   r[   rg   rh   )r:   rL   r   rl   rq   r=   r=   r>   visitJqlOrderBy)  s    
zJQL.visitJqlOrderByc              
   C   s   zf|  | }|d }|d }|jr8| d|jj n||jrX|jjdkrXd|j n|jd}|W S  tk
r } z0| jj| d| 	| d | 
  W Y S d }~X Y nX d S )	Nr   r   rY   ZDESCr   rf   u'   . Условие сортировки "rz   )rZ   r{   orderr+   r|   rO   r7   rP   rQ   rM   rg   )r:   rL   rG   r   r   rq   rR   r=   r=   r>   visitJqlSearchSort;  s    "zJQL.visitJqlSearchSort)h__name__
__module____qualname__r%   r   r   Zapprovers_forZresponsibler   Zcomments
componentsZcmf_created_atZ
cmf_authorr+   Zdeadliner   r   r    r"   r#   r$   Z	cmf_ownerZstatus_closed_atZlistsr)   r   r   Zcmf_modified_atZ
spectatorsrD   r6   rH   rM   rU   r   ZJqlQueryContextr^   ZJqlOrClauseContextrm   ZJqlAndClauseContextro   ZJqlNotClauseContextrr   ZJqlSubClauseContextru   r   r   ZJqlEqualsClauseContextr   ZJqlLikeClauseContextr   ZJqlComparisonClauseContextr   ZJqlInClauseContextr   ZJqlIsClauseContextr   ZJqlWasClauseContextr   ZJqlWasInClauseContextr   ZJqlChangedClauseContextr   ZJqlEqualsOperatorContextr   ZJqlLikeOperatorContextr   ZJqlComparisonOperatorContextr   ZJqlInOperatorContextr   ZJqlIsOperatorContextr   ZJqlWasOperatorContextr   ZJqlWasInOperatorContextr   ZJqlChangedOperatorContextr   ZJqlNonNumberFieldContextr   ZJqlCustomFieldContextr   ZJqlStringContextr   ZJqlEmptyContextr   ZJqlValueContextr   r   r   ZJqlFunctionNameContextr   ZJqlArgumentListContextr   r   r   ZJqlArgumentContextr   ZJqlOrderByContextr   ZJqlSearchSortContextr   __classcell__r=   r=   r;   r>   r
      s    
       

                )'f	r
   c                   @   s.   e Zd Zdd Zdd Zd	eedddZdS )
JQLNormalizerc                 C   s
   || _ d S r4   )_api_import)r:   r9   r=   r=   r>   r6   O  s    zJQLNormalizer.__init__c           
      C   sH   t |}t|}t |}t|}| }t| j|d}||}	|	S )Nr9   r8   )	antlr4ZInputStreamr   ZCommonTokenStreamr   ZjqlQueryr
   r   rZ   )
r:   jqlr8   Zinput_streamZlexerstreamparserZtreeZvisitorrq   r=   r=   r>   get_modifiedR  s    


zJQLNormalizer.get_modifiedN)r   r8   c                 C   s  |pd}t | j|d}g }|D ]}|dr|dd}|d\}}| d| }| d|  }	tjjdd	d
|	gdd
|ggd}
|
r|	|	 n| jj
jd|	 d| d q|| }|r|d r|	|d j n| jj
jd| d q| jj
jd| d q|S )Nry   r   Zcustomfield_ZcustomfieldcfrT   r   rd   r   r   r   r   u+   Пользовательское поле 'z' (r   r   r   u
   Поле 'u#   ' не поддерживаетсяu!   Неизвестное поле 'r   )r
   r   
startswithr   splitr   r%   r   r   r[   r7   rP   rQ   rH   r|   )r:   r   r8   r   Zsupported_fieldsrG   rT   r   r   r   r   Zmapped_fieldr=   r=   r>   convert_fieldsa  sD    





zJQLNormalizer.convert_fields)N)r   r   r   r6   r   listr   r   r=   r=   r=   r>   r   N  s   r   )r   r   Zcmfr   Zcmf.includeZmodules.jira.base_importr   rV   r   r   r   r	   r
   r   r=   r=   r=   r>   <module>   s          D