8
8
from django .core .management .base import BaseCommand
9
9
from django .utils import timezone
10
10
11
- from scheduler .models import TaskArg , TaskKwarg
11
+ from scheduler .models import TaskArg , TaskKwarg , Task
12
12
from scheduler .tools import MODEL_NAMES
13
13
14
14
@@ -17,18 +17,29 @@ def job_model_str(model_str: str) -> str:
17
17
return model_str [:- 3 ] + "Task"
18
18
return model_str
19
19
20
-
21
- def create_job_from_dict (job_dict : Dict [str , Any ], update ):
22
- model = apps .get_model (app_label = "scheduler" , model_name = job_model_str (job_dict ["model" ]))
23
- existing_job = model .objects .filter (name = job_dict ["name" ]).first ()
20
+ def get_task_type (model_str : str ) -> Task .TaskType :
21
+ model_str = job_model_str (model_str )
22
+ if model_str not in MODEL_NAMES :
23
+ raise ValueError (f"Invalid model { model_str } " )
24
+ if model_str == "CronTask" :
25
+ return Task .TaskType .CRON
26
+ elif model_str == "RepeatableTask" :
27
+ return Task .TaskType .REPEATABLE
28
+ elif model_str == "ScheduledTask" :
29
+ return Task .TaskType .ONCE
30
+
31
+ def create_task_from_dict (task_dict : Dict [str , Any ], update ):
32
+ existing_job = Task .objects .filter (name = task_dict ["name" ]).first ()
33
+ task_type = get_task_type (task_dict ["model" ])
24
34
if existing_job :
25
35
if update :
26
36
click .echo (f'Found existing job "{ existing_job } , removing it to be reinserted"' )
27
37
existing_job .delete ()
28
38
else :
29
39
click .echo (f'Found existing job "{ existing_job } ", skipping' )
30
40
return
31
- kwargs = dict (job_dict )
41
+ kwargs = dict (task_dict )
42
+ kwargs ["task_type" ] = task_type
32
43
del kwargs ["model" ]
33
44
del kwargs ["callable_args" ]
34
45
del kwargs ["callable_kwargs" ]
@@ -37,21 +48,21 @@ def create_job_from_dict(job_dict: Dict[str, Any], update):
37
48
if not settings .USE_TZ and not timezone .is_naive (target ):
38
49
target = timezone .make_naive (target )
39
50
kwargs ["scheduled_time" ] = target
40
- model_fields = set (map (lambda field : field .attname , model ._meta .get_fields ()))
51
+ model_fields = set (map (lambda field : field .attname , Task ._meta .get_fields ()))
41
52
keys_to_ignore = list (filter (lambda _k : _k not in model_fields , kwargs .keys ()))
42
53
for k in keys_to_ignore :
43
54
del kwargs [k ]
44
- scheduled_job = model .objects .create (** kwargs )
55
+ scheduled_job = Task .objects .create (** kwargs )
45
56
click .echo (f"Created job { scheduled_job } " )
46
57
content_type = ContentType .objects .get_for_model (scheduled_job )
47
58
48
- for arg in job_dict ["callable_args" ]:
59
+ for arg in task_dict ["callable_args" ]:
49
60
TaskArg .objects .create (
50
61
content_type = content_type ,
51
62
object_id = scheduled_job .id ,
52
63
** arg ,
53
64
)
54
- for arg in job_dict ["callable_kwargs" ]:
65
+ for arg in task_dict ["callable_kwargs" ]:
55
66
TaskKwarg .objects .create (
56
67
content_type = content_type ,
57
68
object_id = scheduled_job .id ,
@@ -125,4 +136,4 @@ def handle(self, *args, **options):
125
136
model .objects .all ().delete ()
126
137
127
138
for job in jobs :
128
- create_job_from_dict (job , update = options .get ("update" ))
139
+ create_task_from_dict (job , update = options .get ("update" ))
0 commit comments