Skip to content
This repository was archived by the owner on Oct 4, 2023. It is now read-only.

Commit 8bef555

Browse files
committed
Account functionality complete
1 parent 65a89ff commit 8bef555

5 files changed

Lines changed: 155 additions & 12 deletions

File tree

imgur-python/client.py

Lines changed: 115 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,12 @@
11
import requests
2-
from helpers.error import ImgurClientError
2+
from imgur.models.album import Album
3+
from imgur.models.image import Image
34
from imgur.models.account import Account
5+
from imgur.models.comment import Comment
6+
from helpers.error import ImgurClientError
47
from imgur.models.gallery_album import GalleryAlbum
58
from imgur.models.gallery_image import GalleryImage
9+
from imgur.models.account_settings import AccountSettings
610

711
API_URL = 'https://api.imgur.com/'
812

@@ -79,20 +83,37 @@ def make_request(self, method, route, data=None):
7983
header = self.prepare_headers()
8084
response = method_to_call(url, headers=header, data=data)
8185

86+
# TODO: Add rate-limit checks
87+
8288
try:
8389
response_data = response.json()
84-
85-
if 'error' in response_data['data']:
86-
raise ImgurClientError(response_data['data']['error'], response.status_code)
8790
except:
8891
raise ImgurClientError('JSON decoding of response failed.')
8992

93+
if isinstance(response_data['data'], dict) and 'error' in response_data['data']:
94+
raise ImgurClientError(response_data['data']['error'], response.status_code)
95+
9096
return response_data['data']
9197

9298
def validate_user_context(self, username):
9399
if username == 'me' and self.auth is None:
94100
raise ImgurClientError('\'me\' can only be used in the authenticated context.')
95101

102+
def logged_in(self):
103+
if self.auth is None:
104+
raise ImgurClientError('Must be logged in to complete request.')
105+
106+
@staticmethod
107+
def build_gallery_images_and_albums(items):
108+
result = []
109+
for item in items:
110+
if item['is_album']:
111+
result.append(GalleryAlbum(item))
112+
else:
113+
result.append(GalleryImage(item))
114+
115+
return result
116+
96117
# Account-related endpoints
97118
def get_account(self, username):
98119
self.validate_user_context(username)
@@ -109,13 +130,95 @@ def get_account(self, username):
109130

110131
def get_gallery_favorites(self, username):
111132
self.validate_user_context(username)
112-
favorites = self.make_request('GET', 'account/%s/gallery_favorites' % username)
133+
gallery_favorites = self.make_request('GET', 'account/%s/gallery_favorites' % username)
113134

114-
result = []
115-
for favorite in favorites:
116-
if favorite['is_album']:
117-
result.append(GalleryAlbum(favorite))
118-
else:
119-
result.append(GalleryImage(favorite))
135+
return self.build_gallery_images_and_albums(gallery_favorites)
136+
137+
def get_account_favorites(self, username):
138+
self.validate_user_context(username)
139+
favorites = self.make_request('GET', 'account/%s/favorites' % username)
140+
141+
return self.build_gallery_images_and_albums(favorites)
142+
143+
def get_account_submissions(self, username, page=0):
144+
self.validate_user_context(username)
145+
submissions = self.make_request('GET', 'account/%s/submissions/%d' % (username, page))
146+
147+
return self.build_gallery_images_and_albums(submissions)
148+
149+
def get_account_settings(self, username):
150+
self.logged_in()
151+
settings = self.make_request('GET', 'account/%s/settings' % username)
152+
153+
return AccountSettings(
154+
settings['email'],
155+
settings['high_quality'],
156+
settings['public_images'],
157+
settings['album_privacy'],
158+
settings['pro_expiration'],
159+
settings['accepted_gallery_terms'],
160+
settings['active_emails'],
161+
settings['messaging_enabled'],
162+
settings['blocked_users']
163+
)
164+
165+
def change_account_settings(self, username, fields):
166+
allowed_fields = {
167+
'bio', 'public_images', 'messaging_enabled', 'album_privacy', 'accepted_gallery_terms', 'username'
168+
}
120169

121-
return result
170+
post_data = {setting: fields[setting] for setting in set(allowed_fields).intersection(fields.keys())}
171+
172+
return self.make_request('POST', 'account/%s/settings' % username, post_data)
173+
174+
def get_email_verification_status(self, username):
175+
self.logged_in()
176+
self.validate_user_context(username)
177+
return self.make_request('GET', 'account/%s/verifyemail' % username)
178+
179+
def send_verification_email(self, username):
180+
self.logged_in()
181+
self.validate_user_context(username)
182+
return self.make_request('POST', 'account/%s/verifyemail' % username)
183+
184+
def get_account_albums(self, username, page=0):
185+
self.validate_user_context(username)
186+
187+
albums = self.make_request('GET', 'account/%s/albums/%d' % (username, page))
188+
return [Album(album) for album in albums]
189+
190+
def get_account_album_ids(self, username, page=0):
191+
self.validate_user_context(username)
192+
return self.make_request('GET', 'account/%s/albums/ids/%d' % (username, page))
193+
194+
def get_account_album_count(self, username):
195+
self.validate_user_context(username)
196+
return self.make_request('GET', 'account/%s/albums/count' % username)
197+
198+
def get_account_comments(self, username, sort='newest', page=0):
199+
self.validate_user_context(username)
200+
comments = self.make_request('GET', 'account/%s/comments/%s/%s' % (username, sort, page))
201+
202+
return [Comment(comment) for comment in comments]
203+
204+
def get_account_comment_ids(self, username, sort='newest', page=0):
205+
self.validate_user_context(username)
206+
return self.make_request('GET', 'account/%s/comments/ids/%s/%s' % (username, sort, page))
207+
208+
def get_account_comment_count(self, username):
209+
self.validate_user_context(username)
210+
return self.make_request('GET', 'account/%s/comments/count' % username)
211+
212+
def get_account_images(self, username, page=0):
213+
self.validate_user_context(username)
214+
images = self.make_request('GET', 'account/%s/images/%d' % (username, page))
215+
216+
return [Image(image) for image in images]
217+
218+
def get_account_image_ids(self, username, page=0):
219+
self.validate_user_context(username)
220+
return self.make_request('GET', 'account/%s/images/ids/%d' % (username, page))
221+
222+
def get_account_images_count(self, username, page=0):
223+
self.validate_user_context(username)
224+
return self.make_request('GET', 'account/%s/images/ids/%d' % (username, page))
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
class AccountSettings:
2+
3+
def __init__(self, email, high_quality, public_images, album_privacy, pro_expiration, accepted_gallery_terms,
4+
active_emails, messaging_enabled, blocked_users):
5+
self.email = email
6+
self.high_quality = high_quality
7+
self.public_images = public_images
8+
self.album_privacy = album_privacy
9+
self.pro_expiration = pro_expiration
10+
self.accepted_gallery_terms = accepted_gallery_terms
11+
self.active_emails = active_emails
12+
self.messaging_enabled = messaging_enabled
13+
self.blocked_users = blocked_users

imgur-python/imgur/models/album.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
class Album:
2+
3+
# See documentation at https://api.imgur.com/ for available fields
4+
def __init__(self, *initial_data, **kwargs):
5+
for dictionary in initial_data:
6+
for key in dictionary:
7+
setattr(self, key, dictionary[key])
8+
for key in kwargs:
9+
setattr(self, key, kwargs[key])
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
class Comment:
2+
3+
# See documentation at https://api.imgur.com/ for available fields
4+
def __init__(self, *initial_data, **kwargs):
5+
for dictionary in initial_data:
6+
for key in dictionary:
7+
setattr(self, key, dictionary[key])
8+
for key in kwargs:
9+
setattr(self, key, kwargs[key])

imgur-python/imgur/models/image.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
class Image:
2+
3+
# See documentation at https://api.imgur.com/ for available fields
4+
def __init__(self, *initial_data, **kwargs):
5+
for dictionary in initial_data:
6+
for key in dictionary:
7+
setattr(self, key, dictionary[key])
8+
for key in kwargs:
9+
setattr(self, key, kwargs[key])

0 commit comments

Comments
 (0)