U
    Įwh                     @   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dd0ejjddgddd1ejjddd2ejjdddd
id3ejjdd4gdd5ejjdd6gddd
idd
id7ejjdddd
idd
idd
idd
id83Z fd9d:Zd;d< Z d=d> Z!d?d@ Z"e#j$dAdBdCZ%e#j&dAdDdEZ'e#j(dAdFdGZ)e#j*dAdHdIZ+e#j,dAdJdKZ-e#j.dAdLdMZ/e#j0dAdNdOZ1e#j2dAdPdQZ3e#j4dAdRdSZ5e#j6dAdTdUZ7e#j8dAdVdWZ9e#j:dAdXdYZ;e#j<dAdZd[Z=e#j>dAd\d]Z?e#j@dAd^d_ZAe#jBdAd`daZCe#jDdAdbdcZEe#jFdAdddeZGe#jHdAdfdgZIe#jJdAdhdiZKe#jLdAdjdkZMe#jNdAdldmZOe#jPdAdndoZQe#jRdAdpdqZSe#jTdAdrdsZUe#jVdAdtduZWe#jXdAdvdwZYe#jZdAdxdyZ[e#j\dAdzd{Z]e#j^dAd|d}Z_e#j`dAd~dZae#jbdAddZce#jddAddZee#jfdAddZg  ZhS )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sprint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   s"   |j j }|jj}|j  ||S r5   )startstopZgetInputStreamgetText)r;   ctxrJ   rK   r>   r>   r?   	_get_text4  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_code9  s     zJQL._get_user_code)rM   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;   rM   rV   rW   whereorder_byr>   r>   r?   visitJqlQueryI  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 rV   r>   .0clauser>   r>   r?   
<listcomp>c  s     z(JQL.visitJqlOrClause.<locals>.<listcomp>r   r   rW   ORc                 S   s   g | ]}|d  qS rW   r>   r_   r>   r>   r?   rb   h  s     rV   rW   )ZjqlAndClauserY   rZ   defaultResultjoinlenextend)r;   rM   clausescZ
and_clauserV   rW   r>   r>   r?   visitJqlOrClauseY  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?   rb   x  s     z)JQL.visitJqlAndClause.<locals>.<listcomp>r   r   rW   ANDc                 S   s   g | ]}|d  qS rd   r>   r_   r>   r>   r?   rb   }  s     re   )jqlNotClauserY   rZ   rf   rg   rh   ri   )r;   rM   rj   rk   Z
not_clauserV   rW   r>   r>   r?   visitJqlAndClausen  s    
zJQL.visitJqlAndClausec                 C   s   |  r| |  }n.| r0| | }n| rF| | }|sR|  S |jrn|jj d|d  n|d |d d}|S )NrX   rV   rW   re   )rn   rY   ZjqlSubClauseZjqlTerminalClauserf   is_notr,   )r;   rM   ra   resultr>   r>   r?   visitJqlNotClause  s    "zJQL.visitJqlNotClausec                 C   s8   |  | }|s|  S d|d  d|d d}|S )N(rV   )rW   re   )rY   ZjqlOrClauserf   )r;   rM   Z	or_clauserq   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   rW   operatorvaluer   rU   =rc   z
NOT EXISTSZEXISTS)INNOT INemptyry   !=rG   z.code	functions	membersOf	MEMBER_OFr   rm   rz   r   r,   r   %r   rX   rV   re   u   Условие '&   ' удалено из запроса. .)rY   jqlField
class_name
issubclassr   Z
CmfM2MBaseZjqlTerminalClauseRhsgetChild
isinstancer   JqlEmptyContextJqlListContextJqlFunctionContextZCmfStrZ
CmfRelBaseitemsrZ   rh   insertreplacerP   r8   loggerwarningrN   rf   )r;   rM   rH   r   
field_nameZis_m2m_fieldt   terminal_сlauseZbql_operatorZ	bql_valueoperandZis_empty_operandZis_list_operandZis_function_operandZ
bql_resultZ
value_typerG   function_namerw   rq   rQ   r>   r>   r?   visitJqlTerminalClause  s    










zJQL.visitJqlTerminalClausec                 C   sD   |  | }|  |d}| d|d  ||d dd}|S Nr   rX   rV   rW   rv   rw   re   )rY   ZjqlEqualsOperatorr   r;   rM   rv   rw   rq   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   rW   ILIKErx   r|   rV   rX   r   r   re   )rY   ZjqlLikeOperatorr   r   r   r   )r;   rM   rv   rw   Zis_empty_valuerq   r>   r>   r?   visitJqlLikeClause   s    zJQL.visitJqlLikeClausec                 C   sD   |  | }|  |d}| d|d  ||d dd}|S r   )rY   ZjqlComparisonOperatorr   r   r>   r>   r?   visitJqlComparisonClause2  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   rX   rV   rW   r   re   r~   rz   uV   Функция 'membersOf' не поддерживается с оператором ''r   rv   )
rY   ZjqlInOperatorr   r   r   r   ZjqlFunctionjqlFunctionNamer   ClauseErrorr   r>   r>   r?   visitJqlInClause@  s    
zJQL.visitJqlInClausec                 C   sJ   |  | }|  | }|d  d|d  |d |d dd}|S )NrV   rX   rW   r   re   )rY   ZjqlIsOperatorZjqlEmpty)r;   rM   rv   r{   rq   r>   r>   r?   visitJqlIsClauseV  s    zJQL.visitJqlIsClausec                 C   s$   |  | }td| dd S Nu   Оператор '#   ' не поддерживается)rY   ZjqlWasOperatorr   r   r;   rM   rv   r>   r>   r?   visitJqlWasClaused  s    zJQL.visitJqlWasClausec                 C   s$   |  | }td| dd S r   )rY   ZjqlWasInOperatorr   r   r   r>   r>   r?   visitJqlWasInClauseh  s    zJQL.visitJqlWasInClausec                 C   s$   |  | }td| dd S r   )rY   ZjqlChangedOperatorr   r   r   r>   r>   r?   visitJqlChangedClausel  s    zJQL.visitJqlChangedClausec                 C   s   |  S r5   rL   r;   rM   r>   r>   r?   visitJqlEqualsOperatorp  s    zJQL.visitJqlEqualsOperatorc                 C   s&   ddd}|  ||  d}|S )Nr   z	NOT ILIKE)~z!~re   )rL   r@   )r;   rM   Zoperator_mappingrq   r>   r>   r?   visitJqlLikeOperators  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 )Nrz   ry   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|   rx   re   r   r;   rM   rq   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   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 )Nr   rU   "r   
   Поле 'r   Zcaptionr   r   field_custom_typer1   r   )r   r   !   Неизвестное поле 'r   r%   model)Z	jqlStringrY   r   rI   lowerr   Z
FieldErrorr%   CmfCustFieldr@   strr   getattrCmfTaskZUnknownFieldErrorZjqlCustomFieldhasattrr   rZ   ri   )r;   rM   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_rS   rc   r   r   r   r   r   +   Пользовательское поле '' (   ) не найдено)Z	POSNUMBERr9   r   r%   r   r@   r   ZCustomFieldError)r;   rM   field_idfield_ext_idr   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EMPTYre   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 }z,|	d	krt|}d| d|d
}n|	dkrftjjdd|gddd ggd}|sRt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rh|	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|}|st	d&W n> t	k
r> } zt
d'| d(|	 d| W 5 d }~X Y nX t#|t$k	rZd| dn|d) t#|t$k	rvt|n|d d
}|S )*Nr   rU   r   u2   Невозможно найти значение 'z'. r   r%   r   r#   re   
logic_typer   r   r   r|   r1   r!   ZLIKEz%"z"%z^-?[0-9]+(w|d|h|m?)( +)?$now()r   -znow()+rW   Z	CmfPersonrc   )affected_versionsfix_versionsz
::version:r*   z%::r   r   Z	CmfChoice    )seplengthu;   Возможно объект не импортированuO   Не найдено подходящей замены для значения 'u   ' в поле 'rV   )%rL   r   	parentCtxr   r   JqlTerminalClauseContextrY   r   r   rP   
ValueErrorr   r@   r   Z_get_priorityr%   ZCmfLogicTyper   r   r   r   ZCmfDateTimeZCmfDateZCmfTimerematchrT   r9   rZ   ZcmfutilZget_model_by_namesgetZcustomZwidgetZtranslit_stripr-   dict)r;   rM   Z	new_valueZcurrent_valuer4   rH   Zlist_parentrQ   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_USERre   r~   z
membersOf(, rt   c                 S   s    g | ]}| d d ddqS )r   rU   r   )r   )r`   argr>   r>   r?   rb   N  s     z(JQL.visitJqlFunction.<locals>.<listcomp>Znowr      Функция 'r   )rY   r   rL   ZjqlArgumentListrg   rf   r   ZFunctionError)r;   rM   r   rq   Zargument_listr>   r>   r?   visitJqlFunctionB  s     zJQL.visitJqlFunctionc                 C   s   |  S r5   r   r   r>   r>   r?   visitJqlFunctionNameZ  s    zJQL.visitJqlFunctionNamec                 C   s.   g }|  D ]}| |}|r|| q|S r5   )ZjqlArgumentrY   rZ   )r;   rM   argsargumentr   r>   r>   r?   visitJqlArgumentList]  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   rV   Tr{   rG   rW   rz   r~   r   u=   ' не поддерживается с оператором 'r   r}   u   Операнд 'u$   ' удален из условия. u   Для операндов 'u   ' не найдены варианты для замены, возможно объекты еще не импортированыrs   r   c                 S   s   g | ]}|qS r>   r>   )r`   r   r>   r>   r?   rb     s     z$JQL.visitJqlList.<locals>.<listcomp>rt   re   )rY   r   r   Z
jqlOperandrZ   r   r   r   JqlValueContext
setdefaultr   r   r   r   rP   r8   r   r   rN   r   rg   )r;   rM   rv   Zubql2_operandsZbql_operandsZjql_operandr   Zoperand_valuerG   r   r}   rQ   rq   r>   r>   r?   visitJqlListf  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 r^   r>   r`   rH   r>   r>   r?   rb     s     z'JQL.visitJqlOrderBy.<locals>.<listcomp>r\   rx   c                 S   s   g | ]}|d  qS rd   r>   r   r>   r>   r?   rb     s     re   )ZjqlSearchSortrY   rZ   rf   rg   )r;   rM   r   rk   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   rX   ZDESCr   re   u%   Условие сортировки 'r   )rY   r   orderr,   r   rP   r8   r   r   rN   rf   )r;   rM   rH   r   r   rq   rQ   r>   r>   r?   visitJqlSearchSort  s    "zJQL.visitJqlSearchSort)i__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_ownerr'   Zstatus_closed_atZlistsr*   r   r   Zcmf_modified_atr/   rE   r7   rI   rN   rT   r   ZJqlQueryContextr]   ZJqlOrClauseContextrl   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   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'i	.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   rY   )
r;   jqlr9   Zinput_streamZlexerstreamparserZtreeZvisitorrq   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cfrS   r   rc   r   r   r   r   r   r   r   r   r   r   r   r   r   )r
   r   
startswithr   splitr   r%   r   r   rZ   r8   r   r   rI   r   )r;   r   r9   r   Zsupported_fieldsrH   rS   r   r   r   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   rU   r   r   r   r	   r
   r   r>   r>   r>   r?   <module>   s"          3