Compare commits
14 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| daab45edda | |||
| 4382449a72 | |||
| dfc0c4173c | |||
| aa2b7eedf6 | |||
| 905febc27b | |||
| 16297f9206 | |||
| c566377ccb | |||
| 9c07f97e87 | |||
| eb195bb6bc | |||
| 71f9da07c7 | |||
| ed4efd82aa | |||
| e33a37b8b9 | |||
| 50465b4502 | |||
| e9748279b8 |
@@ -9,7 +9,7 @@ jobs:
|
||||
runs-on: ubuntu-latest
|
||||
strategy:
|
||||
matrix:
|
||||
python-version: [ "3.7", "3.8", "3.9", "3.10", "3.11" ]
|
||||
python-version: [ "3.8", "3.9", "3.10", "3.11" ]
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v1
|
||||
|
||||
+15
@@ -3,6 +3,21 @@
|
||||
Release history
|
||||
===============
|
||||
|
||||
1.5.0
|
||||
-----
|
||||
|
||||
- Owner creation endpoint update from @akhmerov
|
||||
- Python 3.11 support from @Dettorer
|
||||
- Group membership fixes from @inducer
|
||||
- Rate limiting fixes from @inducer
|
||||
- Latest posts endpoint from @max-lancaster
|
||||
|
||||
|
||||
1.4.0
|
||||
-----
|
||||
|
||||
- Documented here as skipped release
|
||||
|
||||
1.3.0
|
||||
-----
|
||||
|
||||
|
||||
+2
-2
@@ -51,9 +51,9 @@ copyright = u'2014, Marc Sibson'
|
||||
# built documents.
|
||||
#
|
||||
# The short X.Y version.
|
||||
version = '1.1'
|
||||
version = '1.5'
|
||||
# The full version, including alpha/beta/rc tags.
|
||||
release = '1.1.1'
|
||||
release = '1.5.0'
|
||||
|
||||
# The language for content autogenerated by Sphinx. Refer to documentation
|
||||
# for a list of supported languages.
|
||||
|
||||
@@ -26,10 +26,10 @@ classifiers =
|
||||
License :: OSI Approved :: MIT License
|
||||
Operating System :: OS Independent
|
||||
Programming Language :: Python
|
||||
Programming Language :: Python :: 3.7
|
||||
Programming Language :: Python :: 3.8
|
||||
Programming Language :: Python :: 3.9
|
||||
Programming Language :: Python :: 3.10
|
||||
Programming Language :: Python :: 3.11
|
||||
|
||||
[options.packages.find]
|
||||
where=src
|
||||
|
||||
@@ -1,8 +1,6 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
"""Python client for the Discourse API."""
|
||||
|
||||
__version__ = "1.3.0"
|
||||
__version__ = "1.5.0"
|
||||
|
||||
from pydiscourse.client import DiscourseClient
|
||||
|
||||
|
||||
+41
-14
@@ -937,6 +937,18 @@ class DiscourseClient(object):
|
||||
|
||||
return self._get(u"/c/{0}/show.json".format(category_id), **kwargs)
|
||||
|
||||
def update_category(self, category_id, **kwargs):
|
||||
"""
|
||||
|
||||
Args:
|
||||
category_id:
|
||||
**kwargs:
|
||||
|
||||
Returns:
|
||||
|
||||
"""
|
||||
return self._put("/categories/{0}".format(category_id), json=True, **kwargs)
|
||||
|
||||
def delete_category(self, category_id, **kwargs):
|
||||
"""
|
||||
Remove category
|
||||
@@ -1133,9 +1145,7 @@ class DiscourseClient(object):
|
||||
JSON API response
|
||||
|
||||
"""
|
||||
return self._put(
|
||||
"/admin/groups/{0}/owners.json".format(groupid), **{"group[usernames]": username}
|
||||
)
|
||||
return self.add_group_owners(groupid, [username])
|
||||
|
||||
def add_group_owners(self, groupid, usernames):
|
||||
"""
|
||||
@@ -1151,7 +1161,7 @@ class DiscourseClient(object):
|
||||
"""
|
||||
usernames = ",".join(usernames)
|
||||
return self._put(
|
||||
"/admin/groups/{0}/owners.json".format(groupid), **{"group[usernames]": usernames}
|
||||
"/groups/{0}/owners.json".format(groupid), **{"usernames": usernames}
|
||||
)
|
||||
|
||||
def delete_group_owner(self, groupid, userid):
|
||||
@@ -1179,13 +1189,28 @@ class DiscourseClient(object):
|
||||
group = self._get("/groups/{0}/members.json".format(group_name))
|
||||
return group["owners"]
|
||||
|
||||
def _get_paginated_list(self, url, name, offset, **kwargs):
|
||||
result = []
|
||||
initial_offset = offset
|
||||
while True:
|
||||
kwargs["offset"] = offset
|
||||
response = self._get(url, **kwargs)
|
||||
nreturned = len(response[name])
|
||||
result.extend(response[name])
|
||||
offset += nreturned
|
||||
|
||||
if response["meta"]["total"] == len(result) - initial_offset:
|
||||
return result
|
||||
if nreturned == 0:
|
||||
raise RuntimeError("more items expected, but none returned")
|
||||
|
||||
def group_members(self, group_name, offset=0, **kwargs):
|
||||
"""
|
||||
Get all members of a group by group name
|
||||
"""
|
||||
kwargs["offset"] = offset
|
||||
group = self._get("/groups/{0}/members.json".format(group_name), **kwargs)
|
||||
return group["members"]
|
||||
return self._get_paginated_list(
|
||||
"/groups/{0}/members.json".format(group_name),
|
||||
"members", offset, **kwargs)
|
||||
|
||||
def add_group_member(self, groupid, username):
|
||||
"""
|
||||
@@ -1203,7 +1228,7 @@ class DiscourseClient(object):
|
||||
|
||||
"""
|
||||
return self._put(
|
||||
"/admin/groups/{0}/members.json".format(groupid), usernames=username
|
||||
"/groups/{0}/members.json".format(groupid), usernames=username
|
||||
)
|
||||
|
||||
def add_group_members(self, groupid, usernames):
|
||||
@@ -1223,7 +1248,8 @@ class DiscourseClient(object):
|
||||
"""
|
||||
usernames = ",".join(usernames)
|
||||
return self._put(
|
||||
"/admin/groups/{0}/members.json".format(groupid), usernames=usernames
|
||||
"/groups/{0}/members.json".format(groupid), usernames=usernames,
|
||||
json=True,
|
||||
)
|
||||
|
||||
def add_user_to_group(self, groupid, userid):
|
||||
@@ -1243,7 +1269,7 @@ class DiscourseClient(object):
|
||||
"""
|
||||
return self._post("/admin/users/{0}/groups".format(userid), group_id=groupid)
|
||||
|
||||
def delete_group_member(self, groupid, userid):
|
||||
def delete_group_member(self, groupid, username):
|
||||
"""
|
||||
Deletes a member from a group by user ID
|
||||
|
||||
@@ -1251,15 +1277,16 @@ class DiscourseClient(object):
|
||||
|
||||
Args:
|
||||
groupid: the ID of the group
|
||||
userid: the ID of the user
|
||||
username: the user name of the user
|
||||
|
||||
Returns:
|
||||
JSON API response
|
||||
|
||||
"""
|
||||
return self._delete(
|
||||
"/admin/groups/{0}/members.json".format(groupid), user_id=userid
|
||||
)
|
||||
return self._request(
|
||||
DELETE, "/groups/{0}/members.json".format(groupid),
|
||||
json={"usernames": username})
|
||||
|
||||
|
||||
def color_schemes(self, **kwargs):
|
||||
"""
|
||||
|
||||
@@ -198,6 +198,11 @@ class MiscellaneousTests(ClientBaseTestCase):
|
||||
self.assertRequestCalled(request, "GET", "/categories.json")
|
||||
self.assertEqual(r, request().json()["category_list"]["categories"])
|
||||
|
||||
def test_update_category(self, request):
|
||||
prepare_response(request)
|
||||
self.client.update_category(123, a="a", b="b")
|
||||
self.assertRequestCalled(request, "PUT", "/categories/123", a="a", b="b")
|
||||
|
||||
def test_users(self, request):
|
||||
prepare_response(request)
|
||||
self.client.users()
|
||||
|
||||
Reference in New Issue
Block a user