o
    fm'                     @   s  d 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 ddlmZ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mZmZmZmZm Z  ddl!m"Z" G dd deZ#G dd dej$Z%G dd dej&Z'e
(eG dd de
j)Z*G dd de
j+Z,G dd de
j)Z-e
(eG dd de-Z.e
(eG dd de-Z/e
(e G d d! d!e-Z0e
(eG d"d# d#e-Z1d$S )%zPeriodic Task Admin interface.    )current_app)cached_property)forms)settings)adminmessages)CaseValueWhen)Select)	pluralize)gettext_lazy)ngettext_lazy)loads   )ClockedScheduleCrontabScheduleIntervalSchedulePeriodicTaskPeriodicTasksSolarSchedule)is_database_schedulerc                   @   sF   e Zd 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 )
TaskSelectWidgetz/Widget that lets you choose between task names.Nc                 C   s.   | j }tdd | jjD }dtt|| S )Nc                 s   s    | ]
}| d s|V  qdS )zcelery.N)
startswith).0name r   K/var/www/html/venv/lib/python3.10/site-packages/django_celery_beat/admin.py	<genexpr>   s    z4TaskSelectWidget.tasks_as_choices.<locals>.<genexpr>)) r   )_modulessorted
celery_apptaskstuplezip)self_r#   r   r   r   tasks_as_choices   s   z!TaskSelectWidget.tasks_as_choicesc                 C   s   | j d u r
|  | _ | j S N)_choicesr(   r&   r   r   r   choices   s   

zTaskSelectWidget.choicesc                 C   s   d S r)   r   )r&   r'   r   r   r   r,   %   s   c                 C   s   | j j  d S r)   )r"   loaderimport_default_modulesr+   r   r   r   r    +   s   zTaskSelectWidget._modules)__name__
__module____qualname____doc__r   r"   r*   r(   propertyr,   setterr   r    r   r   r   r   r      s    

r   c                   @   s   e Zd ZdZeZdd ZdS )TaskChoiceFieldz.Field that lets you choose between task names.c                 C      dS )NTr   )r&   valuer   r   r   valid_value5      zTaskChoiceField.valid_valueN)r/   r0   r1   r2   r   widgetr8   r   r   r   r   r5   0   s    r5   c                       sj   e Zd 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 )PeriodicTaskFormz4Form that lets you create and modify periodic tasks.zTask (registered)F)labelrequiredzTask (custom)   )r<   r=   
max_lengthc                   @   s   e Zd ZdZeZdZdS )zPeriodicTaskForm.MetazForm metadata.r   N)r/   r0   r1   r2   r   modelexcluder   r   r   r   MetaF   s    rB   c                    sv   t   }|d}|r||d< |d s&ttd}| |j| jd< ||dd ur9|dr9ttd|S )NregtasktaskzNeed name of taskexpire_secondsexpiresz2Only one can be set, in expires and expire_seconds)	supercleangetr   ValidationErrorr'   error_classr   _errors)r&   datarC   exc	__class__r   r   rH   L   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   rJ   r'   )r&   fieldr7   rN   r   r   r   _clean_json\   s   


zPeriodicTaskForm._clean_jsonc                 C   
   |  dS )NargsrT   r+   r   r   r   
clean_argsf      
zPeriodicTaskForm.clean_argsc                 C   rU   )NkwargsrW   r+   r   r   r   clean_kwargsi   rY   zPeriodicTaskForm.clean_kwargs)r/   r0   r1   r2   r5   r'   rC   r   	CharFieldrD   rB   rH   rT   rX   r[   __classcell__r   r   rO   r   r;   9   s     
r;   c                       s  e Zd ZdZeZeZeZ	dZ
dZg dZdZdZddd	d
feddd	d
fedddd
fedddd
ffZdZdd ZdZ		d, fdd	Zd- fdd	Z fddZejedddd  Zejed!dd"d# Zd$d% Zejed&dd'd( Zejed)dd*d+ Z  ZS ).PeriodicTaskAdminz#Admin-interface for periodic tasks.
start_time)r   enabled	schedulerintervalr_   last_run_atone_off)r`   rd   rD   r_   rc   )enable_tasksdisable_taskstoggle_tasks	run_tasks)r   N)r   rC   rD   r`   description)extraprettywide)fieldsclassesSchedule)rb   crontabcrontab_translationsolarclockedr_   rc   rd   	Arguments)rV   rZ   )rj   rk   collapseinzExecution Options)rF   rE   queueexchangerouting_keypriorityheaders)rc   rp   c                 C   s   |j jS r)   )ro   human_readable)r&   objr   r   r   rp      s   z%PeriodicTaskAdmin.crontab_translationz,admin/djcelery/change_periodictask_form.htmlr   c                    sF   |pi }t j }i }|D ]}|j||j< q||d< t j|||dS )Nreadable_crontabs)extra_context)r   objectsallr{   idrG   changeform_view)r&   request	object_idform_urlr~   crontabscrontab_dictro   rO   r   r   r      s   

z!PeriodicTaskAdmin.changeform_viewc                    s0   |pi }t tdd }t| |d< t ||S )NCELERY_BEAT_SCHEDULERwrong_scheduler)getattrr   r   rG   changelist_view)r&   r   r~   ra   rO   r   r   r      s   z!PeriodicTaskAdmin.changelist_viewc                    s   t  |}|ddddS )Nrb   ro   rq   rr   )rG   get_querysetselect_related)r&   r   qsrO   r   r   r      s   zPeriodicTaskAdmin.get_querysetzEnable selected tasks)ri   c                 C   s2   |j dd}t  | |tdd|| d S )NTr`   z!{0} task was successfully enabledz#{0} tasks were successfully enabledupdater   update_changedmessage_userr   formatr&   r   querysetrows_updatedr   r   r   re      s   zPeriodicTaskAdmin.enable_taskszDisable selected tasksc                 C   s4   |j dd d}t  | |tdd|| d S )NF)r`   rc   z"{0} task was successfully disabledz${0} tasks were successfully disabledr   r   r   r   r   rf      s   zPeriodicTaskAdmin.disable_tasksc                 C   s$   |j ttdtddtdddS )NTF)r`   then)defaultr   )r   r   r
   r	   )r&   r   r   r   r   _toggle_tasks_activity   s   
z(PeriodicTaskAdmin._toggle_tasks_activityz!Toggle activity of selected tasksc                 C   s0   |  |}t  | |tdd|| d S )Nz!{0} task was successfully toggledz#{0} tasks were successfully toggled)r   r   r   r   r   r   r   r   r   r   rg      s   
zPeriodicTaskAdmin.toggle_taskszRun selected tasksc           	         s    j j   fdd|D }tdd |D r?t|D ]\}}|d d u r( nq|| j} j|td| dtj	d d S d	d |D }t
|} |td
|t|t|td d S )Nc                    s6   g | ]} j j|jt|jt|j|j|jfqS r   )	r"   r#   rI   rD   r   rV   rZ   rv   r   )r   rD   r+   r   r   
<listcomp>   s    z/PeriodicTaskAdmin.run_tasks.<locals>.<listcomp>c                 s   s    | ]	}|d  du V  qdS )r   Nr   )r   tr   r   r   r      s    z.PeriodicTaskAdmin.run_tasks.<locals>.<genexpr>r   ztask "z" not found)levelc                 S   sD   g | ]\}}}}}|rt |r|j||||d n|j|||dqS ))rV   rZ   rv   periodic_task_name)rV   rZ   r   )lenapply_async)r   rD   rV   rZ   rv   r   r   r   r   r      s    z {0} task{1} {2} successfully runzwas,were)r"   r-   r.   any	enumeraterD   r   r'   r   ERRORr   r   r   )	r&   r   r   r#   ir   not_found_task_nametask_ids	tasks_runr   r+   r   rh      s8   

zPeriodicTaskAdmin.run_tasks)Nr   Nr)   )r/   r0   r1   r2   r;   formr   r@   r   r"   date_hierarchylist_displaylist_filteractionssearch_fieldsr'   	fieldsetsreadonly_fieldsrp   change_form_templater   r   r   r   actionre   rf   r   rg   rh   r]   r   r   rO   r   r^   m   sh    


r^   c                   @   s4   e Zd ZeZdZeZdZdZdZ	dZ
e
Zdd ZdS )	PeriodicTaskInline)r   rD   rV   rZ   Fr   Tz"Periodic Tasks Using This Schedulec                 C   r6   )NFr   )r&   r   r|   r   r   r   has_add_permission  r9   z%PeriodicTaskInline.has_add_permissionN)r/   r0   r1   r   r@   rl   r   
can_deleteextrashow_change_linkverbose_nameverbose_name_pluralr   r   r   r   r   r     s    r   c                   @   s   e Zd ZegZdS )ScheduleAdminN)r/   r0   r1   r   inlinesr   r   r   r   r     s    
r   c                   @   s   e Zd ZdZdZdZdS )ClockedScheduleAdminz&Admin-interface for clocked schedules.)clocked_timeN)r/   r0   r1   r2   rl   r   r   r   r   r   r      s    r   c                   @   s   e Zd ZdZdZdZdZdS )CrontabScheduleAdminz Admin class for CrontabSchedule.)__str__r{   )r{   minutehourday_of_monthmonth_of_yearday_of_weektimezone)r{   N)r/   r0   r1   r2   r   rl   r   r   r   r   r   r   ,  s
    r   c                   @      e Zd ZdZdS )SolarScheduleAdminzAdmin class for SolarSchedule.Nr/   r0   r1   r2   r   r   r   r   r   6      r   c                   @   r   )IntervalScheduleAdminz!Admin class for IntervalSchedule.Nr   r   r   r   r   r   <  r   r   N)2r2   celeryr   celery.utilsr   djangor   django.confr   django.contribr   r   django.db.modelsr   r	   r
   django.forms.widgetsr   django.template.defaultfiltersr   django.utils.translationr   r'   r   kombu.utils.jsonr   modelsr   r   r   r   r   r   utilsr   r   ChoiceFieldr5   	ModelFormr;   register
ModelAdminr^   TabularInliner   r   r   r   r   r   r   r   r   r   <module>   s<     	4 !	