1
1
"""Beat Scheduler Implementation."""
2
+ from __future__ import annotations
3
+
2
4
import datetime
3
5
import logging
4
6
import math
15
17
from celery .utils .time import maybe_make_aware
16
18
from django .conf import settings
17
19
from django .core .exceptions import ObjectDoesNotExist
18
- from django .db import close_old_connections , transaction
20
+ from django .db import close_old_connections , connection , transaction
19
21
from django .db .models import Case , F , IntegerField , Q , When
20
22
from django .db .models .functions import Cast
21
23
from django .db .utils import DatabaseError , InterfaceError
@@ -340,7 +342,7 @@ def _get_crontab_exclude_query(self):
340
342
+ 24
341
343
) % 24
342
344
)
343
- for timezone_name in self ._get_unique_timezone_names ()
345
+ for timezone_name in self ._get_unique_timezones ()
344
346
],
345
347
# Default case - use hour as is
346
348
default = F ('hour_int' )
@@ -359,11 +361,25 @@ def _get_crontab_exclude_query(self):
359
361
360
362
return exclude_query
361
363
362
- def _get_unique_timezone_names (self ):
363
- """Get a list of all unique timezone names used in CrontabSchedule"""
364
- return CrontabSchedule .objects .values_list (
365
- 'timezone' , flat = True
366
- ).distinct ()
364
+ def _get_unique_timezones (self ) -> set [ZoneInfo ]:
365
+ """Get a set of all unique timezones used in CrontabSchedule"""
366
+ # sqlite does not support distinct on a column
367
+ if connection .vendor == 'sqlite' :
368
+ return set (
369
+ CrontabSchedule .objects .values_list (
370
+ 'timezone' , flat = True
371
+ )
372
+ )
373
+
374
+ return set (
375
+ CrontabSchedule .objects .order_by (
376
+ 'timezone'
377
+ ).distinct (
378
+ 'timezone'
379
+ ).values_list (
380
+ 'timezone' , flat = True
381
+ )
382
+ )
367
383
368
384
def _get_timezone_offset (self , timezone_name ):
369
385
"""
0 commit comments