a
    d                     @   s   d dl 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 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 d dlmZmZ e
eG dd de
j Z!e
eG dd de
j Z"dS )    N)	timedelta)events)BackgroundScheduler)settings)adminmessages)Avg)timezone)format_html)	mark_safe)gettext_lazy)	DjangoJobDjangoJobExecution)util)DjangoJobStoreDjangoMemoryJobStorec                       sx   e Zd ZdgZg dZ fddZ fddZdd Zd	d
 Ze	de_
dgZdd ZejdddZe	de_
  ZS )DjangoJobAdminid)r   local_run_timeaverage_durationc                    s<   t  || t | _t | _d | _d | _tt	dd| _
d S )NZAPSCHEDULER_RUN_NOW_TIMEOUT   )super__init__r   _django_jobstorer   _memory_jobstore_jobs_scheduled_jobs_executedgetattrr   _job_execution_timeout)selfmodelZ
admin_site	__class__ T/var/www/html/django/DPS/env/lib/python3.9/site-packages/django_apscheduler/admin.pyr      s    zDjangoJobAdmin.__init__c                    sB   t  |}tjj|jddddddjtdd| _	|S )	Nr   T)Zflat)Z
job_id__injob_idjobduration)Zavg_duration)
r   get_querysetr   objectsfilterZvalues_listZorder_byZannotater   avg_duration_qs)r   requestqsr!   r#   r$   r(   $   s    	zDjangoJobAdmin.get_querysetc                 C   s   |j rt|j S dS )Nz(paused))Znext_run_timer   get_local_dt_formatr   objr#   r#   r$   r   2   s    zDjangoJobAdmin.local_run_timec                 C   s2   z| j j|jdd W S  tjy,   Y dS 0 d S )N)r%      None)r+   getr   r   ZDoesNotExistr/   r#   r#   r$   r   8   s    zDjangoJobAdmin.average_durationzAverage Duration (sec)run_selected_jobsc           	      C   s^  t  }|| j || jtj |  t | _	t | _
t }|D ]r}| j|j}|s~td}| |t||jtj qF|j|jd |j|j|j|j|j|j|jd	 | j	|j qF| j	| j
kr.t |t| jd kr"td}| |t|| jd | j	| j
 tj! |j"dd d S t#$d q| j
D ]}| |ttd	| q4|"  d S )
Nz<Could not find job {} in the database! Skipping execution...)triggerargskwargsr   namemisfire_grace_timecoalescemax_instances)secondszfMaximum runtime of {} seconds exceeded! Not all jobs could be completed successfully. Pending jobs: {},F)waitg?zExecuted job '{}'!)%r   Zadd_jobstorer   Zadd_listener_handle_execution_eventr   ZEVENT_JOB_EXECUTEDstartsetr   r   r	   nowr   Z
lookup_jobr   _Zmessage_userr
   r   WARNINGZadd_jobZfunc_refr6   r7   r8   r9   r:   r;   addr   r   joinERRORshutdowntimesleep)	r   r,   ZquerysetZ	scheduler
start_timeitemZ
django_jobmsgr%   r#   r#   r$   r4   B   s`    


z DjangoJobAdmin.run_selected_jobs)eventc                 C   s   | j |j d S N)r   rE   r%   )r   rN   r#   r#   r$   r?      s    z&DjangoJobAdmin._handle_execution_eventzRun the selected django jobs)__name__
__module____qualname__Zsearch_fieldslist_displayr   r(   r   r   rC   short_descriptionactionsr4   r   ZJobExecutionEventr?   __classcell__r#   r#   r!   r$   r      s   
?r   c                
   @   sj   e Zd ZejdejdejdejdejdiZ	g dZ
g dZdd Zd	d
 Zdd Zede_ede_dS )DjangoJobExecutionAdmingreenblueZorangered)r   r&   html_statusr   duration_text)Zjob__idrun_timestatusc                 C   s    t d| j|j  d|j dS )Nz<p style="color: z">z</p>)r   status_color_mappingr^   r/   r#   r#   r$   r[      s    z#DjangoJobExecutionAdmin.html_statusc                 C   s   t |jS rO   )r   r.   r]   r/   r#   r#   r$   r      s    z&DjangoJobExecutionAdmin.local_run_timec                 C   s
   |j pdS )NzN/A)r'   r/   r#   r#   r$   r\      s    z%DjangoJobExecutionAdmin.duration_textStatuszDuration (sec)N)rP   rQ   rR   r   SUCCESSZSENTZMAX_INSTANCESZMISSEDrG   r_   rS   Zlist_filterr[   r   r\   rC   rT   r#   r#   r#   r$   rW      s   
rW   )#rI   datetimer   Zapschedulerr   Z!apscheduler.schedulers.backgroundr   Zdjango.confr   Zdjango.contribr   r   Zdjango.db.modelsr   Zdjango.utilsr	   Zdjango.utils.htmlr
   Zdjango.utils.safestringr   Zdjango.utils.translationr   rC   Zdjango_apscheduler.modelsr   r   Zdjango_apschedulerr   Zdjango_apscheduler.jobstoresr   r   registerZ
ModelAdminr   rW   r#   r#   r#   r$   <module>   s"   s