Source code for pyticketswitch.cost_range

from pyticketswitch.offer import Offer
from pyticketswitch.mixins import JSONMixin
from pyticketswitch import utils


[docs]class CostRange(JSONMixin, object): """CostRange gives summarized pricing for events and performances. This information is returned from cached data collected when making actual calls to the backend system, and should not be considered accurate. Attributes: valid_quantities (list): list of valid quanities available for purchase. min_seatprice (float): the minimum cost per seat the customer might be expected to pay. max_seatprice (float): the maximum cost per seat the customer might be expected to pay. min_surcharge (float): the minimum surcharge per seat the customer might be expected to pay. max_surcharge (float): the maximum surcharge per seat the customer might be expected to pay. currency (str): currency the cost range and offer prices are in. best_value_offer (:class:`Offer <pyticketswitch.offer.Offer>`): offer with the highest percentage saving. max_saving_offer (:class:`Offer <pyticketswitch.offer.Offer>`): offer with the highest absolute saving. min_cost_offer (:class:`Offer <pyticketswitch.offer.Offer>`): offer with the lowest cost. top_price_offer (:class:`Offer <pyticketswitch.offer.Offer>`): offer with the top price. max_combined_combined_tax_component (float): max combined tax. max_combined_surcharge_tax_sub_component (float): max combined surcharge tax. min_combined_combined_tax_component (float): min combined tax. min_combined_surcharge_tax_sub_component (float): min combined surcharge tax. """ def __init__( self, valid_quantities=None, max_surcharge=None, max_seatprice=None, min_surcharge=None, min_seatprice=None, allows_singles=True, currency=None, best_value_offer=None, max_saving_offer=None, min_cost_offer=None, top_price_offer=None, max_combined_combined_tax_component=None, max_combined_surcharge_tax_sub=None, min_combined_combined_tax_component=None, min_combined_surcharge_tax_sub=None, ): self.valid_quantities = valid_quantities self.max_seatprice = max_seatprice self.max_surcharge = max_surcharge self.min_seatprice = min_seatprice self.min_surcharge = min_surcharge self.currency = currency self.best_value_offer = best_value_offer self.max_saving_offer = max_saving_offer self.min_cost_offer = min_cost_offer self.top_price_offer = top_price_offer self.max_combined_combined_tax_component = ( max_combined_combined_tax_component ) self.max_combined_surcharge_tax_sub = max_combined_surcharge_tax_sub self.min_combined_combined_tax_component = ( min_combined_combined_tax_component ) self.min_combined_surcharge_tax_sub = min_combined_surcharge_tax_sub
[docs] @classmethod def from_api_data(cls, data): """Creates a new CostRange object from API data from ticketswitch. Args: data (dict): the part of the response from a ticketswitch API call that concerns a cost range. Returns: :class:`CostRange <pyticketswitch.cost_range.CostRange>`: a new :class:`CostRange <pyticketswitch.cost_range.CostRange>` object populated with the data from the api. """ min_seatprice = utils.get_price(data, 'min_seatprice') min_surcharge = utils.get_price(data, 'min_surcharge') max_seatprice = utils.get_price(data, 'max_seatprice') max_surcharge = utils.get_price(data, 'max_surcharge') kwargs = { 'valid_quantities': data.get('valid_quantities'), 'min_surcharge': min_surcharge, 'min_seatprice': min_seatprice, 'max_surcharge': max_surcharge, 'max_seatprice': max_seatprice, 'allows_singles': data.get('singles', True), 'currency': data.get('range_currency_code'), } best_value_offer = data.get('best_value_offer') if best_value_offer: best_value_offer = Offer.from_api_data(best_value_offer) kwargs.update(best_value_offer=best_value_offer) max_saving_offer = data.get('max_saving_offer') if max_saving_offer: max_saving_offer = Offer.from_api_data(max_saving_offer) kwargs.update(max_saving_offer=max_saving_offer) min_cost_offer = data.get('min_cost_offer') if min_cost_offer: min_cost_offer = Offer.from_api_data(min_cost_offer) kwargs.update(min_cost_offer=min_cost_offer) top_price_offer = data.get('top_price_offer') if top_price_offer: top_price_offer = Offer.from_api_data(top_price_offer) kwargs.update(top_price_offer=top_price_offer) max_combined_tax_component = data.get( 'max_combined_combined_tax_component' ) if max_combined_tax_component is not None: kwargs.update( max_combined_combined_tax_component=max_combined_tax_component ) max_combined_surcharge_tax_sub = data.get( 'max_combined_surcharge_tax_sub_component' ) if max_combined_surcharge_tax_sub is not None: kwargs.update( max_combined_surcharge_tax_sub=max_combined_surcharge_tax_sub ) min_combined_tax_component = data.get( 'min_combined_combined_tax_component' ) if min_combined_tax_component is not None: kwargs.update( min_combined_combined_tax_component=min_combined_tax_component ) min_combined_surcharge_tax_sub = data.get( 'min_combined_surcharge_tax_sub_component' ) if min_combined_surcharge_tax_sub is not None: kwargs.update( min_combined_surcharge_tax_sub=min_combined_surcharge_tax_sub ) return cls(**kwargs)
def has_offer(self): return any( [ self.best_value_offer, self.max_saving_offer, self.min_cost_offer, self.top_price_offer, ] ) def get_min_combined_price(self): return self.min_surcharge + self.min_seatprice def get_max_combined_price(self): return self.max_surcharge + self.max_seatprice def has_tax(self): return any( [ self.max_combined_combined_tax_component, self.max_combined_surcharge_tax_sub, self.min_combined_combined_tax_component, self.min_combined_surcharge_tax_sub, ] )
[docs]class CostRangeDetails(JSONMixin, object): """Summarizes pricing by ticket types and price bands for an event/performance This information is returned from cached data collected when making actual calls to the backend system, and should not be considered accurate. Attributes: ticket_type_code (str): identifier for the ticket type. price_band_code (str): identifier for the price band. cost_range (:class:`CostRange <pyticketswitch.cost_range.CostRange>`): summary of pricing distribution for this ticket type/price band. cost_range_no_singles (:class:`CostRange <pyticketswitch.cost_range.CostRange>`): summary of pricing distribution for this ticket type/price band when not leaving any singles. ticket_type_description (str): description of the ticket type. price_band_description (str): description of the price band. """ def __init__( self, ticket_type_code, price_band_code, cost_range, ticket_type_description=None, price_band_description=None, cost_range_no_singles=None, **kwargs ): self.ticket_type_code = ticket_type_code self.price_band_code = price_band_code self.cost_range = cost_range self.cost_range_no_singles = cost_range_no_singles self.ticket_type_description = ticket_type_description self.price_band_description = price_band_description @classmethod def from_api_data(cls, data): details = [] for ticket_type in data.get('ticket_type', []): kwargs = { 'ticket_type_code': ticket_type.get('ticket_type_code'), 'ticket_type_description': ticket_type.get('ticket_type_desc'), } for price_band in ticket_type.get('price_band', []): kwargs.update( price_band_code=price_band.get('price_band_code'), price_band_description=price_band.get('price_band_desc'), ) cost_range = price_band.get('cost_range') if not cost_range: continue kwargs.update(cost_range=CostRange.from_api_data(cost_range)) no_singles = cost_range.get('no_singles_cost_range') if no_singles: kwargs.update( cost_range_no_singles=CostRange.from_api_data( no_singles ) ) details.append(cls(**kwargs)) return details