Source code for pyticketswitch.trolley
from pyticketswitch.bundle import Bundle
from pyticketswitch.order import Order
from pyticketswitch.mixins import JSONMixin
from pyticketswitch.purchase_result import PurchaseResult
[docs]class Trolley(JSONMixin, object):
"""Describes a collection of products that are being purchased.
Attributes:
token (str): a token that represents the current state of the trolley.
transaction_uuid (str): unique identifier for this trolley. Only
present after reservation.
transaction_id (str): unique identifier for this trolley. Only present
after purchase. This supposed to be an identifer that is easily
readable/recognisable by a human being.
bundles (list): list of :class:`Bundles <pyticketswitch.bundle.Bundle>`
objects that break down the items to be purchased by their source
systems.
discarded_orders (list): list of
:class:`Orders <pyticketswitch.order.Order>` objects that were in
the trolley in the past but have been removed.
minutes_left (float): the number of minutes left before a reservation
expires.
order_count (int): the number of orders in the trolley.
purchase_result (:class:`PurchaseResult <pyticketswitch.callout.Callout>`):
the result of the purchase attempt when available.
input_contained_unavailable_order (bool): indicates that the call used
to create or modify this trolley object included at least one order
that was not available.
"""
def __init__(self, token=None, transaction_uuid=None, transaction_id=None,
bundles=None, discarded_orders=None, minutes_left=None,
order_count=None, purchase_result=None,
input_contained_unavailable_order=False):
self.token = token
self.transaction_uuid = transaction_uuid
self.transaction_id = transaction_id
self.bundles = bundles
self.discarded_orders = discarded_orders
self.minutes_left = minutes_left
self.order_count = order_count
self.purchase_result = purchase_result
self.input_contained_unavailable_order = input_contained_unavailable_order
[docs] @classmethod
def from_api_data(cls, data):
"""Creates a new Trolley object from API data from ticketswitch.
Args:
data (dict): the part of the response from a ticketswitch API call
that concerns a trolley.
Returns:
:class:`Trolley <pyticketswitch.trolley.Trolley>`: a new
:class:`Trolley <pyticketswitch.trolley.Trolley>` object
populated with the data from the api.
"""
raw_contents = data.get('trolley_contents', {})
if not raw_contents:
raw_contents = data.get('reserved_trolley', {})
if not raw_contents:
raw_contents = data.get('trolley_token_contents', {})
raw_bundles = raw_contents.get('bundle', [])
bundles = [
Bundle.from_api_data(bundle)
for bundle in raw_bundles
]
raw_discarded_orders = data.get('discarded_orders', [])
discarded_orders = [
Order.from_api_data(order)
for order in raw_discarded_orders
]
kwargs = {
'token': data.get('trolley_token'),
'bundles': bundles,
'discarded_orders': discarded_orders,
'transaction_uuid': raw_contents.get('transaction_uuid'),
'transaction_id': raw_contents.get('transaction_id'),
'order_count': data.get('trolley_order_count'),
'input_contained_unavailable_order': data.get(
'input_contained_unavailable_order', False),
}
minutes = data.get('minutes_left_on_reserve')
if minutes is not None:
kwargs.update(minutes_left=float(minutes))
purchase_result = raw_contents.get('purchase_result')
if purchase_result:
kwargs.update(
purchase_result=PurchaseResult.from_api_data(purchase_result))
return cls(**kwargs)
[docs] def get_events(self):
"""Get the events in the trolley.
Returns:
list: list of :class:`Event <pyticketswitch.event.Event>` objects.
"""
if not self.bundles:
return []
return [
event
for bundle in self.bundles
for event in bundle.get_events()
if event and event.id
]
[docs] def get_event_ids(self):
"""Get the event ids of the events in the trolley.
Returns:
set: set of events IDs (str).
"""
return {event.id for event in self.get_events()}
[docs] def get_bundle(self, source_code):
"""Find a bundle with a specific source code
Args:
source_code (str): the source code for the target bundle.
Returns:
:class:`Bundle <pyticketswitch.bundle.Bundle>`: the bundle with the
requested source code.
When no bundle with that source code is present returns :obj:`None`.
"""
if not self.bundles:
return None
for bundle in self.bundles:
if bundle.source_code == source_code:
return bundle
return None
[docs] def get_item(self, item_number):
"""Find an order with the given item number
Args:
item_number (int): the item number of the target order
Returns:
:class:`Order <pyticketswitch.order.order>`: the order with the
specified
"""
if not self.bundles:
return None
for order in self.get_orders():
if order.item == item_number:
return order
return None
[docs] def get_orders(self):
"""Get all orders in all bundles in a trolley
Returns:
list: orders from all bundles in the the trolley
"""
if not self.bundles:
return []
return [
order
for bundle in self.bundles
if bundle.orders
for order in bundle.orders
]
def __repr__(self):
if self.transaction_id:
return u'<Trolley id:{}>'.format(self.transaction_id)
if self.transaction_uuid:
return u'<Trolley uuid:{}>'.format(self.transaction_uuid)
if self.token:
return u'<Trolley token:{}>'.format(self.token)
return super(Trolley, self).__repr__()