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__/model.cpython-310.pyc
o

�k�`4��@s�ddlZddlmZddlmZddlmZddlmZddl	m
Z
mZmZddl
mZddlmZmZmZdd	lmZmZmZmZmZmZdd
lmZmZddlmZmZm Z gd�Z!d
d�Z"dd�Z#dd�Z$dd�Z%dd�Z&dd�Z'dd�Z(dd�Z)Gdd�de*�Z+Gdd �d e*�Z,Gd!d"�d"e,�Z-Gd#d$�d$e*�Z.Gd%d&�d&e,�Z/Gd'd(�d(e,�Z0Gd)d*�d*e,�Z1Gd+d,�d,e*�Z2Gd-d.�d.ej2�Z3Gd/d0�d0e*�Z4Gd1d2�d2e*�Z5Gd3d4�d4e*�Z6dS)5�N)�core)�
Attachment)�cached)�	TracError)�Resource�ResourceExistsError�ResourceNotFound)�TicketSystem)�as_int�embedded_numbers�to_list)�datetime_now�from_utimestamp�
parse_date�
to_utimestamp�utc�utcmax)�empty�stripws)�_�N_�gettext)	�Ticket�Type�Status�
Resolution�Priority�Severity�	Component�	Milestone�VersioncCs0g}t|d�D]}||vr|�|�qd�|�S)z0Fix up cc list separators and remove duplicates.z[;,\s]+z, )r�append�join)�cc_value�cclist�cc�r&�3/usr/lib/python3/dist-packages/trac/ticket/model.py�_fixup_cc_list&s
�
r(cCsV|durdSztt|��WStyYnwz	t|��td�WSty*YdSw)N�datetime)r�int�
ValueErrorr�stripr�	Exception��valuer&r&r'�_db_str_to_datetime/s��r0cCs0|sdSt|�}|r|dkrdnd}||S|S)Nrz%018dz%+017d)r)�dt�is_custom_field�ts�fmtr&r&r'�_datetime_to_db_str<sr5cCs|rt|�SdS�N)r)�timer&r&r'�_from_timestampHsr8cCs|r|SdSr6r&r.r&r&r'�_to_nullL�r9cCs|r|StSr6)rr.r&r&r'�_null_to_emptyPr:r;cCs|r	d�|���S|S)z5Strip spaces and remove duplicate spaces within names� )r"�split��namer&r&r'�simplify_whitespaceTsr@cCsp|j�&}dd�|D�}d�dgt|��}|d||�dd�f|�}Wd�n1s,wYdd�|D�S)	NcSsg|]}t|��qSr&�r*)�.0�id_r&r&r'�
<listcomp>]�z,sort_tickets_by_priority.<locals>.<listcomp>�,�%sa

                  SELECT id FROM ticket AS t
                  LEFT OUTER JOIN enum p
                    ON p.type='priority' AND p.name=t.priority
                  WHERE t.id IN (%s)
                  ORDER BY COALESCE(p.value,'')='', %s, t.id
                  zp.valuer*cS�g|]}|d�qS�rr&�rB�rowr&r&r'rDfrE)�db_queryr"�len�cast)�env�ids�db�tickets�holders�rowsr&r&r'�sort_tickets_by_priority[s���
rUc@s�eZdZdZdZedd��Zedd��Zd6dd	�Z	d
d�Z
edd
��Zdd�Zdd�Z
dd�Zdd�Zdd�Zdd�Zdd�Zdd�Zdd�Zd7d d!�Zd"d#�Zd8d$d%�Zd&d'�Zd7d(d)�Zd*d+�Zd6d,d-�Zd9d.d/�Zd7d0d1�Zd6d2d3�Zd4d5�ZdS):r�ticket)�
resolution�statusr7�
changetimec	Cs:zdt|�ko
dkWSWSttfyYdSw)NrlF)r*r+�	TypeError��numr&r&r'�id_is_validqs
 �zTicket.id_is_validcCst|j|j|j�Sr6)r�realm�id�version��selfr&r&r'�resourcexszTicket.resourceNcs�|�_t�j����_�fdd��jD��_ggg�_�_�_�jD]&}|�d�r4�j�	|d�n�j�	|d�|ddkrJ�j�	|d�q$i�_
i�_|dur[��|�n��
�d�_|�_dS)Ncs"h|]
}|d�jvr|d�qSr>)�protected_fields�rB�frar&r'�	<setcomp>�s�z"Ticket.__init__.<locals>.<setcomp>�customr?�typer7)rOr	�get_ticket_fields�fields�editable_fields�
std_fields�
custom_fields�time_fields�getr!�values�_old�
_fetch_ticket�_init_defaultsr_r`)rbrO�tkt_idr`rfr&rar'�__init__|s&�

�
zTicket.__init__cC�d|jj|jfS�Nz<%s %r>��	__class__�__name__r_rar&r&r'�__repr__��zTicket.__repr__cC�
|jduSr6�r_rar&r&r'�<lambda>��
zTicket.<lambda>cCsh|jD].}d}|d|jvrn|�d�s!|jj�dd|d�}n|�|�}|r1|j�|d|�qdS)Nr?rhrV�default_)rkrdrprO�config�_custom_field_defaultrq�
setdefault)rb�field�defaultr&r&r'rt�s



�
��zTicket._init_defaultsc
Cs�|�d�}|�d�}|r1|r1||vr1z|t|�}Wnttfy0|jj�d||d�Ynw|rh|�d�dkrhzt||�d�d�}W|Styg}z|jj�d	||d|�d}WYd}~|Sd}~ww|S)
Nr/�optionsz0Invalid default value '%s' for custom field '%s'r?rir7�format)�hintz4Invalid default value '%s' for custom field '%s': %s)	rpr*r+�
IndexErrorrO�log�warningrr)rbr�r�r��er&r&r'r��s2


����

���zTicket._custom_field_defaultcCsJd}|�|�rt|�}|j�dd�|j�|f�D]}|s)ttd|d�td���||_t	|j�D]$\}}||}||j
vrFt|�|j|<q1|durPt
|j|<q1||j|<q1|j�d|f�D]%\}}||jvr�||j
vrtt|�|j|<q^|dur~t
|j|<q^||j|<q^|jD]}|d}|�d�r�||jvr�|�|�}|r�|||<q�dS)	NzL
                    SELECT %s FROM ticket WHERE id=%%s
                    rFzTicket %(id)s does not exist.rzInvalid ticket numberzW
                SELECT name, value FROM ticket_custom WHERE ticket=%s
                r?rh)r]r*rOrLr"rmrrr_�	enumeraterorrqrrnr0rkrpr�)rbrurK�ir�r/r?r�r&r&r'rs�sR

����
�


�

��zTicket._fetch_ticketcCs|j�|�Sr6�rqrp�rbr?r&r&r'�__getitem__�r:zTicket.__getitem__cCs�|r"||jvr"t|t�rttd���|j�|i��d�dkr"|��}||j	vr0|j	||kr0dS||j
vr?|j	�|�|j
|<n|j
||krJ|j
|=||j	|<dS)zKLog ticket modifications so the table ticket_change can be updated
        z%Multi-values fields not supported yetri�textareaN)ro�
isinstance�listrrrk�by_namerpr,rqrr�rbr?r/r&r&r'�__setitem__�s

zTicket.__setitem__cCs
||jvSr6)rq)rb�itemr&r&r'�__contains__��
zTicket.__contains__cCs:z|j|}|tur
|WS|�|�WStyYdSw)zLReturn the value of a field or the default value if it is undefined
        N)rqr�get_default�KeyErrorr�r&r&r'�get_value_or_default�s
�zTicket.get_value_or_defaultcCs|j�|i��dd�S)z$Return the default value of a field.r/�)rkr�rpr�r&r&r'r�szTicket.get_defaultcspdd�|jD���fdd�|D�D]}||||<q�fdd�|D�D]}|dd�|vr5d||dd�<q#dS)z<Populate the ticket with 'suitable' values from a dictionarycSrHr>r&rer&r&r'rDrEz#Ticket.populate.<locals>.<listcomp>csg|]}|�vr|�qSr&r&�rBr?��field_namesr&r'rD�cs*g|]}|dd��vr|�d�r|�qS)�	N�	checkbox_��
startswithr�r�r&r'rDs
�r�N�0)rk)rbrqr?r&r�r'�populate	s��zTicket.populatec	
sf|jrJd��d|jvrt|jd�|d<|durtt�}||jd<|jd<|�|j��g}g}|jD]}|d}||jvrO|�d�rJ|�|�q4|�|�q4|j	j
�>}|��}|�dd	�
|�d	�
d
gt|��f�fdd�|D��|�|d
��|r�|�d��fdd�|D��Wd�n1s�wYt��|_i|_t|j	�jD]}|�|�q�|jS)z Add ticket to database.
        z Cannot insert an existing ticketr%Nr7rYr?rhz#INSERT INTO ticket (%s) VALUES (%s)rFrGcsg|]}��|��qSr&�rpr�)�	db_valuesr&r'rD4sz!Ticket.insert.<locals>.<listcomp>rVzoINSERT INTO ticket_custom (ticket, name, value)
                       VALUES (%s, %s, %s)
                    csg|]
}�|��|�f�qSr&r�)rB�c�r�rur&r'rD<s�)�existsrqr(r
r�_to_db_typesrkrpr!rO�db_transaction�cursor�executer"rM�get_last_id�executemanyr*r_rrr	�change_listeners�ticket_created)	rb�whenrmrnrf�fnamerQr��listenerr&r�r'�insertsP




�
�������
z
Ticket.insertc	CsXt|�}|j�d|j|f�D]\}z
t|�dd�d�WSty)YdSwdS)z$Return a comment number by its date.z�                SELECT oldvalue FROM ticket_change
                WHERE ticket=%s AND time=%s AND field='comment'
                �.����N)rrOrLr_r*�rsplitr+)rb�cdater3�cnumr&r&r'�get_comment_numberGs
���zTicket.get_comment_numberc
sd�jsJd��d�jvrt�jd��d<t�fdd��j��D��}|r)t|�s-|r-dS|dur5tt�}|�jd<��	�j�}��	�j�}�j
j��}|d|d�jf�d	}	|d
�j�jf�D] \}
}z|	t
|�dd�d
�7}	Wn
ty�|	d7}	Yq`wt|	d�}|r�d||f}�jD]`}
|�|
�}|�|
�}|
�jvr�|d�j|
f�D]}|d|�j|
f�n!|d�j|
|f�|durوj�|
�}��|�}�j�|
�|kr�q�n
|d|
|�jf�|d�j|d||
||f�q�|d�j|d|||f�Wd�n	1�swY�j}i�_t�j
�jD]}|��|||��qt
|�dd�d
�S)z�
        Store ticket changes in the database. The ticket must already exist in
        the database.  Returns False if there were no changes to save, True
        otherwise.
        zCannot update a new ticketr%c3s$�|]
\}}�j�|�|kVqdSr6r��rB�k�vrar&r'�	<genexpr>^s��z&Ticket.save_changes.<locals>.<genexpr>FNrY�+UPDATE ticket SET changetime=%s WHERE id=%sram
                    SELECT DISTINCT tc1.time, COALESCE(tc2.oldvalue,'')
                    FROM ticket_change AS tc1
                    LEFT OUTER JOIN ticket_change AS tc2
                    ON tc2.ticket=%s AND tc2.time=tc1.time
                       AND tc2.field='comment'
                    WHERE tc1.ticket=%s ORDER BY tc1.time DESC
                    r�r�r�z%s.%sz�SELECT * FROM ticket_custom
                                     WHERE ticket=%s and name=%s
                                     �zUPDATE ticket_custom SET value=%s
                              WHERE ticket=%s AND name=%s
                              z{INSERT INTO ticket_custom (ticket,name,value)
                              VALUES(%s,%s,%s)
                              �%UPDATE ticket SET %s=%%s WHERE id=%%sz�INSERT INTO ticket_change
                        (ticket,time,author,field,oldvalue,newvalue)
                      VALUES (%s, %s, %s, %s, %s, %s)
                      z�INSERT INTO ticket_change
                    (ticket,time,author,field,oldvalue,newvalue)
                  VALUES (%s,%s,%s,'comment',%s,%s)
                  )r�rqr(�allrr�itemsrr
rr�rOr�r_r*r�r+�strrprnrkr�r�r	r��ticket_changed)rb�author�commentr��replyto�props_unchangedr��
old_db_valuesrQr\r3�oldr�r?�db_val�
old_db_valrKr�r��
old_valuesr�r&rar'�save_changesSs�
�

�
�	�



�
�
�
��������?zTicket.save_changescCsN|��}|��D]\}}||jvr||jv}t||�||<qt|�||<q|Sr6)�copyr�rornr5r9)rbrqr�r/r2r&r&r'r��s

zTicket._to_db_typesc
	Cs�t|j�}t|�}|rd}|j|||||f}nd}|j||f}g}|j�||�D]&\}}}	}
}}|	|jvr=t|
�}
t|�}|�t|�||	|
pGd|pJd|f�q(|S)aHReturn the changelog as a list of tuples of the form
        (time, author, field, oldvalue, newvalue, permanent).

        While the other tuple elements are quite self-explanatory,
        the `permanent` flag is used to distinguish collateral changes
        that are not yet immutable (like attachments, currently).
        a`
                SELECT time, author, field, oldvalue, newvalue, 1 AS permanent
                FROM ticket_change WHERE ticket=%s AND time=%s
                  UNION
                SELECT time, author, 'attachment', null, filename,
                  0 AS permanent
                FROM attachment WHERE type='ticket' AND id=%s AND time=%s
                  UNION
                SELECT time, author, 'comment', null, description,
                  0 AS permanent
                FROM attachment WHERE type='ticket' AND id=%s AND time=%s
                ORDER BY time,permanent,author,field
                a<
                SELECT time, author, field, oldvalue, newvalue, 1 AS permanent
                FROM ticket_change WHERE ticket=%s
                  UNION
                SELECT time, author, 'attachment', null, filename,
                  0 AS permanent
                FROM attachment WHERE type='ticket' AND id=%s
                  UNION
                SELECT time, author, 'comment', null, description,
                  0 AS permanent
                FROM attachment WHERE type='ticket' AND id=%s
                ORDER BY time,permanent,author,field
                r�)	r�r_rrOrLror0r!r)
rbr��sid�when_ts�sql�argsr��tr�r��oldvalue�newvalue�	permanentr&r&r'�
get_changelog�s"


�
�zTicket.get_changelogcCs�|jj�'}t�|j|j|j�|d|jf�|d|jf�|d|jf�Wd�n1s.wYt|j�jD]}|�|�q9dS)zDelete the ticket.
        zDELETE FROM ticket WHERE id=%sz)DELETE FROM ticket_change WHERE ticket=%sz)DELETE FROM ticket_custom WHERE ticket=%sN)	rOr�r�
delete_allr^r_r	r��ticket_deleted�rbrQr�r&r&r'�delete�s
��z
Ticket.deletecCs�|dur|�|�}|s
dSt|d�}t|�}i}||d�}|j�d|j|f�D]"\}}}	}
||	|
d�||<|dkr?||d<q(|�d�sJ|�d|�q(|rO|SdS)	z6Return a ticket change by its number or date.
        Nr)�daterkz�
                SELECT field, author, oldvalue, newvalue
                FROM ticket_change WHERE ticket=%s AND time=%s
                )r�r��newr�r�r)�_find_changerrrOrLr_r�r�)rbr�r�rKr3rk�changer�r�r�r�r&r&r'�
get_change�s(

�

��zTicket.get_changec
Csd|dur|�|�}|s
dSt|d�}t|�}|durtt�}t|�}|jj�_}dd�|d|j|f�D�}|D]7\}	}
}|d|j||	f�D]\}|d|
|j||	|f�n|	|jvre|d|	|
|jf�q7|d	|
|j|	f�q7|d
|j|f�|d||jf�Wd�n1s�wY|�	|j�dd
�|D�}
t
|j�jD]}t|d�r�|�
|||
�q�dS)z8Delete a ticket change identified by its number or date.NrcSs.g|]\}}}|dkr|�d�s|||f�qS)r�rr�)rBr�r�r�r&r&r'rDs
�z(Ticket.delete_change.<locals>.<listcomp>z�
                        SELECT field, oldvalue, newvalue FROM ticket_change
                        WHERE ticket=%s AND time=%s
                        z�SELECT time FROM ticket_change
                                      WHERE ticket=%s AND time>%s AND field=%s
                                      LIMIT 1
                                      z�UPDATE ticket_change SET oldvalue=%s
                          WHERE ticket=%s AND time=%s AND field=%s
                          AND oldvalue=%s
                          r�r�z5DELETE FROM ticket_change WHERE ticket=%s AND time=%sr�cSsi|]
\}}}|||f�qSr&r&)rBr�r�r�r&r&r'�
<dictcomp>Es�z(Ticket.delete_change.<locals>.<dictcomp>�ticket_change_deleted)r�rrr
rrOr�r_rmrsr	r��hasattrr�)rbr�r�r�rKr3r�rQrkr�r�r��next_ts�changesr�r&r&r'�
delete_changesb

��

��
��
�����'�
��zTicket.delete_changec

Cs�t|�}|durtt�}t|�}d}|jj��}|d|j|f�D]\}||p'dkr2	Wd�dS|d|��|j||�d�f�}	|	rOtdd�|	D��d	nd
}
|d|j||d|
|p]dt	|�f�|dur�|d
|��|j||�d�f�D]
\}|d|j|||f�qwn	|d||j|f�|d||jf�Wd�n1s�wY||j
d<|p�d}t|j�jD]}t
|d�r�|�|||||�q�dS)zaModify a ticket comment specified by its date, while keeping a
        history of edits.
        NFz�
                    SELECT newvalue FROM ticket_change
                    WHERE ticket=%s AND time=%s AND field='comment'
                    r�z�SELECT field FROM ticket_change
                           WHERE ticket=%%s AND time=%%s AND field %s
                           �_commentcss"�|]\}t|dd��VqdS��NrA)rBr�r&r&r'r�es� z(Ticket.modify_comment.<locals>.<genexpr>r�rz�INSERT INTO ticket_change
                    (ticket,time,author,field,oldvalue,newvalue)
                  VALUES (%s,%s,%s,%s,%s,%s)
                  z
_comment%d��
                        SELECT author FROM ticket_change
                        WHERE ticket=%%s AND time=%%s AND NOT field %s LIMIT 1
                        rz�INSERT INTO ticket_change
                            (ticket,time,author,field,oldvalue,newvalue)
                          VALUES (%s,%s,%s,'comment','',%s)
                          z�UPDATE ticket_change SET newvalue=%s
                      WHERE ticket=%s AND time=%s AND field='comment'
                      r�rY�ticket_comment_modified)rr
rrOr�r_�prefix_match�prefix_match_value�maxr�rqr	r�r�r�)
rbr�r�r�r�r3r��old_commentrQrk�rev�
old_authorr�r&r&r'�modify_commentKsj

���������
���

���
,
���zTicket.modify_commentcCs||dur|�|�}|s
dS|\}}}n
t|�dd}}}|jj��}|dur5d}|d|j|f�D]\}}|durX|d|��|j||�d�f�D]\}}n		Wd�dS|d|��|j||�d�f�}tdd	�|D��}g}	|D]\}
}}}
|	�|
t	t
|��||f�|
|}}qu|	��|	r�|	d
ddnd}
|	�|
t	t
|��||f�|	Wd�S1s�wYdS)
zYRetrieve the edit history of a comment identified by its number or
        date.
        Nr�z�
                        SELECT author, newvalue FROM ticket_change
                        WHERE ticket=%s AND time=%s AND field='comment'
                        z�
                        SELECT author, newvalue FROM ticket_change
                        WHERE ticket=%%s AND time=%%s AND NOT field %s LIMIT 1
                        rz�SELECT field, author, oldvalue, newvalue
                         FROM ticket_change
                         WHERE ticket=%%s AND time=%%s AND field %s
                         r�css0�|]\}}}}t|dd��|||fVqdSr�rA)rBr�r�r�r�r&r&r'r��s�
 �z-Ticket.get_comment_history.<locals>.<genexpr>r�rr�)r�rrOrLr_r�r��sortedr!rr*�sort)rbr�r�rK�ts0�author0�last_commentrQrT�historyr�r�r�r3r&r&r'�get_comment_history�sV

���������$�zTicket.get_comment_historyc

Cs&t|�}|jj��}|d|��|j|d|�d|�f�D]}|Wd�Sd}|d|j|jf�D]&\}}}}	zt|�dd�d�}Wn
tyT|d7}Ynw||kr[n
q5	Wd�dS|dur}|d	|�	�|j||�
d
�f�D]\}|||	fWd�S1s�wYdS)zFind a comment by its number.z�
                    SELECT time, author, newvalue FROM ticket_change
                    WHERE ticket=%%s AND field='comment'
                    AND (oldvalue=%%s OR oldvalue %s)
                    �%r�Nra�
                    SELECT DISTINCT tc1.time, COALESCE(tc2.oldvalue,''),
                                    tc2.author, COALESCE(tc2.newvalue,'')
                    FROM ticket_change AS tc1
                    LEFT OUTER JOIN ticket_change AS tc2
                    ON tc2.ticket=%s AND tc2.time=tc1.time
                       AND tc2.field='comment'
                    WHERE tc1.ticket=%s ORDER BY tc1.time
                    r�r�r�r)r�rOrL�liker_�like_escaper*r�r+r�r�)
rbr��scnumrQrKr\r3r�r�r�r&r&r'r��s@
���

�
����
�$�zTicket._find_change)NNr6)NNNN)NNN) r{�
__module__�__qualname__r^rd�staticmethodr]�propertyrcrvr|r�rtr�rsr�r�r�r�r�r�r�r�r�r�r�r�r�r�r�rr�r&r&r&r'ris<


+	
2
^

2


;
>1rc@sbeZdZdZdZdZedd��Zddd�Zdd�Z	dd	�Z
d
d�Zdd
�Ze
dd��Zdd�ZdS)�AbstractEnumNcCr~r6)�
_old_valuerar&r&r'r��r�zAbstractEnum.<lambda>cCs�|js|j|_||_d|_|_d|_|_d|_|rK|j�d|j|f�D]\}}||_|_t	|�|_||_|_dSt
tdt|j
d�|d���dS)a!Create a new `enum` instance. If `name` is specified and the
        enum with `name` exists, the enum will be retrieved from the
        database.

        :raises ResourceNotFound: if `name` is not `None` and an enum
                                  with `name` does not exist.
        Nz{
                    SELECT value, description FROM enum
                    WHERE type=%s AND name=%s
                    z!%(type)s %(name)s does not exist.r�rir?)�
ticket_colrirOr?�	_old_namer/r
�descriptionrLr;rrr�label)rbrOr?r/rr&r&r'rv�s&�
��zAbstractEnum.__init__cCsd|jj|j|jfS)Nz
<%s %r %r>)rzr{r?r/rar&r&r'r|	szAbstractEnum.__repr__c
Cs�|jsttdt|jd�d���|jj�d|j|j	�|jj
�D}|d|j|jf�|�|j�D]%}zt
|j�t
|j�krJtt
|j�d�|_|��Wq/tyTYq/wt|j���Wd�n1sfwYd|_|_d|_	|_d|_dS)zMDelete the enum.

        :raises TracError: if enum does not exist.
        z$Cannot delete non-existent %(type)s.r�rizDeleting %s '%s'z+DELETE FROM enum WHERE type=%s AND value=%sr�N)r�rrrrrOr��inforir?r�r
�selectr*r/r��updater+r	�reset_ticket_fieldsrr)rbrQ�enumr&r&r'r�s.�

����

zAbstractEnum.deletec
Cs$|jrttdt|jd�|jd���|��|jj�	d|j
|j�|jj�[}z2|jsH|d|�
dd�|j
f�}|rEtt|dd��dnd|_|d	|j
|j|jt|j�f�Wn|jjjyqttd
t|jd�|jd���wt|j���Wd�n1s�wY|j|_|j|_dS)z�Add a new enum.

        :raises TracError: if enum name is empty.
        :raises ResourceExistsError: if enum with name already exists.
        z)%(type)s value "%(name)s" already exists.rrzCreating new %s '%s'zuSELECT COALESCE(MAX(%s), 0) FROM enum
                                WHERE type=%%s
                                r/r*r�z�
                    INSERT INTO enum (type, name, value, description)
                    VALUES (%s, %s, %s, %s)
                    �(%(type)s value "%(name)s" already existsN)r�rrrrr?�_check_and_coerce_fieldsrOr��debugrir�r/rNr*�floatr9r�db_exc�IntegrityErrorr	rrr
)rbrQrKr&r&r'r�'sB��

��"������zAbstractEnum.insertc
Cs|js	ttd���|��|jj�d|j|j�|jj	�b}z|d|j|j
t|j�|j|j
f�Wn|jjjyIttdt|jd�|jd���w|j
|_|j|j
krv|d|j|jf|j|j
f�|j|_
t|j���Wd�dSWd�dS1s�wYdS)	z�Update the enum.

        :raises TracError: if enum does not exist or enum name is empty.
        :raises ResourceExistsError: if renamed enum already exists.
        z Cannot update non-existent enum.zUpdating %s '%s'zvUPDATE enum SET name=%s,value=%s,description=%s
                      WHERE type=%s AND name=%s
                      rrrz%UPDATE ticket SET %s=%%s WHERE %s=%%sN)r�rrrrOr�rrir?r�r/r9rrrrrrrr
rr	r�rbrQr&r&r'rHs>
�����
�
��"�zAbstractEnum.updateccs��|j�4}|d|�dd�|jf�D]\}}}||�}||_|_||_|_t|�|_|VqWd�dS1s;wYdS)Nz~
                    SELECT name, value, description FROM enum
                    WHERE type=%s ORDER BY
                    r/r*)	rLrNrir?rr/r
r;r)�clsrOrQr?r/r�objr&r&r'rgs�
��
�"�zAbstractEnum.selectcCs0t|j�|_|jsttdt|jd�d���dS)NzInvalid %(type)s name.rr)r@r?rrrrrar&r&r'rus��z%AbstractEnum._check_and_coerce_fieldsr6)r{rr	rirrrr�rvr|r�r�r�classmethodrrr&r&r&r'r�s
!

rc@s$eZdZdZdZed�ed�fZdS)r�ticket_typerizTicket TypezTicket TypesN)r{rr	rirrrr&r&r&r'r|src@s(eZdZdd�Zedd��Zdd�ZdS)rcCs
||_dSr6)rO)rbrOr&r&r'rv�r�zStatus.__init__ccs,�t|���D]}||�}||_|VqdSr6)r	�get_all_statusr?)r rO�staterXr&r&r'r�s��z
Status.selectcCrwrx�rzr{r?rar&r&r'r|�r}zStatus.__repr__N)r{rr	rvr"rr|r&r&r&r'r�s

rc@� eZdZdZed�ed�fZdS)rrW�ResolutionsN�r{rr	rirrr&r&r&r'r��rc@r')r�priority�
PrioritiesNr)r&r&r&r'r�r*rc@r')r�severity�
SeveritiesNr)r&r&r&r'r�r*rc@�feZdZdZedd��Zedd��Zddd�Zd	d
�Zdd�Z	d
d�Z
dd�Zedd��Z
dd�ZdS)r�	componentcCr~r6�rrar&r&r'r��r�zComponent.<lambda>cC�t|j|j�Sr6�rr^r?rar&r&r'rc��zComponent.resourceNcCst||_d|_|_|_|_|r8|j�d|f�D]\}}||_|_t|�|_t|�|_dSttd|d���dS)a2Create a new `Component` instance. If `name` is specified
        and the component with `name` exists, the component will be
        retrieved from the database.

        :raises ResourceNotFound: if `name` is not `None` and component
                                  with `name` does not exist.
        Nz`
                    SELECT owner, description FROM component WHERE name=%s
                    z"Component %(name)s does not exist.r>)	rOr?r�ownerrrLr;rr)rbrOr?r5rr&r&r'rv�s�

��zComponent.__init__cCrwrxr&rar&r&r'r|�r}zComponent.__repr__cC�x|js	ttd���|jj�d|j�|jj�}|d|jf�t|j��	�Wd�n1s/wYd|_|_
dS)zWDelete the component.

        :raises TracError: if component does not exist.
        z%Cannot delete non-existent component.zDeleting component '%s'z#DELETE FROM component WHERE name=%sN�r�rrrOr�rr?r�r	rrrr&r&r'r���
�zComponent.deletec	Cs�|jrttd|jd���|��|jj�d|j�|jj�4}z|d|jt	|j
�t	|j�f�Wn|jjj
yBttd|jd���wt|j���Wd�n1sTwY|j|_dS)z�Insert a new component.

        :raises TracError: if component name is empty.
        :raises ResourceExistsError: if component with name already exists.
        �$Component "%(name)s" already exists.r>zCreating new component '%s'z�
                        INSERT INTO component (name,owner,description)
                        VALUES (%s,%s,%s)
                        N)r�rrr?rrOr�rr�r9r5rrrr	rrrr&r&r'r��s*�
�����zComponent.insertc	Cs�|js	ttd���|��|jj�d|j�|jj�R}z|d|jt	|j
�t	|j�|jf�Wn|jj
jyAttd|jd���w|j|jkrd|d|j|jf�|j|_t|j���Wd�dSWd�dS1sowYdS)z�Update the component.

        :raises TracError: if component does not exist or component name
            is empty.
        :raises ResourceExistsError: if renamed component already exists.
        z%Cannot update non-existent component.zUpdating component '%s'zpUPDATE component SET name=%s,owner=%s, description=%s
                      WHERE name=%s
                      r9r>z1UPDATE ticket SET component=%s WHERE component=%sN)r�rrrrOr�rr?r�r9r5rrrrrr	rrr&r&r'r�s2
����
��	"�zComponent.updateccsJ�|�d�D]\}}}||�}||_|_t|�|_t|�|_|VqdS)Nz^
                SELECT name, owner, description FROM component ORDER BY name
                )rLr?rr;r5r)r rOr?r5rr0r&r&r'rs�

�zComponent.selectcCs.t|j�|_t|j�|_|jsttd���dS)NzInvalid component name.)r@r?r5rrrar&r&r'rs
�z"Component._check_and_coerce_fieldsr6�r{rr	r^rr�rcrvr|r�r�rr"rrr&r&r&r'r�s



rc@s8eZdZdZedd��Zddd�Zdd�Zdd	d
�ZdS)�MilestoneCachez?Cache for milestone data and factory for 'milestone' resources.cCs>i}|j�d�D]\}}}}|t|�t|�|pdf||<q|S)z�Dictionary containing milestone data, indexed by name.

        Milestone data consist of a tuple containing the name, the
        datetime objects for due and completed dates and the
        description.
        zY
                SELECT name, due, completed, description FROM milestone
                r�)rOrLr8)rb�
milestonesr?�due�	completedrr&r&r'r<s
�zMilestoneCache.milestonesNcCs |j�|�}|r|�||�SdS)z�Retrieve an existing milestone having the given `name`.

        If `milestone` is specified, fill that instance instead of creating
        a fresh one.

        :return: `None` if no such milestone exists
        N)r<rp�factory)rbr?�	milestone�datar&r&r'�fetchone.s�zMilestoneCache.fetchoneccs"�|j��D]}|�|�VqdS)zIterator on all milestones.N)r<rqr?)rbrAr&r&r'�fetchall:s��zMilestoneCache.fetchallcCsB|\}}}}|pt|j�}||_||_||_||_|jdd�|S)aBuild a `Milestone` object from milestone data.

        That instance remains *private*, i.e. can't be retrieved by
        name by other processes or even by other threads in the same
        process, until its `~Milestone.insert` method gets called with
        success.
        F)�
invalidate)rrOr?r=r>r�checkin)rbrqr@r?r=r>rr&r&r'r??szMilestoneCache.factoryr6)	r{rr	�__doc__rr<rBrCr?r&r&r&r'r;s

r;c@s�eZdZdZedd��Zddd�Zdd�Zed	d
��Zedd��Z	ed
d��Z
edd��Zddd�Zdd�Z
dd�Zddd�Z		ddd�Zeddd��ZdS) rr@cCr2r6r3rar&r&r'rcUr4zMilestone.resourceNcCsP||_d|_|_|r|j�||�sttd|d�td���dS|j�d|�dS)z�Create an undefined milestone or fetch one from the database,
        if `name` is given.

        In the latter case however, raise `~trac.resource.ResourceNotFound`
        if a milestone of that name doesn't exist yet.
        N�"Milestone %(name)s does not exist.r>�Invalid milestone name.)NNNr�)rOr?rr�cacherBrrr?)rbrOr?r&r&r'rvYs���zMilestone.__init__cCrwrxr&rar&r&r'r|jr}zMilestone.__repr__cCs
t|j�Sr6)r;rOrar&r&r'rIm�
zMilestone.cachecCs|jdduS)Nr?)rrrar&r&r'r�qszMilestone.<lambda>cCr~r6�r>rar&r&r'r�rr�cCs|jo	|jtt�kSr6)r=r
rrar&r&r'r�ssTcCs*|j|j|j|jd�|_|r|j`dSdS)N)r?r=r>r)r?r=r>rrrrIr<)rbrDr&r&r'rEvs�
�zMilestone.checkincCs�|jj�d|j�|jj�#}|d|jf�t�|j|j|j�|j`	t
|j���Wd�n1s3wYd|jd<t
|j�j
D]}|�|�qCdS)zDelete the milestone.zDeleting milestone '%s'z#DELETE FROM milestone WHERE name=%sNr?)rOr�rr?r�rr�r^rIr<r	rrr�milestone_change_listeners�milestone_deletedr�r&r&r'r�}s
�
�zMilestone.deletec	Cs�t|j�|_|jsttd���|jj�d|j�|jj�:}z|d|jt|j	�t|j
�|jf�Wn|jjj
yCttd|jd���w|��t|j���Wd�n1sYwYt|j�jD]}|�|�qddS)z�Insert a new milestone.

        :raises TracError: if milestone name is empty.
        :raises ResourceExistsError: if milestone with name already exists.
        rHzCreating new milestone '%s'z�
                    INSERT INTO milestone (name, due, completed, description)
                    VALUES (%s,%s,%s,%s)
                    �$Milestone "%(name)s" already exists.r>N)r@r?rrrOr�rr�rr=r>rrrrrEr	rrL�milestone_createdr�r&r&r'r��s,
�����
�zMilestone.insertc	sBt�j��_�jsttd����j��}�jj�^}�j|dkr7���j|d�t	�
�j�j|d�j�j��jj�
d|d�z|d�jt�j�t�j��j|df�Wn�jjjyjttd�jd���w���Wd�n1sywYt�j����fd	d
�|��D�}t�j�jD]}|��|�q�dS)z�Update the milestone.

        :raises TracError: if milestone does not exist or milestone name
            is empty.
        :raises ResourceExistsError: if renamed milestone already exists.
        rHr?zMilestone renamedzUpdating milestone '%s'z�UPDATE milestone
                      SET name=%s, due=%s, completed=%s, description=%s
                      WHERE name=%s
                      rNr>Ncs$i|]\}}t�|�|kr||�qSr&)�getattrr�rar&r'r��s�z$Milestone.update.<locals>.<dictcomp>)r@r?rrrrr�rOr��move_ticketsr�reparent_allr^r�rrr=r>rrrrrEr	rr�rL�milestone_changed)rbr�r�rQr�r�r&rar'r�s<

�
����
��zMilestone.updateFcCs�|r||jkr|j�|�sttd|d�td���tt�}d}|r$|d7}|jj�C}dd�|||j	df�D�}|r[|jj
�d	|j	d|�|D]}	t|j|	�}
||
d
<|
�
|||�qGWd�|SWd�|S1snwY|S)a�Move tickets associated with this milestone to another
        milestone.

        :param new_milestone: milestone to which the tickets are moved
        :param author: author of the change
        :param comment: comment that is inserted into moved tickets. The
                        string should not be translated.
        :param exclude_closed: whether tickets with status closed should be
                               excluded

        :return: a list of ids of tickets that were moved
        rGr>rHz(SELECT id FROM ticket WHERE milestone=%sz AND status != 'closed'cSsg|]}t|d��qSrIrArJr&r&r'rD�r�z*Milestone.move_tickets.<locals>.<listcomp>r?z?Moving tickets associated with milestone '%s' to milestone '%s'r@N)r?rIrBrrr
rrOr�rrr�rrr�)rb�
new_milestoner�r��exclude_closed�nowr�rQ�tkt_idsrurVr&r&r'rQ�s>��

��
�
�
�
�
zMilestone.move_ticketscCs2t|���}|sdd�|D�}dd�}t||d�S)NcSsg|]	}|jdur|�qSr6rK)rB�mr&r&r'rD�sz$Milestone.select.<locals>.<listcomp>cSs|jpt|jptt|j�fSr6)r>rr=rr?)rXr&r&r'�milestone_order�s�z)Milestone.select.<locals>.milestone_order)�key)r;rCr�)r rO�include_completedr<rYr&r&r'r�s
zMilestone.selectr6)T)NF)r{rr	r^rrcrvr|rIr��is_completed�is_laterEr�r�rrQr"rr&r&r&r'rQs(




(
�%rc@sTeZdZdZedd��Zddd�Zdd�Zd	d
�Zdd�Z	d
d�Z
eddd��ZdS)�Report�reportcCr~r6rrar&r&r'r�rJz
Report.existsNcCs�||_d|_|_|_|_|durIt|d�}|dur>|j�d|f�D]\}}}||_t|�|_t|�|_t|�|_dStt	d|d�t	d���dS)Nz�
                        SELECT title, description, query FROM report
                        WHERE id=%s
                        z Report {%(num)s} does not exist.r[zInvalid Report Number)
rOr_�title�queryrr
rLr;rr)rbrOr_�	id_as_intr`rrar&r&r'rvs&
�


���zReport.__init__cCrwrxryrar&r&r'r|r}zReport.__repr__cCs*|jsJd��|j�d|jf�d|_dS)zDelete the report.z!Cannot delete non-existent reportzDELETE FROM report WHERE id=%sN)r�rOr�r_rar&r&r'r�s
z
Report.deletecCs�|jrJd��|jsttd���|jj�d|j�|jj�&}|�	�}|�
dt|j�t|j�t|j
�f�|�|d�|_Wd�dS1sFwYdS)zMInsert a new report.

        :raises TracError: if `query` is empty
        zCannot insert existing report�Query cannot be empty.zCreating new report '%s'z`
                INSERT INTO report (title,query,description) VALUES (%s,%s,%s)
                r_N)r�rarrrOr�rr_r�r�r�r9r`rr�)rbrQr�r&r&r'r�!s
��"�z
Report.insertcCs@|js	ttd���|j�dt|j�t|j�t|j�|jf�dS)zIUpdate a report.

        :raises TracError: if `query` is empty
        rczf
            UPDATE report SET title=%s, query=%s, description=%s
            WHERE id=%s
            N)	rarrrOr�r9r`rr_rar&r&r'r3s��z
Report.updater_Tc	csl�|�d|dkr
dnd|rdndf�D]\}}}}||�}||_t|�|_t|�|_t|�|_|VqdS)Nzq
                SELECT id, title, description, query
                FROM report ORDER BY %s %s
                r`r_r��DESC)rLr_r;r`rra)	r rOr��ascr_r`rrar_r&r&r'r@s�
��


�z
Report.selectr6)r_T)
r{rr	r^rr�rvr|r�r�rr"rr&r&r&r'r^�s


r^c@r/)r r`cCr~r6r1rar&r&r'r�Sr�zVersion.<lambda>cCr2r6r3rar&r&r'rcUr4zVersion.resourceNcCst||_d|_|_|_|_|r8|j�d|f�D]\}}||_|_t|�|_t|�|_dStt	d|d���dS)Nz]
                    SELECT time, description FROM version WHERE name=%s
                    z Version %(name)s does not exist.r>)
rOr?rr7rrLr8r;rr)rbrOr?r7rr&r&r'rvYs�

��zVersion.__init__cCrwrxr&rar&r&r'r|hr}zVersion.__repr__cCr6)zSDelete the version.

        :raises TracError: if version does not exist.
        z#Cannot delete non-existent version.zDeleting version '%s'z!DELETE FROM version WHERE name=%sNr7rr&r&r'r�kr8zVersion.deletec	Cs�|��|jj�d|j�|jj�4}z|d|jt|j�t|j	�f�Wn|jj
jy6tt
d|jd���wt|j���Wd�n1sHwY|j|_dS)z�Insert a new version.

        :raises TracError: if version name is empty.
        :raises ResourceExistsError: if version with name already exists.
        zCreating new version '%s'z{
                    INSERT INTO version (name,time,description)
                    VALUES (%s,%s,%s)
                    �"Version "%(name)s" already exists.r>N)rrOr�rr?r�rr7r9rrrrrr	rrrr&r&r'r�ys"
�����zVersion.insertc	Cs�|js	ttd���|��|jj�d|j�|jj�H}z|d|jt	|j
�|j|jf�Wn|jj
jy?ttd|jd���w|j|jkrS|d|j|jf�|j|_t|j���Wd�dS1sewYdS)z�Update the version.

        :raises TracError: if version does not exist or version name
            is empty.
        :raises ResourceExistsError: if renamed value already exists.
        z#Cannot update non-existent version.zUpdating version '%s'znUPDATE version SET name=%s, time=%s, description=%s
                      WHERE name=%s
                      rfr>z-UPDATE ticket SET version=%s WHERE version=%sN)r�rrrrOr�rr?r�rr7rrrrrr	rrr&r&r'r�s.
����
�"�zVersion.updatecCsbg}|�d�D]\}}}||�}||_|_t|�|_t|�|_|�|�qdd�}t||dd�S)Nz<
                SELECT name, time, description FROM versioncSs|jptt|j�fSr6)r7rrr?)r�r&r&r'�
version_order�sz%Version.select.<locals>.version_orderT)rZ�reverse)	rLr?rr8r7r;rr!r�)r rO�versionsr?r7rr`rgr&r&r'r�s

zVersion.selectcCs"t|j�|_|jsttd���dS)NzInvalid version name.)r@r?rrrar&r&r'r�s�z Version._check_and_coerce_fieldsr6r:r&r&r&r'r Os



r )7�re�tracr�trac.attachmentr�
trac.cacher�	trac.corer�
trac.resourcerrr�trac.ticket.apir	�	trac.utilr
rr�trac.util.datefmtr
rrrrr�trac.util.textrr�trac.util.translationrrr�__all__r(r0r5r8r9r;r@rU�objectrrrrrrrrr;rr^r r&r&r&r'�<module>sN 	
x9.Q

https://t.me/RX1948 - 2025