Source code for pyticketswitch.performance
from pyticketswitch import utils
from pyticketswitch.cost_range import CostRange
from pyticketswitch.availability import AvailabilityDetails
from pyticketswitch.mixins import JSONMixin, PaginationMixin
from pyticketswitch.currency import CurrencyMeta
[docs]class Performance(JSONMixin, object):
"""Describes and occurance of an :class:`Event <pyticketswitch.event.Event>`.
The performance will have either a **date_time** or a **name**.
.. note:: The **date_time** field is a timezone aware datetime and it is
localised for the venue and not the user.
Attributes:
id (str): identifier for the performance.
event_id (str): identifier for the event.
date_time (:obj:`datetime.datetime`): the localised date and time for
the performance.
date_description (str): a human readable description of the date of the
performance.
time_description (str): a human readable description of the time of the
performance.
has_pool_seats (bool): the performance has pool seats available.
is_limited (bool): the performance has limited availability.
cached_max_seats (int): This should not be used. Earlier versions of the documentation
implied that it held a meaningful value for the availability, but this is not true,
and the attribute was not always present. If you are using it then you should stop,
and switch to cost range data instead if you still want cached availability data.
For the time being the value will be one million instead of being absent entirely if the data is not available.
cached_max_seats_is_real (bool): A boolean indicating whether the data in the previous variable
is actually real or not. Can be used whilst migrating away from using it.
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.
is_ghost (bool): the performance is a ghost performance and is nolonger
available.
name (str): the name of the performance.
running_time (int): the number of minutes the performance is expected
to run for.
availability_details (:class:`AvailabilityDetails <pyticketswitch.availability.AvailabilityDetails>`):
summerised availability data for the performance. This data is
cached from previous availability calls and may not be accurate.
"""
def __init__(self, id_, event_id, date_time=None,
date_description=None, time_description=None, has_pool_seats=False,
is_limited=False, cached_max_seats=None, cached_max_seats_is_real=None, cost_range=None,
no_singles_cost_range=None, is_ghost=False, name=None,
running_time=None, availability_details=None):
self.id = id_
self.event_id = event_id
self.date_time = date_time
self.date_description = date_description
self.time_description = time_description
self.has_pool_seats = has_pool_seats
self.is_limited = is_limited
self.cached_max_seats = cached_max_seats
self.cached_max_seats_is_real = cached_max_seats_is_real
self.cost_range = cost_range
self.no_singles_cost_range = no_singles_cost_range
self.is_ghost = is_ghost
self.name = name
self.running_time = running_time
self.availability_details = availability_details
[docs] @classmethod
def from_api_data(cls, data):
"""Creates a new **Performance** object from API data from ticketswitch.
Args:
data (dict): the part of the response from a ticketswitch API call
that concerns a performance.
Returns:
:class:`Performance <pyticketswitch.order.Performance>`: a new
:class:`Performance <pyticketswitch.order.Performance>` object
populated with the data from the api.
"""
id_ = data.get('perf_id')
event_id = data.get('event_id')
date_time = data.get('iso8601_date_and_time')
if date_time:
date_time = utils.isostr_to_datetime(date_time)
date_desc = data.get('date_desc')
time_desc = data.get('time_desc')
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:
api_cost_range['singles'] = True
cost_range = CostRange.from_api_data(api_cost_range)
if api_no_singles_cost_range:
api_no_singles_cost_range['singles'] = False
no_singles_cost_range = CostRange.from_api_data(
api_no_singles_cost_range)
availability_details = AvailabilityDetails.from_api_data(
data.get('avail_details', {}))
kwargs = {
'id_': id_,
'event_id': event_id,
'date_time': date_time,
'date_description': date_desc,
'time_description': time_desc,
'running_time': data.get('running_time'),
'name': data.get('perf_name'),
'has_pool_seats': data.get('has_pool_seats', False),
'is_limited': data.get('is_limited', False),
'is_ghost': data.get('is_ghost', False),
'cached_max_seats': data.get('cached_max_seats'),
'cost_range': cost_range,
'no_singles_cost_range': no_singles_cost_range,
'availability_details': availability_details,
}
return cls(**kwargs)
def __repr__(self):
if self.date_time:
return u'<Performance {}: {}>'.format(self.id, self.date_time.isoformat())
return u'<Performance {}>'.format(self.id)
[docs]class PerformanceMeta(PaginationMixin, CurrencyMeta, object):
"""
PerformanceMeta contains meta information about a list of
:class:`Performances <pyticketswitch.performance.Performance>`.
Attributes:
auto_select (bool): indicates that the performance list will contain
only one performance and this performance should be automatically
selected for the customer. See :ref:`Events that don't need
performance selection
<events_that_dont_need_performance_selection>` for more
information.
has_names: (bool): indicates that the related performances have names
"""
def __init__(self, auto_select=False, has_names=False, *args, **kwargs):
self.auto_select = auto_select
self.has_names = has_names
super(PerformanceMeta, self).__init__(*args, **kwargs)
[docs] @classmethod
def from_api_data(cls, data):
"""Creates a new **PerformanceMeta** object from API data from ticketswitch.
Args:
data (dict): the part of the response from a ticketswitch API call
that concerns some performance meta data.
Returns:
:class:`PerformanceMeta <pyticketswitch.order.PerformanceMeta>`: a
new :class:`PerformanceMeta <pyticketswitch.order.PerformanceMeta>`
object populated with the data from the api.
"""
inst = super(PerformanceMeta, cls).from_api_data(data)
inst.auto_select = data.get('autoselect_this_performance', False)
inst.has_names = data.get('results', {}).get('has_perf_names', False)
return inst