import logging import datetime import pytz from scheduler.asyncio import Scheduler from settings import TIMEZONE from orders import order_issue, order_check from db.queries import order_status_outstanding, orders_pool_by_id, orders_pool_scheduled, skip_day_contains from util import order_time logger = logging.getLogger(__name__) WEEKDAYS = [0, 1, 2, 3, 4] WEEKENDS = [5, 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) self.scheduled_pools = {} for orders_pool in orders_pool_scheduled(): self.scheduled_pools[orders_pool.id] = self.scheduler.daily( order_time(orders_pool.time), self.scheduled_order, args=(orders_pool.id,) ) self.outstanding_orders = {} # TODO: Schedule outstanding order checks # TODO: Schedule keeping schedule up to date logger.info(self.scheduler) async def scheduled_order(self, orders_pool_id): orders_pool = orders_pool_by_id(orders_pool_id) # Skip weekends or weekdays day_of_week = datetime.datetime.now(tz=self.tz).weekday() if ( (not orders_pool.weekends and day_of_week in WEEKENDS) or (not orders_pool.weekdays and day_of_week in WEEKDAYS) ): logger.info(f'{orders_pool.name}[{orders_pool.user.telegram_username}] Not scheduled for today') return # Skip stored dates # TODO: Store these per user today = datetime.datetime.now(tz=self.tz).strftime("%Y-%m-%d") logger.info('Today %s' % today) if (skip_day_contains(today)): logger.info('Today is a skip day') return logger.info(f'Issuing order for {orders_pool.name}[{orders_pool.user.telegram_username}]') order_status = await order_issue(orders_pool) if order_status is not None: # Schedule check self.outstanding_orders[order_status.id] = self.scheduler.once( order_status.due_at + GRACE_PERIOD, self.scheduled_check, args=(order_status.id,) ) async def scheduled_check(self, outstanding_order_id): await order_check(outstanding_order_id)