Skip to content

Commit

Permalink
Add example of adding a set.
Browse files Browse the repository at this point in the history
  • Loading branch information
hammer committed Feb 3, 2014
1 parent 1398488 commit df73eeb
Show file tree
Hide file tree
Showing 2 changed files with 75 additions and 24 deletions.
66 changes: 49 additions & 17 deletions pyquizlet.py
Expand Up @@ -5,38 +5,70 @@


class Quizlet():
auth_url = 'https://quizlet.com/authorize'
token_url = 'https://api.quizlet.com/oauth/token'
api_url = 'https://api.quizlet.com/2.0'
auth_url_base = 'https://quizlet.com/authorize'
token_url_base = 'https://api.quizlet.com/oauth/token'
api_url_base = 'https://api.quizlet.com/2.0'

def __init__(self, client_id, encoded_auth_str):
def __init__(self, client_id, encoded_auth_str, redirect_uri):
self.client_id = client_id
self.encoded_auth_str = encoded_auth_str
self.redirect_uri = redirect_uri
self.access_info = None

############
# Auth Flow
############
def generate_auth_url(self, scope):
# Generate randome string of 10 hexadecimal digits
state = '%010x' % random.randrange(16**10)
params = {'scope': scope,
'client_id': self.client_id,
'response_type': 'code',
'state': state}
request_string = '?'. join([Quizlet.auth_url, urlencode(params)])
return (request_string, state)
auth_url = '?'. join([Quizlet.auth_url_base, urlencode(params)])
return (auth_url, state)

def request_token(self, code, redirect_uri):
params = {'grant_type': 'authorization_code',
'code': code,
'redirect_uri': redirect_uri}
def request_token(self, code):
data = {'grant_type': 'authorization_code',
'code': code,
'redirect_uri': self.redirect_uri}
headers = {'Content-type': 'application/x-www-form-urlencoded',
'Authorization' : 'Basic %s' % self.encoded_auth_str}
r = requests.post(Quizlet.token_url, headers=headers, data=params)
r = requests.post(Quizlet.token_url_base, headers=headers, data=data)

# Keys: access_token, token_type, expires_in, scope, user_id
self.access_info = r.json()

def make_request(self, api_path, params={}):
base_url = '/'.join([Quizlet.api_url, api_path])
print(base_url)
params['client_id'] = self.client_id
headers = {'Authorization': 'Bearer ' + self.access_info['access_token']}
r = requests.get(base_url, headers=headers, params=params)
##################
# Request Utility
##################
def make_request(self, api_path, params=None, type='get'):
params = params if params else {}
request_url_base = '/'.join([Quizlet.api_url_base, api_path])
headers = {'Authorization': ' '.join(['Bearer',
self.access_info['access_token']])}

# TODO(hammer): clena up this design
if type == 'get':
r = requests.get(request_url_base, headers=headers, params=params)
elif type == 'post':
r = requests.post(request_url_base, headers=headers, data=params)

return r.json()

##################
# Useful Requests
##################
def get_sets(self):
return self.make_request('/'.join(['users',
self.access_info['user_id'],
'sets']))

def add_set(self, title, terms, definitions, lang_terms, lang_definitions):
params = {'title': title,
'terms[]': terms,
'definitions[]': definitions,
'lang_terms': lang_terms,
'lang_definitions': lang_definitions}
return self.make_request('sets', params, 'post')

33 changes: 26 additions & 7 deletions sample_web_app.py
Expand Up @@ -6,20 +6,39 @@
# TODO(hammer): pick this up from environment
client_id = ''
encoded_auth_str = ''
redirect_uri = ''

# TODO(hammer): check state
@app.route("/")
def hello():
q = Quizlet(client_id, encoded_auth_str)
q = Quizlet(client_id, encoded_auth_str, redirect_uri)

# Redirect user to Quizlet's permissions request
if not request.args:
redirect_url, state = q.generate_auth_url('read')
return redirect(redirect_url)
auth_url, state = q.generate_auth_url('read write_set')
return redirect(auth_url)

# TODO(hammer): handle denial of permissions
q.request_token(request.args.get('code'))

# GET the sets
old_sets = q.get_sets()

# POST a new set
title = 'new_set'
terms = ['nuovo', 'vecchio']
definitions = ['new', 'old']
lang_terms = 'it'
lang_definitions = 'en'
new_set = q.add_set(title, terms, definitions, lang_terms, lang_definitions)

auth_code = request.args.get('code')
q.request_token(auth_code, 'http://localhost:5000')
# GET the sets to confirm set was added
new_sets = q.get_sets()

sets = q.make_request('users/lltools/sets/')
return "Hello sets: %s" % sets
# Write it all out
return 'Old sets: %d\nNew set: %s\nNew sets:%d' % (len(old_sets),
new_set,
len(new_sets))


if __name__ == "__main__":
Expand Down

0 comments on commit df73eeb

Please sign in to comment.