Ë
    ÝÄ'jM,  ã            	       óR  — d dl Z d dlZd dlZd dlZd dlZd dlZd dlmZmZm	Z	m
Z
 d dlmZmZmZmZ d dlmZ d dlmZmZ d dlmZmZmZ d dlmZ dd	lmZmZ dd
lmZm Z m!Z!m"Z"m#Z# ddl$m%Z%m&Z&m'Z' ddl(m)Z)m*Z+ ddl,m-Z-  e«       Z. ed¬«      Z/ e0 ej                  «       «      Z1dZ2 ed¬«      Z3e-jh                  xs   ejj                  d«      jm                  «       Z7 ee7«      Z8dede9fd„Z:deddfd„Z;dedz  de9fd„Z<defd„Z=d„ Z>e.j                  de¬«      d6dede@fd „«       ZAe.j…                  d«       e
d!«       e
d!«      fded"e@d#e@fd$„«       ZCe.j                  d%«      d&„ «       ZDe.j                  d'«      defd(„«       ZE G d)„ d*e«      ZFe.j                  d+e¬«      defd,„«       ZGe.j                  d-«       e	e3«      fded.e@dedz  fd/„«       ZHe.j                  d0«       e	e3«      fded1e0dedz  fd2„«       ZIe.j…                  d3«       e	e3«      fded4eFdedz  fd5„«       ZJy)7é    N)Ú	APIRouterÚRequestÚDependsÚForm)ÚHTMLResponseÚRedirectResponseÚResponseÚStreamingResponse)ÚJinja2Templates)Ú	HTTPBasicÚHTTPBasicCredentials)ÚTimestampSignerÚSignatureExpiredÚBadSignature)Ú	BaseModelé   )Ú	subscribeÚunsubscribe)Úcheck_iteration_existsÚget_work_itemÚfind_existing_taskÚcreate_taskÚiteration_name)Ú
get_ticketÚget_ticket_articlesÚget_customer_info)Úsuggest_tagsÚ_has_provider)Úsettingszapp/templates)Ú	directoryÚ
za_sessionF)Ú
auto_erroré    ÚrequestÚreturnc                 ó¾   — | j                   j                  t        «      }|sy	 t        j	                  |t
        j                  ¬«       y# t        t        f$ r Y yw xY w)NF)Úmax_ageT)	ÚcookiesÚgetÚ_SESSION_COOKIEÚ_signerÚunsignr   Úsession_timeoutr   r   )r$   Útokens     ú*/var/www/html/zammad-automation/app/web.pyÚ_valid_sessionr0   %   sQ   € Ø�O‰O×Ñ¤Ó0€EÙØðÜ�‰�u¤h×&>Ñ&>ˆÔ?ØøÜœlÐ+ò Ùðús   ¤%A
 Á
AÁAÚresponsec                 óš   — t         j                  d«      j                  «       }| j                  t        |t
        j                  dd¬«       y )Ns   okTÚlax)r'   ÚhttponlyÚsamesite)r+   ÚsignÚdecodeÚ
set_cookier*   r   r-   )r1   r.   s     r/   Ú_set_sessionr9   0   s@   € Ü�L‰L˜Ó×&Ñ&Ó(€EØ×ÑÜ˜Ü×(Ñ(ØØð	 õ ó    Úcredentialsc                 ó<  — | syt        j                  | j                  j                  «       t        j
                  j                  «       «      }t        j                  | j                  j                  «       t        j                  j                  «       «      }|xr |S )z?Validate HTTP Basic credentials (used by Swagger UI Authorize).F)ÚsecretsÚcompare_digestÚusernameÚencoder   Úweb_usernameÚpasswordÚweb_password)r;   Úok_userÚok_passs      r/   Ú_check_basicrF   :   ss   € áØÜ×$Ñ$ [×%9Ñ%9×%@Ñ%@Ó%BÄH×DYÑDY×D`ÑD`ÓDbÓc€GÜ×$Ñ$ [×%9Ñ%9×%@Ñ%@Ó%BÄH×DYÑDY×D`ÑD`ÓDbÓc€GØÒ�wÐr:   c                 óP   — t         j                  sy t        | «      s
t        «       ‚y )N)r   rC   r0   Ú_redirect_login©r$   s    r/   Ú_require_authrJ   C   s$   € Ü× Ò ØÜ˜'Ô"ÜÓÐð #r:   c                  ó   — t        dd¬«      S ©Nú/loginé.  ©ÚurlÚstatus_code)r   © r:   r/   rH   rH   J   s   € Ü °cÔ:Ð:r:   rM   )Úresponse_classÚerrorc              ƒ   óH   K  — t         j                  | d|t        dœ¬«      S ­w)Nú
login.html)rT   Ú
static_ver©r$   ÚnameÚcontext)Ú	templatesÚTemplateResponseÚ_STATIC_VER)r$   rT   s     r/   Ú
login_pager^   P   s+   è ø€ ä×%Ñ%Ø˜l¸eÔS^Ñ4_ð &ó ð ùs   ‚ ".r?   rB   c              ƒ   óœ  K  — t        j                  |j                  «       t        j                  j                  «       «      }t        j                  |j                  «       t        j
                  j                  «       «      }t        j
                  r|r|st        j                  | dddid¬«      S t        dd¬«      }t        |«       |S ­w)	NrV   rT   zInvalid username or password.é‘  )r$   rY   rZ   rQ   ú/rN   rO   )
r=   r>   r@   r   rA   rC   r[   r\   r   r9   )r$   r?   rB   rD   rE   r1   s         r/   Ú
login_postrb   W   sª   è ø€ ô ×$Ñ$ X§_¡_Ó%6¼×8MÑ8M×8TÑ8TÓ8VÓW€GÜ×$Ñ$ X§_¡_Ó%6¼×8MÑ8M×8TÑ8TÓ8VÓW€Gä×Ò¡g±'Ü×)Ñ)ØØØÐ=Ð>Øð	 *ó 
ð 	
ô   C°SÔ9€HÜ�ÔØ€Oùs   ‚C
Cz/logoutc               ƒ   óR   K  — t        dd¬«      } | j                  t        «       | S ­wrL   )r   Údelete_cookier*   )r1   s    r/   Úlogoutre   m   s%   è ø€ ä H¸#Ô>€HØ×Ñœ?Ô+Ø€Oùs   ‚%'z/eventsc              ƒ   óÈ   ‡ K  — t         j                  st        d¬«      S t         j                  rt	        ‰ «      st        d¬«      S ˆ fd„}t         |«       ddddœ¬	«      S ­w)
Ni”  )rQ   r`   c                 ót  •K  — t        «       } 	 d­–— 	 ‰j                  «       ƒ d {  –—† rnK	 t        j                  | j	                  «       d¬«      ƒ d {  –—† }dt        j                  |«      › d�­–— Œd	 t        | «       y 7 Œ]7 Œ0# t        j                  $ r d­–— Y Œ,w xY w# t        | «       w xY w­w)Nzretry: 3000

é   )Útimeoutzdata: z

z: keepalive

)	r   Úis_disconnectedÚasyncioÚwait_forr)   ÚjsonÚdumpsÚTimeoutErrorr   )ÚqÚeventr$   s     €r/   Ústreamzsse_events.<locals>.stream}   s«   øè ø€ Ü‹Kˆð	Ø#Ó#ØØ ×0Ñ0Ó2×2Ð2Øð,Ü")×"2Ñ"2°1·5±5³7ÀBÔ"G×G�EØ"¤4§:¡:¨eÓ#4Ð"5°TÐ:Ó:ð àô ˜�Nð 3øð Hùä×+Ñ+ò ,Ø+Õ+ð,ûô ˜�Nüsa   ƒB8�B( ¨B©B( ¯(B
 ÁBÁ B
 Á8B( Á:B8ÂB( ÂB
 Â
B%Â"B( Â$B%Â%B( Â(B5Â5B8ztext/event-streamzno-cacheÚno)zCache-ControlzX-Accel-Buffering)Ú
media_typeÚheaders)r   Únotifications_enabledr	   rC   r0   r
   )r$   rr   s   ` r/   Ú
sse_eventsrw   v   s\   øè ø€ ä×)Ò)Ü CÔ(Ð(Ü×Ò¤^°GÔ%<Ü CÔ(Ð(ôô ™V›XÐ2EØ7AÐX\Ñ%]ô_ð _ùs   ƒAA"c                   ó˜   — e Zd ZU eed<   eed<   eed<   eed<   eed<   dZeed<   dZedz  ed	<   dZ	edz  ed
<   dZ
edz  ed<   dZeed<   y)ÚCreateTaskRequestÚticket_numberÚticket_titleÚ
ticket_urlr   Ústory_idÚ ÚactivityNÚoriginal_estimateÚremaining_workÚexpert_estimateÚtags)Ú__name__Ú
__module__Ú__qualname__ÚstrÚ__annotations__Úintr   r€   Úfloatr�   r‚   rƒ   rR   r:   r/   ry   ry   ’   s\   … ØÓØÓØƒOØÓØƒMØ€HˆcÓØ&*Ð�u˜t‘|Ó*Ø#'€N�E˜D‘LÓ'Ø$(€O�U˜T‘\Ó(Ø€Dˆ#„Nr:   ry   ra   c           	   ƒ   óä   K  — t         j                  rt        | «      st        dd¬«      S t        j                  | dt        «       t         j                  t         j                  t        dœ¬«      S ­w)NrM   rN   rO   z
index.html)Údefault_iterationrv   Údevops_enabledrW   rX   )
r   rC   r0   r   r[   r\   r   rv   r�   r]   rI   s    r/   ÚindexrŽ   Ÿ   sa   è ø€ ä×Ò¤^°GÔ%<Ü H¸#Ô>Ð>Ü×%Ñ%ØØä!/Ó!1Ü%-×%CÑ%CÜ&×5Ñ5Ü%ñ	
ð &ó 	ð 	ùs   ‚A.A0z/web/ticket-inforP   c              ƒ   ó^  K  — t         j                  r$t        | «      st        |«      st	        ddd¬«      S |j                  dd«      }t        j                  d|«      }|sdd	d
œS t        |j                  d«      «      }	 t        |«      ƒ d {  –—† }|j                  d«      }|j                  d«      }ddddddœ}ddddœ}	|j                  |d«      }
|	j                  |d«      }d|t        |d   «      |j                  dd«      |
|dœS 7 Œ}# t        $ r}dd|› �d
œcY d }~S d }~ww xY w­w)NúD{"status":"error","message":"Session expired. Please log in again."}úapplication/jsonr`   ©Úcontentrt   rQ   z%23ú#z[/#]ticket/zoom/(\d+)rT   zHCannot parse ticket ID from URL. Expected format: .../#ticket/zoom/12345©ÚstatusÚmessager   Ústate_idÚpriority_idÚnewÚopenzpending reminderÚclosedzpending close)r   é   é   é   é   ÚlowÚnormalÚhigh)r   r�   rž   Úunknownr~   ÚokÚnumberÚtitle)r–   Ú	ticket_idrz   r{   Úticket_stateÚticket_priorityzZammad error: )r   rC   r0   rF   r	   ÚreplaceÚreÚsearchr‰   Úgroupr   r)   r‡   Ú	Exception)r$   rP   r;   Úmr¨   Úticketr˜   r™   Ú	state_mapÚpriority_mapÚstateÚpriorityÚes                r/   Úticket_infor·   ¯   sB  è ø€ ä×Ò¤^°GÔ%<Ä\ÐR]ÔE^ÜÐ fØ#5À3ôHð 	Hà
�+‰+�e˜SÓ
!€CÜ
�	‰	Ð*¨CÓ0€AÙØ!Ð.xÑyÐyÜ�A—G‘G˜A“J“€IðDÜ! )Ó,×,ˆØ—j‘j Ó,ˆØ—j‘j Ó/ˆØ  VÐ0BÀxÐTcÑdˆ	Ø  X°&Ñ9ˆØ—=‘= ¨9Ó5ˆØ×#Ñ# K°Ó4ˆð Ø"Ü  ¨Ñ!1Ó2Ø"ŸJ™J w°Ó3Ø!Ø'ñ
ð 	
ð -ùô  ò DØ!°¸q¸cÐ.BÑCÕCûðDüsI   ‚A>D-ÂD ÂDÂA<D ÄD-ÄD Ä	D*ÄD%ÄD*Ä D-Ä%D*Ä*D-z/web/suggest-tagsr¨   c           
   ƒ   ó|  K  — t         j                  r$t        | «      st        |«      st	        ddd¬«      S t        «       sdddœS 	 t        j                  t        |«      t        |«      «      ƒ d {  –—† \  }}|j                  d«      }|rt        |«      ƒ d {  –—† ni }|D �cg c]'  }|j                  d	d
«      rŒ|j                  dd«      ‘Œ) }}t        |j                  dd«      |j                  dd«      xs	 |r|d   nd|j                  dd«      |j                  dd«      |j                  dd«      |dd  ¬«      ƒ d {  –—† }	|	j                  d«      D �cg c]#  }|j                  «       sŒ|j                  «       ‘Œ% }}d|dœS 7 �Œ7 Œôc c}w 7 ŒP# t        $ r}
dd|
› �dœcY d }
~
S d }
~
ww xY wc c}w ­w)Nr�   r‘   r`   r’   rT   zAI provider not configuredr•   Úcustomer_idÚinternalFÚbodyr~   r§   Únoter   ÚemailÚorganizationrY   r   )r{   Úticket_body_htmlÚcustomer_emailÚcustomer_orgÚcustomer_nameÚarticleszFailed to fetch ticket data: ú;r¥   )r–   rƒ   )r   rC   r0   rF   r	   Ú
ai_enabledrk   Úgatherr   r   r)   r   r   r¯   ÚsplitÚstrip)r$   r¨   r;   r±   rÃ   r¹   ÚcustomerÚaÚarticle_bodiesÚai_tags_strr¶   Útrƒ   s                r/   Úweb_suggest_tagsrÎ   Î   s­  è ø€ ô ×Ò¤^°GÔ%<Ä\ÐR]ÔE^ÜÐ fØ#5À3ôHð 	HäŒ<Ø!Ð.JÑKÐKðSÜ!(§¡Ü�yÓ!Ü 	Ó*ó"
÷ 
Ñˆ�ð —j‘j Ó/ˆÙ;FÔ*¨;Ó7×7Ð7ÈBˆà5=Ö^°ÀQÇUÁUÈ:ÐW\ÕE]˜!Ÿ%™% ¨Õ+Ð^ˆÐ^ä(ØŸ™ G¨RÓ0Ø#ŸZ™Z¨°Ó3ÒdÉ^¸ÀqÒ8IÐacØ#Ÿ<™<¨°Ó4Ø!Ÿ™ n°bÓ9Ø"Ÿ,™, v¨rÓ2Ø# A BÐ'ô
÷ 
ˆð  +×0Ñ0°Ó5ÖC˜!¸¿¹½ˆA�G‰G�IÐC€DÐCØ DÑ)Ð)ð+
ùð
 8úâ^ð
ùô ò SØ!Ð0MÈaÈSÐ.QÑRÕRûðSüò Dùs‘   ‚AF<Á+F Á2FÁ3(F ÂFÂ
F Â&FÂ>FÃA4F ÅFÅF ÅF<ÅF7Å4F7ÆF<ÆF ÆF ÆF Æ	F4Æ"F/Æ)F4Æ*F<Æ/F4Æ4F<z/web/create-taskÚpayloadc              ƒ   ó(  K  — t         j                  r$t        | «      st        |«      st	        ddd¬«      S t         j
                  sdddœS t         j                  › d|j                  › �}t        |j                  «      ƒ d {  –—† sdd	|j                  › d
�dœS t        |j                  «      ƒ d {  –—† }|€dd|j                  › d�dœS |d   j                  d«      dk7  r(dd|j                  › d|d   j                  d«      › d�dœS t        |j                  «      ƒ d {  –—† }|r dd|d   › d|j                  › �|d   |d   dœS t        |j                  d|j                  |j                  |j                   ||j"                  xs d|j$                  �|j$                  nd|j&                  �|j&                  nd|j(                  �|j(                  nd|j*                  ¬«      ƒ d {  –—† }d|j                  |d   |d   dœS 7 �Œ…7 �ŒX7 Œé7 Œ#­w) Nr�   r‘   r`   r’   rT   z5DevOps integration is disabled (DEVOPS_ENABLED=false)r•   ú\zIteration 'z' not found in Azure DevOpszUser Story #z
 not foundÚfieldszSystem.WorkItemTypez
User StoryzWork item #z is not a User Story (type: ú)ÚexistszTask #Úidz already exists for Ticket #rP   )r–   r—   Útask_idÚtask_urlr   ÚDevelopmentg      à?g      Ð?)r}   r¨   rz   r{   r|   Ú	iter_pathr   r€   r�   r‚   rƒ   Úcreated)r–   r}   rÖ   r×   )r   rC   r0   rF   r	   r�   Údevops_projectr   r   r   r}   r)   r   rz   r   r{   r|   r   r€   r�   r‚   rƒ   )r$   rÏ   r;   rÙ   ÚstoryÚexistingÚtasks          r/   Úweb_create_taskrß   ó   sV  è ø€ ä×Ò¤^°GÔ%<Ä\ÐR]ÔE^ÜÐ fØ#5À3ôHð 	Hô ×"Ò"Ø!Ð.eÑfÐfä×*Ñ*Ð+¨2¨g×.DÑ.DÐ-EÐF€Iä'¨×(>Ñ(>Ó?×?Ð?Ø!°¸G×<RÑ<RÐ;SÐSnÐ.oÑpÐpä × 0Ñ 0Ó1×1€EØ€}Ø!°¸W×=MÑ=MÐ<NÈjÐ.YÑZÐZØˆX�×ÑÐ0Ó1°\ÒAØ!°¸G×<LÑ<LÐ;MÐMiÐjoÐpxÑjy×j}Ñj}ð  Tó  kUð  jVð  VWð  /Xñ  Yð  	Yä'¨×(=Ñ(=Ó>×>€HÙàØ ¨¡Ð/Ð/KÈG×LaÑLaÐKbÐcØ ‘~Ø  ™ñ	
ð 	
ô Ø×!Ñ!ØØ×+Ñ+Ø×)Ñ)Ø×%Ñ%ØØ×!Ñ!Ò2 ]Ø7>×7PÑ7PÐ7\˜'×3Ò3ÐbeØ18×1GÑ1GÐ1S�w×-Ò-ÐY\Ø3:×3JÑ3JÐ3V˜×/Ò/Ð\`Ø�\‰\ô÷ €Dð Ø×$Ñ$Ø˜‘:Ø˜‘Kñ	ð ð? @ùð 2ùð ?øðúsJ   ‚BHÂHÂ/HÂ3HÂ4A0HÄ$HÄ%CHÇ,HÇ-HÈHÈHÈH)r~   )Kr¬   r=   ÚosÚtimerm   rk   Úfastapir   r   r   r   Úfastapi.responsesr   r   r	   r
   Úfastapi.templatingr   Úfastapi.securityr   r   Úitsdangerousr   r   r   Úpydanticr   Úbroadcasterr   r   Údevopsr   r   r   r   r   Úzammadr   r   r   Úair   r   rÅ   Úconfigr   Úrouterr[   r‰   r]   r*   Ú_basicÚsession_secretÚurandomÚhexÚ_session_secretr+   Úboolr0   r9   rF   rJ   rH   r)   r‡   r^   Úpostrb   re   rw   ry   rŽ   r·   rÎ   rß   rR   r:   r/   ú<module>rõ      sÈ  ðÛ 	Û Û 	Û Û Û ß 5Ó 5ß YÓ YÝ .ß <ß HÑ HÝ ß /÷õ ÷ GÑ Fß 9Ý á	‹€Ù oÔ6€	ñ �)�$—)‘)“+Ó€à€Ù	˜eÔ	$€Ø×)Ñ)ÒA¨Z¨R¯Z©Z¸«^×-?Ñ-?Ó-A€Ù
˜/Ó
*€ð˜Gð ¨ó ð˜8ð ¨ó ðÐ2°TÑ9ð ¸dó ð ˜7ó  ò;ð ‡�ˆH \€Ó2ñ˜gð ¨cò ó 3ðð ‡�ˆXÓñ ˜“IÙ˜“IñØðàðð òó ðð* ‡�ˆIÓñó ðð ‡�ˆIÓð_˜gò _ó ð_ô6
˜	ô 
ð ‡�ˆC €Ó-ð˜ò ó .ðð ‡�ÐÓÙ]dÐekÓ]lñ D˜wð D¨Sð DÐ?SÐVZÑ?Zò Dó  ðDð< ‡�ÐÓ ñ 07°v«ñ!*Øð!*àð!*ð &¨Ñ,ò!*ó !ð!*ðH ‡�ÐÓ Ùszð  |Bó  tCñ . 7ð .Ð5Fð .ÐUiÐlpÑUpò .ó !ñ.r:   