88from django .core .management .base import BaseCommand
99from django .utils import timezone
1010
11- from scheduler .models import TaskArg , TaskKwarg
11+ from scheduler .models import TaskArg , TaskKwarg , Task
1212from scheduler .tools import MODEL_NAMES
1313
1414
@@ -17,18 +17,29 @@ def job_model_str(model_str: str) -> str:
1717 return model_str [:- 3 ] + "Task"
1818 return model_str
1919
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" ])
2434 if existing_job :
2535 if update :
2636 click .echo (f'Found existing job "{ existing_job } , removing it to be reinserted"' )
2737 existing_job .delete ()
2838 else :
2939 click .echo (f'Found existing job "{ existing_job } ", skipping' )
3040 return
31- kwargs = dict (job_dict )
41+ kwargs = dict (task_dict )
42+ kwargs ["task_type" ] = task_type
3243 del kwargs ["model" ]
3344 del kwargs ["callable_args" ]
3445 del kwargs ["callable_kwargs" ]
@@ -37,21 +48,21 @@ def create_job_from_dict(job_dict: Dict[str, Any], update):
3748 if not settings .USE_TZ and not timezone .is_naive (target ):
3849 target = timezone .make_naive (target )
3950 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 ()))
4152 keys_to_ignore = list (filter (lambda _k : _k not in model_fields , kwargs .keys ()))
4253 for k in keys_to_ignore :
4354 del kwargs [k ]
44- scheduled_job = model .objects .create (** kwargs )
55+ scheduled_job = Task .objects .create (** kwargs )
4556 click .echo (f"Created job { scheduled_job } " )
4657 content_type = ContentType .objects .get_for_model (scheduled_job )
4758
48- for arg in job_dict ["callable_args" ]:
59+ for arg in task_dict ["callable_args" ]:
4960 TaskArg .objects .create (
5061 content_type = content_type ,
5162 object_id = scheduled_job .id ,
5263 ** arg ,
5364 )
54- for arg in job_dict ["callable_kwargs" ]:
65+ for arg in task_dict ["callable_kwargs" ]:
5566 TaskKwarg .objects .create (
5667 content_type = content_type ,
5768 object_id = scheduled_job .id ,
@@ -125,4 +136,4 @@ def handle(self, *args, **options):
125136 model .objects .all ().delete ()
126137
127138 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