Skip to content

Commit 7265cec

Browse files
committed
small refactoring and review feedback
1 parent 9672021 commit 7265cec

File tree

4 files changed

+130
-142
lines changed

4 files changed

+130
-142
lines changed

intbot/core/admin.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -26,12 +26,12 @@ class WebhookAdmin(admin.ModelAdmin):
2626
"processed_at",
2727
]
2828

29-
def pretty_meta(self, obj):
29+
def pretty_meta(self, obj: Webhook):
3030
return format_html("<pre>{}</pre>", json.dumps(obj.meta, indent=4))
3131

3232
pretty_meta.short_description = "Meta"
3333

34-
def pretty_content(self, obj):
34+
def pretty_content(self, obj: Webhook):
3535
return format_html("<pre>{}</pre>", json.dumps(obj.content, indent=4))
3636

3737
pretty_content.short_description = "Content"
@@ -61,7 +61,7 @@ class DiscordMessageAdmin(admin.ModelAdmin):
6161
"sent_at",
6262
]
6363

64-
def content_short(self, obj):
64+
def content_short(self, obj: DiscordMessage):
6565
# NOTE(artcz) This can create false shortcuts, but for most messages is
6666
# good enough, because most of them are longer than 20 chars
6767
return f"{obj.content[:10]}...{obj.content[-10:]}"
@@ -84,7 +84,7 @@ class PretalxDataAdmin(admin.ModelAdmin):
8484
"processed_at",
8585
]
8686

87-
def pretty_content(self, obj):
87+
def pretty_content(self, obj: PretalxData):
8888
return format_html("<pre>{}</pre>", json.dumps(obj.content, indent=4))
8989

9090
pretty_content.short_description = "Content"

intbot/core/integrations/pretalx.py

Lines changed: 38 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,66 +1,85 @@
1+
import logging
12
from typing import Any
23

34
import httpx
45
from core.models import PretalxData
56
from django.conf import settings
67

7-
PRETALX_EVENT = "ep2025"
8-
base_url = f"https://pretalx.com/api/events/{PRETALX_EVENT}/"
8+
logger = logging.getLogger(__name__)
99

10-
RESOURCES = {
10+
PRETALX_EVENTS = [
11+
"ep2023",
12+
"ep2024",
13+
"ep2025",
14+
]
15+
16+
ENDPOINTS = {
1117
# Questions need to be passed to include answers in the same endpoint,
1218
# saving us later time with joining the answers.
13-
PretalxData.PretalxEndpoints.submissions: "submissions?questions=all",
14-
PretalxData.PretalxEndpoints.speakers: "speakers?questions=all",
19+
PretalxData.PretalxResources.submissions: "submissions?questions=all",
20+
PretalxData.PretalxResources.speakers: "speakers?questions=all",
1521
}
1622

1723

1824
JsonType = dict[str, Any]
1925

2026

21-
def fetch_pretalx_data(resource) -> list[JsonType]:
27+
def get_event_url(event):
28+
assert event in PRETALX_EVENTS
29+
30+
return f"https://pretalx.com/api/events/{event}/"
31+
32+
33+
def fetch_pretalx_data(event: str, resource: PretalxData.PretalxResources) -> list[JsonType]:
2234
headers = {
2335
"Authorization": f"Token {settings.PRETALX_API_TOKEN}",
2436
"Content-Type": "application/json",
2537
}
2638

27-
endpoint = RESOURCES[resource]
28-
url = base_url + f"{endpoint}"
39+
base_url = get_event_url(event)
40+
endpoint = ENDPOINTS[resource]
41+
url = f"{base_url}{endpoint}"
2942

3043
# Pretalx paginates the output, so we will need to do multiple requests and
3144
# then merge mutliple pages to one big dictionary
32-
res0 = []
45+
results = []
3346
data = {"next": url}
34-
n = 0
47+
page = 0
48+
49+
# This takes advantage of the fact that "next" will contain a url to the
50+
# next page, until there is more data to fetch. If this is the last page,
51+
# then the data["next"] will be None (falsy), and thus stop the while loop.
3552
while url := data["next"]:
36-
n += 1
53+
page += 1
3754
response = httpx.get(url, headers=headers)
3855

3956
if response.status_code != 200:
4057
raise Exception(f"Error {response.status_code}: {response.text}")
4158

59+
logger.info("Fetching data from %s, page %s", url, page)
60+
4261
data = response.json()
43-
res0 += data["results"]
62+
results += data["results"]
4463

45-
return res0
64+
return results
4665

4766

48-
def download_latest_submissions() -> PretalxData:
49-
data = fetch_pretalx_data(PretalxData.PretalxEndpoints.submissions)
67+
def download_latest_submissions(event: str) -> PretalxData:
68+
data = fetch_pretalx_data(event, PretalxData.PretalxResources.submissions)
5069

5170
pretalx_data = PretalxData.objects.create(
52-
endpoint=PretalxData.PretalxEndpoints.submissions,
71+
resource=PretalxData.PretalxResources.submissions,
5372
content=data,
5473
)
5574

5675
return pretalx_data
5776

5877

59-
def download_latest_speakers() -> PretalxData:
60-
data = fetch_pretalx_data(PretalxData.PretalxEndpoints.speakers)
78+
def download_latest_speakers(event: str) -> PretalxData:
79+
data = fetch_pretalx_data(event, PretalxData.PretalxResources.speakers)
6180

6281
pretalx_data = PretalxData.objects.create(
63-
endpoint=PretalxData.PretalxEndpoints.speakers,
82+
resource=PretalxData.PretalxResources.speakers,
6483
content=data,
6584
)
6685

intbot/core/models.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -92,15 +92,15 @@ class PretalxData(models.Model):
9292
"business" tables, like "Proposal" or "Speaker".
9393
"""
9494

95-
class PretalxEndpoints(models.TextChoices):
95+
class PretalxResources(models.TextChoices):
9696
submissions = "submissions", "Submissions"
9797
speakers = "speakers", "Speakers"
9898
schedule = "schedule", "Schedule"
9999

100100
uuid = models.UUIDField(default=uuid.uuid4)
101-
endpoint = models.CharField(
101+
resource= models.CharField(
102102
max_length=255,
103-
choices=PretalxEndpoints.choices,
103+
choices=PretalxResources.choices,
104104
)
105105
content = models.JSONField()
106106

0 commit comments

Comments
 (0)