import logging import datetime import pytz from scheduler.asyncio import Scheduler from settings import TIMEZONE from orders import order_issue, order_check from db import Database from util import order_time logger = logging.getLogger(__name__) SATURDAY = 5 SUNDAY = 6 GRACE_PERIOD = datetime.timedelta(seconds=10) class OrderScheduler(): def __init__(self, loop): self.tz = pytz.timezone(TIMEZONE) self.scheduler = Scheduler(loop=loop, tzinfo=self.tz) # Regularly scheduled orders 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 ) logger.info(self.scheduler) async def scheduled_order(self): # Skip weekends day_of_week = datetime.datetime.now(tz=self.tz).weekday() if (day_of_week in [SATURDAY, SUNDAY]): logger.info('Today is a weekend') return # Skip stored dates d = Database() today = datetime.datetime.now(tz=self.tz).strftime("%Y-%m-%d") logger.info('Today %s' % today) if (d.skip_day_contains(today)): logger.info('Today is a skip day') return due_at = await order_issue() if due_at is not None: # Schedule check self.scheduler.once( due_at + GRACE_PERIOD, self.scheduled_check ) logger.info(self.scheduler) async def scheduled_check(self): await order_check()