https://t.me/RX1948
Server : Apache
System : Linux iad1-shared-b8-43 6.6.49-grsec-jammy+ #10 SMP Thu Sep 12 23:23:08 UTC 2024 x86_64
User : dh_edsupp ( 6597262)
PHP Version : 8.2.26
Disable Function : NONE
Directory :  /lib/python3/dist-packages/trac/ticket/__pycache__/

Upload File :
current_dir [ Writeable ] document_root [ Writeable ]

 

Current File : //lib/python3/dist-packages/trac/ticket/__pycache__/web_ui.cpython-310.pyc
o

�k�`�V�@s4ddlZddlmZddlZddlZddlZddlZddlmZddlm	Z	m
Z
ddlTddlm
Z
mZddlmZddlmZmZdd	lmZmZmZmZmZdd
lmZmZmZddlmZddl m!Z!m"Z"m#Z#dd
l$m%Z%ddl&m'Z'ddl(m)Z)ddl*m+Z+m,Z,m-Z-m.Z.m/Z/ddl0m1Z1m2Z2m3Z3m4Z4m5Z5m6Z6m7Z7m8Z8m9Z9m:Z:ddl;m<Z<m=Z=m>Z>ddl?m@Z@mAZAmBZBmCZCddlDmEZEddlFmGZGmHZHmIZImJZJmKZKddlLmMZMmNZNddlOmPZPmQZQmRZRddlSmTZTmUZUmVZVmWZWmXZXmYZYmZZZm[Z[m\Z\m]Z]m^Z^m_Z_m`Z`maZambZbddlcmdZdmeZeGdd�def�ZgGdd�def�ZhdS)�N��datetime)�AttachmentModule)�
BoolOption�Option)�*)�Mimeview�IContentConverter)�NotificationSystem)�IPermissionPolicy�PermissionSystem)�Resource�ResourceNotFound�get_resource_url�render_resource_link�get_resource_shortname)�
ISearchSource�
search_to_sql�shorten_result)�model)�TicketSystem�ITicketManipulator�TicketFieldList)�TicketChangeEvent)�group_milestones)�ITimelineEventProvider)�as_bool�as_int�get_reporter_id�lazy�to_list)
�datetime_now�format_datetime�format_date_or_datetime�from_utimestamp�get_date_format_hint�get_datetime_format_hint�
parse_date�
to_utimestamp�	user_time�utc)�Markup�tag�to_fragment)�exception_to_unicode�empty�
is_obfuscated�shorten_line)�	separated)�_�tag_�tagn_�N_�ngettext)�get_diff_options�diff_blocks)�IRequestHandler�arg_list_to_args�parse_arg_list)�Chrome�INavigationContributor�ITemplateProvider�	accesskey�add_ctxtnav�add_link�
add_notice�
add_script�add_script_data�add_stylesheet�add_warning�	auth_link�chrome_info_script�prevnext_nav�web_context)�	format_to�format_to_htmlc@seZdZeeeeeee	�e
e�Ze
jZedddd�Zedddd�Zeddd	d
�Zeddd
d�Zeddddd�Ze�d�Zdd�Zedd��Zdd�Zdd�Zdd�Zdd �Zd!d"�Z d#d$�Z!d%d&�Z"d'd(�Z#d)d*�Z$d+d,�Z%d-d.�Z&d/d0�Z'd1d2�Z(d3d4�Z)d5d6�Z*d7d8�Z+d9d:�Z,d;d<�Z-d=d>�Z.dwd@dA�Z/dBdC�Z0dDdE�Z1dwdFdG�Z2dHdI�Z3dJdK�Z4dLdM�Z5dxdOdP�Z6dQdR�Z7dSdT�Z8dUdV�Z9dydYdZ�Z:d[d\�Z;dwd]d^�Z<d_d`�Z=dadb�Z>dcdd�Z?dedf�Z@dzdgdh�ZAdxdidj�ZBdxdkdl�ZCdmdn�ZDdxdodp�ZEdxdqdr�ZF	Ndxdsdt�ZGdxdudv�ZHdNS){�TicketModule�timeline�ticket_show_details�truezcEnable the display of all ticket changes in the timeline, not only
        open / close operations.�ticket_show_component�falsezUEnable the display of component of tickets in the timeline.
        (''since 1.1.1'')�newticket_formatter�onelinerz�Which formatter flavor (e.g. 'html' or 'oneliner') should be
        used when presenting the description for new tickets.
        If 'oneliner', the [timeline] abbreviated_messages option applies.
        �ticket�preserve_newlines�defaultz�Whether Wiki formatter should respect the new lines present
        in the Wiki text.
        If set to 'default', this is equivalent to 'yes' for new environments
        but keeps the old behavior for upgraded environments (i.e. 'no').
        �query�ticketlink_queryz?status=!closedz�The base query to be used when linkifying values of ticket
            fields. The query is a URL query
            string starting with `?` as used in `query:`
            [TracQuery#UsingTracLinks Trac links].
            )rX�docz/ticket/([0-9]+)$cCst�|_dS�N)�set�_warn_for_moved_attr��self�ra�4/usr/lib/python3/dist-packages/trac/ticket/web_ui.py�__init__iszTicketModule.__init__cCs"|j}|dkr
|jjdk}t|�S)NrX�)rW�env�database_initial_versionr)r`rWrararb�must_preserve_newlineslsz#TicketModule.must_preserve_newlinesccsH�dtd�ddddfVdtd�ddd	dfVd
td�ddd
dfVdS)N�rsszRSS Feed�xml�trac.ticket.Ticket�application/rss+xml��csvzComma-delimited Text�text/csv�tabzTab-delimited Text�tsv�text/tab-separated-values)r3r_rararb�get_supported_conversionsus�
�
�

�z&TicketModule.get_supported_conversionscCsJ|dkr|j||dd�S|dkr|j||ddd�S|dkr#|�||�SdS)	Nrmrn)�mimetypero�	rq)�seprsrh)�
export_csv�_export_rss)r`�reqrsrV�keyrararb�convert_content}s
��zTicketModule.convert_contentcCs|j�|j�r	dSdS)N�tickets�	newticket)�ticket_path_re�match�	path_info�r`rxrararb�get_active_navigation_item�sz'TicketModule.get_active_navigation_itemccs<�d|jvrddtjtd�|j��t|d�d�fVdSdS)N�
TICKET_CREATE�mainnavr|z
New Ticket�)�hrefr@)�permr,�ar3r�r|r@r�rararb�get_navigation_items�s�
�
��z!TicketModule.get_navigation_itemscCs8|j�|j�}|r|�d�|jd<dS|jdkrdSdS)N��idT�
/newticket)r}r~r�group�args)r`rxr~rararb�
match_request�s
�zTicketModule.match_requestcCs4d|jvr|jdkrttd���|�|�S|�|�S)Nr�r�z)id can't be set for a new ticket request.)r�r�	TracErrorr3�_process_ticket_request�_process_newticket_requestr�rararb�process_request�s




zTicketModule.process_requestcCsgSr\rar_rararb�get_htdocs_dirs�szTicketModule.get_htdocs_dirscCst�dd�gS)Nztrac.ticket�	templates)�
pkg_resources�resource_filenamer_rararb�get_templates_dirs�szTicketModule.get_templates_dirsccs"�d|jvrdtd�fVdSdS)N�TICKET_VIEWrV�Tickets)r�r3r�rararb�get_search_filters�s�
�zTicketModule.get_search_filtersccsJ�d|vrdSt|j�}|jj�{}t|ddddd|�dd�g|�\}}t|d	g|�\}}	t|d
g|�\}
}t|j�}|d|||
f||	|�D];\}
}}}}}}}||d�}d
|�|�vr�|j�	|�t
dtjt
|j|�|d�|�|
|||�d�t|�|t||�fVqHWd�n1s�wYt|j��|||�D]}|Vq�dS)NrV�summary�keywords�description�reporter�ccr��text�newvalue�valuea2SELECT summary, description, reporter, type, id,
                                 time, status, resolution
                          FROM ticket
                          WHERE id IN (
                              SELECT id FROM ticket WHERE %s
                            UNION
                              SELECT ticket FROM ticket_change
                              WHERE field='comment' AND %s
                            UNION
                              SELECT ticket FROM ticket_custom WHERE %s
                          )
                          �r�r��%(title)s: %(message)s��class_��title�message)r
�realmre�db_queryr�castrr�r�rVr4r,�spanr�format_summaryr$rr�get_search_results)r`rx�terms�filters�ticket_realm�db�sqlr��sql2�args2�sql3�args3�ticketsystemr��desc�author�type�tid�ts�status�
resolution�t�resultrararbr��sV�


��
�
��


�������
"��zTicketModule.get_search_resultsccs<�d|jvrdtd�fV|jrdtd�dfVdSdSdS)Nr�rVzTickets opened and closed�ticket_detailszTicket updatesT)r�r3�timeline_detailsr�rararb�get_timeline_filters�s�
�z!TicketModule.get_timeline_filtersc#s��t|��t|��ddddd��t|j��t|j���������fdd�����fdd	�}|jj��}d
�vs;d�vr�d}d}d}	||�D]\\}
}|	rj||kr`|
dd
}|	dd
�|j�qE|	V|
}|}d}	qE|r�||kr�|dd
}
|
dd
}|
j|jg}|f|
ddd�}d|
d|
d|f}	qE|r�|V|
}|}qE|	r�|	Vn|r�|Vd
�vr�|d��f�D]}�|didd�}
|
r�|
Vq�d�vr�t	|j��
��||�D]
}|Vq�Wd�dSWd�dS1s�wYdS)N)r|�created)�reopenedticket�reopened)�closedticket�closed)�editedticket�updated)�newr�r��editcs�|\}}}}}	}
}�|d�}d��|�vrdS|�d�}
d}|dkrEd�vrC|rB�fdd�|D�}td	d	t|�t|d
�d�t��}ndSd�vr^|d
kr]|
r]|
r[|r[td|
dd�}n|
}ndS�|\}}|t|�|||||	||
||
|||ffS)Nr�r�r��r�r�c	s"g|]
}t���||�����qSra)r,�i�get�
capitalize��.0�k)�field_labelsrarb�
<listcomp>�s�zKTicketModule.get_timeline_events.<locals>.produce_event.<locals>.<listcomp>�%(labels)s changed�, ��labelsrVr�r�r�)	r�r�r5�lenr2r,�brr3r$)�valuesr��fields�comment�cidr�r�r�r�r�r��	componentrVr��infor��kind�verb)r�r�rx�
status_mapr�rarb�
produce_event�sF


������
��z7TicketModule.get_timeline_events.<locals>.produce_eventc
3s@�d}|d|�dd���f�D]v\	}}}}}}}}	}
|	s |
s q|r,||f|dd�krR|r?�||||
|�}|r?||dfVdiddf\}}}
}|||||d|f}|dkrq|
}
|	o`|	�d	�d
}|dd�|f|dd�}q|dkr||
d
vr||
}q|ddkr�|
||<q|r��||||
|�}|r�||dfVdSdSdS)Na
                    SELECT t.id, tc.time, tc.author, t.type, t.summary,
                           t.component, tc.field, tc.oldvalue, tc.newvalue
                    FROM ticket_change tc
                    INNER JOIN ticket t ON
                        t.id = tc.ticket AND tc.time>=%%s AND tc.time<=%%s
                    LEFT OUTER JOIN enum p ON
                        p.type='priority' AND p.name=t.priority
                    ORDER BY tc.time, COALESCE(p.value,'')='', %s, tc.ticket
                    zp.value�int�r�r�r�r��.����r�)r�r�rr3)r��split)r��datar�r�r�r�r�r��field�oldvaluer�r�r�r�r��ev)r��ts_start�ts_stoprarb�produce_ticket_change_eventssH�
	�	��

� ��zFTicketModule.get_timeline_events.<locals>.produce_ticket_change_eventsrVr�r�rr��batchmodifyr�z�SELECT id, time, reporter, type, summary,
                                            description, component
                                     FROM ticket WHERE time>=%s AND time<=%s
                                     r�)r(r
r�rre�get_ticket_field_labelsr��appendr�r�get_timeline_events)r`rx�start�stopr�r�r��prev_t�prev_ev�batch_evr�r�rV�prev_ticketr{�
batch_data�row�eventra)r�r�r�rxr�r�r�r�rbr��sr��

*��
���+"�z TicketModule.get_timeline_eventscCsj|d}|dkr|�|||�S|d\}}}}}	}
}}}
}}|dkr3|j�|j�}|r1|d|7}|S|dkrrt|j��||	|
|�}td�td�td	�td
�d�|}d}|jr^|
r^|
d
}|t	|�}t
|tjd|j|d�|d�S|dkr�d}}|	dkr�|}n|}|}|j
|d�}|j|jd�|	dkr�|�d�dkr�|j}|j||dkd�|t|jd||�SdS)Nrr�r��urlz	#comment:r�z*Ticket %(ticketref)s (%(summary)s) createdz+Ticket %(ticketref)s (%(summary)s) reopenedz)Ticket %(ticketref)s (%(summary)s) closedz*Ticket %(ticketref)s (%(summary)s) updated)r�r�r�r�r�z - �#�r�)�	ticketrefr�r�r���resource�rW�wiki_flavorrU)r	�
shorten_lines)�_render_batched_timeline_eventr�rVr�rrer�r6�timeline_componentr1r4r,�em�child�	set_hintsrg�get_hint�timeline_newticket_formatterrL)r`�contextr�rr�rVr�r�r�r�r�r�r�r�r�r�r�r�r��component_prefix�summary_complete�descr�	t_context�flavorrararb�render_timeline_eventis\����
���z"TicketModule.render_timeline_eventcCs�|d\}}}}}}	}
}}}
}|dkr"|jjd�dd�|D��d�S|dkrBd�d	d�|D��}td
|d�}tdtjd
||d�d�S|dkrZ|�}|j|jd�|t	|j
d||
�SdS)Nr�r�,cs��|]}t|�VqdSr\��str�r�r�rararb�	<genexpr>���z>TicketModule._render_batched_timeline_event.<locals>.<genexpr>r�r�u,​csrr\rrrararbr�rzTickets %(ticketids)s)�	ticketidsz$Tickets %(ticketlist)s batch updatedrr)�
ticketlistr�r)r�rY�joinr3r4r,r
rrgrLre)r`rr�rr{r�r�r�r�r�r�r�r�r�r�r r�rrararbr�s ���z+TicketModule._render_batched_timeline_eventcCs�g}t|j��||�}|D]:}g}g}g}|�|||�D]}	|	�|||�\}
}}|�|
�|�|�|�|�q|rG|�||dt|�|f�q
|j�d�}
|
sX|rX|dd}
|sat	|t
d��||
fS)Nr�actionz?There are no workflow actions defined for this ticket's status.)rre�get_available_actions�_get_action_controllers�render_ticket_action_controlr�r,r�r�rGr4)r`rxrV�action_controls�sorted_actionsr#r��hints�widgets�
controller�label�widget�hint�selected_actionrararb�_get_action_controls�s4��
�

�z!TicketModule._get_action_controlsccs@�t|j�jD]}dd�|�||�pgD�}||vr|VqdS)z>Generator yielding the controllers handling the given `action`cSsg|]\}}|�qSrara)r��wr�rararbr���z8TicketModule._get_action_controllers.<locals>.<listcomp>N)rre�action_controllers�get_ticket_actions)r`rxrVr#r+�actionsrararbr%�s����z$TicketModule._get_action_controllersc
Cs$|�|j��d�t�|j�}d}d}|jdkrd}d}|�|||�|j�	|�p-t
|d�}||d<d|jv}|s>|jdkr�t|j��||�}t
|�d	krQ|d	nd}|j�	d
|�}	d}
|	rm|	|vrmd}
t|td|	d��|�|||	�\}}|r�d}
|D]}
t||
�q|t|td
t�dt��d�t�d�d��|�||�|
|�||�M}
|s�|jdkr�|
r�|�|||	�d|jd<|�||�\}}|}|�||�}|�|gdd|||d��|�||�}||d<|jr�d|d<t|d<d|fSt|d�t |j�}|�!|�|�s	|�"|�|�#|�d|fS)Nr�Tr��POSTF�field_reporterr��previewrr#�'The action "%(name)s" is not available.��name�YPlease review your configuration, probably starting with %(section)s in your %(tracini)s.�[ticket]�workflow = ...�trac.ini��section�tracini)�	author_idr5�version�description_changer'r#�disable_submitr��preview_moderIzticket_box.html�common/css/ticket.css�ticket.html)$r�r��requirer�Ticketre�method�	_populater�r�rrr$r�rGr3�get_ticket_changesr4r,�prer��code�_apply_ticket_changes�_validate_ticket�
_do_creater0�
_prepare_data�update�_prepare_fields�is_xhrrIrFr=�add_wiki_toolbars�add_auto_preview�
add_jquery_ui)r`rxrV�plain_fieldsr7�reporter_idr8r5�default_actionr#�valid�
field_changes�problems�problemr'r/rFr�r��chromerararbr��s�
�
������	

��





z'TicketModule._process_newticket_requestc'	s��j�d�}�j�dd�}�jr:d�jvr:t�|j||�}|j}t|j|�j�dd�|d�t	��}��
|�d����|j||��
d�tj|j||d	���j�d
d�jvrYdpZd�}|����}|d
vr��j�d�}	|	rr|	g}
ndd��jD�}
|dkr�|���||
�S|dkr�|���||
�S�nj|dkr��j�
d��j�d�}|���||�S|dkrĈj�
d��j�d�}|���||�Sd�jvr�i}|�d�jd�dd��|�����nd�jvr���j��j���n
d�jv�rT�j�dd�}
�j�d�}��|�}|�sttd|d���t d|�j!d�}��|��
d�|�����rD��"|d�j|
����j��j�d |�n�i}|�d�jd�dd��n��j#d!k�r�d"}t$|j��%���}||v�rud#}t&�td$|d%��|�'���|�(��|�\}}|�r�d#}|D]}t&�|��q�t&�t)d&t*�+d't*�,�d(�t*�-d)�d*��|�.�|�||���|�M}d+�jv�r�|�r�|�/��|�d"�jd,<t0t1�j�d-d.���}|�||�j�d/��p�j�j�d0�d1��ni}|�d�jd�dd��|��j�d��j�d��j�d��j�d2��j�d3�d4��|�2��|t3�d5�|��j�r?t4|d6d7�|d8<t	|d9<d:|fSt5|j�}�j�d;�}|�rc|d<k�rWd=�jnd}|j6�d>�||d?���fd@dA�}d"}dB�j7v�rˆj7dB�8�}t9�j�|v�r�|�:t9�j��}|d.k�r�|dC|d.�|dD||dE�|t;|�dEk�r�|dF||dE�|dG|dH�t<�dI�j7dJ�d#}|�r'|jj=�U}|dK�D]H\}}t1|�}t1|�}|�jk�r�|dC|�|dL�jf�D]\}|dDt1|���q�j|k�r|dG|�|dM�jf�D]\} |dFt1| ���q
Wd�n	1�s"wYi}!�jD]&}	|	dN}"�j>�|"�|"�}#|"�j?v�rMt@|#tA��rMtB|#dOtC�}#|#|!|"<�q,�j|!d<tD�|�E��|!|dPdQ��tF�dR�tG|j�}$|$�H��|dS�s|$�I��|$�J��|�Kd>�D]&}%|%jL}tM|j�j!�j|dT�}&|d<k�r�tN�|&�}&t<�dU|&|%jO|%jP|��q�tQ�tdV�tdW�tdX��dY|fS)ZNr�rD�preview_comment�edited_commentr�)�escape_newlines�utf-8r��rDr#�history�view)rh�diffr�cSs g|]}|ddkr|d�qS)r��textarear;ra)r�r�rararbr�?s�z8TicketModule._process_ticket_request.<locals>.<listcomp>rj�comment-history�cnum�comment-diff�
changetime)r#�reassign_owner�resolve_resolution�
start_time�cancel_comment�edit_comment�	cnum_editzComment %(num)s not found��numr�)�parent�TICKET_EDIT_COMMENT�date�#comment:%dr6TFr9r:r<r=r>r?r@�submitr8rrr�reassign_choice�resolve_choice)r#rrrprq�	cnum_hist�cversion)r�rurdrr�r��change_previewr�rGrIzticket_preview.html�formatrhzt%drj)�filenamecs8�j|dd�}|rt�|�j�|�td|d��dSdS)N)r�rD�Ticket #%(id)sr�)rrBr�rVr3)�	css_classr�r��rxrVrarb�add_ticket_link�s
��z=TicketModule._process_ticket_request.<locals>.add_ticket_link�
query_tickets�first�prevr��next�lastr��up�
query_hrefz#SELECT min(id), max(id) FROM ticketz(SELECT max(id) FROM ticket WHERE id < %sz(SELECT min(id) FROM ticket WHERE %s < idr;�iso8601�changes)�comments_prefs�
old_valuesr�rHrF)r��	alternatezPrevious TicketzNext Ticketz
Back to QueryrI)Rr��getintrWrKr�rgrMrer�rI�send�encoder�rJrrKrTr��_render_history�_render_diff�_render_comment_history�_render_comment_diffrU�authnamerR�redirectr�rVr��
get_changer�r3r
r�modify_commentrLrr$rGrMrNr4r,rOr�rPrQ�_do_saver$r��_insert_ticket_datar�boolr�send_converted�sessionr�r�indexr�rBr��_old�time_fields�
isinstancerr"r*rE�
_get_prefsrFr=rXrYrZrrryrrHr;�out_mimetyperJ)'r`rxr�rDrre�renderedr#r�r��text_fieldsrmr_r��change�comment_resourcer^r5r`rarr�mimer�r�r��global_sequencer{�idxr��min_id�max_id�prev_id�next_idr�r;r�rb�
conversion�conversion_hrefrar�rbr�&s�����
�

��
�
�
����	


��



�

�

�

�

�

���

�






�

��z$TicketModule._process_ticket_requestcCs*|j�dd�|j�dd�|j�dd�d�S)N�ticket_comments_order�oldest�ticket_show_prop_changesrQ�ticket_show_comments)�comments_order�show_prop_changes�
show_comments)r�r�r�rararbr�
s����zTicketModule._get_prefsFcCs|tt||j|d�|jtd�S)N��absurls)rVr(rrW�emtpy)r(rKrrgr/)r`rxrVr�rararbrTs
�zTicketModule._prepare_datacCst|j��|�Sr\)r=re�cc_list)r`r�rararb�_cc_listszTicketModule._cc_listcCs�d}|jr	|j}n0|j�dd���}|r|}n"t|d���}|r9|dkr9|��d}|�d�r9|�d�r9|�d	�}d}|�	|�}|rJ||vrHd
nd}|||fS)z�Return an (action, recipient) tuple corresponding to a change
        of CC status for this user relative to the current `cc_list`.N�emailr�r��	anonymousr��<�>z<>�remove�add)
�is_authenticatedr�r�r��striprr��
startswith�endswithr�)r`rxr��entryr�r�r#r�rararb�
_toggle_ccs 


zTicketModule._toggle_ccc
s�|s,�fdd��jD�}t|�D]}|�d�r*|dd�}d|�jvr*||||<qn
�fdd��jD�}tjjD]}|�|d�|�d|d�q:|��D]9\}}||jvr�z|rat	�t
|�nd||<WqOty�}	z||jvrx|||<nt|	�|	�WYd}	~	qOd}	~	wwqO|�
|�d�jvr�d�jvr�|��|d	�\}
}}|
d
kr�|�|�n	|
dkr�|�|�d�|�|d	<dSdSdS)
NcsBi|]}|�d�rd|dd��jvr|dd��j�|��qS)�field_�revert_�N)r�r�r�r��rxrarb�
<dictcomp>6s��z*TicketModule._populate.<locals>.<dictcomp>�	checkbox_�	r�csi|]	}|�j�|��qSra)r�r�r�r�rarbr�@s�	cc_update�	revert_ccr�r�r�r�)r��listr�rrK�protected_fields�pop�itemsr�r)r'r��
custom_fields�populater�r�r�r")
r`rxrVr[r�r��eachr�r��e�	cc_action�cc_entryr�rar�rbrM4sJ
��
�
�


����

�zTicketModule._populatecCs8g}|�||�D]}|dr|d|d<|�|�q|S)N�	permanentrmrD)�rendered_changelog_entriesr�)r`rxrVrhr�rararb�_get_history\s
�zTicketModule._get_historycs�|�|j��d�|�||�}|���fdd�|D�}|�dd|d|dd��|�td	�|j|d
��t|td|j	d�|j
�|j	��d
|fS)z-Extract the history for a ticket description.r�cs*g|]}t�fdd�|dD��r|�qS)c3��|]}|�vVqdSr\ra�r��f�r�rarbrjs��z:TicketModule._render_history.<locals>.<listcomp>.<genexpr>r�)�any)r��cr�rarbr�js�z0TicketModule._render_history.<locals>.<listcomp>rz''Initial version''�timer�)rDr�rzr��Ticket History)r�rrh�Back to Ticket #%(num)srv�history_view.html)r�rrJr��reverser�rUr3rAr�r�rV)r`rxrVr�r�rhrar�rbr�ds �
��zTicketModule._render_historyc)s<�j�dd�}�j�d|�}||kr||}}�����}i�g}d}	}
|D]6}|d}|�|<t�fdd�|dD��r]|rH||krHt|�}	|
dkrV|rV||krVt|�}
|�||f�q'||krj|
dkrj|
d}	|	dkru||	\}}
nd	\}}
|
|	}|
dkr�||
\}}nttd
����j|d�}�j|d�}��	|��
d���	|��
d�|}d
}|
t|�dkr�||
dd}�fdd�}i}|r�||d
d|�t|�}||||d|�t�j
����g�d0����fdd�	}g}|��D]?\}}|�v�r4||||}}||k�r4��||���}����||||�}t�tdt�|�|d��}|�|||d��q���|g||�||�d��t��\} }!}"d}#|!D]}$|$�d��r`t|$dd
��}#n�qN|#dk�rid
}#�D]@}%|�|%�}&|&�ry|&��ng}&|�|%�}'|'�r�|'��ng}'t|&|'|#d|!vd|!vd|!vd�}(��|(g|%|||%�|||%�d���qk|�r�t�dt�j
�j�jd|d �td!|d"��t�d#t�j
�j�jd$d%�td&��|�r�t�d't�j
�j�jd|d �td!|d"��t�td(�td)�td&��t �d*�t!�d+�|�"td,��j||�|"||||d-d-d.��d/|fS)1z�Show differences between two versions of a ticket description.

        `text_fields` is optionally a list of fields of interest, that are
        considered for jumping to the next change.
        rDr��old_versionr�c3r�r\rar�r�rarbr�rz,TicketModule._render_diff.<locals>.<genexpr>r�r)rNzNo differences to showrgr�Ncsbt||d�D]'}|�vr.�|d��D]\}}|d||<|dur-||vr-|d||<qqdS)Nr�r�r��old)�ranger�)r�r��from_version�
to_versionrDr��v)r�rarb�replay_changes�s��z1TicketModule._render_diff.<locals>.replay_changescsztd�jd�}|rt|td���||����}|jr'td|jd�}d|j}n	td�td�}}|||t�j|�j	�d	�S)
Nr�r�z	 &ndash; �Version %(num)srv�v%d�Initial Version�initial)�path�rev�shortrevr�)
r3r�r,r+r�r�rDrrer�)r�r�r�r�r�)r�rxr`rVrarb�version_info�s
��z/TicketModule._render_diff.<locals>.version_infozProperty %(label)s %(rendered)s)r,r�)r;r�rj)�props�diffsr�r�r��-Ur��-B�-i�-b�r�ignore_blank_lines�ignore_case�ignore_space_changes)rr�r�r�r�r�rj)r#rDr�rvr�rh�r#r�r��Previous Change�Next Change�common/css/diff.css�common/js/diff.jszTicket Diffr�)r�rr��new_versionr�rj�num_changesr��
old_ticket�
new_ticket�longcol�shortcol�diff_view.htmlr\)#r�r�r�r�r�r�r�r3rr�rJ�dictrrer�r�r�r��_render_property_diffr,�lir4�strongr8r�r��
splitlinesr9rBrr�rJrFrDrU))r`rxrVr�r�rr�rh�descriptions�old_idx�new_idxr�rD�
old_changer�
new_change�tnew�told�prev_version�next_versionr�rrr�r�r�r�r�r�r,r�rj�
diff_style�diff_options�	diff_data�diff_context�optionr��old_text�new_textrra)r�r�rxr`r�rVrbr�xs�
�


�
�����


�
��
����
��

�
zTicketModule._render_diffNcCs(|jj|j|dur|nd|d�d|S)N)rr�r{)r�rVr�)r`rxrVrmrDrararb�_make_comment_urls
��zTicketModule._make_comment_urlc	CsHg}|�|�pgD]\}}}}|�|||d||�||||�d��q	|S)N)rDrzr�r�r�r)�get_comment_historyr�r*)	r`rxrVrmrhrDrzr�r�rararb�_get_comment_historys�
�z!TicketModule._get_comment_historyc
Cs�|�|j��d�|�|||�}|��|�|||�}|�td�|jtd|j|d�|dd|fg|d��t	|td|jd	�|�d
|fS)z)Extract the history for a ticket comment.r��Ticket Comment History�!Ticket #%(num)s, comment %(cnum)d�rwrmrnrm)r�rr;r�diff_action�	diff_argsrhr�rvr�)
r�rrJr,r�r*rUr3r�rA)r`rxrVr�rmrhrrararbr�*s �
�	z$TicketModule._render_comment_historyc
s�|��j��d�|j�dd�}|j�d|�}||kr!||}}n||kr)|d}i�|�|���D]}|�|d<q2��fdd�}t|�\}	}
}d}|
D]}
|
�d�r^t|
d	d
��}nqM|dkred
}���fdd
�}||�}||�}t	|||d|
vd|
vd|
vd�}|g||�||�d�g}|}d
}|t
��dkr�|d}|r�|jj�j
�d|d�}t|d|td|d��t|d|jj�j
�dd�td��|r�|jj�j
�d|d�}t|d|td|d��t|td�td�td��t|d�t|d �|�id!td"��d#�j�d$td%�j
�d&��d'|�|����d(|�|��|��d)|�|��|��d*|jj�j
�d|d��d+d�d,d-�fg�d|�d.|�d/|�d0|�d1||�d2�|�d3��d-��d4d4d5���d6|fS)7z:Show differences between two versions of a ticket comment.r�rDr�r�csHtd�j�d�}|rtd|d�}d|}n	td�td�}}|||d�S)	Nr.r/r�rvr�r�r�)r�r�r�)r3r�)rDr�r�r�)rmrVrarbr�Js�
z7TicketModule._render_comment_diff.<locals>.version_infor�rr�Nrc
sFz�|d}Wntyttd|��jd���w|r!|��SgS)Nr�zANo version %(version)d for comment %(cnum)d on ticket #%(ticket)s)rDrmrV)�KeyErrorrr3r�r)rDr��rmrhrVrarb�get_text]s��z3TicketModule._render_comment_diff.<locals>.get_textrrrr)rr�r�r�rn)rmr#rDr�r�rvr�rl)rmr#r-r�r
rrr
r�zTicket Comment Diffrr;r.r/r�old_url�new_url�diff_urlr0r1rmrr�rjrr�rVr�)rrr)r�rrJr�r�r,r8r�r�r9r�r�rVr�rBr3rJrFrDrUr*)r`rxrVr�rmrr�r�r�r#r$r%r&r'r4r(r)rr�r!r"rrar3rbr�<s�

�
�������

����������
���
�
�����
�z!TicketModule._render_comment_diffr�
text/plaincCsdd�|jD�}t��}|�d�tjtj|dddd�|tjd�}|�d	gd
d�|D��t	||j
�}t|j�g}	|D]9}
|
d}||pGd}|d
vrWt
|j��||d�}n||jvrp|j�|��d�}
|rnt|t|
|�nd}|	�|�q<|�|	�|��d|fS)NcSsg|]
}|ddvr|�qS)r;)r�rorar�rararbr��s�z+TicketModule.export_csv.<locals>.<listcomp>srf�
T)�encoding�newline�
write_through)�	delimiter�quotingr�cSsg|]}|d�qSr:rar�rararbr��r2r;r�)r��ownerr�� r�z%s;charset=utf-8)r��io�BytesIO�writerm�writer�
TextIOWrapper�
QUOTE_MINIMAL�writerowrKrrr�r=re�
format_emailsr��by_namer�r)r#r��getvalue)r`rxrVrursr��contentrDr�colsr�r;r�r�rararbrv�s6
��

���
zTicketModule.export_csvcCsng}|�||�D]�}|�|�i}d|vrdg|d<|d��D]*\}}|dkr2|�dg��|�q d}|ds;d}n|dsAd	}|�|g��|�q |�d�}	|	r_td
d
t|	�d�|	�d�}	|�d�}
|
rstd
d
t|
�d�|
�d�}
|�d	�}|r�tddt|�d�|�d�}td��dd�|	|
|fD��|d<q|j	||dd�}||d<t
|j��|d|ddd��}
|
dfS)Nr��addedr�r��changedr�r]r��deletedr�r�r�z%(labels)s setz%(labels)s deleted�; css�|]}|r|VqdSr\ra)r��grararbr�rz+TicketModule._export_rss.<locals>.<genexpr>r�Tr�r�z
ticket.rssrk)�content_type�iterable)
r�r�r��
setdefaultr�r7r�r"r3rTr=re�render_template)r`rxrVr�r��change_summaryr�r��chgr��s�dr��outputrararbrw�sN


�
�
�$��zTicketModule._export_rssc
	Cs0d}|j}|jr`|jr`t|j�ddh}d|vr(d|�|�vr(t|td��d}|�d�d|vrAd	|�|�vrAt|td
��d}|�d�|rXd|�|�vrXt|td��d}|s`|�|j�|j	�
d
�}|rxd|�|�vrxt|td��d}|jr�|js�|s�|r�tt|d��}d|j	vr�|j	�
d�|kr�t|td��n|j	�
d�|kr�t|td��d}|j	�
d�p�d}	|	dkr�t
|	d�dur�ttd���|p�|j	�
d�}|jD]A}
|jr�t|
d�r�|
�||�D]
}d}t|td|d��q�|
�||�D]\}}d}|�rt|tdt�|�|d��q�t||�q�q�|S)NTr�r�r��TICKET_EDIT_DESCRIPTIONz-No permission to edit the ticket description.Fr��TICKET_ADMINz,No permission to change the ticket reporter.�TICKET_CHGPROPz&No permission to change ticket fields.r��
TICKET_APPENDz No permissions to add a comment.ror8rrz8This ticket has been modified since you started editing.�	view_timezaYour changes have not been saved because this ticket has been modified since you started editing.�replytorz$Invalid comment threading identifierrd�validate_commentz*The ticket comment is invalid: %(message)s�r�z2The ticket field %(field)s is invalid: %(message)s)r�r�)r�existsr�r]r�rGr3�discardr�r�r�rr(r�TracValueError�ticket_manipulators�hasattrrar4�validate_ticketr,r)
r`rxrV�force_collision_checkr^rrNr�ror`�manipulatorr�r�rararbrR�sh




�
��
zTicketModule._validate_ticketc	
Cs\t|�|||��}|��|D]}|j�d|jj�|�|||�qtd||d|j	�}z
t
|j��|�Wn(t
y^}z|j�d|jt|��t|tdt|�d��WYd}~nd}~wwtjd|j|j�|j�d�}d	|jvr�t|td
|d��|�|jj|j|jdd
��d|�|j�vr�t|td|d��|�|j���|�|j�|j��dS)N�Side effect for %sr�r�z:Failure sending notification on creation of ticket #%s: %sz[The ticket has been created, but an error occurred while sending notifications: %(message)srbr�r��
attachmentzPThe ticket %(ticketref)s has been created. You can now attach the desired files.)rr�r	r�zTThe ticket %(ticketref)s has been created, but you don't have permission to view it.) r�r%�insert�log�debug�	__class__�__name__�apply_action_side_effectsrr�r
re�notify�	Exception�errorr�r.rGr4r-r,r�r�rVr�rCr�rmr�r�rr|)	r`rxrVr#�controllersr+rr�rrararbrS0sF��
����	
���zTicketModule._do_createc
Cs6t|�|||��}d}tt�}t|d�}|j�d�}|j||||j�d�d�}	|	rxd|	}td||||�}
z
t	|j
��|
�Wn8tyw}z,|j
�d|jt|��td	�}|r_tj||d
�}t|td|t|�d��d}WYd}~nd}~ww|D]}
|j
�d
|
jj�|
�|||�qz|�|j�|j�|�dS)Nr�r�r�r`)�whenr`r{rNz8Failure sending notification on change to ticket #%s: %sr�rlz]The %(change)s has been saved, but an error occurred while sending notifications: %(message)s)r�r�rk)r�r%r!r*rr�r��save_changesrr
rertrurorvr�r.r3r,r�rGr4r-rprqrrrsr�r�rV)r`rxrVr#rw�fragment�nowr�r�rmrr�r�r+rararbr�Zs@


�
�����zTicketModule._do_savecst|j����i���fdd�}|j��D]\}}|||pd||d�qg}|�|||�D]D}|jj}	|�|||�}
|
D]4}||}|
|}
|�vrj�|d}�|d}||
krj|rj|�	t
d|	||
||d��||||
|	�q=q.t����D]\}}|d	|dkr��|=qy�|fS)
z�Returns a dictionary of field changes.

        The field changes are represented as:
        `{field: {'old': oldvalue, 'new': newvalue, 'by': what}, ...}`
        cs|||��||�d��|<dS)N)r�r��byr,)r�)r�r�r�r��r_r�rarb�store_change�s
�z5TicketModule.get_ticket_changes.<locals>.store_changer��userr�r|z^%(controller1)s changed "%(key)s" to "%(val1)s", but %(controller2)s changed it to "%(val2)s".)�controller1ry�val1�controller2�val2r�)rrer�r�r�r%rqrrrNr�r3r�)r`rxrVr/r~r�r�r`r+�cname�action_changesryr�r��last_new�last_by�itemrar}rbrN�sB������zTicketModule.get_ticket_changescCs|D]
}||d||<qdS)zKApply the changes obtained from `get_ticket_changes` to the ticket
        r�Nra)r`rVr_ryrararbrQ�s�z"TicketModule._apply_ticket_changesc	Cszddlm}|j�|�s|p|S|dur|j}tt|��}|||<|dkr)d|d<|s-|r;tj|p2||j	�
|�|d�SdS)z;Return a link to /query with the appropriate name and valuer��QueryModuleNr�r�r�)r�r�)�trac.ticket.queryr�re�is_component_enabledrZr;r<r,r�r�rY)	r`rxr;r�r�r�rYr�r�rararb�_query_link�s��zTicketModule._query_linkcCs�ddlm}t|t�r|j�|�s|S|dur|j}tt|��}g}t	t
�d|��D]E\}}	|dr<|�|	�
�d�q*|	ro|dkrKt|j��||	�n|	}
t|
�sj|��}d|	||<|�tj|
|j�|�d	��q*|�|
�q*t|�S)
z@Splits a list of words and makes a query link to each separatelyrr�Nz	([;,\s]+)r�r@r��~rl)r�r�r�rrer�rZr;r<�	enumerate�rer�r�r�r=�
format_authorr0�copyr,r�r�rY)r`rr;r�rYr�r�r�r��wordr��	word_argsrararb�_query_link_words�s4

���


�
�zTicketModule._query_link_wordsc	sjt�|j�}t�}|jD�]%}|d}|d}|�dd�|�dg�|�dd�|�dd�|�d	�}	|d
vrE�j�||||	d�|d<|d
vrOd|d<�n|dkr�|�d�s��fdd��fdd�|dD�D�}
|
gk|d<t|
|jo|d��	|j�v�}g|d<dd�|D�|d<t
d||�}t�j||d�|d<n�|dkr�|�d�s�zt
��j||�}
Wn	ty�Yn�w|
jr�t�t|
j�}td|d�}|d|d�n�|dk�rV|duo�d|v}d��	|j�v�r+|j�d|d�}���|�\}}}d�jv�od�jv}td �td!�td"�d#�||d$<||d%<||d&<||d<|�r+||dd<|�rV��|dd'�}��|dd(�d)d*��}||k�rM|d=n	d+�|�|dd(<|d,v�r�|j�r�|d�r�||}|d}g}|�dg�D]
}|�|d��qt|�r�||v�r�||v�r�|�|�n�|d-k�r�||}|d.v�r�|d/k�r�td0�ntd1�}�j�||||	d�|d<ns|d2k�r�|�d3�d4k�rՈj�||||	d�|d<nX|�d3�d5k�r�j|||||	d�|d<nB|d6k�r-||}||d7<|�d3d8�}t|t��rt�t||�|d9<n|�pd:|d9<t �d;d�}|d<k�r't!|�|d=<nt"|�|d=<|�|�q|S)>Nr;r��optionalF�options�skip�editableTrZ)r�rkr�)rYr�)r�r�r�r?r�r�r�ro�	milestone�customcs g|]}d��|j�vr|�qS)�TICKET_CHG_MILESTONE)r�r�r��mr�rarbr��s
��z0TicketModule._prepare_fields.<locals>.<listcomp>c3s�|]
}t��j|�VqdSr\)r�	Milestonere)r��optr_rarbr�s��z/TicketModule._prepare_fields.<locals>.<genexpr>r\cSs$g|]\}}|dd�|D�d��qS)cSsg|]}|j�qSrar:r�rararbr��sz;TicketModule._prepare_fields.<locals>.<listcomp>.<listcomp>)r,r�ra)r�r,�
milestonesrararbr��s���	optgroups�compactrDzReleased %(datetime)srrr��TICKET_EDIT_CCr�r�zAdd Ccz	Remove Cc�Cc)r�r�N�
edit_labelr�r�r�r�r@rr�)�radio�select�checkbox)�1�0r��yes�nor�r��	referencer�r��	timevaluerr�r��lc_timerz�format_hint)#rKrrr�rTr�r�rrcr�r
rrer�Versionrr�r)r"r3r�r�r�r��replacer"�extendr�r�r�rr#�getattrr%r&)r`rxrVr_rr�r�r;�type_rZr��groupsr�rD�dtr��
cc_changedr�r�r�r�r��old_cc_list�new_cc_listr�r�r��xr�r��localera)rxr`rbrV�s�

�
�
�
�
���
����




�

���
�����

�
zTicketModule._prepare_fieldscs$�j�d�}|�d<|jj�d<d�d<|�d<t|j��|��||�}���fdd�}|dkr=||d	|dd
|j�i}	i}
g}d}d}
��d
|d�}t�}|�	�|�D]�}|dr�|d}|jjdur�||jjkr�|d�
�D]\}}||	vr�|d|	|<qtd}
n@d|vr�|
�|dg��|�|t
|�kr�||d|dd|�|jjr�|d�
�D]
\}}|d|	|<q�d|dvr�|�d<|d|kr�|�|d�|
s�|�|�qX|jjdur�|�|	�d}|D]}|d�d�}|�r|ddk�r|dnd}q�|��|�\}}||d�j�d��d��id�}�j�d�}|�r)||d<�jdk�r<|�||�|��||�|jjdu�rH|�|	�t�|j�}dD]$}||}���|�}t|��ss|j�|||���|�d��d|<�qP��|||||
t|j��|�||||t|�dkd ��dS)!z+Insert ticket data into the template `data`r`rDNrErCcsRd�jvr'�j�|dd�}d�d||fgdd�|��D�dg��d<dSdS)	Nr�F)�
show_emailr9zReplying to [%s %s]:cSsg|]}d|�qS)z> %sra)r��linerararbr�lr2zLTicketModule._insert_ticket_data.<locals>.quote_original.<locals>.<listcomp>r�)r�r�r"r)r��original�link�formatted_author�rbr�rxrarb�quote_originalfs
�����z8TicketModule._insert_ticket_data.<locals>.quote_originalr�r�z	ticket:%drFrrror�rmr�r�Tr�r�z
comment:%sr�rzr�r�)r�r�r8r��comment_historyr6�r�r?r�z%s_link)r�	conflictsr�r��replies�attachmentsr'r#r��	closetimerF)r�r�rrDr=rerVr�r]r�r�rTr�rrUr�r0rLrQ�_render_property_changesrKr�r0r��author_classr�attachment_datar�)r`rxrVr�rCr_r`r�r�r�r�r�rmr�rrr�r�r�r�r�r�rXr'r/r�r�roler�formatted_userrar�rbr�Ws�
���
�
�
��


��
�z TicketModule._insert_ticket_datac	cs��|j�d�}|j||d�D]C}|j|�d�d�}d|�|�vrQ|�|||d|�d|dvrN|ddd}||d�}d	|�|�vrN|dd=|dsNq|Vqd
S)�`Iterate on changelog entries, consolidating related changes
        in a `dict` object.
        rm�rxrmrgr�r�r�r��ATTACHMENT_VIEWN)rr�grouped_changelog_entriesr�r�r�)	r`rxrVrx�attachment_realmr�r�r�rmrararbr��s �

��z'TicketModule.rendered_changelog_entriesc		Cs@|��D]\}}|d|d}}|�||||||�|d<qdS)Nr�r�r�)r�r)	r`rxrVr��resource_newr�r�r�r�rararbr��s���z%TicketModule._render_property_changescs�dd�}dd�}t|j������fdd�}	�j�|i�}
|
�d�}|dkr0||	|j||�}|S|d	vr]|	|�}
|	|�}|rH|sHtd
|
d�}|S|rT|sTtd|d�}|Std
|
|d�}|S|dkrq|dkrktd�}|Std�}|S|dkr��s}td�}|St|j��j	dd�}t
jtd�|d�}td|d�}|S|dkr�|
�d�dkr�tj
tdd�}|d|||�}|S|dkr�|
�d�}t|t�r�t�t||�n|p�d }t|t�r�t�t||�n|p�d }|||�}|S|||�}|S)!Ncs��sdd��||��||����fdd��D�}��fdd��D�}|r1tddt|�t|d�d�}|r@td	d	t|�t|d�d�}|sD|rPt||oM|oMtd
�|�St|d|�S)NcSs|Sr\ra)r�rararb�<lambda>�szITicketModule._render_property_diff.<locals>.render_list.<locals>.<lambda>c�g|]
}|�vr�|��qSrara�r�r�)�elt_renderer�old_listrarbr���zKTicketModule._render_property_diff.<locals>.render_list.<locals>.<listcomp>cr�rarar�)r��new_listrarbr��r�z%(value)s addedr@�r��%(value)s removedrP� → )r5r�r2r,r3)r��
split_listr�r�rM�remvdra)r�r�r�rb�render_list�s"��z7TicketModule._render_property_diff.<locals>.render_listcSs^|r|rttj|dd�dtj|dd��}|S|s&|r&tdtj|dd��}|Stj|dd�}|S)Nztrac-field-oldr�r�ztrac-field-newu→ ztrac-field-deleted)r,r�)r�r�r�rararb�render_default�s���z:TicketModule._render_property_diff.<locals>.render_defaultcs�p�j}�j�||d�S)Nr)r�
authorinfo)r�r�rbrxr�rVrarbr�s
z6TicketModule._render_property_diff.<locals>.authorinfor�r�r�r�r�zset to %(value)szchanged from %(old)s to %(new)s)r�r�r�r�r]�unsetrk�modifiedrjr	rlzmodified (%(diff)s))rjr�r�r�z[,;\s]+)rur�r�)r=rer�rIr�r�r4r3rr�r,r��	functools�partialr r�rr)r#)r`rxrVr�r�r�r�r�r�r��
field_infor�r��
old_author�
new_authorr�rj�tl�format_rar�rbr�sn


%� ����������
����

�z"TicketModule._render_property_diffccs��t|j���}|j|d�}d}d}}|D]�\}}	}
}}}
|
r#|fn||	f}||krX|r<|t|�}|d|d<|V|}dd|ii}|i|
d|d�}|
rX|sX|d7}||d	<|
�d
�sk|�d|	�|d�d|	�|
dkr�||d<|	|d<|dd<|r�d|vr�|�dd�\}}||d
<n|}t|�|d	<}q|
�d�r�t|
dd��}|�|i��	d|i�|�|di��	|	t
t|��d��q|s�|r�||kr�|||�|
|
�d�|d|
<q|r�|t|�}|d|d<|VdSdS)r�r�rNr�rzr�)rzr�r�r�r�r�rmr3r�r�r`�_commentrl)r�rz)r�r�r,r�)rrer��
get_changelog�maxr�rTr�r�rUr$r�)r`rVrxr��	changelog�autonum�last_uid�currentrzr�r�r�r�r��uidr��last_comment�
parent_num�this_numr�rararbr�0sd��

�
�
��
�z&TicketModule.grouped_changelog_entries)Fr\)rr8)NNN)Irr�
__module__�__qualname__�
implementsr	r>r:rr?r�ExtensionPointrrfrr�rr�rrrrWrZr��compiler}rcrrgrrrzr�r�r�r�r�r�r�r�r�r�rrr0r%r�r�r�rTr�r�rMr�r�r�r*r,r�r�rvrwrRrSr�rNrQr�r�rVr�r�r�rr�rarararbrN?s�������

	,, Xh

(
"
c
-I*(+


|
q

�OrNc@s0eZdZdZee�ejZdd�Zddd�Z	dS)	�DefaultTicketPolicyaSDefault permission policy for the ticket system.

    * Users with `MILESTONE_VIEW` can edit the ticket milestone field.
    * Authenticated users with `TICKET_APPEND` or `TICKET_CHGPROP` can
      edit the description of a ticket they reported.
    * Authenticated users with `TICKET_APPEND` can edit their own ticket
      comments.
    cCs|dkr|t|j�jvr|�|d�rd|vrdS|dkr?|dkr?|�||j�r?d|vs/d|vr?t�|j|j�}||d	kr?dS|d
kru|dkrw|�|d�ry|�|j|j�r{d||j�vr}t�|j|jj�}|�	|j�}|r||dkr�dSdSdSdSdSdSdSdS)
Nr�r��MILESTONE_VIEWTr[r�r]r^r�ryr�r�)
rrer5�_is_valid_resourcer�rrKr�rxr�)r`r#�usernamerr�rVr�rararb�check_permissionss:
��
���z$DefaultTicketPolicy.check_permissionTcCs&|o|j|ko|r|jduS|jduSr\)r�r�)r`r�expected_realmrcrararbr�s
��z&DefaultTicketPolicy._is_valid_resourceN)T)
rrr�r��__doc__r�rrr�rrrarararbr�es	r�)irmrr�rAr�r��trac.attachmentr�trac.configrr�	trac.core�trac.mimeview.apirr	�trac.notification.apir
�	trac.permrr�
trac.resourcer
rrrr�trac.searchrrr�trac.ticketr�trac.ticket.apirrr�trac.ticket.notificationr�trac.ticket.roadmapr�trac.timeline.apir�	trac.utilrrrrr �trac.util.datefmtr!r"r#r$r%r&r'r(r)r*�trac.util.htmlr+r,r-�trac.util.textr.r/r0r1�trac.util.presentationr2�trac.util.translationr3r4r5r6r7�trac.versioncontrol.diffr8r9�trac.web.apir:r;r<�trac.web.chromer=r>r?r@rArBrCrDrErFrGrHrIrJrK�trac.wiki.formatterrLrM�	ComponentrNr�rarararb�<module>sZ0D4

https://t.me/RX1948 - 2025