Ë
    š÷@i|   ã                   óö   — d Z ddlZddlmZmZ ddlmZ ddlmZ ddl	m
Z
 	 ddlZ ej                  e«      Z G d„ d«      Z G d	„ d
e«      Z G d„ de«      Z G d„ de«      Z G d„ d«      Zy# e$ r dZY ŒQw xY w)z)
Notification system for cronjob events.
é    N)ÚListÚOptional)Úsettings)Ú	send_mail)ÚCronExecutionc                   ó2   — e Zd ZdZdedefd„Zddedefd„Zy)	ÚNotificationBackendz%Base class for notification backends.Ú	executionÚerror_messagec                 ó   — t         ‚)zSend failure notification.)ÚNotImplementedError)Úselfr
   r   s      úV/home/cursorai/projects/django-cronjob-utils/src/django_cronjob_utils/notifications.pyÚnotify_failurez"NotificationBackend.notify_failure   s   € ä!Ð!ó    Úmessagec                  ó   — y)z%Send success notification (optional).N© )r   r
   r   s      r   Únotify_successz"NotificationBackend.notify_success   s   € àr   N©Ú )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   Ústrr   r   r   r   r   r	   r	      s+   „ Ù/ð"¨ð "Àcó "ñ¨ð Àô r   r	   c                   ó,   — e Zd ZdZdefd„Zdedefd„Zy)ÚEmailBackendzEmail notification backend.Úconfigc                 óª   — |j                  dg «      | _        |j                  dt        j                  «      | _        |j                  dd«      | _        y )NÚ
recipientsÚ
from_emailÚsubject_templatezCronjob Failed: {task_name})Úgetr!   r   ÚDEFAULT_FROM_EMAILr"   r#   ©r   r   s     r   Ú__init__zEmailBackend.__init__#   sA   € Ø Ÿ*™* \°2Ó6ˆŒØ Ÿ*™* \´8×3NÑ3NÓOˆŒØ &§
¡
Ð+=Ð?\Ó ]ˆÕr   r
   r   c                 óL  — | j                   st        j                  d«       y| j                  j	                  |j
                  |j                  ¬«      }d|j
                  › d|j                  › d|j                  › d|j                  › d|j                  xs d	› d
|› d|j                  xs d	› d�}	 t        ||| j                  | j                   d¬«       t        j                  d|j
                  › �«       y# t        $ r"}t        j                  d|› �«       Y d}~yd}~ww xY w)z$Send failure notification via email.z4Email backend configured but no recipients specifiedN)Ú	task_nameÚ	task_codez!
Cronjob Execution Failed

Task: ú (z)
Execution Date: z

Started: z
Error Code: úN/Az

Error Message:
z

Message:
z4

Please check the execution logs for more details.
F)Úsubjectr   r"   Úrecipient_listÚfail_silentlyz(Email notification sent for failed task z#Failed to send email notification: )r!   ÚloggerÚwarningr#   Úformatr)   r*   Úexecution_dateÚstartedÚ
error_coder   r   r"   ÚinfoÚ	ExceptionÚerror)r   r
   r   r-   r   Úes         r   r   zEmailBackend.notify_failure(   s9  € à�ŠÜ�N‰NÐQÔRØà×'Ñ'×.Ñ.Ø×)Ñ)Ø×)Ñ)ð /ó 
ˆð
ð ×ÑÐ˜2˜i×1Ñ1Ð2ð 3Ø×)Ñ)Ð*ð +
Ø
×
Ñ
Ð	ð Ø×!Ñ!Ò* UÐ+ð ,ð €ð ð ×ÑÒ�eÐ ð ðˆð"
	DÜØØØŸ?™?Ø#Ÿ™Ø#õô �K‰KÐBÀ9×CVÑCVÐBWÐXÕYøÜò 	DÜ�L‰LÐ>¸q¸cÐB×CÑCûð	Dús   Â1AC8 Ã8	D#ÄDÄD#N©	r   r   r   r   Údictr'   r   r   r   r   r   r   r   r       s)   „ Ù%ð^˜tó ^ð
&D¨ð &DÀcô &Dr   r   c                   ó,   — e Zd ZdZdefd„Zdedefd„Zy)ÚSlackBackendzSlack notification backend.r   c                 óº   — |j                  d«      | _        |j                  dd«      | _        |j                  dd«      | _        | j                  st	        d«      ‚y )NÚwebhook_urlÚchannelz	#cronjobsÚusernameÚCronbotzSlack webhook_url is required)r$   r?   r@   rA   Ú
ValueErrorr&   s     r   r'   zSlackBackend.__init__T   sQ   € Ø!Ÿ:™: mÓ4ˆÔØ—z‘z )¨[Ó9ˆŒØŸ
™
 :¨yÓ9ˆŒà×ÒÜÐ<Ó=Ð=ð  r   r
   r   c                 óz  — t         €t        j                  d«       y| j                  | j                  d|j
                  › �dd|j
                  › d|j                  › d�dd	œd
t        |j                  «      dd	œd|j                  j                  d«      dd	œd|j                  xs ddd	œd|dd dd	œgdœgdœ}	 t        j                  | j                  |d¬«      }|j                  «        t        j                  d|j
                  › �«       y# t         $ r"}t        j                  d|› �«       Y d}~yd}~ww xY w)z$Send failure notification via Slack.Nz[requests library is required for Slack notifications. Install it with: pip install requestsu   â�Œ Cronjob Failed: ÚdangerÚTaskr+   Ú)T)ÚtitleÚvalueÚshortÚDateÚStartedú%Y-%m-%d %H:%M:%Sz
Error Coder,   zError Messageiô  F)ÚcolorÚfields)r@   rA   ÚtextÚattachmentsé
   ©ÚjsonÚtimeoutz(Slack notification sent for failed task z#Failed to send Slack notification: )Úrequestsr0   r8   r@   rA   r)   r*   r   r3   r4   Ústrftimer5   Úpostr?   Úraise_for_statusr6   r7   )r   r
   r   ÚpayloadÚresponser9   s         r   r   zSlackBackend.notify_failure\   sE  € äÐÜ�L‰LÐvÔwØð —|‘|ØŸ™Ø*¨9×+>Ñ+>Ð*?Ð@ð &à"(°i×6IÑ6IÐ5JÈ"ÈY×M`ÑM`ÐLaÐabÐ3cÐnrÑsØ"(´3°y×7OÑ7OÓ3PÐ[_Ñ`Ø"+°i×6GÑ6G×6PÑ6PÐQdÓ6eÐptÑuØ".¸×9MÑ9MÒ9VÐQVÐaeÑfØ"1¸MÈ$È3Ð<OÐZ_Ñ`ðñ	ðñ	
ˆð$	DÜ—}‘} T×%5Ñ%5¸GÈRÔPˆHØ×%Ñ%Ô'Ü�K‰KÐBÀ9×CVÑCVÐBWÐXÕYøÜò 	DÜ�L‰LÐ>¸q¸cÐB×CÑCûð	Dús   Â:AD Ä	D:ÄD5Ä5D:Nr:   r   r   r   r=   r=   Q   s'   „ Ù%ð>˜tó >ðD¨ð DÀcô Dr   r=   c                   ó,   — e Zd ZdZdefd„Zdedefd„Zy)ÚTelegramBackendzTelegram notification backend.r   c                 óâ   — |j                  d«      | _        |j                  d«      | _        | j                  st        d«      ‚| j                  st        d«      ‚d| j                  › d�| _        y )NÚ	bot_tokenÚchat_idzTelegram bot_token is requiredzTelegram chat_id is requiredzhttps://api.telegram.org/botz/sendMessage)r$   r_   r`   rC   Úapi_urlr&   s     r   r'   zTelegramBackend.__init__   s]   € ØŸ™ KÓ0ˆŒØ—z‘z )Ó,ˆŒà�~Š~ÜÐ=Ó>Ð>Ø�|Š|ÜÐ;Ó<Ð<à5°d·n±nÐ5EÀ\ÐRˆ�r   r
   r   c                 ó  — t         €t        j                  d«       yd|j                  › d|j                  › d|j
                  › d|j                  j                  d«      › d|j                  xs d	› d
|dd › �}| j                  |ddœ}	 t        j                  | j                  |d¬«      }|j                  «        t        j                  d|j                  › �«       y# t        $ r"}t        j                  d|› �«       Y d}~yd}~ww xY w)z'Send failure notification via Telegram.Nz^requests library is required for Telegram notifications. Install it with: pip install requestsu(   â�Œ <b>Cronjob Failed</b>

<b>Task:</b> r+   z)
<b>Date:</b> z
<b>Started:</b> rM   z
<b>Error Code:</b> r,   z

<b>Error:</b>
iè  ÚHTML)r`   rP   Ú
parse_moderR   rS   z+Telegram notification sent for failed task z&Failed to send Telegram notification: )rV   r0   r8   r)   r*   r3   r4   rW   r5   r`   rX   ra   rY   r6   r7   )r   r
   r   r   rZ   r[   r9   s          r   r   zTelegramBackend.notify_failureŠ   s  € äÐÜ�L‰LÐyÔzØðØ%×/Ñ/Ð0°°9×3FÑ3FÐ2Gð HØ%×4Ñ4Ð5ð 6Ø(×0Ñ0×9Ñ9Ð:MÓNÐOð P"Ø"+×"6Ñ"6Ò"?¸%Ð!@ð AØ+¨E¨TÐ2Ð3ð5ð 	ð —|‘|ØØ ñ
ˆð	GÜ—}‘} T§\¡\¸ÈÔLˆHØ×%Ñ%Ô'Ü�K‰KÐEÀi×FYÑFYÐEZÐ[Õ\øÜò 	GÜ�L‰LÐAÀ!ÀÐE×FÑFûð	Gús   Â
AC Ã	D
Ã(DÄD
Nr:   r   r   r   r]   r]   |   s)   „ Ù(ð	S˜tó 	SðG¨ð GÀcô Gr   r]   c                   ó>   — e Zd ZdZd„ Zd„ Zdedefd„Zd
dedefd„Z	y	)ÚNotificationManagerz)Manages notifications for cronjob events.c                 ó2   — g | _         | j                  «        y )N)ÚbackendsÚ_load_backends)r   s    r   r'   zNotificationManager.__init__ª   s   € Ø35ˆŒØ×ÑÕr   c                 óâ  — t        t        di «      j                  di «      }|j                  dg «      }d|v r7	 |j                  di «      }| j                  j	                  t        |«      «       d|v r7	 |j                  di «      }| j                  j	                  t        |«      «       d	|v r8	 |j                  d	i «      }| j                  j	                  t        |«      «       yy# t        $ r"}t        j                  d|› �«       Y d}~Œžd}~ww xY w# t        $ r"}t        j                  d|› �«       Y d}~Œ‘d}~ww xY w# t        $ r"}t        j                  d
|› �«       Y d}~yd}~ww xY w)z&Load configured notification backends.ÚCRONJOB_UTILSÚNOTIFICATIONSÚ
on_failureÚemailz$Failed to initialize Email backend: NÚslackz$Failed to initialize Slack backend: Útelegramz'Failed to initialize Telegram backend: )Úgetattrr   r$   rh   Úappendr   r7   r0   r8   r=   r]   )r   r   rm   Úemail_configr9   Úslack_configÚtelegram_configs          r   ri   z"NotificationManager._load_backends®   sT  € äœ ?°BÓ7×;Ñ;¸OÈRÓPˆà—Z‘Z ¨bÓ1ˆ
à�jÑ ðIØ%Ÿz™z¨'°2Ó6�Ø—‘×$Ñ$¤\°,Ó%?Ô@ð �jÑ ðIØ%Ÿz™z¨'°2Ó6�Ø—‘×$Ñ$¤\°,Ó%?Ô@ð ˜Ñ#ðLØ"(§*¡*¨Z¸Ó"<�Ø—‘×$Ñ$¤_°_Ó%EÕFð $øô ò IÜ—‘ÐCÀAÀ3ÐG×HÑHûðIûô ò IÜ—‘ÐCÀAÀ3ÐG×HÑHûðIûô ò LÜ—‘ÐFÀqÀcÐJ×KÑKûðLúsG   ¹6C' Á46D Â/6E Ã'	DÃ0DÄDÄ	E ÄD;Ä;E Å	E.ÅE)Å)E.r
   r   c                 óÖ   — | j                   D ]  }	 |j                  ||«       Œ y# t        $ r9}t        j	                  d|j
                  j                  › d|› �«       Y d}~ŒVd}~ww xY w)zNotify stakeholders of failure.úNotification backend ú	 failed: N)rh   r   r7   r0   r8   Ú	__class__r   )r   r
   r   Úbackendr9   s        r   r   z"NotificationManager.notify_failureÉ   sg   € à—}”}ˆGð_Ø×&Ñ& y°-Õ@ñ %øô ò _Ü—‘Ð4°W×5FÑ5F×5OÑ5OÐ4PÐPYÐZ[ÐY\Ð]×^Ñ^ûð_ús   ‘&¦	A(¯/A#Á#A(r   c                 ó°  — t        t        di «      j                  di «      }|j                  dg «      }|sy| j                  D ]L  }|j                  j
                  j                  «       j                  dd«      |v sŒ:	 |j                  ||«       ŒN y# t        $ r9}t        j                  d|j                  j
                  › d|› �«       Y d}~Œ�d}~ww xY w)	z/Notify stakeholders of success (if configured).rk   rl   Ú
on_successNrz   r   rw   rx   )rq   r   r$   rh   ry   r   ÚlowerÚreplacer   r7   r0   r8   )r   r
   r   r   r|   rz   r9   s          r   r   z"NotificationManager.notify_successÑ   sÂ   € äœ ?°BÓ7×;Ñ;¸OÈRÓPˆØ—Z‘Z ¨bÓ1ˆ
áØà—}”}ˆGØ× Ñ ×)Ñ)×/Ñ/Ó1×9Ñ9¸)ÀRÓHÈJÒVðcØ×*Ñ*¨9°gÕ>ñ %øô !ò cÜ—L‘LÐ#8¸×9JÑ9J×9SÑ9SÐ8TÐT]Ð^_Ð]`Ð!a×bÑbûðcús   Á>BÂ	CÂ/CÃCNr   )
r   r   r   r   r'   ri   r   r   r   r   r   r   r   rf   rf   §   s<   „ Ù3òòLð6_¨ð _Àcó _ñc¨ð cÀô cr   rf   )r   ÚloggingÚtypingr   r   Údjango.confr   Údjango.core.mailr   Údjango_cronjob_utils.modelsr   rV   ÚImportErrorÚ	getLoggerr   r0   r	   r   r=   r]   rf   r   r   r   Ú<module>r†      s”   ðñó ß !Ý  Ý &Ý 5ðÛð 
ˆ×	Ñ	˜8Ó	$€÷	ñ 	ô.DÐ&ô .Dôb(DÐ&ô (DôV(GÐ)ô (G÷V7cò 7cøðs ò Ø‚Hðús   ¢A. Á.A8Á7A8