1010import csv
1111import datetime
1212import logging
13+ import uuid
1314import xml .etree .ElementTree as ET
1415from contextlib import suppress
1516from functools import cached_property
@@ -1828,11 +1829,14 @@ class PipelineRun(models.Model):
18281829 related_name = "pipelineruns" ,
18291830 on_delete = models .CASCADE ,
18301831 )
1831- run_id = models .CharField (
1832- blank = True ,
1833- null = True ,
1832+
1833+ run_id = models .UUIDField (
1834+ primary_key = True ,
1835+ default = uuid .uuid4 ,
18341836 editable = False ,
1837+ unique = True ,
18351838 )
1839+
18361840 run_start_date = models .DateTimeField (
18371841 blank = True ,
18381842 null = True ,
@@ -1880,6 +1884,7 @@ class Status(models.TextChoices):
18801884 SUCCESS = "success"
18811885 FAILURE = "failure"
18821886 STOPPED = "stopped"
1887+ QUEUED = "queued"
18831888 STALE = "stale"
18841889
18851890 @property
@@ -1902,6 +1907,9 @@ def status(self):
19021907 elif self .run_start_date :
19031908 return status .RUNNING
19041909
1910+ elif self .created_date :
1911+ return status .QUEUED
1912+
19051913 return status .UNKNOWN
19061914
19071915 @property
@@ -1982,8 +1990,10 @@ def set_run_stopped(self):
19821990 self .set_run_ended (exitcode = 99 )
19831991
19841992 def stop_run (self ):
1985- self .append_to_log ("Stop run requested" )
1993+ if self .run_succeeded :
1994+ return
19861995
1996+ self .append_to_log ("Stop run requested" )
19871997 if not VULNERABLECODE_ASYNC :
19881998 self .set_run_stopped ()
19891999 return
@@ -2084,7 +2094,9 @@ def __str__(self):
20842094 return f"{ self .pipeline_id } "
20852095
20862096 def save (self , * args , ** kwargs ):
2087- if self .pk and (existing := PipelineSchedule .objects .get (pk = self .pk )):
2097+ if not self .pk :
2098+ self .schedule_work_id = self .create_new_job (execute_now = True )
2099+ elif self .pk and (existing := PipelineSchedule .objects .get (pk = self .pk )):
20882100 if existing .is_active != self .is_active or existing .run_interval != self .run_interval :
20892101 self .schedule_work_id = self .create_new_job ()
20902102 self .full_clean ()
@@ -2116,7 +2128,7 @@ def earliest_run(self):
21162128
21172129 @property
21182130 def latest_run_date (self ):
2119- return self .latest_run .created_date if self .latest_run else None
2131+ return self .latest_run .run_start_date if self .latest_run else None
21202132
21212133 @property
21222134 def next_run_date (self ):
@@ -2139,7 +2151,7 @@ def status(self):
21392151 if self .latest_run :
21402152 return self .latest_run .status
21412153
2142- def create_new_job (self ):
2154+ def create_new_job (self , execute_now = False ):
21432155 """
21442156 Create a new scheduled job. If a previous scheduled job
21452157 exists remove the existing job from the scheduler.
@@ -2151,4 +2163,4 @@ def create_new_job(self):
21512163 if self .schedule_work_id :
21522164 schedules .clear_job (self .schedule_work_id )
21532165
2154- return schedules .schedule_execution (self ) if self .is_active else None
2166+ return schedules .schedule_execution (self , execute_now ) if self .is_active else None
0 commit comments