Source code for pyticketswitch.status
from pyticketswitch.trolley import Trolley
from pyticketswitch.user import User
from pyticketswitch.utils import isostr_to_datetime
from pyticketswitch.country import Country
from pyticketswitch.customer import Customer
from pyticketswitch.mixins import JSONMixin
from pyticketswitch.address import Address
from pyticketswitch.card_type import CardType
from pyticketswitch.callout import Callout
[docs]class Status(JSONMixin, object):
"""Describes the current state of a transaction
Attributes:
status (str): the current status of the transaction.
reserved_at (datetime.datetime): the date and time when the transaction
was reserved.
purchased_at (datetime.datetime): the date and time when the transaction
was purchased.
trolley (:class:`Trolley <pyticketswitch.trolley.Trolley>`): the
contents of the transactions trolley.
external_sale_page (str): the page that was rendered to the customer
after the transaction was completed. This is only available if
it was passed into the API at purchase time.
languages (list): list of IETF language tags relevant to the
transaction.
remote_site (str): the remote site the transaction was reserved and
purchased under.
unreserved_orders (list): list of :class:`Orders
<pyticketswitch.order.Order`>` that failed to reserve.
prefilled_address (:class:`Address <pyticketswitch.address.Address>`):
some address information that should be used to prefill any
customer address fields. This is primarily used on B2B accounts.
needs_payment_card (bool): When :obj:`True` indicates that this
reservation will require :class:`CardDetails
<pyticketswitch.payment_methods.CardDetails>` as the payment method
at purchase time.
needs_email_address (bool): When :obj:`True` indicates that the
customer needs to provide a valid email address at purchase time.
needs_agent_reference (bool): When :obj:`True` indicates that an agent
reference should be provided at purchase time.
can_edit_address (bool): When :obj:`False` indicates that the prefilled
customer address provided by **prefilled_address** should not be
edited.
allowed_countries (list): list of :class:`Countries
<pyticketswitch.country.Country>` that are acceptable for the
customers postal address to be from.
minutes_left (float): the number of minutes left before a reservation
expires.
supports_billing_address (bool): this transaction will support supplying
a secondary billing address that is differnet to the customer
address.
accepted_cards (list): acceptable debit/credit card types when API
takes card details from the customer.
pending_callout (:class:`Callout <pyticketswitch.callout.Callout>`):
if the transaction is mid purchase then this will hold information
about how to reenter the purchase process.
"""
def __init__(self, status=None, reserved_at=None, trolley=None,
purchased_at=None, external_sale_page=None,
languages=None, remote_site=None, reserve_user=None,
prefilled_address=None, needs_payment_card=False,
needs_email_address=False, needs_agent_reference=False,
can_edit_address=False, allowed_countries=None,
minutes_left=None, supports_billing_address=False,
accepted_cards=None, pending_callout=None, customer=None,
purchase_result=None):
self.status = status
self.reserved_at = reserved_at
self.purchased_at = purchased_at
self.trolley = trolley
self.external_sale_page = external_sale_page
self.languages = languages
self.remote_site = remote_site
self.reserve_user = reserve_user
self.prefilled_address = prefilled_address
self.needs_payment_card = needs_payment_card
self.needs_email_address = needs_email_address
self.needs_agent_reference = needs_agent_reference
self.can_edit_address = can_edit_address
self.allowed_countries = allowed_countries
self.minutes_left = minutes_left
self.supports_billing_address = supports_billing_address
self.accepted_cards = accepted_cards
self.pending_callout = pending_callout
self.customer = customer
self.purchase_result = purchase_result
[docs] @classmethod
def from_api_data(cls, data):
"""Creates a new Status object from API data from ticketswitch.
Args:
data (dict): the part of the response from a ticketswitch API call
that concerns a transactions state.
Returns:
:class:`Status <pyticketswitch.status.Status>`: a new
:class:`Status <pyticketswitch.status.Status>` object
populated with the data from the api.
"""
accepted_cards = [
CardType(code=key, description=value)
for key, value in data.get('accepted_payment_cards', {}).items()
]
customer = None
customer_api_data = data.get('customer')
if customer_api_data:
customer = Customer.from_api_data(customer_api_data)
kwargs = {
'status': data.get('transaction_status'),
'trolley': Trolley.from_api_data(data),
'remote_site': data.get('remote_site'),
'can_edit_address': data.get('can_edit_address'),
'needs_agent_reference': data.get('needs_agent_reference'),
'needs_email_address': data.get('needs_email_address'),
'needs_payment_card': data.get('needs_payment_card'),
'minutes_left': data.get('minutes_left_on_reserve'),
'supports_billing_address': data.get('supports_billing_address'),
'accepted_cards': accepted_cards,
'customer': customer,
}
reserved_raw = data.get('reserve_iso8601_date_and_time')
if reserved_raw:
kwargs.update(reserved_at=isostr_to_datetime(reserved_raw))
purchased_raw = data.get('purchase_iso8601_date_and_time')
if purchased_raw:
kwargs.update(purchased_at=isostr_to_datetime(purchased_raw))
external_sale_page_raw = data.get('external_sale_page_raw')
if external_sale_page_raw:
raise NotImplementedError("don't know what this looks like yet")
reserve_user_data = data.get('reserve_user')
if reserve_user_data:
reserve_user = User.from_api_data(reserve_user_data)
kwargs.update(reserve_user=reserve_user)
languages_raw = data.get('language_list')
if languages_raw:
kwargs.update(languages=languages_raw)
allowed_countries = data.get('allowed_countries')
if allowed_countries is not None:
countries = [
Country(key, description=description)
for key, description in allowed_countries.items()
]
countries.sort(key=lambda x: x.code)
kwargs.update(allowed_countries=countries)
address = data.get('prefilled_address')
if address:
kwargs.update(prefilled_address=Address.from_api_data(address))
pending_callout = data.get('pending_callout')
if pending_callout:
kwargs.update(pending_callout=Callout.from_api_data(pending_callout))
return cls(**kwargs)