33import datetime
44import logging
55import traceback
6- import uuid
7- from typing import TYPE_CHECKING , Self
6+ from typing import TYPE_CHECKING , Any , Self
7+ from uuid import UUID , uuid4
88
99from opentelemetry import trace
1010from opentelemetry .semconv ._incubating .attributes .code_attributes import (
2323from opentelemetry .trace import Link , SpanContext , SpanKind
2424
2525from plain import models
26- from plain .models import transaction
26+ from plain .models import transaction , types
2727from plain .models .expressions import F
2828from plain .runtime import settings
2929from plain .utils import timezone
@@ -44,25 +44,31 @@ class JobRequest(models.Model):
4444 Keep all pending job requests in a single table.
4545 """
4646
47- created_at = models .DateTimeField (auto_now_add = True )
48- uuid = models .UUIDField (default = uuid . uuid4 )
47+ created_at : datetime . datetime = types .DateTimeField (auto_now_add = True )
48+ uuid : UUID = types .UUIDField (default = uuid4 )
4949
50- job_class = models .CharField (max_length = 255 )
51- parameters = models .JSONField (required = False , allow_null = True )
52- priority = models .SmallIntegerField (default = 0 )
53- source = models .TextField (required = False )
54- queue = models .CharField (default = "default" , max_length = 255 )
50+ job_class : str = types .CharField (max_length = 255 )
51+ parameters : dict [ str , Any ] | None = types .JSONField (required = False , allow_null = True )
52+ priority : int = types .SmallIntegerField (default = 0 )
53+ source : str = types .TextField (required = False )
54+ queue : str = types .CharField (default = "default" , max_length = 255 )
5555
56- retries = models .SmallIntegerField (default = 0 )
57- retry_attempt = models .SmallIntegerField (default = 0 )
56+ retries : int = types .SmallIntegerField (default = 0 )
57+ retry_attempt : int = types .SmallIntegerField (default = 0 )
5858
59- concurrency_key = models .CharField (max_length = 255 , required = False )
59+ concurrency_key : str = types .CharField (max_length = 255 , required = False )
6060
61- start_at = models .DateTimeField (required = False , allow_null = True )
61+ start_at : datetime .datetime | None = types .DateTimeField (
62+ required = False , allow_null = True
63+ )
6264
6365 # OpenTelemetry trace context
64- trace_id = models .CharField (max_length = 34 , required = False , allow_null = True )
65- span_id = models .CharField (max_length = 18 , required = False , allow_null = True )
66+ trace_id : str | None = types .CharField (
67+ max_length = 34 , required = False , allow_null = True
68+ )
69+ span_id : str | None = types .CharField (
70+ max_length = 18 , required = False , allow_null = True
71+ )
6672
6773 # expires_at = models.DateTimeField(required=False, allow_null=True)
6874
@@ -149,24 +155,30 @@ class JobProcess(models.Model):
149155 All active jobs are stored in this table.
150156 """
151157
152- uuid = models .UUIDField (default = uuid .uuid4 )
153- created_at = models .DateTimeField (auto_now_add = True )
154- started_at = models .DateTimeField (required = False , allow_null = True )
158+ uuid : UUID = types .UUIDField (default = uuid4 )
159+ created_at : datetime .datetime = types .DateTimeField (auto_now_add = True )
160+ started_at : datetime .datetime | None = types .DateTimeField (
161+ required = False , allow_null = True
162+ )
155163
156164 # From the JobRequest
157- job_request_uuid = models .UUIDField ()
158- job_class = models .CharField (max_length = 255 )
159- parameters = models .JSONField (required = False , allow_null = True )
160- priority = models .SmallIntegerField (default = 0 )
161- source = models .TextField (required = False )
162- queue = models .CharField (default = "default" , max_length = 255 )
163- retries = models .SmallIntegerField (default = 0 )
164- retry_attempt = models .SmallIntegerField (default = 0 )
165- concurrency_key = models .CharField (max_length = 255 , required = False )
165+ job_request_uuid : UUID = types .UUIDField ()
166+ job_class : str = types .CharField (max_length = 255 )
167+ parameters : dict [ str , Any ] | None = types .JSONField (required = False , allow_null = True )
168+ priority : int = types .SmallIntegerField (default = 0 )
169+ source : str = types .TextField (required = False )
170+ queue : str = types .CharField (default = "default" , max_length = 255 )
171+ retries : int = types .SmallIntegerField (default = 0 )
172+ retry_attempt : int = types .SmallIntegerField (default = 0 )
173+ concurrency_key : str = types .CharField (max_length = 255 , required = False )
166174
167175 # OpenTelemetry trace context
168- trace_id = models .CharField (max_length = 34 , required = False , allow_null = True )
169- span_id = models .CharField (max_length = 18 , required = False , allow_null = True )
176+ trace_id : str | None = types .CharField (
177+ max_length = 34 , required = False , allow_null = True
178+ )
179+ span_id : str | None = types .CharField (
180+ max_length = 18 , required = False , allow_null = True
181+ )
170182
171183 query = JobQuerySet ()
172184
@@ -229,7 +241,7 @@ def run(self) -> JobResult:
229241 self .save (update_fields = ["started_at" ])
230242
231243 try :
232- job = jobs_registry .load_job (self .job_class , self .parameters )
244+ job = jobs_registry .load_job (self .job_class , self .parameters or {} )
233245 job .job_process = self
234246
235247 try :
@@ -446,36 +458,46 @@ class JobResult(models.Model):
446458 All in-process and completed jobs are stored in this table.
447459 """
448460
449- uuid = models .UUIDField (default = uuid . uuid4 )
450- created_at = models .DateTimeField (auto_now_add = True )
461+ uuid : UUID = types .UUIDField (default = uuid4 )
462+ created_at : datetime . datetime = types .DateTimeField (auto_now_add = True )
451463
452464 # From the Job
453- job_process_uuid = models .UUIDField ()
454- started_at = models .DateTimeField (required = False , allow_null = True )
455- ended_at = models .DateTimeField (required = False , allow_null = True )
456- error = models .TextField (required = False )
457- status = models .CharField (
465+ job_process_uuid : UUID = types .UUIDField ()
466+ started_at : datetime .datetime | None = types .DateTimeField (
467+ required = False , allow_null = True
468+ )
469+ ended_at : datetime .datetime | None = types .DateTimeField (
470+ required = False , allow_null = True
471+ )
472+ error : str = types .TextField (required = False )
473+ status : str = types .CharField (
458474 max_length = 20 ,
459475 choices = JobResultStatuses .choices ,
460476 )
461477
462478 # From the JobRequest
463- job_request_uuid = models .UUIDField ()
464- job_class = models .CharField (max_length = 255 )
465- parameters = models .JSONField (required = False , allow_null = True )
466- priority = models .SmallIntegerField (default = 0 )
467- source = models .TextField (required = False )
468- queue = models .CharField (default = "default" , max_length = 255 )
469- retries = models .SmallIntegerField (default = 0 )
470- retry_attempt = models .SmallIntegerField (default = 0 )
471- concurrency_key = models .CharField (max_length = 255 , required = False )
479+ job_request_uuid : UUID = types .UUIDField ()
480+ job_class : str = types .CharField (max_length = 255 )
481+ parameters : dict [ str , Any ] | None = types .JSONField (required = False , allow_null = True )
482+ priority : int = types .SmallIntegerField (default = 0 )
483+ source : str = types .TextField (required = False )
484+ queue : str = types .CharField (default = "default" , max_length = 255 )
485+ retries : int = types .SmallIntegerField (default = 0 )
486+ retry_attempt : int = types .SmallIntegerField (default = 0 )
487+ concurrency_key : str = types .CharField (max_length = 255 , required = False )
472488
473489 # Retries
474- retry_job_request_uuid = models .UUIDField (required = False , allow_null = True )
490+ retry_job_request_uuid : UUID | None = types .UUIDField (
491+ required = False , allow_null = True
492+ )
475493
476494 # OpenTelemetry trace context
477- trace_id = models .CharField (max_length = 34 , required = False , allow_null = True )
478- span_id = models .CharField (max_length = 18 , required = False , allow_null = True )
495+ trace_id : str | None = types .CharField (
496+ max_length = 34 , required = False , allow_null = True
497+ )
498+ span_id : str | None = types .CharField (
499+ max_length = 18 , required = False , allow_null = True
500+ )
479501
480502 query = JobResultQuerySet ()
481503
@@ -502,7 +524,7 @@ class JobResult(models.Model):
502524
503525 def retry_job (self , delay : int | None = None ) -> JobRequest | None :
504526 retry_attempt = self .retry_attempt + 1
505- job = jobs_registry .load_job (self .job_class , self .parameters )
527+ job = jobs_registry .load_job (self .job_class , self .parameters or {} )
506528
507529 if delay is None :
508530 retry_delay = job .calculate_retry_delay (retry_attempt )
0 commit comments