@@ -33,24 +33,29 @@ class PythonKCMeetups(object):
3333
3434 """
3535
36- def __init__ (self , api_key , http_timeout = 1 , http_retries = 2 ):
36+ def __init__ (self , api_key , num_past_events = None , http_timeout = 1 ,
37+ http_retries = 2 ):
3738 """
3839 Create a new instance.
3940
4041 Parameters
4142 ----------
4243 api_key
4344 The Meetup.com API consumer key to make requests with.
45+ num_past_events
46+ The max number of events retrieved by get_past_events. Defaults to
47+ None (no limit).
4448 http_timeout
45- Time, in seconds, to give HTTP requests to complete.
49+ Time, in seconds, to give HTTP requests to complete. Defaults to 1.
4650 http_retries
4751 The number of times to retry requests when it is appropriate to do
48- so.
52+ so. Defaults to 2.
4953
5054 """
5155 self ._api_key = api_key
5256 self ._http_timeout = http_timeout
5357 self ._http_retries = http_retries
58+ self ._num_past_events = num_past_events
5459
5560 def get_upcoming_events (self ):
5661 """
@@ -98,23 +103,63 @@ def get_past_events(self):
98103 """
99104
100105 def get_attendees (event ):
101- return ( self . get_event_attendees ( event [ 'id' ])
102- if 'id' in event else None )
106+ return [ attendee for event_id , attendee in events_attendees
107+ if event_id == event [ 'id' ]]
103108
104109 def get_photos (event ):
105- return (self .get_event_photos (event ['id' ])
106- if 'id' in event else None )
107-
108- query = urllib .urlencode ({'key' : self ._api_key ,
109- 'group_urlname' : GROUP_URLNAME ,
110- 'status' : 'past' ,
111- 'desc' : 'true' })
110+ return [photo for event_id , photo in events_photos
111+ if event_id == event ['id' ]]
112+
113+ params = {'key' : self ._api_key ,
114+ 'group_urlname' : GROUP_URLNAME ,
115+ 'status' : 'past' ,
116+ 'desc' : 'true' }
117+ if self ._num_past_events :
118+ params ['page' ] = str (self ._num_past_events )
119+ query = urllib .urlencode (params )
112120 url = '{0}?{1}' .format (EVENTS_URL , query )
113121 data = self ._http_get_json (url )
122+
114123 events = data ['results' ]
115- return [parse_event (event , get_attendees (event ), get_photos (event ))
124+ event_ids = [event ['id' ] for event in events ]
125+
126+ events_attendees = self .get_events_attendees (event_ids )
127+ events_photos = self .get_events_photos (event_ids )
128+
129+ return [parse_event (event , get_attendees (event ), get_photos (event ))
116130 for event in events ]
117131
132+ def get_events_attendees (self , event_ids ):
133+ """
134+ Get the attendees of the identified events.
135+
136+ Parameters
137+ ----------
138+ event_ids
139+ List of IDs of events to get attendees for.
140+
141+ Returns
142+ -------
143+ List of tuples of (event id, ``pythonkc_meetups.types.MeetupMember``).
144+
145+ Exceptions
146+ ----------
147+ * PythonKCMeetupsBadJson
148+ * PythonKCMeetupsBadResponse
149+ * PythonKCMeetupsMeetupDown
150+ * PythonKCMeetupsNotJson
151+ * PythonKCMeetupsRateLimitExceeded
152+
153+ """
154+ query = urllib .urlencode ({'key' : self ._api_key ,
155+ 'event_id' : ',' .join (event_ids )})
156+ url = '{0}?{1}' .format (RSVPS_URL , query )
157+ data = self ._http_get_json (url )
158+ rsvps = data ['results' ]
159+ return [(rsvp ['event' ]['id' ], parse_member_from_rsvp (rsvp ))
160+ for rsvp in rsvps
161+ if rsvp ['response' ] != "no" ]
162+
118163 def get_event_attendees (self , event_id ):
119164 """
120165 Get the attendees of the identified event.
@@ -145,6 +190,36 @@ def get_event_attendees(self, event_id):
145190 return [parse_member_from_rsvp (rsvp ) for rsvp in rsvps
146191 if rsvp ['response' ] != "no" ]
147192
193+ def get_events_photos (self , event_ids ):
194+ """
195+ Get photos for the identified events.
196+
197+ Parameters
198+ ----------
199+ event_ids
200+ List of IDs of events to get photos for.
201+
202+ Returns
203+ -------
204+ List of tuples of (event id, ``pythonkc_meetups.types.MeetupPhoto``).
205+
206+ Exceptions
207+ ----------
208+ * PythonKCMeetupsBadJson
209+ * PythonKCMeetupsBadResponse
210+ * PythonKCMeetupsMeetupDown
211+ * PythonKCMeetupsNotJson
212+ * PythonKCMeetupsRateLimitExceeded
213+
214+ """
215+ query = urllib .urlencode ({'key' : self ._api_key ,
216+ 'event_id' : ',' .join (event_ids )})
217+ url = '{0}?{1}' .format (PHOTOS_URL , query )
218+ data = self ._http_get_json (url )
219+ photos = data ['results' ]
220+ return [(photo ['photo_album' ]['event_id' ], parse_photo (photo ))
221+ for photo in photos ]
222+
148223 def get_event_photos (self , event_id ):
149224 """
150225 Get photos for the identified event.
@@ -236,13 +311,13 @@ def _http_get(self, url):
236311 return response
237312
238313 if (try_number >= self ._http_retries or
239- response .status_code not in (408 , 500 , 502 , 503 , 504 )):
314+ response .status_code not in (408 , 500 , 502 , 503 , 504 )):
240315
241316 if response .status_code >= 500 :
242317 raise PythonKCMeetupsMeetupDown (response , response .content )
243318 if response .status_code == 400 :
244319 try :
245- data = json .loads (content )
320+ data = json .loads (response . content )
246321 if data .get ('code' , None ) == 'limit' :
247322 raise PythonKCMeetupsRateLimitExceeded
248323 except : # Don't lose original error when JSON is bad
0 commit comments