o
    ArPf#                     @   sX  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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)e
'eG dd de
j(Z*e
'eG dd de
j(Z+e
j,'e e
j,'e dS )zPeriodic Task Admin interface.    )current_app)cached_property)forms)settings)adminmessages)CaseValueWhen)Select)	pluralize)gettext_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   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).0name r   Y/var/www/html/humari/django-venv/lib/python3.10/site-packages/django_celery_beat/admin.py	<genexpr>   s    z4TaskSelectWidget.tasks_as_choices.<locals>.<genexpr>)) r   )_moduleslist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   s   dS )NTr   )r&   valuer   r   r   valid_value4   s   zTaskChoiceField.valid_valueN)r/   r0   r1   r2   r   widgetr7   r   r   r   r   r5   /   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   MetaE   s    r@   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&   datarA   exc	__class__r   r   rF   K   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   rH   r'   )r&   fieldr6   rL   r   r   r   _clean_json[   s   


zPeriodicTaskForm._clean_jsonc                 C   
   |  dS )NargsrR   r+   r   r   r   
clean_argse      
zPeriodicTaskForm.clean_argsc                 C   rS   )NkwargsrU   r+   r   r   r   clean_kwargsh   rW   zPeriodicTaskForm.clean_kwargs)r/   r0   r1   r2   r5   r'   rA   r   	CharFieldrB   r@   rF   rR   rV   rY   __classcell__r   r   rM   r   r9   8   s     
r9   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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 )0PeriodicTaskAdminz#Admin-interface for periodic tasks.
start_time)r   enabled	schedulerintervalr]   last_run_atone_off)r^   rb   rB   r]   ra   )enable_tasksdisable_taskstoggle_tasks	run_tasks)r   N)r   rA   rB   r^   description)extraprettywide)fieldsclassesSchedule)r`   crontabcrontab_translationsolarclockedr]   ra   rb   	Arguments)rT   rX   )rh   ri   collapseinzExecution Options)rD   rC   queueexchangerouting_keypriorityheaders)ra   rn   c                 C   s   |j jS r)   )rm   human_readable)r&   objr   r   r   rn      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allry   idrE   changeform_view)r&   request	object_idform_urlr|   crontabscrontab_dictrm   rM   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   rE   changelist_view)r&   r   r|   r_   rM   r   r   r      s   z!PeriodicTaskAdmin.changelist_viewc                    s   t  |}|ddddS )Nr`   rm   ro   rp   )rE   get_querysetselect_related)r&   r   qsrM   r   r   r      s   zPeriodicTaskAdmin.get_querysetc                 C   s.   |  |td|t|t|td| dS )zxSend message about action to user.

        `verb` should shortly describe what have changed (e.g. 'enabled').

        z {0} task{1} {2} successfully {3}was,wereN)message_userr'   formatr   )r&   r   rows_updatedverbr   r   r   _message_user_about_update   s   z,PeriodicTaskAdmin._message_user_about_updatezEnable selected tasks)rg   c                 C   s&   |j dd}t  | ||d d S )NTr^   r^   updater   update_changedr   r&   r   querysetr   r   r   r   rc      s   zPeriodicTaskAdmin.enable_taskszDisable selected tasksc                 C   s(   |j dd d}t  | ||d d S )NF)r^   ra   disabledr   r   r   r   r   rd      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   s$   |  |}t  | ||d d S )Ntoggled)r   r   r   r   r   r   r   r   re      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#   rG   rB   r   rT   rX   rt   r   )r   rB   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 ))rT   rX   rt   periodic_task_name)rT   rX   r   )lenapply_async)r   rB   rT   rX   rt   r   r   r   r   r      s    z {0} task{1} {2} successfully runr   )r"   r-   r.   any	enumeraterB   r   r'   r   ERRORr   r   r   )	r&   r   r   r#   ir   not_found_task_nametask_ids	tasks_runr   r+   r   rf      s8   

zPeriodicTaskAdmin.run_tasks)Nr   Nr)   ) r/   r0   r1   r2   r9   formr   r>   r   r"   date_hierarchylist_displaylist_filteractionssearch_fieldsr'   	fieldsetsreadonly_fieldsrn   change_form_templater   r   r   r   r   actionrc   rd   r   re   rf   r[   r   r   rM   r   r\   l   sj    


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   rj   r   r   r   r   r   r     s    r   c                   @   s   e Zd ZdZdZdS )CrontabScheduleAdminz Admin class for CrontabSchedule.)__str__ry   N)r/   r0   r1   r2   r   r   r   r   r   r     s    r   N)-r2   celeryr   celery.utilsr   djangor   django.confr   django.contribr   r   django.db.modelsr   r	   r
   django.forms.widgetsr   django.template.defaultfiltersr   django.utils.translationr   r'   kombu.utils.jsonr   modelsr   r   r   r   r   r   utilsr   r   ChoiceFieldr5   	ModelFormr9   register
ModelAdminr\   r   r   siter   r   r   r   <module>   s2     	4 