|
1 | | -from datetime import datetime |
2 | | -from requests import Request, Session |
| 1 | +import asyncio |
3 | 2 | import json |
4 | 3 |
|
| 4 | +from aiohttp import ClientSession |
| 5 | +from datetime import datetime |
| 6 | +from requests import Session |
| 7 | + |
5 | 8 | session = Session() |
6 | 9 | headers = { |
7 | 10 | "Authorization": "Bearer <key>", |
8 | 11 | "Content-Type": "application/json" |
9 | 12 | } |
10 | 13 |
|
| 14 | +eventBriteApiUrl = "https://www.eventbriteapi.com/v3/" |
11 | 15 | organisationId = "464103861019" |
12 | | -monthNames = ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"] |
13 | 16 |
|
| 17 | +monthNames = ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"] |
14 | 18 | eventTemplate = "<div class=\"row card\"><div class=\"col-12`eventClass`\"><div class=\"row\"><div class=\"col-sm-4 col-lg-2 event-date\"><span class=\"event-date-month\">`month`</span> <span class=\"event-date-day\">`day`</span><p><span class=\"event-date-start-time\">`eventStart``eventStartAmPm` - </span><span class=\"event-date-end-time\">`eventEnd``eventEndAmPm`</span></p></div><div class=\"col-sm-8 col-lg-10 event-title\"><span class=\"event-title\">`eventName`</span></div></div><div class=\"row\"><div class=\"col-md-12 col-lg-9 event-description\"><span class=\"event-description\">`eventDescription`</span></div><div class=\"col-md-12 col-lg-3 event-book-button\"><!-- Noscript content for added SEO --><noscript><a href=\"https://www.eventbrite.co.uk/e/programming-101-tickets-`eventId`\"rel=\"noopener noreferrer\" target=\"_blank\"></noscript><!-- You can customize this button any way you like --><button id=\"`eventbriteWidgetModalTriggerEventId`\" class=\"btn `registerButtonClass` float-right\"type=\"button\">`registerButtonText`</button><noscript></a>Register for tickets on Eventbrite</noscript></div></div></div></div>" |
15 | 19 | widgetPrefix = "var orderComplete = function () {var resultString = \"Order complete!\";alert(resultString);console.log(resultString);};" |
16 | 20 | widgetTemplate = "/* `eventName` */ window.EBWidgets.createWidget({widgetType: 'checkout',eventId: '`eventId`',modal: true,modalTriggerElementId: '`eventbriteWidgetModalTriggerEventId`',onOrderComplete: orderComplete});" |
17 | 21 |
|
18 | | -def getOrganisationUrl(organisationId): |
19 | | - return "https://www.eventbriteapi.com/v3/organizations/" + str(organisationId) |
20 | | - |
21 | | -def getEventUrl(eventId): |
22 | | - return "https://www.eventbriteapi.com/v3/events/" + str(eventId) |
23 | | - |
24 | | -def getResponse(url): |
25 | | - response = session.get(url = url, headers = headers) |
26 | | - return json.loads(response.text) |
| 22 | +async def fetchEventTicketClasses(session, eventId): |
| 23 | + url = eventBriteApiUrl + "events/" + str(eventId) + "/ticket_classes/" |
| 24 | + async with session.get(url = url, headers = headers) as response: |
| 25 | + responseJson = await response.json() |
| 26 | + return {'eventId': eventId, 'response': responseJson} |
27 | 27 |
|
28 | 28 | def getOrganisationEvents(organisationId): |
29 | | - return getResponse(getOrganisationUrl(organisationId) + "/events/") |
| 29 | + eventsUrl = eventBriteApiUrl + "organizations/" + str(organisationId) + "/events/" |
| 30 | + response = session.get(url = eventsUrl, headers = headers) |
| 31 | + return json.loads(response.text)['events'] |
| 32 | + |
| 33 | +async def getEventTicketClasses(eventData): |
| 34 | + async with ClientSession() as session: |
| 35 | + asyncTasks = [] |
| 36 | + for event in eventData: |
| 37 | + asyncTasks.append(fetchEventTicketClasses(session, event['id'])) |
| 38 | + |
| 39 | + responses = await asyncio.gather(*asyncTasks, return_exceptions=True) |
| 40 | + |
| 41 | + ticketClassData = {} |
| 42 | + for response in responses: |
| 43 | + if response['response']['pagination']['object_count'] == 0: |
| 44 | + continue |
| 45 | + |
| 46 | + ticketClassData[response['eventId']] = response['response'] |
| 47 | + |
| 48 | + return ticketClassData |
30 | 49 |
|
31 | | -def getEventAttendees(eventId): |
32 | | - return getResponse(getEventUrl(eventId) + "/attendees/") |
| 50 | +def processOrganisationEventsResponse(response): |
| 51 | + global organisationEvents |
| 52 | + organisationEvents = json.loads(response.text) |
33 | 53 |
|
34 | | -def getEventTicketClasses(eventId): |
35 | | - return getResponse(getEventUrl(eventId) + "/ticket_classes/") |
| 54 | +def processEventTicketClassesResponse(response): |
| 55 | + global ticketClasses |
| 56 | + ticketClasses = json.loads(response.text)['ticket_classes'] |
36 | 57 |
|
37 | 58 | def getEventsAsHtml(event, lambda_context): |
38 | | - data = getOrganisationEvents(organisationId) |
| 59 | + organisationEvents = {} |
| 60 | + ticketClasses = [] |
39 | 61 |
|
40 | 62 | content = "" |
41 | 63 | widgets = widgetPrefix |
42 | 64 |
|
43 | | - for event in data['events']: |
| 65 | + eventData = getOrganisationEvents(organisationId) |
| 66 | + ticketClassData = asyncio.run(getEventTicketClasses(eventData)) |
| 67 | + |
| 68 | + for event in eventData: |
| 69 | + if event['status'] != "live": |
| 70 | + continue |
| 71 | + |
44 | 72 | eventId = event['id'] |
45 | 73 |
|
46 | | - ticketClasses = getEventTicketClasses(eventId)['ticket_classes'] |
| 74 | + ticketClass = ticketClassData[eventId]['ticket_classes'] |
47 | 75 | onSaleStatus = '' if ticketClasses == [] else ticketClasses[0]['on_sale_status'] |
48 | 76 |
|
49 | 77 | eventClass = '' |
@@ -98,3 +126,5 @@ def getEventsAsHtml(event, lambda_context): |
98 | 126 | .replace("`eventbriteWidgetModalTriggerEventId`", "eventbrite-widget-modal-trigger-" + eventId) |
99 | 127 |
|
100 | 128 | return {'statusCode': 200, 'content': content, 'widgets': widgets} |
| 129 | + |
| 130 | + |
0 commit comments