gear-orders/scheduling.py

67 lines
1.6 KiB
Python
Raw Normal View History

2025-11-14 04:03:20 +00:00
import logging
import datetime
import pytz
from scheduler.asyncio import Scheduler
from settings import TIMEZONE
2025-11-14 04:03:20 +00:00
from orders import order_issue, order_check
2025-11-14 04:03:20 +00:00
from db import Database
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
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)
# 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)
# Schedule any outstanding orders
db = Database()
outstanding_orders = db.order_status_outstanding()
for oo in outstanding_orders:
self.scheduler.once(
datetime.datetime.fromisoformat(oo['due_at']) + GRACE_PERIOD,
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
d = Database()
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)
if (d.skip_day_contains(today)):
logger.info('Today is a skip day')
2025-11-14 04:03:20 +00:00
return
due_at = await order_issue()
2025-11-14 04:03:20 +00:00
# Schedule check
self.scheduler.once(
due_at + GRACE_PERIOD,
2025-11-14 04:03:20 +00:00
self.scheduled_check
)
logger.info(self.scheduler)
async def scheduled_check(self):
await order_check()