
    >Tf"                         d dl Z 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 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 d dlmZ d dl m!Z! dZ" G d dej#                  Z$dS )    N)settings)GenericForeignKey)ValidationError)MinValueValidator)models)reverse)timezone)gettext)JobStatusChoices)
ObjectType)job_end	job_start)
get_config)RQ_QUEUE_DEFAULT)RestrictedQuerySet)get_queue_for_model)Jobc            	           e Zd ZdZ ej        ddej        dd          Z ej        dd          Z	 e
ddd	
          Z ej         ed          d          Z ej         ed          d          Z ej         ed          dd          Z ej         ed          dd ed          f ed                    Z ej         ed          dd          Z ej         ed          dd          Z ej        ej        ej        ddd          Z ej         ed          deej                  Z ej         ed          dd          Z ej          ed          d	d          Z! ej"         ed           d!          Z# e$j%                    Z& G d" d#          Z'd$ Z(d% Z)d& Z* fd'Z+e,d(             Z- fd)Z.d* Z/ej0        d+fd,Z1e2d/d.            Z3 xZ4S )0r   zs
    Tracks the lifecycle of a job which represents a background task (e.g. the execution of a custom script).
    zcontenttypes.ContentTypejobsT)torelated_name	on_deleteblanknull)r   r   object_type	object_idF)ct_fieldfk_fieldfor_concrete_modelname   )verbose_name
max_lengthcreated)r"   auto_now_add	scheduled)r"   r   r   interval   z Recurrence interval (in minutes))r"   r   r   
validators	help_textstarted	completed+)r   r   r   r   r   status   )r"   r#   choicesdefaultdataerror)r"   editabler   zjob ID)r"   uniquec                   d    e Zd ZdgZ ej        d          fZ ed          Z ed          Z	dS )Job.Metaz-created)r   r   )fieldsjobr   N)
__name__
__module____qualname__orderingr   Indexindexes_r"   verbose_name_plural     5/var/www/html/netbox-4.1.3/netbox/core/models/jobs.pyMetar7   l   sN        <FL <===
 qxxaiirC   rE   c                 *    t          | j                  S N)strjob_idselfs    rD   __str__zJob.__str__t   s    4;rC   c                     | j         j        dk    rt          dd| j        i          S | j         j        dk    rt          dd| j        i          S t          d| j        g          S )	Nreportmodulezextras:report_resultjob_pk)kwargsscriptmodulezextras:script_resultzcore:job)args)r   modelr   pkrJ   s    rD   get_absolute_urlzJob.get_absolute_urlw   sq    !^332Hdg;NOOOO!^332Hdg;NOOOOz	2222rC   c                 J    t           j                            | j                  S rG   )r   colorsgetr.   rJ   s    rD   get_status_colorzJob.get_status_color   s    &**4;777rC   c                     t                                                       | j        t          j                            d          vr5t          t          d                              | j                            d S )Nr   z5Jobs cannot be assigned to this object type ({type}).)type)	supercleanr   r   objectswith_featurer   r@   format)rK   	__class__s    rD   r]   z	Job.clean   sq     :#5#B#B6#J#JJJ!IJJQQW[WgQhh   KJrC   c                     | j         sd S | j        p| j        }|sd S | j         |z
  }t          |                                d          \  }}t          |           d|ddS )N<   z
 minutes, z.2fz seconds)r,   r+   r$   divmodtotal_secondsint)rK   
start_timedurationminutessecondss        rD   rh   zJob.duration   sx    ~ 	4\1T\
 	4>J.!("8"8":":B??g,,??'?????rC   c                 L    t                      j        |i | t                      j                            | j        j        t                    }t          j	        |          }|
                    t          | j                            }|r|                                 d S d S rG   )r\   deleter   QUEUE_MAPPINGSrX   r   rS   r   	django_rq	get_queue	fetch_jobrH   rI   cancel)rK   rR   rP   rq_queue_namequeuer9   ra   s         rD   rl   z
Job.delete   s    ''''"3778H8NP`aa#M22ooc$+..// 	JJLLLLL	 	rC   c                     | j         dS t          j                    | _         t          j        | _        |                                  t          j        |            dS )zQ
        Record the job's start time and update its status to "running."
        N)	r+   r	   nowr   STATUS_RUNNINGr.   saver   sendrJ   s    rD   startz	Job.start   sO     <#F  |~~&5		 	trC   Nc                 L   t           j        }||vrCt          t          d                              d                    |                              || _        |r|| _        t          j	                    | _
        |                                  t          j        |            dS )zc
        Mark the job as completed, optionally specifying a particular termination status.
        z:Invalid status for job termination. Choices are: {choices}z, )r0   N)r   TERMINAL_STATE_CHOICES
ValueErrorr@   r`   joinr.   r3   r	   ru   r,   rw   r   rx   )rK   r.   r3   valid_statusess       rD   	terminatezJob.terminate   s     *@''NOOVV IIn55 W      	DJ!		 	TrC    c                 t   |r|rt          t          d                    |r)t          j                            |d          }	|j        }
ndx}	}
t          |	r|	j        nd          }t          j	        |          }|rt          j        nt          j        }t          j                            |	|
|||||t          j                              }|r |dt#          |j                  |d| nJ|r% |j        ||ft#          |j                  |d| n# |j        |ft#          |j                  |d| |S )a  
        Create a Job instance and enqueue a job using the given callable

        Args:
            func: The callable object to be enqueued for execution
            instance: The NetBox object to which this job pertains (optional)
            name: Name for the job (optional)
            user: The user responsible for running the job
            schedule_at: Schedule the job to be executed at the passed date and time
            interval: Recurrence interval (in minutes)
            immediate: Run the job immediately without scheduling it in the background. Should be used for interactive
                management commands only.
        zJenqueue() cannot be called with values for both schedule_at and immediate.F)r   N)r   r   r    r.   r&   r'   userrI   )rI   r9   rB   )r|   r@   r   r^   get_for_modelrT   r   rS   rn   ro   r   STATUS_SCHEDULEDSTATUS_PENDINGr   createuuiduuid4rH   rI   
enqueue_atenqueue)clsfuncinstancer    r   schedule_atr'   	immediaterP   r   r   rr   rs   r.   r9   s                  rD   r   zJob.enqueue   s}     	n9 	nQkllmmm 	+$,::8X]:^^K II&**K)+,VK,=,=RVWW#M226Af!22GWGfk  #!:<< ! 	
 	
  		KD;CJS;;F;;;;  	KE[$Zs3:CZZSYZZZZ EM$Js3:CJJ6JJJ
rC   )Nr   NNNF)5r:   r;   r<   __doc__r   
ForeignKeyCASCADEr   PositiveBigIntegerFieldr   r   object	CharFieldr@   r    DateTimeFieldr$   r&   PositiveIntegerFieldr   r'   r+   r,   r   AUTH_USER_MODELSET_NULLr   r   r   r.   	JSONFieldr2   	TextFieldr3   	UUIDFieldrI   r   
as_managerr^   rE   rL   rU   rY   r]   propertyrh   rl   ry   STATUS_COMPLETEDr   classmethodr   __classcell__)ra   s   @rD   r   r      s         $&#%.  K /.  I    F
 6QvYY  D #f"Qy\\  G %$Q{^^  I
 +v*Qz]]a  
 !677  H #f"Qy\\  G
 %$Q{^^  I
 6#/  D VQx[[  /	  F 6QvYY  D
 FQwZZ  E
 VQx[[  F
 , +--G( ( ( ( ( ( ( (     3 3 38 8 8     @ @ X@        0@    , 1 1 1 [1 1 1 1 1rC   r   )%r   rn   django.confr   "django.contrib.contenttypes.fieldsr   django.core.exceptionsr   django.core.validatorsr   	django.dbr   django.urlsr   django.utilsr	   django.utils.translationr
   r@   core.choicesr   core.modelsr   core.signalsr   r   netbox.configr   netbox.constantsr   utilities.querysetsr   utilities.rqworkerr   __all__Modelr   rB   rC   rD   <module>r      su                    @ @ @ @ @ @ 2 2 2 2 2 2 4 4 4 4 4 4             ! ! ! ! ! ! 1 1 1 1 1 1 ) ) ) ) ) ) " " " " " " + + + + + + + + $ $ $ $ $ $ - - - - - - 2 2 2 2 2 2 2 2 2 2 2 2
a a a a a&, a a a a arC   