gear-orders/scheduling.py

73 lines
2.1 KiB
Python

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 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
today = datetime.datetime.now(tz=self.tz).strftime("%Y-%m-%d")
logger.info('Today %s' % today)
if (skip_day_contains(orders_pool.user, 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)