Source code for pyticketswitch.event

from pyticketswitch.exceptions import IntegrityError
from pyticketswitch.cost_range import CostRange
from pyticketswitch.ticket_type import TicketType
from pyticketswitch.content import Content
from import Media
from import Review
from pyticketswitch.availability import AvailabilityDetails
from pyticketswitch.field import Field
from pyticketswitch.mixins import JSONMixin, PaginationMixin
from pyticketswitch.currency import CurrencyMeta

[docs]class Event(JSONMixin, object): """Describes a product in the ticketswitch system. Attributes: id (str): the identifier for the event. status (str): status of the event. description (str): human readable name for the event. source (str): the backend system from wich the event originates. source_code (str): the internal code for the backend system. event_type (str): the type of the event. venue (str): a human readable description of the venue. classes (dict): a dictionary of class descriptions that the event belongs to keyed on class identifier. filters (list): a list of filters that the event belongs to. postcode (str): venue post code. city (str): human readable venue city. city_code (str): venue city code country (str): human readable country name. country_code (str): ISO 3166-1 country code. latitude (float): latitude of the venue. longitude (float): longitude of the venue. max_running_time (int): maximum running time of a performance in minutes. min_running_time (int): minimum running time of a performance in minutes. show_performance_time (bool): indicates that the performance time for this event is relevant and should be shown. has_performances (bool): indicates that the event has performances. is_seated (bool): indicates the event is seated. needs_departure_date (bool): indicates that ticket purchases for this event will require a departure date. needs_duration (bool): indicates that ticket purchases for this event will require a duration. needs_performance (bool): indicates that you should ask your customer what date/time they want to attend this event on. See :ref:`Events that don't need performance selection <events_that_dont_need_performance_selection>` for more information. upsell_list (list): list of event id's. cost_range (:class:`CostRange <pyticketswitch.cost_range.CostRange>`): pricing summary from cached availability. Only present when requested. no_singles_cost_range (:class:`CostRange <pyticketswitch.cost_range.CostRange>`): pricining summary from cached availability. Only present when requested. cost_range_details (:class:`CostRangeDetails <pyticketswitch.cost_range.CostRangeDetails>`): summary pricing information broken down by availability. This is cached data. Only present when requested. content (dict): dictionary of :class:`Content <pyticketswitch.content.Content>` objects indexed on content name. Only present when requested. fields (dict): dictionary of :class:`Field <pyticketswitch.content.Content>` objects indexed on field name. Only present when requested. event_info (str): event info in plain text. Only present when requested. event_info_html (str): event info as HTML. Only present when requested. venue_addr (str): venue address in plain text. Only present when requested. venue_addr_html (str): venue address as HTML. Only present when requested. venue_info (str): venue info in plain text. Only present when requested. venue_info_html (str): venue info as HTML. Only present when requested. media (dict): dictionary of :class:`Media <>` objects indexed on media name. Only present when requested. reviews (list): list of :class:`Reviews <>` objects. Only present when requested. critic_review_percent (float): summary of critic review star rating. rated from 1 (lowest) to 5 (highest). availability_details (:class:`AvailabilityDetails <pyticketswitch.availability.AvailabilityDetails>`): summary of availability details from cached data. Only present when requested. component_events (list): list of :class:`Events <pyticketswitch.event.Event>` objects that comprise a meta event. valid_quantities (list): list of valid quanities available for purchase. from cached data, only available when requested by **get_events** or **get_event**. raw (dict): the raw data used to generate the object. is_addon (bool): indicates that the event is an addon. area_code (str): the internal code for the area. This is for internal use only. venue_code (str): the internal code for the venue. This is for internal use only. venue_is_enforced (bool): indicates if the venue is enforced. This is for internal use only. lingo_code (str): a code for the type of event, e.g. theatre or attraction. This is for internal use only. """ def __init__(self, id_, status=None, event_type=None, source=None, source_code=None, venue=None, description=None, postcode=None, classes=None, filters=None, upsell_list=None, city=None, city_code=None, country=None, country_code=None, latitude=None, longitude=None, needs_departure_date=False, needs_duration=False, addon_events=None, upsell_events=None, needs_performance=False, has_performances=False, is_seated=False, show_performance_time=False, min_running_time=None, max_running_time=None, cost_range=None, no_singles_cost_range=None, cost_range_details=None, content=None, event_info_html=None, event_info=None, venue_addr_html=None, venue_addr=None, venue_info=None, venue_info_html=None, media=None, reviews=None, critic_review_percent=None, availability_details=None, component_events=None, valid_quantities=None, fields=None, raw=None, is_add_on=None, area_code=None, venue_code=None, venue_is_enforced=None, lingo_code=None): = id_ self.status = status self.description = description self.source = source self.source_code = source_code self.event_type = event_type self.venue = venue self.classes = classes self.filters = filters self.postcode = postcode = city self.city_code = city_code = country self.country_code = country_code self.latitude = latitude self.longitude = longitude self.max_running_time = max_running_time self.min_running_time = min_running_time self.show_performance_time = show_performance_time self.has_performances = has_performances self.is_seated = is_seated self.needs_departure_date = needs_departure_date self.needs_duration = needs_duration self.needs_performance = needs_performance self.addon_events = addon_events self.upsell_events = upsell_events # TODO This will be removed from the API soon self.upsell_list = upsell_list self.cost_range = cost_range self.no_singles_cost_range = no_singles_cost_range self.cost_range_details = cost_range_details self.content = content self.fields = fields self.event_info = event_info self.event_info_html = event_info_html self.venue_addr = venue_addr self.venue_addr_html = venue_addr_html self.venue_info = venue_info self.venue_info_html = venue_info_html = media = reviews self.critic_review_percent = critic_review_percent self.availability_details = availability_details self.component_events = component_events self.valid_quantities = valid_quantities self.raw = raw self.is_add_on = is_add_on self.venue_code = venue_code self.area_code = area_code self.venue_is_enforced = venue_is_enforced self.lingo_code = lingo_code
[docs] @classmethod def class_dict_from_api_data(cls, data): """Creates a dict of Event data from a raw ticketswitch API call Args: data (dict): the part of the response from a ticketswitch API call that concerns a event. Returns: dict: a new dict populated with the data from the api for creating an :class:`Event <pyticketswitch.event.Event>` object """ id_ = data.get('event_id') if not id_: raise IntegrityError("event_id not found in event data", data=data) geo_data = data.get('geo_data', {}) # the raw field 'has_no_perfs' is a negative flag, so I'm inverting it has_performances = not data.get('has_no_perfs', False) 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) api_cost_range_details = data.get('cost_range_details', {}) ticket_type_list = api_cost_range_details.get('ticket_type', []) cost_range_details = [ TicketType.from_api_data(ticket_type) for ticket_type in ticket_type_list ] api_content = data.get('structured_info', {}) content = { key: Content.from_api_data(value) for key, value in api_content.items() } fields = { field.get('custom_field_name'): Field.from_api_data(field) for field in data.get('custom_fields', {}) } media = {} api_media = data.get('media', {}) for asset in api_media.get('media_asset', []): new_media = Media.from_api_data(asset) media[] = new_media api_video = data.get('video_iframe') if api_video: kwargs = { 'secure_complete_url': api_video.get('video_iframe_url_when_secure'), 'insecure_complete_url': api_video.get('video_iframe_url_when_insecure'), 'caption': api_video.get('video_iframe_caption'), 'caption_html': api_video.get('video_iframe_caption_html'), 'width': api_video.get('video_iframe_width'), 'height': api_video.get('video_iframe_height'), 'name': 'video', } new_video = Media.from_api_data(kwargs) media['video'] = new_video api_reviews = data.get('reviews', {}) reviews = [ Review.from_api_data(api_review) for api_review in api_reviews.get('review', []) ] availability_details = AvailabilityDetails.from_api_data( data.get('avail_details', {})) api_component_events = data.get('meta_event_component_events', {}) component_events = [ Event.from_api_data(meta_event) for meta_event in api_component_events.get('event', []) ] lingo_code = None raw_lingo_data = data.get('lingo_data') if raw_lingo_data: lingo_code = raw_lingo_data.get('lingo_code') kwargs = { 'id_': id_, 'description': data.get('event_desc', None), 'status': data.get('event_status'), 'event_type': data.get('event_type'), 'source_code': data.get('source_code'), 'source': data.get('source_desc'), 'venue': data.get('venue_desc'), 'classes': data.get('classes'), #TODO: don't actually know what filters look like yet... 'filters': data.get('custom_filter', []), 'fields': fields, 'postcode': data.get('postcode'), 'city': data.get('city_desc'), 'city_code': data.get('city_code'), 'country': data.get('country_desc'), 'country_code': data.get('country_code'), 'latitude': geo_data.get('latitude'), 'longitude': geo_data.get('longitude'), 'max_running_time': data.get('max_running_time'), 'min_running_time': data.get('min_running_time'), 'has_performances': has_performances, 'show_performance_time': data.get('show_perf_time', False), 'is_seated': data.get('is_seated', False), 'needs_departure_date': data.get('need_departure_date', False), 'needs_duration': data.get('need_duration', False), 'needs_performance': data.get('need_performance', False), 'upsell_list': data.get('event_upsell_list', {}).get('event_id', []), 'cost_range': cost_range, 'no_singles_cost_range': no_singles_cost_range, 'cost_range_details': cost_range_details, # extra info 'event_info_html': data.get('event_info_html'), 'event_info': data.get('event_info'), 'venue_addr_html': data.get('venue_addr_html'), 'venue_addr': data.get('venue_addr'), 'venue_info': data.get('venue_info'), 'venue_info_html': data.get('venue_info_html'), 'content': content, 'media': media, 'reviews': reviews, 'critic_review_percent': data.get('critic_review_percent'), 'availability_details': availability_details, 'component_events': component_events, 'valid_quantities': data.get('valid_quantities'), 'raw': data, 'is_add_on': data.get('is_add_on'), 'venue_code': data.get('venue_code'), 'area_code': data.get('area_code'), 'lingo_code': lingo_code, } return kwargs
[docs] @classmethod def from_api_data(cls, data): """Creates a new Event object from API data from ticketswitch. Args: data (dict): the part of the response from a ticketswitch API call that concerns a event. Returns: :class:`Event <pyticketswitch.event.Event>`: a new :class:`Event <pyticketswitch.event.Event>` object populated with the data from the api. """ kwargs = cls.class_dict_from_api_data(data) return cls(**kwargs)
[docs] @classmethod def from_events_by_id_api_data(cls, data): """Creates a new Event object from API data from the events_by_id call. Args: data (dict): the part of the response from the ticketswitch `events_by_id` API call containing events and other data. Returns: :class:`Event <pyticketswitch.event.Event>`: a new :class:`Event <pyticketswitch.event.EVent>` object populated with the data from the API. """ kwargs = cls.class_dict_from_api_data(data.get('event')) if data.get('add_ons'): addons=[ Event.from_api_data(raw_addon) for raw_addon in data.get('add_ons') ] kwargs.update(addon_events=addons) if data.get('upsells'): upsells=[ Event.from_api_data(raw_upsell) for raw_upsell in data.get('upsells') ] kwargs.update(upsell_events=upsells) if data.get('venue_is_enforced') is not None: kwargs.update(venue_is_enforced=data.get('venue_is_enforced')) return cls(**kwargs)
def __repr__(self): return u'<Event {}:{}>'.format(, self.description.encode('ascii', 'ignore'))
[docs]class EventMeta(PaginationMixin, CurrencyMeta): """Meta information about a set of events Attributes: currencies (dict): dictionary of :class:`Currency <pytickectswitch.currency.Currency>`) objects indexed on currency code. default_currency_code (str): unless other wise specified all prices in the related response will be in this currency. desired_currency_code (str): the currency that the user account is expecting. Useful for conversions. page_length (int): the number of items per page. page_number (int): the current page. pages_remaining (int): the number of pages remaining. results_remaining (int): the total number of remaining results after the current page. total_results (int): the total number of results. """ pass