11import requests
2+ from django .core .cache import cache
23
34from config .environment import settings
45
56
67class PretalxService :
7- def __init__ (self , base_url : str ):
8- self .base_url = settings .PRETALX .BASE_URL .rstrip ("/" )
8+ def __init__ (self , base_url : str | None = None ):
9+ self .base_url = base_url or settings .PRETALX .BASE_URL .rstrip ("/" )
910 self .headers = {
10- "Authorization" : f"Token { settings .PRETALX .API_TOKEN } " ,
1111 "Content-Type" : "application/json" ,
1212 }
1313
@@ -17,14 +17,39 @@ def get_event(self, event_slug: str):
1717 return response .json () if response .ok else response .raise_for_status ()
1818
1919 def get_submissions (self , event_slug : str ):
20- url = f"{ self .base_url } /api/events/{ event_slug } /submissions/"
20+ cache_key = f"pretalx_submissions_{ event_slug } "
21+ cached = cache .get (cache_key )
22+ if cached :
23+ return cached
24+ url = f"{ self .base_url } /api/events/{ event_slug } /submissions/?page_size=999"
2125 response = requests .get (url , headers = self .headers )
22- return response .json () if response .ok else response .raise_for_status ()
26+ data = response .json () if response .ok else response .raise_for_status ()
27+ cache .set (cache_key , data )
28+ return data
2329
2430 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 ()
31+ try :
32+ cache_key = f"pretalx_speakers_{ event_slug } "
33+ cached = cache .get (cache_key )
34+ if cached :
35+ return cached
36+
37+ url = f"{ self .base_url } /api/events/{ event_slug } /speakers/?page_size=999"
38+ response = requests .get (url , headers = self .headers )
39+ data = response .json () if response .ok else response .raise_for_status ()
40+
41+ submissions = self .get_submissions (event_slug )
42+ confirmed_codes = {sub ["code" ] for sub in submissions .get ("results" , []) if sub .get ("state" ) == "confirmed" }
43+
44+ data ["results" ] = [
45+ speaker
46+ for speaker in data .get ("results" , [])
47+ if any (code in confirmed_codes for code in speaker .get ("submissions" , []))
48+ ]
49+ cache .set (cache_key , data )
50+ return data
51+ except requests .RequestException :
52+ return {"results" : []}
2853
2954 def get_talks (self , event_slug : str ):
3055 url = f"{ self .base_url } /api/events/{ event_slug } /talks?limit=999&state=confirmed"
@@ -40,3 +65,8 @@ def send_feedback(self, event_slug: str, submission_id: str, feedback: dict):
4065 url = f"{ self .base_url } /api/events/{ event_slug } /submissions/{ submission_id } /feedback/"
4166 response = requests .post (url , json = feedback , headers = self .headers )
4267 return response .json () if response .ok else response .raise_for_status ()
68+
69+ def get_sessions (self , event_slug : str ):
70+ url = f"{ self .base_url } /api/events/{ event_slug } /sessions/"
71+ response = requests .get (url , headers = self .headers )
72+ return response .json () if response .ok else response .raise_for_status ()
0 commit comments