Skip to content

Commit 7624f58

Browse files
mxsashaplaindocs
andauthored
Fix remaining Pretalx scripts (#2420)
Co-authored-by: Sam <[email protected]>
1 parent cdc8242 commit 7624f58

File tree

2 files changed

+74
-18
lines changed

2 files changed

+74
-18
lines changed

docs/_scripts/pretalx2mc-info.py

Lines changed: 36 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
sys.path.insert(1, '../_ext')
1111

1212
import os
13-
from collections import OrderedDict
13+
from collections import OrderedDict, defaultdict
1414
from utils import slugify
1515
import requests
1616
from ruamel import yaml
@@ -27,18 +27,19 @@ def convert_to_yaml(year, series, series_slug, yaml_output, pretalx_slug):
2727
print('Error: PRETALX_TOKEN not found in environment variables.')
2828
return
2929
http_headers = {'Authorization': 'Token ' + os.environ['PRETALX_TOKEN']}
30-
submissions_url = f'https://pretalx.com/api/events/{pretalx_slug}/submissions/?state=confirmed'
30+
submissions_url = f'https://pretalx.com/api/events/{pretalx_slug}/submissions/?state=confirmed&expand=speakers'
3131
print(f'Loading submissions from {submissions_url}...')
3232
submissions = requests.get(submissions_url, headers=http_headers)
3333
if submissions.status_code != 200:
3434
print(f'Error: submissions request failed: {submissions.status_code}: {submissions.text}')
3535
return
3636

37+
answers = get_answers(pretalx_slug, http_headers)
3738
for index, talk in enumerate(submissions.json()['results']):
3839
slug = slugify(talk['title'] + '-' + talk['speakers'][0]['name'])
3940
print(f'Processing talk {slug}...')
4041

41-
speaker_info = retrieve_speaker_info([s['code'] for s in talk['speakers']], http_headers, pretalx_slug)
42+
speaker_info = retrieve_speaker_info([s['code'] for s in talk['speakers']], http_headers, pretalx_slug, answers)
4243
if not speaker_info:
4344
print(f'Error: failed to retrieve info for speaker s["code"]')
4445
return
@@ -57,7 +58,7 @@ def convert_to_yaml(year, series, series_slug, yaml_output, pretalx_slug):
5758
print('Completed!')
5859

5960

60-
def retrieve_speaker_info(speaker_codes, http_headers, pretalx_slug):
61+
def retrieve_speaker_info(speaker_codes, http_headers, pretalx_slug, answers):
6162
result = []
6263
for speaker_code in speaker_codes:
6364
speaker_url = f'https://pretalx.com/api/events/{pretalx_slug}/speakers/{speaker_code}/?questions=all'
@@ -68,12 +69,11 @@ def retrieve_speaker_info(speaker_codes, http_headers, pretalx_slug):
6869
return
6970

7071
def search_answers(speaker_dict, search_string):
71-
for answer in speaker_dict['answers']:
72-
if search_string in answer['question']['question']['en'].lower():
73-
return answer['answer']
72+
for question, answer in answers.get(speaker_code, []):
73+
if search_string in question.lower():
74+
return answer
7475

7576
speaker = speaker_response.json()
76-
speaker_slug = slugify(speaker['name'])
7777

7878
result.append(OrderedDict([
7979
('name', speaker['name']),
@@ -88,6 +88,34 @@ def search_answers(speaker_dict, search_string):
8888
]))
8989
return result
9090

91+
92+
def get_answers(pretalx_slug, http_headers):
93+
url = f'https://pretalx.com/api/events/{pretalx_slug}/answers/?expand=question'
94+
print(f'Loading answers from {url}...')
95+
answers = load_pretalx_resource(url, http_headers)
96+
result = defaultdict(list)
97+
for answer in answers:
98+
result[answer['person']].append((answer['question']['question']['en'], answer['answer']))
99+
return result
100+
101+
def load_pretalx_resource(url, http_headers):
102+
results = []
103+
while url:
104+
response = requests.get(url, headers=http_headers)
105+
# 403 may occur as a pretalx bug
106+
if response.status_code not in [200, 403]:
107+
print(f'Error: request failed: {response.status_code}: {response.text}')
108+
return
109+
110+
results += response.json()['results']
111+
112+
if response.json()['next']:
113+
url = response.json()['next']
114+
else:
115+
break
116+
return results
117+
118+
91119
if __name__ == '__main__':
92120
convert_to_yaml(
93121
year='2025',

docs/_scripts/pretalx2wtd.py

Lines changed: 38 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
sys.path.insert(1, '../_ext')
1111

1212
import os
13-
from collections import OrderedDict
13+
from collections import OrderedDict, defaultdict
1414
from utils import slugify
1515
import requests
1616
from ruamel import yaml
@@ -36,18 +36,19 @@ def convert_to_yaml(year, series, series_slug, yaml_output, pretalx_slug):
3636
print('Error: PRETALX_TOKEN not found in environment variables.')
3737
return
3838
http_headers = {'Authorization': 'Token ' + os.environ['PRETALX_TOKEN']}
39-
submissions_url = f'https://pretalx.com/api/events/{pretalx_slug}/submissions/?state=confirmed'
39+
submissions_url = f'https://pretalx.com/api/events/{pretalx_slug}/submissions/?state=confirmed&expand=speakers'
4040
print(f'Loading submissions from {submissions_url}...')
4141
submissions = requests.get(submissions_url, headers=http_headers)
4242
if submissions.status_code != 200:
4343
print(f'Error: submissions request failed: {submissions.status_code}: {submissions.text}')
4444
return
4545

46+
answers = get_answers(pretalx_slug, http_headers)
4647
for index, talk in enumerate(submissions.json()['results']):
4748
slug = slugify(talk['title'][:MAX_TITLE_LENGTH_FOR_SLUG] + '-' + talk['speakers'][0]['name'])
4849
print(f'Processing talk {slug}...')
4950

50-
speaker_info = retrieve_speaker_info([s['code'] for s in talk['speakers']], http_headers, pretalx_slug)
51+
speaker_info = retrieve_speaker_info([s['code'] for s in talk['speakers']], http_headers, pretalx_slug, answers)
5152
if not speaker_info:
5253
print(f'Error: failed to retrieve info for speaker s["code"]')
5354
return
@@ -71,7 +72,7 @@ def convert_to_yaml(year, series, series_slug, yaml_output, pretalx_slug):
7172
print('Completed!')
7273

7374

74-
def retrieve_speaker_info(speaker_codes, http_headers, pretalx_slug):
75+
def retrieve_speaker_info(speaker_codes, http_headers, pretalx_slug, answers):
7576
result = []
7677
for speaker_code in speaker_codes:
7778
speaker_url = f'https://pretalx.com/api/events/{pretalx_slug}/speakers/{speaker_code}/'
@@ -82,15 +83,15 @@ def retrieve_speaker_info(speaker_codes, http_headers, pretalx_slug):
8283
return
8384

8485
def search_answers(speaker_dict, search_string):
85-
for answer in speaker_dict['answers']:
86-
if search_string in answer['question']['question']['en'].lower():
87-
return answer['answer']
86+
for question, answer in answers.get(speaker_code, []):
87+
if search_string in question.lower():
88+
return answer
8889

8990
speaker = speaker_response.json()
9091
speaker_slug = slugify(speaker['name'])
9192

92-
if speaker['avatar']:
93-
image_response = requests.get(speaker['avatar'], stream=True)
93+
if speaker['avatar_url']:
94+
image_response = requests.get(speaker['avatar_url'], stream=True)
9495
avatar_path = SPEAKER_IMAGE_PATH + speaker_slug + '.' + CONTENT_TYPE_EXTENSIONS[image_response.headers['content-type']]
9596
if image_response.status_code != 200:
9697
print(f'Error: speaker avatar request failed: {image_response.status_code}: {image_response.text}')
@@ -108,9 +109,36 @@ def search_answers(speaker_dict, search_string):
108109
]))
109110
return result
110111

112+
113+
def get_answers(pretalx_slug, http_headers):
114+
url = f'https://pretalx.com/api/events/{pretalx_slug}/answers/?expand=question'
115+
print(f'Loading answers from {url}...')
116+
answers = load_pretalx_resource(url, http_headers)
117+
result = defaultdict(list)
118+
for answer in answers:
119+
result[answer['person']].append((answer['question']['question']['en'], answer['answer']))
120+
return result
121+
122+
def load_pretalx_resource(url, http_headers):
123+
results = []
124+
while url:
125+
response = requests.get(url, headers=http_headers)
126+
# 403 may occur as a pretalx bug
127+
if response.status_code not in [200, 403]:
128+
print(f'Error: request failed: {response.status_code}: {response.text}')
129+
return
130+
131+
results += response.json()['results']
132+
133+
if response.json()['next']:
134+
url = response.json()['next']
135+
else:
136+
break
137+
return results
138+
111139
if __name__ == '__main__':
112140
year='2025'
113-
place="Portland"
141+
place="Berlin"
114142
convert_to_yaml(
115143
year,
116144
series='Write the Docs '+place,

0 commit comments

Comments
 (0)