Skip to content

Commit b2c2263

Browse files
committed
wip
1 parent 8444a51 commit b2c2263

File tree

5 files changed

+36
-23
lines changed

5 files changed

+36
-23
lines changed

scheduler/management/commands/export.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ def handle(self, *args, **options):
5454
if options.get("format") == "json":
5555
import json
5656

57-
click.echo(json.dumps(res, indent=2), file=file)
57+
click.echo(json.dumps(res, indent=2, default=str), file=file)
5858
return
5959

6060
if options.get("format") == "yaml":

scheduler/management/commands/import.py

Lines changed: 22 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
from django.core.management.base import BaseCommand
99
from django.utils import timezone
1010

11-
from scheduler.models import TaskArg, TaskKwarg
11+
from scheduler.models import TaskArg, TaskKwarg, Task
1212
from 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"))

scheduler/rq_classes.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -61,9 +61,9 @@ def __eq__(self, other) -> bool:
6161
def is_scheduled_task(self) -> bool:
6262
return self.meta.get("scheduled_task_id", None) is not None
6363

64-
def is_execution_of(self, task: "ScheduledTask") -> bool: # noqa: F821
64+
def is_execution_of(self, task: "Task") -> bool: # noqa: F821
6565
return (
66-
self.meta.get("task_type", None) == task.TASK_TYPE and self.meta.get("scheduled_task_id", None) == task.id
66+
self.meta.get("task_type", None) == task.task_type and self.meta.get("scheduled_task_id", None) == task.id
6767
)
6868

6969
def stop_execution(self, connection: ConnectionType):

scheduler/tools.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import importlib
22
import os
3-
from typing import List, Any, Callable
3+
from typing import List, Any, Callable, Optional
44

55
import croniter
66
from django.apps import apps
@@ -21,8 +21,10 @@ def callable_func(callable_str: str) -> Callable:
2121
return func
2222

2323

24-
def get_next_cron_time(cron_string) -> timezone.datetime:
24+
def get_next_cron_time(cron_string: Optional[str]) -> Optional[timezone.datetime]:
2525
"""Calculate the next scheduled time by creating a crontab object with a cron string"""
26+
if cron_string is None:
27+
return None
2628
now = timezone.now()
2729
itr = croniter.croniter(cron_string, now)
2830
next_itr = itr.get_next(timezone.datetime)

testproject/testproject/settings.py

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -44,9 +44,9 @@
4444
"default": {
4545
"BACKEND": "django.core.cache.backends.redis.RedisCache",
4646
"LOCATION": [
47-
"redis://127.0.0.1:6379", # leader
47+
"redis://127.0.0.1:6379",
4848
],
49-
"OPTIONS": {"connection_class": FakeConnection},
49+
"BROKER": "fakeredis",
5050
}
5151
}
5252
TEMPLATES = [
@@ -115,19 +115,19 @@
115115
STATIC_URL = "/static/"
116116
SCHEDULER_QUEUES = {
117117
"default": {
118-
"URL": f"redis://localhost:${BROKER_PORT}/0",
118+
"URL": f"redis://localhost:{BROKER_PORT}/0",
119119
},
120120
"low": {
121-
"URL": f"redis://localhost:${BROKER_PORT}/0",
121+
"URL": f"redis://localhost:{BROKER_PORT}/0",
122122
},
123123
"high": {
124-
"URL": f"redis://localhost:${BROKER_PORT}/1",
124+
"URL": f"redis://localhost:{BROKER_PORT}/1",
125125
},
126126
"medium": {
127-
"URL": f"redis://localhost:${BROKER_PORT}/1",
127+
"URL": f"redis://localhost:{BROKER_PORT}/1",
128128
},
129129
"another": {
130-
"URL": f"redis://localhost:${BROKER_PORT}/1",
130+
"URL": f"redis://localhost:{BROKER_PORT}/1",
131131
},
132132
}
133133
DEFAULT_AUTO_FIELD = "django.db.models.BigAutoField"

0 commit comments

Comments
 (0)