1+ import json
2+
13import requests
4+ from django .core .cache import cache
25
36from config .environment import settings
47
58
69class PretalxService :
7- def __init__ (self , base_url : str ):
8- self .base_url = settings .PRETALX .BASE_URL .rstrip ("/" )
10+ def __init__ (self , base_url : str | None = None ):
11+ self .base_url = base_url or settings .PRETALX .BASE_URL .rstrip ("/" )
912 self .headers = {
10- "Authorization" : f"Token { settings .PRETALX .API_TOKEN } " ,
1113 "Content-Type" : "application/json" ,
1214 }
1315
@@ -17,14 +19,39 @@ def get_event(self, event_slug: str):
1719 return response .json () if response .ok else response .raise_for_status ()
1820
1921 def get_submissions (self , event_slug : str ):
20- url = f"{ self .base_url } /api/events/{ event_slug } /submissions/"
22+ cache_key = f"pretalx_submissions_{ event_slug } "
23+ cached = cache .get (cache_key )
24+ if cached :
25+ return cached
26+ url = f"{ self .base_url } /api/events/{ event_slug } /submissions/?page_size=999"
2127 response = requests .get (url , headers = self .headers )
22- return response .json () if response .ok else response .raise_for_status ()
28+ data = response .json () if response .ok else response .raise_for_status ()
29+ cache .set (cache_key , data )
30+ return data
2331
2432 def get_speakers (self , event_slug : str ):
25- url = f"{ self .base_url } /api/events/{ event_slug } /speakers/"
26- response = requests .get (url , headers = self .headers )
27- return response .json () if response .ok else response .raise_for_status ()
33+ try :
34+ cache_key = f"pretalx_speakers_{ event_slug } "
35+ cached = cache .get (cache_key )
36+ if cached :
37+ return cached
38+
39+ url = f"{ self .base_url } /api/events/{ event_slug } /speakers/?page_size=999"
40+ response = requests .get (url , headers = self .headers )
41+ data = response .json () if response .ok else response .raise_for_status ()
42+
43+ submissions = self .get_submissions (event_slug )
44+ confirmed_codes = {sub ["code" ] for sub in submissions .get ("results" , []) if sub .get ("state" ) == "confirmed" }
45+
46+ data ["results" ] = [
47+ speaker
48+ for speaker in data .get ("results" , [])
49+ if any (code in confirmed_codes for code in speaker .get ("submissions" , []))
50+ ]
51+ cache .set (cache_key , data )
52+ return data
53+ except requests .RequestException :
54+ return {"results" : []}
2855
2956 def get_talks (self , event_slug : str ):
3057 url = f"{ self .base_url } /api/events/{ event_slug } /talks?limit=999&state=confirmed"
@@ -40,3 +67,8 @@ def send_feedback(self, event_slug: str, submission_id: str, feedback: dict):
4067 url = f"{ self .base_url } /api/events/{ event_slug } /submissions/{ submission_id } /feedback/"
4168 response = requests .post (url , json = feedback , headers = self .headers )
4269 return response .json () if response .ok else response .raise_for_status ()
70+
71+ def get_sessions (self , event_slug : str ):
72+ url = f"{ self .base_url } /api/events/{ event_slug } /sessions/"
73+ response = requests .get (url , headers = self .headers )
74+ return response .json () if response .ok else response .raise_for_status ()
0 commit comments