U
    cc                      @   sP  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&G dd de
j'Z(G dd de
j'Z)e
j*+e e
j*+e e
j*+e e
j*+ee) e
j*+e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   R/var/www/html/project/venv/lib/python3.8/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 k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   Z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)   )r9   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 sLttd}| |j| jd< ||dd k	rr|drrt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'   Zerror_classr   _errors)r&   datar@   exc	__class__r   r   rE   K   s    

zPeriodicTaskForm.cleanc              
   C   sP   | j | }zt| W n4 tk
rJ } zttd| W 5 d }~X Y nX |S )NzUnable to parse JSON: %s)Zcleaned_datar   
ValueErrorr   rG   r'   )r&   fieldr6   rJ   r   r   r   _clean_json[   s    

zPeriodicTaskForm._clean_jsonc                 C   s
   |  dS )NargsrO   r+   r   r   r   
clean_argse   s    zPeriodicTaskForm.clean_argsc                 C   s
   |  dS )NkwargsrQ   r+   r   r   r   clean_kwargsh   s    zPeriodicTaskForm.clean_kwargs)r/   r0   r1   r2   r5   r'   r@   r   Z	CharFieldrA   r?   rE   rO   rR   rT   __classcell__r   r   rK   r   r8   8   s   
r8   c                       s   e Zd ZdZeZeZeZ	dZ
dZdddddg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* fdd	Z fddZdd Zdd Zede_dd  Zed!e_d"d# Zd$d% Zed&e_d'd( Zed)e_  ZS )+PeriodicTaskAdminz#Admin-interface for periodic tasks.
start_time)__str__enabledintervalrW   last_run_atone_offrY   r\   rA   r[   )enable_tasksdisable_taskstoggle_tasks	run_tasks)r   N)r   r@   rA   rY   description)extraprettywide)fieldsclassesZSchedule)rZ   crontabsolarclockedrW   r[   r\   	Arguments)rP   rS   )rb   rc   ZcollapseinzExecution Options)rC   rB   queueZexchangeZrouting_keypriorityheaders)r[   c                    s0   |pi }t tdd }t| |d< t ||S )NZCELERYBEAT_SCHEDULERZwrong_scheduler)getattrr   r   rD   changelist_view)r&   requestZextra_contextZ	schedulerrK   r   r   ro      s     z!PeriodicTaskAdmin.changelist_viewc                    s   t  |}|ddddS )NrZ   rf   rg   rh   )rD   get_querysetZselect_related)r&   rp   qsrK   r   r   rq      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&   rp   rows_updatedverbr   r   r   _message_user_about_update   s    z,PeriodicTaskAdmin._message_user_about_updatec                 C   s&   |j dd}t  | ||d d S )NTrY   rY   updater   update_changedrx   r&   rp   querysetrv   r   r   r   r]      s    zPeriodicTaskAdmin.enable_taskszEnable selected tasksc                 C   s(   |j dd d}t  | ||d d S )NF)rY   r[   disabledrz   r}   r   r   r   r^      s    zPeriodicTaskAdmin.disable_taskszDisable selected tasksc                 C   s$   |j ttdtddtdddS )NTF)rY   Zthen)defaultry   )r{   r   r
   r	   )r&   r~   r   r   r   _toggle_tasks_activity   s    z(PeriodicTaskAdmin._toggle_tasks_activityc                 C   s$   |  |}t  | ||d d S )NZtoggled)r   r   r|   rx   r}   r   r   r   r_      s    
zPeriodicTaskAdmin.toggle_tasksz!Toggle activity of selected tasksc           	         s    j j   fdd|D }tdd |D r~t|D ]\}}|d d kr8 qRq8|| 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#   rF   rA   r   rP   rS   rk   r   )r   rA   r+   r   r   
<listcomp>   s   z/PeriodicTaskAdmin.run_tasks.<locals>.<listcomp>c                 s   s   | ]}|d  dk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 | ]<\}}}}}|r0t |r0|j||||d n|j|||dqS ))rP   rS   rk   periodic_task_name)rP   rS   r   )lenZapply_async)r   rA   rP   rS   rk   r   r   r   r   r      s   z {0} task{1} {2} successfully runrs   )r"   r-   r.   any	enumeraterA   rt   r'   r   ERRORr   ru   r   )	r&   rp   r~   r#   ir   Znot_found_task_nametask_idsZ	tasks_runr   r+   r   r`      s6    

zPeriodicTaskAdmin.run_taskszRun selected tasks)N)r/   r0   r1   r2   r8   formr   r=   r   r"   Zdate_hierarchylist_displayZlist_filteractionsZsearch_fieldsr'   Z	fieldsetsZreadonly_fieldsro   rq   rx   r]   Zshort_descriptionr^   r   r_   r`   rU   r   r   rK   r   rV   l   sN   


)rV   c                   @   s   e Zd ZdZdZdZdS )ClockedScheduleAdminz&Admin-interface for clocked schedules.)Zclocked_timeN)r/   r0   r1   r2   rd   r   r   r   r   r   r      s   r   N),r2   Zceleryr   Zcelery.utilsr   djangor   Zdjango.confr   Zdjango.contribr   r   Zdjango.db.modelsr   r	   r
   Zdjango.forms.widgetsr   Zdjango.template.defaultfiltersr   Zdjango.utils.translationr   r'   Zkombu.utils.jsonr   modelsr   r   r   r   r   r   utilsr   r   ZChoiceFieldr5   Z	ModelFormr8   Z
ModelAdminrV   r   siteregisterr   r   r   r   <module>   s.    	4 