o
    I<VÛ,  ã                   @   s¾  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	m
Z
 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 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m Z m!Z! d dl"m#Z# d dl$m%Z% ddl&m'Z'm(Z(m)Z) ddl*m+Z+m,Z,m-Z-m.Z.m/Z/ ddl0m1Z1 ddl2m3Z3 zd dl4m5Z5 W n e6y§   d dl4m7Z5 Y nw ej8dej9dej:dej;dej<dddiZ=dd d!œZ>G d"d#„ d#ej?ƒZ@e(ed$ƒd$ƒd%d&„ ƒZAe(ed$ƒd'ƒd(d)„ ƒZBe(ed*ƒd+ƒd,d+„ ƒZCe(ed-ƒd.ƒd/d.„ ƒZDe(ed0ƒd0ƒd1d0„ ƒZEG d2d3„ d3e
jFƒZGG d4d5„ d5eGƒZHG d6d7„ d7eGƒZIe
jJ Ke+eH¡ e
jJ Ke,eI¡ G d8d9„ d9eƒZLG d:d;„ d;ejMƒZNG d<d=„ d=ejOƒZPG d>d?„ d?e
jFƒZQe
jJ Ke.¡ e
jJ Ke/¡ e
jJ Ke-eQ¡ d@S )Aé    )Úabsolute_importÚunicode_literals)Úloads)Úforms)Úsettings)Úadmin)Úhelpers)Úmain)ÚSelect)Úrender_to_response)ÚRequestContext)Úescape)Úugettext_lazy)Úcurrent_app)Ústates)Ú	broadcastÚrevokeÚ
rate_limit)Úcached_property)Úabbrtaské   )ÚactionÚdisplay_fieldÚ
fixedwidth)Ú	TaskStateÚWorkerStateÚPeriodicTaskÚIntervalScheduleÚCrontabSchedule)Únaturaldate)Úis_database_scheduler)Ú
force_text)Úforce_unicodeÚgreenÚredÚmagentaÚyellowÚorangeÚRECEIVEDÚblueÚgray)ÚONLINEÚOFFLINEc                       s   e Zd Z‡ fdd„Z‡  ZS )ÚMonitorListc                    s$   t t| ƒj|i |¤Ž | jj| _d S ©N)Úsuperr-   Ú__init__Úmodel_adminÚlist_page_titleÚtitle)ÚselfÚargsÚkwargs©Ú	__class__© ú@/var/www/html/env/lib/python3.10/site-packages/djcelery/admin.pyr0   0   s   zMonitorList.__init__)Ú__name__Ú
__module__Ú__qualname__r0   Ú__classcell__r9   r9   r7   r:   r-   .   s    r-   Ústatec                 C   s$   t | jƒ}t | jd¡}d ||¡S )NÚblackú+<b><span style="color: {0};">{1}</span></b>)r   r?   ÚTASK_STATE_COLORSÚgetÚformat)Útaskr?   Úcolorr9   r9   r:   Úcolored_state5   s   
rG   Úlast_heartbeatc                 C   s$   |   ¡ rdpd}t| }d ||¡S )Nr+   r,   rA   )Úis_aliveÚNODE_STATE_COLORSrD   )Únoder?   rF   r9   r9   r:   Ú
node_state<   s   rL   ÚETAÚetac                 C   s   | j sdS t| j ƒS )Nz&<span style="color: gray;">none</span>)rN   r   ©rE   r9   r9   r:   rN   C   s   
ÚwhenÚtstampc                 C   s    d  tt| jƒƒtt| jƒƒ¡S )Nz<div title="{0}">{1}</div>)rD   r   ÚstrrQ   r   rO   r9   r9   r:   rQ   J   s   ÿÚnamec                 C   s"   t | jdƒ}d t| jƒt|ƒ¡S )Né   z!<div title="{0}"><b>{1}</b></div>)r   rS   rD   r   )rE   Ú
short_namer9   r9   r:   rS   Q   s   ÿc                       sH   e Zd ZdZdZdd„ Zd‡ fdd„	Zd‡ fdd„	Z‡ fd	d
„Z‡  Z	S )ÚModelMonitorFc                 K   s   t S r.   )r-   )r4   Úrequestr6   r9   r9   r:   Úget_changelist]   ó   zModelMonitor.get_changelistNc                    s,   |pi }|  d| j¡ tt| ƒj|||d�S )Nr3   )Úextra_context)Ú
setdefaultÚdetail_titler/   rV   Úchange_view)r4   rW   Ú	object_idrZ   r7   r9   r:   r]   `   s
   
ÿzModelMonitor.change_viewc                    s   | j sdS tt| ƒ ||¡S ©NF)Ú
can_deleter/   rV   Úhas_delete_permission)r4   rW   Úobjr7   r9   r:   ra   g   s   z"ModelMonitor.has_delete_permissionc                    s   | j sdS tt| ƒ |¡S r_   )Úcan_addr/   rV   Úhas_add_permission)r4   rW   r7   r9   r:   rd   l   s   zModelMonitor.has_add_permissionr.   )
r;   r<   r=   rc   r`   rX   r]   ra   rd   r>   r9   r9   r7   r:   rV   Y   s    rV   c                       s   e Zd ZedƒZedƒZdZdZddddœfd	d
ddœffZe	dedƒdd�e
ee	ddd�e	ddd�eedfZdZdZdZg d¢ZG dd„ dƒZeedƒƒdd„ ƒZeedƒƒd d!„ ƒZeed"ƒƒd#d$„ ƒZeed%ƒƒd&d'„ ƒZ‡ fd(d)„Z‡ fd*d+„Z‡  ZS ),ÚTaskMonitorzTask detailÚTasksz djcelery/confirm_rate_limit.htmlrQ   N)	r?   Útask_idrS   r5   r6   rN   ÚruntimeÚworkerrQ   )Úextrapretty©ÚfieldsÚclassesÚDetails)Úcollapserj   )ÚresultÚ	tracebackÚexpires)rm   rl   rg   ÚUUIDé   )rS   Úptr5   T)Úprettyr6   ri   )r?   rg   rS   r5   r6   rN   rh   ri   rp   rq   rr   rQ   )r?   rS   rQ   rN   ri   )rS   rg   r5   r6   Úworker__hostname)Úrevoke_tasksÚterminate_tasksÚ
kill_tasksÚrate_limit_tasksc                   @   s   e Zd ZddiZdS )zTaskMonitor.MediaÚall)zdjcelery/style.cssN)r;   r<   r=   Úcssr9   r9   r9   r:   ÚMedia˜   s    r~   zRevoke selected tasksc                 C   sF   t  ¡ �}|D ]	}t|j|d� qW d   ƒ d S 1 sw   Y  d S )N©Ú
connection©r   Údefault_connectionr   rg   ©r4   rW   Úquerysetr€   r?   r9   r9   r:   rx   ›   s
   
ÿ"ÿzTaskMonitor.revoke_taskszTerminate selected tasksc                 C   sH   t  ¡ �}|D ]
}t|j|dd� qW d   ƒ d S 1 sw   Y  d S )NT)r€   Ú	terminater�   rƒ   r9   r9   r:   ry   ¡   s
   
ÿ"ÿzTaskMonitor.terminate_taskszKill selected tasksc                 C   sJ   t  ¡ �}|D ]}t|j|ddd� qW d   ƒ d S 1 sw   Y  d S )NTÚKILL)r€   r…   Úsignalr�   rƒ   r9   r9   r:   rz   §   s   
ÿÿ"ÿzTaskMonitor.kill_taskszRate limit selected tasksc           
      C   s®   t dd„ |D ƒƒ}| jj}|j}|j d¡r>|jd }t ¡ �}|D ]	}t|||d� q"W d   ƒ d S 1 s7w   Y  d S t	dƒ|t
|jƒtj||dœ}	t| j|	t|ƒd�S )	Nc                 S   ó   g | ]}|j ‘qS r9   )rS   )Ú.0rE   r9   r9   r:   Ú
<listcomp>°   ó    z0TaskMonitor.rate_limit_tasks.<locals>.<listcomp>Úpostr   r   zRate limit selection)r3   r„   Úobject_nameÚaction_checkbox_nameÚoptsÚ	app_label)Úcontext_instance)ÚsetÚmodelÚ_metar�   ÚPOSTrC   r   r‚   r   Ú_r!   Úverbose_namer   ÚACTION_CHECKBOX_NAMEr   Ú rate_limit_confirmation_templater   )
r4   rW   r„   Útasksr�   r�   Úrater€   Ú	task_nameÚcontextr9   r9   r:   r{   ®   s0   

ÿ
ÿýú	þzTaskMonitor.rate_limit_tasksc                    ó    t t| ƒ |¡}| dd ¡ |S ©NÚdelete_selected)r/   re   Úget_actionsÚpop©r4   rW   Úactionsr7   r9   r:   r¡   È   ó   zTaskMonitor.get_actionsc                    s   t t| ƒ |¡}| d¡S )Nri   )r/   re   Úget_querysetÚselect_related©r4   rW   Úqsr7   r9   r:   r¦   Í   s   
zTaskMonitor.get_queryset)r;   r<   r=   r–   r\   r2   r™   Údate_hierarchyÚ	fieldsetsr   rG   rS   rN   rQ   Úlist_displayÚreadonly_fieldsÚlist_filterÚsearch_fieldsr¤   r~   r   rx   ry   rz   r{   r¡   r¦   r>   r9   r9   r7   r:   re   r   sL    ýþú

ø








re   c                       s€   e Zd ZdZedƒZedƒZdefZdZ	g d¢Z
eedƒƒdd	„ ƒZeed
ƒƒdd„ ƒZeedƒƒdd„ ƒZ‡ fdd„Z‡  ZS )ÚWorkerMonitorTzNode detailzWorker NodesÚhostname)rH   )Úshutdown_nodesÚenable_eventsÚdisable_eventszShutdown selected worker nodesc                 C   ó   t ddd„ |D ƒd� d S )NÚshutdownc                 S   rˆ   r9   ©r±   ©r‰   Únr9   r9   r:   rŠ   Þ   r‹   z0WorkerMonitor.shutdown_nodes.<locals>.<listcomp>©Údestination©r   ©r4   rW   r„   r9   r9   r:   r²   Ü   s   zWorkerMonitor.shutdown_nodesz%Enable event mode for selected nodes.c                 C   rµ   )Nr³   c                 S   rˆ   r9   r·   r¸   r9   r9   r:   rŠ   ã   r‹   z/WorkerMonitor.enable_events.<locals>.<listcomp>rº   r¼   r½   r9   r9   r:   r³   à   ó   
ÿzWorkerMonitor.enable_eventsz&Disable event mode for selected nodes.c                 C   rµ   )Nr´   c                 S   rˆ   r9   r·   r¸   r9   r9   r:   rŠ   è   r‹   z0WorkerMonitor.disable_events.<locals>.<listcomp>rº   r¼   r½   r9   r9   r:   r´   å   r¾   zWorkerMonitor.disable_eventsc                    rž   rŸ   )r/   r°   r¡   r¢   r£   r7   r9   r:   r¡   ê   r¥   zWorkerMonitor.get_actions)r;   r<   r=   rc   r–   r\   r2   rL   r¬   r­   r¤   r   r²   r³   r´   r¡   r>   r9   r9   r7   r:   r°   Ò   s    





r°   c                   @   sB   e Zd ZeZdZdd„ Zedd„ ƒZej	dd„ ƒZe
dd„ ƒZdS )	ÚTaskSelectWidgetNc                 C   s2   | j }ttdd„ | jjD ƒƒƒ}dtt||ƒƒ S )Nc                 s   s   � | ]
}|  d ¡s|V  qdS )zcelery.N)Ú
startswith)r‰   rS   r9   r9   r:   Ú	<genexpr>ü   s   € ÿz4TaskSelectWidget.tasks_as_choices.<locals>.<genexpr>))Ú rÂ   )Ú_modulesÚlistÚsortedÚ
celery_apprš   ÚtupleÚzip)r4   r–   rš   r9   r9   r:   Útasks_as_choicesú   s   z!TaskSelectWidget.tasks_as_choicesc                 C   s   | j d u r
|  ¡ | _ | j S r.   )Ú_choicesrÉ   ©r4   r9   r9   r:   Úchoices   s   

zTaskSelectWidget.choicesc                 C   s   d S r.   r9   )r4   r–   r9   r9   r:   rÌ     s   c                 C   s   | j j ¡  d S r.   )rÆ   ÚloaderÚimport_default_modulesrË   r9   r9   r:   rÃ     s   zTaskSelectWidget._modules)r;   r<   r=   r   rÆ   rÊ   rÉ   ÚpropertyrÌ   Úsetterr   rÃ   r9   r9   r9   r:   r¿   ö   s    

r¿   c                   @   s   e Zd ZeZdd„ ZdS )ÚTaskChoiceFieldc                 C   s   dS )NTr9   )r4   Úvaluer9   r9   r:   Úvalid_value  rY   zTaskChoiceField.valid_valueN)r;   r<   r=   r¿   ÚwidgetrÓ   r9   r9   r9   r:   rÑ     s    rÑ   c                       sf   e Zd Zeedƒdd�Zejedƒddd�ZG dd„ dƒZ	‡ fd	d
„Z
dd„ Zdd„ Zdd„ Z‡  ZS )ÚPeriodicTaskFormzTask (registered)F)ÚlabelÚrequiredzTask (custom)éÈ   )rÖ   r×   Ú
max_lengthc                   @   s   e Zd ZeZdZdS )zPeriodicTaskForm.Metar9   N)r;   r<   r=   r   r“   Úexcluder9   r9   r9   r:   ÚMeta  s    rÛ   c                    sT   t t| ƒ ¡ }| d¡}|r||d< |d s(t tdƒ¡}|  |j¡| j	d< |‚|S )NÚregtaskrE   zNeed name of task)
r/   rÕ   ÚcleanrC   r   ÚValidationErrorr–   Úerror_classÚmessagesÚ_errors)r4   ÚdatarÜ   Úexcr7   r9   r:   rÝ   "  s   
zPeriodicTaskForm.cleanc              
   C   sD   | j | }zt|ƒ W |S  ty! } z	t tdƒ| ¡‚d }~ww )NzUnable to parse JSON: %s)Úcleaned_datar   Ú
ValueErrorr   rÞ   r–   )r4   ÚfieldrÒ   rã   r9   r9   r:   Ú_clean_json-  s   

ü
ÿ€ÿzPeriodicTaskForm._clean_jsonc                 C   ó
   |   d¡S )Nr5   ©rç   rË   r9   r9   r:   Ú
clean_args7  ó   
zPeriodicTaskForm.clean_argsc                 C   rè   )Nr6   ré   rË   r9   r9   r:   Úclean_kwargs:  rë   zPeriodicTaskForm.clean_kwargs)r;   r<   r=   rÑ   r–   rÜ   r   Ú	CharFieldrE   rÛ   rÝ   rç   rê   rì   r>   r9   r9   r7   r:   rÕ     s    ÿÿ
rÕ   c                       sj   e Zd ZeZeZdZddddœfddddœfdd	d
dœfddd
dœffZd‡ fdd„	Z	‡ fdd„Z
‡  ZS )ÚPeriodicTaskAdmin)Ú__unicode__ÚenabledN)rS   rÜ   rE   rð   )rj   Úwiderk   ÚSchedule)ÚintervalÚcrontabÚ	Arguments)r5   r6   )rj   rñ   ro   zExecution Options)rr   ÚqueueÚexchangeÚrouting_keyc                    s4   |pi }t tdd ƒ}t|ƒ |d< tt| ƒ ||¡S )NÚCELERYBEAT_SCHEDULERÚwrong_scheduler)Úgetattrr   r    r/   rî   Úchangelist_view)r4   rW   rZ   Ú	schedulerr7   r9   r:   rü   U  s   ÿz!PeriodicTaskAdmin.changelist_viewc                    s   t t| ƒ |¡}| dd¡S )Nró   rô   )r/   rî   r¦   r§   r¨   r7   r9   r:   r¦   \  s   zPeriodicTaskAdmin.get_querysetr.   )r;   r<   r=   rÕ   Úformr   r“   r¬   r«   rü   r¦   r>   r9   r9   r7   r:   rî   >  s.    þþþþórî   N)RÚ
__future__r   r   Úanyjsonr   Údjangor   Údjango.confr   Údjango.contribr   Údjango.contrib.adminr   Údjango.contrib.admin.viewsr	   Ú
main_viewsÚdjango.forms.widgetsr
   Údjango.shortcutsr   Údjango.templater   Údjango.utils.htmlr   Údjango.utils.translationr   r–   Úceleryr   r   Úcelery.task.controlr   r   r   Úcelery.utilsr   Úcelery.utils.textr   Úadmin_utilsr   r   r   Úmodelsr   r   r   r   r   Úhumanizer   Úutilsr    Údjango.utils.encodingr!   ÚImportErrorr"   ÚSUCCESSÚFAILUREÚREVOKEDÚSTARTEDÚRETRYrB   rJ   Ú
ChangeListr-   rG   rL   rN   rQ   rS   Ú
ModelAdminrV   re   r°   ÚsiteÚregisterr¿   ÚChoiceFieldrÑ   Ú	ModelFormrÕ   rî   r9   r9   r9   r:   Ú<module>   sv    ÿûÿ




`&#