2025-11-14 04:03:20 +00:00
|
|
|
import logging
|
|
|
|
|
import datetime
|
|
|
|
|
import pytz
|
|
|
|
|
|
|
|
|
|
from scheduler.asyncio import Scheduler
|
|
|
|
|
|
2025-11-14 04:03:20 +00:00
|
|
|
from settings import TIMEZONE
|
2025-11-14 04:03:20 +00:00
|
|
|
from orders import order_issue, order_check
|
2025-11-14 04:03:21 +00:00
|
|
|
from db.queries import order_status_outstanding, skip_day_contains
|
2025-11-14 04:03:20 +00:00
|
|
|
from util import order_time
|
2025-11-14 04:03:20 +00:00
|
|
|
|
|
|
|
|
logger = logging.getLogger(__name__)
|
|
|
|
|
|
|
|
|
|
SATURDAY = 5
|
|
|
|
|
SUNDAY = 6
|
|
|
|
|
|
2025-11-14 04:03:20 +00:00
|
|
|
GRACE_PERIOD = datetime.timedelta(seconds=10)
|
|
|
|
|
|
2025-11-14 04:03:20 +00:00
|
|
|
class OrderScheduler():
|
|
|
|
|
def __init__(self, loop):
|
|
|
|
|
self.tz = pytz.timezone(TIMEZONE)
|
|
|
|
|
|
|
|
|
|
self.scheduler = Scheduler(loop=loop, tzinfo=self.tz)
|
|
|
|
|
|
2025-11-14 04:03:20 +00:00
|
|
|
# Regularly scheduled orders
|
2025-11-14 04:03:20 +00:00
|
|
|
order_time_dt = order_time()
|
|
|
|
|
self.scheduler.daily(order_time_dt, self.scheduled_order)
|
2025-11-14 04:03:20 +00:00
|
|
|
|
|
|
|
|
# Schedule any outstanding orders
|
2025-11-14 04:03:21 +00:00
|
|
|
outstanding_orders = order_status_outstanding()
|
2025-11-14 04:03:20 +00:00
|
|
|
for oo in outstanding_orders:
|
|
|
|
|
self.scheduler.once(
|
2025-11-16 23:14:04 +00:00
|
|
|
datetime.datetime.fromisoformat(oo.due_at) + GRACE_PERIOD,
|
2025-11-14 04:03:20 +00:00
|
|
|
self.scheduled_check
|
|
|
|
|
)
|
2025-11-14 04:03:20 +00:00
|
|
|
|
|
|
|
|
logger.info(self.scheduler)
|
|
|
|
|
|
|
|
|
|
async def scheduled_order(self):
|
2025-11-14 04:03:20 +00:00
|
|
|
# Skip weekends
|
2025-11-14 04:03:20 +00:00
|
|
|
day_of_week = datetime.datetime.now(tz=self.tz).weekday()
|
|
|
|
|
if (day_of_week in [SATURDAY, SUNDAY]):
|
2025-11-14 04:03:20 +00:00
|
|
|
logger.info('Today is a weekend')
|
|
|
|
|
return
|
|
|
|
|
|
|
|
|
|
# Skip stored dates
|
2025-11-14 04:03:20 +00:00
|
|
|
today = datetime.datetime.now(tz=self.tz).strftime("%Y-%m-%d")
|
2025-11-14 04:03:20 +00:00
|
|
|
logger.info('Today %s' % today)
|
2025-11-14 04:03:21 +00:00
|
|
|
if (skip_day_contains(today)):
|
2025-11-14 04:03:20 +00:00
|
|
|
logger.info('Today is a skip day')
|
2025-11-14 04:03:20 +00:00
|
|
|
return
|
|
|
|
|
|
2025-11-14 04:03:20 +00:00
|
|
|
due_at = await order_issue()
|
2025-11-14 04:03:20 +00:00
|
|
|
|
2025-11-14 04:03:20 +00:00
|
|
|
if due_at is not None:
|
|
|
|
|
# Schedule check
|
|
|
|
|
self.scheduler.once(
|
|
|
|
|
due_at + GRACE_PERIOD,
|
|
|
|
|
self.scheduled_check
|
|
|
|
|
)
|
2025-11-14 04:03:20 +00:00
|
|
|
|
|
|
|
|
logger.info(self.scheduler)
|
|
|
|
|
|
|
|
|
|
async def scheduled_check(self):
|
|
|
|
|
await order_check()
|