Skip to content

Commit 54b5062

Browse files
committed
Get more info with fewer requests in client
* Add option to limit past events returned by get_past_events. * Added get_events_attendees and get_events_photos to retrieve that info for multiple events in one API request.
1 parent 77d308d commit 54b5062

File tree

4 files changed

+106
-24
lines changed

4 files changed

+106
-24
lines changed

docs/changelog.rst

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,20 @@ Changelog
44
Releases
55
--------
66

7+
* `Release 0.1.0 - February 17, 2013`_
78
* `Release 0.0.6 - November 26, 2011`_
89
* `Release 0.0.5 - November 6, 2011`_
910
* `Release 0.0.4 - August 21, 2011`_
1011
* `Release 0.0.3 - August 13, 2011`_
1112
* `Release 0.0.2 - August 13, 2011`_
1213
* `Release 0.0.1 - August 7, 2011`_
1314

15+
Release 0.1.0 - February 17, 2013
16+
---------------------------------
17+
18+
* Add option to limit past events returned by get_past_events.
19+
* Added get_events_attendees and get_events_photos to retrieve that info for multiple events in one API request.
20+
1421
Release 0.0.6 - November 26, 2011
1522
---------------------------------
1623

pythonkc_meetups/client.py

Lines changed: 90 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -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

pythonkc_meetups/types.py

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -87,15 +87,15 @@
8787

8888

8989
MeetupEvent = namedtuple('MeetupEvent',
90-
['id', 'name', 'description', 'time', 'status', 'venue',
91-
'yes_rsvp_count', 'maybe_rsvp_count', 'event_url', 'photo_url',
92-
'attendees', 'photos'])
90+
['id', 'name', 'description', 'time', 'status',
91+
'venue', 'yes_rsvp_count', 'maybe_rsvp_count',
92+
'event_url', 'photo_url', 'attendees', 'photos'])
9393

9494
MeetupVenue = namedtuple('MeetupVenue',
95-
['id', 'name', 'address_1', 'address_2', 'address_3', 'city', 'state',
96-
'zip', 'country', 'lat', 'lon'])
95+
['id', 'name', 'address_1', 'address_2', 'address_3',
96+
'city', 'state', 'zip', 'country', 'lat', 'lon'])
9797

9898
MeetupMember = namedtuple('MeetupMember', ['id', 'name', 'photo'])
9999

100-
MeetupPhoto = namedtuple('MeetupPhoto',
101-
['id', 'url', 'highres_url', 'thumb_url'])
100+
MeetupPhoto = namedtuple('MeetupPhoto',
101+
['id', 'url', 'highres_url', 'thumb_url'])

setup.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,12 @@
77

88
setup(
99
name='pythonkc-meetups',
10-
version='0.0.6',
10+
version='0.1.0',
1111
description='Provides PythonKC Meetup.com events.',
1212
license='MIT',
1313
url='https://github.com/pythonkc/pythonkc-meetups',
1414
packages=find_packages(),
15-
install_requires=['distribute', 'requests==0.7.5',
15+
install_requires=['distribute', 'requests==0.7.5',
1616
'mimeparse==0.1.3', 'python-dateutil==1.5'],
1717
author='Steven Cummings',
1818
author_email='estebistec@gmail.com',

0 commit comments

Comments
 (0)