Skip to content

Commit 03b2643

Browse files
committed
Performance improvements for event generation script
1 parent c30c02b commit 03b2643

File tree

3 files changed

+51
-90
lines changed

3 files changed

+51
-90
lines changed

aws_lambda/create-package.bat

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
pip install --target ./package/ aiohttp
12
pip install --target ./package/ requests
23
cd package/
34
zip -r9 ../function.zip .

aws_lambda/eventBriteHelper.py

Lines changed: 50 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,49 +1,77 @@
1-
from datetime import datetime
2-
from requests import Request, Session
1+
import asyncio
32
import json
43

4+
from aiohttp import ClientSession
5+
from datetime import datetime
6+
from requests import Session
7+
58
session = Session()
69
headers = {
710
"Authorization": "Bearer <key>",
811
"Content-Type": "application/json"
912
}
1013

14+
eventBriteApiUrl = "https://www.eventbriteapi.com/v3/"
1115
organisationId = "464103861019"
12-
monthNames = ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"]
1316

17+
monthNames = ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"]
1418
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>"
1519
widgetPrefix = "var orderComplete = function () {var resultString = \"Order complete!\";alert(resultString);console.log(resultString);};"
1620
widgetTemplate = "/* `eventName` */ window.EBWidgets.createWidget({widgetType: 'checkout',eventId: '`eventId`',modal: true,modalTriggerElementId: '`eventbriteWidgetModalTriggerEventId`',onOrderComplete: orderComplete});"
1721

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}
2727

2828
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
3049

31-
def getEventAttendees(eventId):
32-
return getResponse(getEventUrl(eventId) + "/attendees/")
50+
def processOrganisationEventsResponse(response):
51+
global organisationEvents
52+
organisationEvents = json.loads(response.text)
3353

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']
3657

3758
def getEventsAsHtml(event, lambda_context):
38-
data = getOrganisationEvents(organisationId)
59+
organisationEvents = {}
60+
ticketClasses = []
3961

4062
content = ""
4163
widgets = widgetPrefix
4264

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+
4472
eventId = event['id']
4573

46-
ticketClasses = getEventTicketClasses(eventId)['ticket_classes']
74+
ticketClass = ticketClassData[eventId]['ticket_classes']
4775
onSaleStatus = '' if ticketClasses == [] else ticketClasses[0]['on_sale_status']
4876

4977
eventClass = ''
@@ -98,3 +126,5 @@ def getEventsAsHtml(event, lambda_context):
98126
.replace("`eventbriteWidgetModalTriggerEventId`", "eventbrite-widget-modal-trigger-" + eventId)
99127

100128
return {'statusCode': 200, 'content': content, 'widgets': widgets}
129+
130+

aws_lambda/getEventBriteEventsAsHtml.py

Lines changed: 0 additions & 70 deletions
This file was deleted.

0 commit comments

Comments
 (0)