-
Notifications
You must be signed in to change notification settings - Fork 60
Description
per create_instructor_answer's current documentation the post parameter can be either a string (the post's cid) or dictionary (post object with id key).
piazza-api/piazza_api/network.py
Lines 192 to 211 in acb5de9
| def create_instructor_answer(self, post, content, revision, anonymous=False): | |
| """Create an instructor's answer to a post `post`. | |
| It seems like if the post has `<p>` tags, then it's treated as HTML, | |
| but is treated as text otherwise. You'll want to provide `content` | |
| accordingly. | |
| :type post: dict|str|int | |
| :param post: Either the post dict returned by another API method, or | |
| the `cid` field of that post. | |
| :type content: str | |
| :param content: The content of the answer. | |
| :type revision: int | |
| :param revision: The number of revisions the answer has gone through. | |
| The first responder should out 0, the first editor 1, etc. | |
| :type anonymous: bool | |
| :param anonymous: Whether or not to post anonymously. | |
| :rtype: dict | |
| :returns: Dictionary with information about the created answer. | |
| """ |
however passing in a string post actually causes an error/crash: that's because
piazza-api/piazza_api/network.py
Lines 212 to 215 in acb5de9
| try: | |
| cid = post["id"] | |
| except KeyError: | |
| cid = post |
doesn't handle the type cases correctly. trying to index
["id"] in a string raises a TypeError not a KeyError so it doesn't get caught, and the fallback doesn't work. one possible fix is to catch the TypeError, as is done in some other functions, e.g. update_post:
piazza-api/piazza_api/network.py
Lines 259 to 275 in acb5de9
| def update_post(self, post, content): | |
| """Update post content by cid | |
| :type post: dict|str|int | |
| :param post: Either the post dict returned by another API method, or | |
| the `cid` field of that post. | |
| :type subject: str | |
| :param content: The content of the followup. | |
| :rtype: dict | |
| :returns: Dictionary with information about the updated post. | |
| """ | |
| try: | |
| cid = post["id"] | |
| except KeyError: | |
| cid = post | |
| except TypeError: | |
| cid = post |
another fix is to just simplify the API and only take in string post ID instead of str|dict|int; after all that is the only part of the post object needed, so it doesn't logically make sense to require the whole object. for most people typing out an additional ["id"] is not all that much added work, and the benefit is that the API is a lot more consistent and well-typed this way.