Skip to content

Commit 1830642

Browse files
Merge pull request #57 from CodeWithGroup/feature/events-page-improvements
Feature/events page improvements
2 parents c30c02b + b088810 commit 1830642

File tree

10 files changed

+120
-405
lines changed

10 files changed

+120
-405
lines changed

_includes/scripts.html

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -29,9 +29,9 @@
2929
"Content-Type": "application/json"
3030
}
3131
}).done(function(data) {
32-
console.log(data.body);
33-
34-
$("#events-scheduled").html(data.content);
32+
$("#events-drop-ins").html(data.dropins);
33+
$("#events-huddles").html(data.huddles);
34+
$("#events-workshops").html(data.workshops);
3535
$("#eventBriteWidgets").append(data.widgets);
3636
$.globalEval(data.widgets);
3737
});

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: 92 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -1,49 +1,81 @@
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 = ""
63+
dropins = ""
64+
huddles = ""
65+
workshops = ""
66+
4167
widgets = widgetPrefix
4268

43-
for event in data['events']:
69+
eventData = getOrganisationEvents(organisationId)
70+
ticketClassData = asyncio.run(getEventTicketClasses(eventData))
71+
72+
for event in eventData:
73+
if event['status'] != "live":
74+
continue
75+
4476
eventId = event['id']
4577

46-
ticketClasses = getEventTicketClasses(eventId)['ticket_classes']
78+
ticketClass = ticketClassData[eventId]['ticket_classes']
4779
onSaleStatus = '' if ticketClasses == [] else ticketClasses[0]['on_sale_status']
4880

4981
eventClass = ''
@@ -75,26 +107,43 @@ def getEventsAsHtml(event, lambda_context):
75107
eventEnd -= 12
76108
eventEndAmPm = "pm"
77109

78-
if event['status'] == "live":
79-
content = content + eventTemplate \
80-
.replace("`eventClass`", eventClass) \
81-
.replace("`registerButtonClass`", registerButtonClass) \
82-
.replace("`registerButtonText`", registerButtonText) \
83-
.replace("`eventClass`", eventClass) \
84-
.replace("`month`", month) \
85-
.replace("`day`", str(day)) \
86-
.replace("`eventStart`", str(eventStart)) \
87-
.replace("`eventStartAmPm`", eventStartAmPm) \
88-
.replace("`eventEnd`", str(eventEnd)) \
89-
.replace("`eventEndAmPm`", eventEndAmPm) \
90-
.replace("`eventName`", eventName) \
91-
.replace("`eventDescription`", eventDescription) \
92-
.replace("`eventId`", eventId) \
93-
.replace("`eventbriteWidgetModalTriggerEventId`", "eventbrite-widget-modal-trigger-" + eventId)
94-
95-
widgets = widgets + "\r\n" + widgetTemplate \
96-
.replace("`eventName`", eventName) \
97-
.replace("`eventId`", eventId) \
98-
.replace("`eventbriteWidgetModalTriggerEventId`", "eventbrite-widget-modal-trigger-" + eventId)
99-
100-
return {'statusCode': 200, 'content': content, 'widgets': widgets}
110+
eventHtml = eventTemplate \
111+
.replace("`eventClass`", eventClass) \
112+
.replace("`registerButtonClass`", registerButtonClass) \
113+
.replace("`registerButtonText`", registerButtonText) \
114+
.replace("`eventClass`", eventClass) \
115+
.replace("`month`", month) \
116+
.replace("`day`", str(day)) \
117+
.replace("`eventStart`", str(eventStart)) \
118+
.replace("`eventStartAmPm`", eventStartAmPm) \
119+
.replace("`eventEnd`", str(eventEnd)) \
120+
.replace("`eventEndAmPm`", eventEndAmPm) \
121+
.replace("`eventName`", eventName) \
122+
.replace("`eventDescription`", eventDescription) \
123+
.replace("`eventId`", eventId) \
124+
.replace("`eventbriteWidgetModalTriggerEventId`", "eventbrite-widget-modal-trigger-" + eventId)
125+
126+
widgets += "\r\n" + widgetTemplate \
127+
.replace("`eventName`", eventName) \
128+
.replace("`eventId`", eventId) \
129+
.replace("`eventbriteWidgetModalTriggerEventId`", "eventbrite-widget-modal-trigger-" + eventId)
130+
131+
content += eventHtml
132+
133+
if 'drop' in eventName.lower() and 'in' in eventName.lower():
134+
dropins += eventHtml
135+
elif 'huddle' in eventName.lower():
136+
huddles += eventHtml
137+
else:
138+
scheduled += eventHtml
139+
140+
if dropins == "":
141+
dropins = "<p>We don't have any drop-ins scheduled at the moment. Ask on Slack if you'd like us to arrange one.</p>"
142+
143+
if huddles == "":
144+
huddles = "<p>We don't have any huddles scheduled at the moment. Ask on Slack if you'd like us to arrange one.</p>"
145+
146+
if workshops == "":
147+
workshops = "<p>We don't have any workshops planned at the moment. Ask on Slack if you'd like us to arrange one.</p>"
148+
149+
return {'statusCode': 200, 'content': content, 'dropins': dropins, 'workshops': workshops, 'widgets': widgets}

aws_lambda/getEventBriteEventsAsHtml.py

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

events.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,4 +26,4 @@ <h1>{{page.title}}</h1>
2626
<br />
2727
{% include_relative pages-events/events-huddles.html %}
2828
<br />
29-
{% include_relative pages-events/events-eventbrite-list.html %}
29+
{% include_relative pages-events/events-workshops.html %}

pages-events/events-drop-ins.html

Lines changed: 2 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -13,64 +13,6 @@ <h2>Drop-in sessions</h2>
1313
You can also click the 'Jitsi Link' buttons below.
1414
</p>
1515

16-
<h3>National Coding Week</h3>
1716
<section id="events-drop-ins">
18-
<div class="row card">
19-
<div class="col-12">
20-
<div class="row">
21-
<div class="col-sm-4 col-lg-2 event-date">
22-
<span class="event-date-month">SEP</span>
23-
<span class="event-date-day">16</span>
24-
<p>
25-
<span class="event-date-start-time">7pm - </span>
26-
27-
<span class="event-date-end-time">9pm</span>
28-
</p>
29-
</div>
30-
<div class="col-sm-8 col-lg-10 event-title">
31-
<span class="event-title">National Coding Week Drop-In</span>
32-
</div>
33-
</div>
34-
<div class="row">
35-
<div class="col-md-12 col-lg-9 event-description">
36-
<span class="event-description">
37-
An ad-hoc event for anyone who would like help with coding or coding-related stuff. This can be
38-
something related to one of our workshops, a question about how to get started, or anything else! </span>
39-
</div>
40-
<div class="col-md-12 col-lg-3 event-book-button">
41-
<a class="btn btn-primary float-right" type="button" href="https://join.codewith.org.uk">Jitsi Link
42-
<span class="fas fa-link"></span></a>
43-
</div>
44-
</div>
45-
</div>
46-
</div>
47-
<div class="row card">
48-
<div class="col-12">
49-
<div class="row">
50-
<div class="col-sm-4 col-lg-2 event-date">
51-
<span class="event-date-month">SEP</span>
52-
<span class="event-date-day">18</span>
53-
<p>
54-
<span class="event-date-start-time">7pm - </span>
55-
56-
<span class="event-date-end-time">9pm</span>
57-
</p>
58-
</div>
59-
<div class="col-sm-8 col-lg-10 event-title">
60-
<span class="event-title">National Coding Week Drop-In</span>
61-
</div>
62-
</div>
63-
<div class="row">
64-
<div class="col-md-12 col-lg-9 event-description">
65-
<span class="event-description">
66-
An ad-hoc event for anyone who would like help with coding or coding-related stuff. This can be
67-
something related to one of our workshops, a question about how to get started, or anything else! </span>
68-
</div>
69-
<div class="col-md-12 col-lg-3 event-book-button">
70-
<a class="btn btn-primary float-right" type="button" href="https://join.codewith.org.uk">Jitsi Link
71-
<span class="fas fa-link"></span></a>
72-
</div>
73-
</div>
74-
</div>
75-
</div>
76-
</section>
17+
<p><i class="fas fa-spinner fa-w-16 fa-spin fa-lg"></i> Loading...</p>
18+
</section>

pages-events/events-eventbrite-list.html

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

0 commit comments

Comments
 (0)