Source code for pyticketswitch.month
import datetime
from pyticketswitch.misc import MONTH_NUMBERS
from pyticketswitch.cost_range import CostRange
from pyticketswitch.mixins import JSONMixin
from pyticketswitch.utils import bitmask_to_numbered_list
[docs]class Month(JSONMixin, object):
"""Availability summary data for a given month
Attributes:
month (int): number of the month, jan == 1, feb == 2, dec == 12, etc.
year (int): year of the month. eg. 2014, 2015, 2016.
description (str): the human readable description of the month.
cost_range (:class:`CostRange <pyticketswitch.cost_range.CostRange>`):
pricing summary, may also include offers.
no_singles_cost_range (:class:`CostRange <pyticketswitch.cost_range.CostRange>`):
pricing summary when no leaving single seats, may also include
offers.
"""
def __init__(self, month, year, description=None, dates_bitmask=None,
weekday_bitmask=None, cost_range=None,
no_singles_cost_range=None):
self.month = month
self.year = year
self.description = description
self._dates_bitmask = dates_bitmask
self._weekday_bitmask = weekday_bitmask
self.cost_range = cost_range
self.no_singles_cost_range = no_singles_cost_range
@classmethod
def from_api_data(cls, data):
api_cost_range = data.get('cost_range', {})
api_no_singles_cost_range = api_cost_range.get(
'no_singles_cost_range', {})
cost_range = None
no_singles_cost_range = None
if api_cost_range:
cost_range = CostRange.from_api_data(api_cost_range)
if api_no_singles_cost_range:
no_singles_cost_range = CostRange.from_api_data(
api_no_singles_cost_range)
kwargs = {
'cost_range': cost_range,
'no_singles_cost_range': no_singles_cost_range,
'month': MONTH_NUMBERS.get(data.get('month')),
'year': data.get('year'),
'description': data.get('month_desc'),
'dates_bitmask': data.get('month_dates_bitmask'),
'weekday_bitmask': data.get('month_weekdays_bitmask'),
}
return cls(**kwargs)
[docs] def is_available(self, day):
"""Indicates if the event has availability on a given day.
the dates bitmask is a 32 bit int where the right most bit is the first
day of the month. To find if we have availability on a specfic day,
we bit shift the mask by the zero indexed day and AND it by 1. If the
result is a 1 then this combo of ticket type and price band is
available on that day, otherwise it is not.
Args:
day (int): the day of the month.
Returns:
bool: :obj:`True` there is availability on the given day. Otherwise
:obj:`False`.
"""
return bool(self._dates_bitmask >> (day - 1) & 1)
[docs] def on_weekday(self, day):
"""Indicates if the event has availability on a given day of the week.
Check if the month has shows available on a given day of the week,
where 0 is monday and sunday is 6.
.. note:: the api uses sunday as day 0 where as python uses monday.
I've made a concious decision here to use the python numbers
to keep it consistent with anything written against this.
(also a sunday day 0 is silly).
FIXME: this is copied directly from the AvailabilityDetails class.
Perhaps worth breaking this out to common base or mixin class?
Args:
day (int): the day of the week. monday = 0, tuesday = 1, sunday = 6.
Returns:
bool: :obj:`True` there is availability on the given day. Otherwise
:obj:`False`.
"""
adjusted_day = day + 1 if day < 6 else 0
return bool(self._weekday_bitmask >> adjusted_day & 1)
def start_date(self):
num_list = bitmask_to_numbered_list(self._dates_bitmask)
if not num_list:
return
first_day = num_list[0]
howdy = datetime.date(year=self.year, month=self.month, day=first_day)
return howdy
def end_date(self):
num_list = bitmask_to_numbered_list(self._dates_bitmask)
if not num_list:
return
last_day = num_list[-1]
howdy = datetime.date(year=self.year, month=self.month, day=last_day)
return howdy