Compare commits

...

11 Commits

Author SHA1 Message Date
Julia Grace 29cb1ce14b fixed test_topic()' 2015-04-22 10:51:39 -07:00
Julia Grace 4e69083284 Merge pull request #8 from RauchF/master
Python 3 compatibility, new GET method (/admin/users/list/)
2015-03-31 10:36:28 -07:00
Felix Rauch cc03b5cc08 Add method to GET list of users (/admin)
This allows to grab all users, as used in the Discourse admin UI at
/admin/users/list. By default grabs all active users, but also accepts
the other views like "staff", "suspended", etc.
2014-12-19 01:22:13 +01:00
Felix Rauch 385e35b322 Add parentheses around print statement for Python 3.x
Python 3.x actually requires parentheses around the arguments to
print().
This shouldn't break compatibility with Python 2.4/2.6, but fixes a
syntax error with Python 3.x.
2014-12-19 00:52:53 +01:00
Julia Grace 9c6097a3d4 Merge pull request #6 from kportertx/patch-1
Potential bug in update_post
2014-12-05 14:10:16 -08:00
Kevin Porter 204eb1478a Potential bug in update_post 2014-12-03 18:48:57 -08:00
Marc Sibson e64b990dc8 Merge branch 'master' of github.com:tindie/pydiscourse 2014-08-06 15:25:15 -07:00
Marc Sibson e358300085 fix topic to avoid redirect 2014-08-06 15:25:05 -07:00
Marc Sibson b8cb201652 Merge pull request #3 from tindie/more-good-errors
try harder to give verbose error messages
2014-07-16 14:29:01 -07:00
Marc Sibson cba141724d try harder to give verbose error messages 2014-07-16 14:26:11 -07:00
Marc Sibson d64651e655 add post update 2014-06-23 22:27:28 -07:00
3 changed files with 38 additions and 13 deletions
+23 -9
View File
@@ -44,13 +44,16 @@ class DiscourseClient(object):
def toggle_gravatar(self, username, state=True, **kwargs):
url = '/users/{0}/preferences/avatar/toggle'.format(username)
if bool(state):
kwargs['use_uploaded_avatar'] = 'true'
else:
kwargs['use_uploaded_avatar'] = 'false'
return self._put(url, **kwargs)
def pick_avatar(self, username, gravatar=True, generated=False, **kwargs):
url = '/users/{0}/preferences/avatar/pick'.format(username)
return self._put(url, **kwargs)
def update_email(self, username, email, **kwargs):
return self._put('/users/{0}/preferences/email'.format(username), email=email, **kwargs)
@@ -77,6 +80,12 @@ class DiscourseClient(object):
"""
return self._delete('/admin/users/{0}.json'.format(userid), **kwargs)
def users(self, filter=None, **kwargs):
if filter is None:
filter = 'active'
return self._get('/admin/users/list/{0}.json'.format(filter), **kwargs)
def private_messages(self, username=None, **kwargs):
if username is None:
username = self.api_username
@@ -91,8 +100,8 @@ class DiscourseClient(object):
def new_topics(self, **kwargs):
return self._get('/new.json', **kwargs)
def topic(self, topic_id, **kwargs):
return self._get('/t/{0}.json'.format(topic_id), **kwargs)
def topic(self, slug, topic_id, **kwargs):
return self._get('/t/{0}/{1}.json'.format(slug, topic_id), **kwargs)
def post(self, topic_id, post_id, **kwargs):
return self._get('/t/{0}/{1}.json'.format(topic_id, post_id), **kwargs)
@@ -129,6 +138,11 @@ class DiscourseClient(object):
"""
return self._post('/posts', raw=content, **kwargs)
def update_post(self, post_id, content, edit_reason='', **kwargs):
kwargs['post[raw]'] = content
kwargs['post[edit_reason]'] = edit_reason
return self._put('/posts/{0}'.format(post_id), **kwargs)
def topics_by(self, username, **kwargs):
url = '/topics/created-by/{0}.json'.format(username)
return self._get(url, **kwargs)['topic_list']['topics']
@@ -207,12 +221,12 @@ class DiscourseClient(object):
log.debug('response %s: %s', response.status_code, repr(response.text))
if not response.ok:
if response.reason:
msg = response.reason
else:
try:
msg = u','.join(response.json()['errors'])
except (ValueError, TypeError, KeyError):
try:
msg = u','.join(response.json()['errors'])
except (ValueError, TypeError, KeyError):
if response.reason:
msg = response.reason
else:
msg = u'{0}: {1}'.format(response.status_code, response.text)
if 400 <= response.status_code < 500:
+8 -2
View File
@@ -30,7 +30,7 @@ class DiscourseCmd(cmd.Cmd):
try:
return method(*args, **kwargs)
except DiscourseError as e:
print e, e.response.text
print (e, e.response.text)
return e.response
return wrapper
@@ -57,8 +57,14 @@ def main():
op.add_option('--api-user', default='system')
op.add_option('-v', '--verbose', action='store_true')
api_key = os.environ['DISCOURSE_API_KEY']
options, args = op.parse_args()
if not options.host.startswith('http'):
op.error('host must include protocol, eg http://')
api_key = os.environ.get('DISCOURSE_API_KEY')
if not api_key:
op.error('please set DISCOURSE_API_KEY')
client = DiscourseClient(options.host, options.api_user, api_key)
if options.verbose:
+7 -2
View File
@@ -82,8 +82,8 @@ class TestTopics(ClientBaseTestCase):
def test_topic(self, request):
prepare_response(request)
self.client.topic(22)
self.assertRequestCalled(request, 'GET', '/t/22.json')
self.client.topic('some-test-slug', 22)
self.assertRequestCalled(request, 'GET', '/t/some-test-slug/22.json')
def test_topics_by(self, request):
prepare_response(request)
@@ -111,3 +111,8 @@ class MiscellaneousTests(ClientBaseTestCase):
r = self.client.categories()
self.assertRequestCalled(request, 'GET', '/categories.json')
self.assertEqual(r, request().json()['category_list']['categories'])
def test_users(self, request):
prepare_response(request)
r = self.client.users()
self.assertRequestCalled(request, 'GET', '/admin/users/list/active.json')