U
    +Liӓ                     @   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,ejjddgddd-ejjdd.gdd/ejjddgdd0gdd1ejjddgddd2ejjddd3ejjdddd
id4ejjdd5gdd6ejjdd7gddd
idd
id8ejjdddd
idd
idd
idd
id93Z fd:d;Zd<d= Z d>d? Z!d@dA Z"dBdC Z#e$j%dDdEdFZ&e$j'dDdGdHZ(e$j)dDdIdJZ*e$j+dDdKdLZ,e$j-dDdMdNZ.e$j/dDdOdPZ0e$j1dDdQdRZ2e$j3dDdSdTZ4e$j5dDdUdVZ6e$j7dDdWdXZ8e$j9dDdYdZZ:e$j;dDd[d\Z<e$j=dDd]d^Z>e$j?dDd_d`Z@e$jAdDdadbZBe$jCdDdcddZDe$jEdDdedfZFe$jGdDdgdhZHe$jIdDdidjZJe$jKdDdkdlZLe$jMdDdmdnZNe$jOdDdodpZPe$jQdDdqdrZRe$jSdDdsdtZTe$jUdDdudvZVe$jWdDdwdxZXe$jYdDdydzZZe$j[dDd{d|Z\e$j]dDd}d~Z^e$j_dDddZ`e$jadDddZbe$jcdDddZde$jedDddZfe$jgdDddZh  ZiS )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
resolutionresolvedZresolutiondatesprintu   спринтstatussummarytexttypeZ	issuetypeupdatedZupdateddate
spectators)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 typer'   r(   r)   r*   r+   r,   Z	timespentr-   r.   ZvoterZvotesZwatcherZworklogAuthorZworklogCommentZworklogDateZ	workRatioc                    s"   t    |j| _|| _|| _d S N)super__init__
cmf_importsource_hash
api_import)selfr:   r9   	__class__ ./modules/jira/jql/parser.pyr7   #  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@   nextr1   values)r;   r   fieldr>   rB   r?   
_get_field)  s    
zJQL._get_fieldc                 C   s0   t tjj|rdS t tjj|d r(dS dS d S )NTZ_idF)hasattrr%   CmfTaskZdp_model)r;   
field_namer>   r>   r?   _is_sortable5  s
    zJQL._is_sortablec                 C   s"   |j j }|jj}|j  ||S r5   )startstopZgetInputStreamgetText)r;   ctxrN   rO   r>   r>   r?   	_get_text=  s    zJQL._get_textc              
   C   s|   d }z| j |}W n0 tk
rD } zt| dW 5 d }~X Y n4X | j j|ddd\}}|rh|j}ntd| d|S )NuG   . Возможно пользователь был удален в JiraF)Zcreateupdateu   Пользователь 'u%   ' не найден в системе)r:   Z_get_user_info_from_dump	ExceptionZ_process_personr   )r;   Zuser_keyZ	user_codeZ	user_infoexcuser_r>   r>   r?   _get_user_codeB  s     zJQL._get_user_code)rQ   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;   rQ   rZ   r[   whereorder_byr>   r>   r?   visitJqlQueryR  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 rZ   r>   .0clauser>   r>   r?   
<listcomp>l  s     z(JQL.visitJqlOrClause.<locals>.<listcomp>r   r   r[   ORc                 S   s   g | ]}|d  qS r[   r>   rc   r>   r>   r?   rf   q  s     rZ   r[   )ZjqlAndClauser]   r^   defaultResultjoinlenextend)r;   rQ   clausescZ
and_clauserZ   r[   r>   r>   r?   visitJqlOrClauseb  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 rb   r>   rc   r>   r>   r?   rf     s     z)JQL.visitJqlAndClause.<locals>.<listcomp>r   r   r[   ANDc                 S   s   g | ]}|d  qS rh   r>   rc   r>   r>   r?   rf     s     ri   )jqlNotClauser]   r^   rj   rk   rl   rm   )r;   rQ   rn   ro   Z
not_clauserZ   r[   r>   r>   r?   visitJqlAndClausew  s    
zJQL.visitJqlAndClausec                 C   s   |  r| |  }n.| r0| | }n| rF| | }|sR|  S |jrn|jj d|d  n|d |d d}|S )Nr\   rZ   r[   ri   )rr   r]   ZjqlSubClauseZjqlTerminalClauserj   is_notr,   )r;   rQ   re   resultr>   r>   r?   visitJqlNotClause  s    "zJQL.visitJqlNotClausec                 C   s8   |  | }|s|  S d|d  d|d d}|S )N(rZ   )r[   ri   )r]   ZjqlOrClauserj   )r;   rQ   Z	or_clauseru   r>   r>   r?   visitJqlSubClause  s    zJQL.visitJqlSubClausec              
   C   s  z|  | }|d }|j}t|tj}|  | }|d d }|d d }| d}	t|	t	j
}
t|	t	j}t|	t	j}|
rt|tjr||dg}|dkrd||||gg}n|r|dkrd	nd
}|||g}nt|tjrr|dkr|rg }| D ]\}}|dkr\|r<|||dkr0d	nd
d g n|||dkrPdndd g nz|dkr~|| d||g nX|dkr|D ]H\}}|dkr||r| dn|d|g n||||gg qqt|dkr|d }n(t|dkrp|d|dkrdnd nT|dkrB|r6| dn|||g}n.|dkrPdnd}|sd| dn|||gg}n|d dkrddd|ddgdd|ddgd||gd||gg}n|dkrf|rfg }| D ]N\}}|dkr|||dkrdndd g n|dkr||||g qt|dkr<|d }n(t|dkrp|d|dkr^dnd n
|||g}|d  d|d  |d}|W S  tk
r } z2| jjd| | d | d! |   W Y S d }~X Y nX d S )"Nr   r[   operatorvaluer   rY   =rg   z
NOT EXISTSZEXISTS)INNOT INemptyr}   !=rG   z.code	functions	membersOf	MEMBER_OFr   rq   r~   r   r,   r   %r   r\   rZ   ri   u   Условие '&   ' удалено из запроса. .)r]   jqlField
class_name
issubclassr   Z
CmfM2MBaseZjqlTerminalClauseRhsgetChild
isinstancer   JqlEmptyContextJqlListContextJqlFunctionContextZCmfStrZ
CmfRelBaseitemsr^   rl   insertreplacerT   r8   loggerwarningrR   rj   )r;   rQ   rH   r   rL   Zis_m2m_fieldt   terminal_сlauseZbql_operatorZ	bql_valueoperandZis_empty_operandZis_list_operandZis_function_operandZ
bql_resultZ
value_typerG   function_namer{   ru   rU   r>   r>   r?   visitJqlTerminalClause  s    










zJQL.visitJqlTerminalClausec                 C   sD   |  | }|  |d}| d|d  ||d dd}|S Nr   r\   rZ   r[   rz   r{   ri   )r]   ZjqlEqualsOperatorr   r;   rQ   rz   r{   ru   r>   r>   r?   visitJqlEqualsClause  s    zJQL.visitJqlEqualsClausec                 C   s   |  | }|  |d}t|dtj}|rL|d dkrDdnd|d< |d  d|d  |d |rr|d nd|d  dd	d
}|S )Nr   r[   ILIKEr|   r   rZ   r\   r   r   ri   )r]   ZjqlLikeOperatorr   r   r   r   )r;   rQ   rz   r{   Zis_empty_valueru   r>   r>   r?   visitJqlLikeClause)  s    zJQL.visitJqlLikeClausec                 C   sD   |  | }|  |d}| d|d  ||d dd}|S r   )r]   ZjqlComparisonOperatorr   r   r>   r>   r?   visitJqlComparisonClause;  s    zJQL.visitJqlComparisonClausec                 C   s   |  | }|  |d}| d|d  ||d dd}t|dtjr|  |  dkr|dkrt	d	| d
d|d d< |S )Nr   r\   rZ   r[   r   ri   r   r~   uV   Функция 'membersOf' не поддерживается с оператором ''r   rz   )
r]   ZjqlInOperatorr   r   r   r   ZjqlFunctionjqlFunctionNamer   ClauseErrorr   r>   r>   r?   visitJqlInClauseI  s    
zJQL.visitJqlInClausec                 C   sJ   |  | }|  | }|d  d|d  |d |d dd}|S )NrZ   r\   r[   r   ri   )r]   ZjqlIsOperatorZjqlEmpty)r;   rQ   rz   r   ru   r>   r>   r?   visitJqlIsClause_  s    zJQL.visitJqlIsClausec                 C   s$   |  | }td| dd S Nu   Оператор '#   ' не поддерживается)r]   ZjqlWasOperatorr   r   r;   rQ   rz   r>   r>   r?   visitJqlWasClausem  s    zJQL.visitJqlWasClausec                 C   s$   |  | }td| dd S r   )r]   ZjqlWasInOperatorr   r   r   r>   r>   r?   visitJqlWasInClauseq  s    zJQL.visitJqlWasInClausec                 C   s$   |  | }td| dd S r   )r]   ZjqlChangedOperatorr   r   r   r>   r>   r?   visitJqlChangedClauseu  s    zJQL.visitJqlChangedClausec                 C   s   |  S r5   rP   r;   rQ   r>   r>   r?   visitJqlEqualsOperatory  s    zJQL.visitJqlEqualsOperatorc                 C   s&   ddd}|  ||  d}|S )Nr   z	NOT ILIKE)~z!~ri   )rP   r@   )r;   rQ   Zoperator_mappingru   r>   r>   r?   visitJqlLikeOperator|  s    zJQL.visitJqlLikeOperatorc                 C   s   |  S r5   r   r   r>   r>   r?   visitJqlComparisonOperator  s    zJQL.visitJqlComparisonOperatorc                 C   s   |  rdS dS )Nr~   r}   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ISr   r|   ri   r   r;   rQ   ru   r>   r>   r?   visitJqlIsOperator  s    zJQL.visitJqlIsOperatorc                 C   s   |  rdS dS )NzWAS NOTZWASr   r   r>   r>   r?   visitJqlWasOperator  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 r5   r   r   r>   r>   r?   visitJqlChangedOperator  s    zJQL.visitJqlChangedOperatorc                 C   sl  |  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< | |j|d< |S )Nr   rY   "r   
   Поле 'r   Zcaptionr   r   field_custom_typer1   r   )r   r   !   Неизвестное поле 'r   r%   modelsortable)Z	jqlStringr]   r   rI   lowerr   
FieldErrorr%   CmfCustFieldr@   strr   getattrrK   ZUnknownFieldErrorZjqlCustomFieldrJ   r   r^   rm   rM   r   )r;   rQ   Zstring_fieldrH   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_rW   rg   r   r   r   r   r   +   Пользовательское поле '' (   ) не найдено)Z	POSNUMBERr9   r   r%   r   r@   r   ZCustomFieldError)r;   rQ   field_idfield_ext_idrL   r   r>   r>   r?   visitJqlCustomField  s    zJQL.visitJqlCustomFieldc                 C   s   |  S r5   r   r   r>   r>   r?   visitJqlString  s    zJQL.visitJqlStringc                 C   s   dd d}|S )NZEMPTYri   r>   r   r>   r>   r?   visitJqlEmpty  s    zJQL.visitJqlEmptyc              
   C   s  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 }z4|	d	kr| j|\}}d| d|d
}n|	dkrntjjdd|gddd ggd}|sZt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rp|	dkr*| j d| }n,|	dkrF| j d | }n| j d!| }|ddd"| d"g n||d| g q t|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&W n> t	k
rF } zt
d'| d(|	 d| W 5 d }~X Y nX t#|t$k	rbd| dn|d) t#|t$k	r~t|n|d d
}|S )*Nr   rY   r   u2   Невозможно найти значение 'z'. r   r%   r   r#   ri   
logic_typer   r   r   r   r1   r!   ZLIKEz%"z"%z^-?[0-9]+(w|d|h|m?)( +)?$now()r   -znow()+r[   Z	CmfPersonrg   )affected_versionsfix_versionsz
::version:r*   z%::r   r   Z	CmfChoice    )seplengthu;   Возможно объект не импортированuO   Не найдено подходящей замены для значения 'u   ' в поле 'rZ   )%rP   r   	parentCtxr   r   JqlTerminalClauseContextr]   r   r   rT   
ValueErrorr   r@   r:   Z_get_cached_priorityr%   ZCmfLogicTyper   r   r   r   ZCmfDateTimeZCmfDateZCmfTimerematchrX   r9   r^   ZcmfutilZget_model_by_namesgetZcustomZwidgetZtranslit_stripr-   dict)r;   rQ   Z	new_valueZcurrent_valuer4   rH   Zlist_parentrU   r   rL   r   r   objZpriority_idZpriority_namer   Zfilter_Zfield_modelZsearch_fieldr   Z
choice_keyru   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_USERri   r   z
membersOf(, rx   c                 S   s    g | ]}| d d ddqS )r   rY   r   )r   )rd   argr>   r>   r?   rf   Z  s     z(JQL.visitJqlFunction.<locals>.<listcomp>Znowr      Функция 'r   )r]   r   rP   ZjqlArgumentListrk   rj   r   ZFunctionError)r;   rQ   r   ru   Zargument_listr>   r>   r?   visitJqlFunctionN  s     zJQL.visitJqlFunctionc                 C   s   |  S r5   r   r   r>   r>   r?   visitJqlFunctionNamef  s    zJQL.visitJqlFunctionNamec                 C   s.   g }|  D ]}| |}|r|| q|S r5   )ZjqlArgumentr]   r^   )r;   rQ   argsargumentr   r>   r>   r?   visitJqlArgumentListi  s    
zJQL.visitJqlArgumentListc                 C   s~  |  |jd}g }i }| D ]}z|d}|  |}|sFW q"||d  t|tjrjd|d< nt|tjr|	dg }||d  n`t|tj
r|  | }	|dkr|	dkrtd	|	 d
| d|	dg }
|
|	|d f W q" tk
r8 } z$| jjd| | d|  W 5 d }~X Y q"X q"|sXtd| | ddddd |D  d|d}|S )Nr   rZ   Tr   rG   r[   r~   r   r   u=   ' не поддерживается с оператором 'r   r   u   Операнд 'u$   ' удален из условия. u   Для операндов 'u   ' не найдены варианты для замены, возможно объекты еще не импортированыrw   r   c                 S   s   g | ]}|qS r>   r>   )rd   r   r>   r>   r?   rf     s     z$JQL.visitJqlList.<locals>.<listcomp>rx   ri   )r]   r   r   Z
jqlOperandr^   r   r   r   JqlValueContext
setdefaultr   r   r   r   rT   r8   r   r   rR   r   rk   )r;   rQ   rz   Zubql2_operandsZbql_operandsZjql_operandr   Zoperand_valuerG   r   r   rU   ru   r>   r>   r?   visitJqlListr  sF    


zJQL.visitJqlListc                 C   s   |  S r5   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 rb   r>   rd   rH   r>   r>   r?   rf     s     z'JQL.visitJqlOrderBy.<locals>.<listcomp>r`   r|   c                 S   s   g | ]}|d  qS rh   r>   r   r>   r>   r?   rf     s     ri   )ZjqlSearchSortr]   r^   rj   rk   )r;   rQ   r   ro   ru   r>   r>   r?   visitJqlOrderBy  s    
zJQL.visitJqlOrderByc              
   C   s   z|  | }|d }|d }|d s:td| d|jrR| d|jj n||jrr|jjdkrrd|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   r   r   u4   ' не поддерживает сортировкуr\   ZDESCr   ri   u%   Условие сортировки 'r   )r]   r   r   r   orderr,   r   rT   r8   r   r   rR   rj   )r;   rQ   rH   rL   r   ru   rU   r>   r>   r?   visitJqlSearchSort  s    "zJQL.visitJqlSearchSort)j__name__
__module____qualname__r%   rK   r   Zapprovers_forZresponsibler   Zcomments
componentsZcmf_created_atZ
cmf_authorr,   Zdeadliner   r   r    r"   r#   r$   Z	cmf_ownerr'   Zstatus_closed_atZlistsr*   r   r   Zcmf_modified_atr/   rE   r7   rI   rM   rR   rX   r   ZJqlQueryContextra   ZJqlOrClauseContextrp   ZJqlAndClauseContextrs   ZJqlNotClauseContextrv   ZJqlSubClauseContextry   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   r   r   r   r   r   r   ZJqlFunctionNameContextr   ZJqlArgumentListContextr   r   r   ZJqlArgumentContextr   ZJqlOrderByContextr   ZJqlSearchSortContextr   __classcell__r>   r>   r<   r?   r
      s    
       

    	           r)j	.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 r5   )_api_import)r;   r:   r>   r>   r?   r7     s    zJQLNormalizer.__init__c           
      C   sH   t |}t|}t |}t|}| }t| j|d}||}	|	S )Nr:   r9   )	antlr4ZInputStreamr   ZCommonTokenStreamr   ZjqlQueryr
   r   r]   )
r;   jqlr9   Zinput_streamZlexerstreamparserZtreeZvisitorru   r>   r>   r?   get_modified  s    


zJQLNormalizer.get_modifiedN)r   r9   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 )Nr   r   Zcustomfield_ZcustomfieldcfrW   r   rg   r   r   r   r   r   r   r   r   r   r   r   r   r   )r
   r   
startswithr   splitr   r%   r   r   r^   r8   r   r   rI   r   )r;   r   r9   r   Zsupported_fieldsrH   rW   r   r   rL   r   Zmapped_fieldr>   r>   r?   convert_fields  sD    





zJQLNormalizer.convert_fields)N)r   r   r   r7   r   listr   r   r>   r>   r>   r?   r     s   r   )r   r   Zcmfr   Zcmf.includeZmodules.jira.base_importr   rY   r   r   r   r	   r
   r   r>   r>   r>   r?   <module>   s"          B