Skip to content

Commit abaf83a

Browse files
committed
simplify using DATE_MAX as None/null by using a models.DateTimeField subclass
1 parent 6c67bf2 commit abaf83a

File tree

4 files changed

+38
-17
lines changed

4 files changed

+38
-17
lines changed

django_tasks/backends/database/apps.py

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,3 @@ class TasksAppConfig(AppConfig):
55
name = "django_tasks.backends.database"
66
label = "django_tasks_database"
77
verbose_name = "Tasks Database Backend"
8-
9-
def ready(self) -> None:
10-
from . import signal_handlers # noqa
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
# Generated by Django 5.1.4 on 2025-05-07 19:10
2+
3+
import django_tasks.backends.database.models
4+
from django.db import migrations
5+
6+
7+
class Migration(migrations.Migration):
8+
9+
dependencies = [
10+
('django_tasks_database', '0016_alter_dbtaskresult_options_and_more'),
11+
]
12+
13+
operations = [
14+
migrations.AlterField(
15+
model_name='dbtaskresult',
16+
name='run_after',
17+
field=django_tasks.backends.database.models.NullIsMaxDateTimeField(verbose_name='run after'),
18+
),
19+
]

django_tasks/backends/database/models.py

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,23 @@ def __class_getitem__(cls, _):
5050
DATE_MAX = datetime.datetime(9999, 1, 1, tzinfo=datetime.timezone.utc)
5151

5252

53+
class NullIsMaxDateTimeField(models.DateTimeField):
54+
"""
55+
MySQL can only use indexes on simple queries, so instead of using null,
56+
and nulls_last, or models.Case, set null/None as MAX_DATE, and vice-versa
57+
"""
58+
def get_prep_value(self, value):
59+
value = super().get_prep_value(value)
60+
if value is None:
61+
value = DATE_MAX
62+
return value
63+
64+
def from_db_value(self, value, expression, connection):
65+
if value == DATE_MAX:
66+
return None
67+
return value
68+
69+
5370
class DBTaskResultQuerySet(models.QuerySet):
5471
def ready(self) -> "DBTaskResultQuerySet":
5572
"""
@@ -104,7 +121,7 @@ class DBTaskResult(GenericBase[P, T], models.Model):
104121
)
105122
backend_name = models.CharField(_("backend name"), max_length=32)
106123

107-
run_after = models.DateTimeField(_("run after"))
124+
run_after = NullIsMaxDateTimeField(_("run after"))
108125

109126
return_value = models.JSONField(_("return value"), default=None, null=True)
110127

@@ -155,7 +172,7 @@ def task(self) -> Task[P, T]:
155172
return task.using(
156173
priority=self.priority,
157174
queue_name=self.queue_name,
158-
run_after=None if self.run_after == DATE_MAX else self.run_after,
175+
run_after=self.run_after,
159176
backend=self.backend_name,
160177
)
161178

django_tasks/backends/database/signal_handlers.py

Lines changed: 0 additions & 12 deletions
This file was deleted.

0 commit comments

Comments
 (0)