server/comments: add comment updating
This commit is contained in:
parent
612734e9ff
commit
48cb172cc8
4 changed files with 157 additions and 4 deletions
39
API.md
39
API.md
|
@ -41,7 +41,7 @@
|
||||||
- Comments
|
- Comments
|
||||||
- ~~Listing comments~~
|
- ~~Listing comments~~
|
||||||
- [Creating comment](#creating-comment)
|
- [Creating comment](#creating-comment)
|
||||||
- ~~Updating comment~~
|
- [Updating comment](#updating-comment)
|
||||||
- ~~Getting comment~~
|
- ~~Getting comment~~
|
||||||
- ~~Deleting comment~~
|
- ~~Deleting comment~~
|
||||||
- ~~Rating comment~~
|
- ~~Rating comment~~
|
||||||
|
@ -698,7 +698,7 @@ data.
|
||||||
|
|
||||||
- **Errors**
|
- **Errors**
|
||||||
|
|
||||||
- post does not exist
|
- the post does not exist
|
||||||
- comment text is empty
|
- comment text is empty
|
||||||
- privileges are too low
|
- privileges are too low
|
||||||
|
|
||||||
|
@ -707,6 +707,39 @@ data.
|
||||||
Creates a new comment under given post.
|
Creates a new comment under given post.
|
||||||
|
|
||||||
|
|
||||||
|
## Updating comment
|
||||||
|
- **Request**
|
||||||
|
|
||||||
|
`PUT /comment/<id>`
|
||||||
|
|
||||||
|
- **Input**
|
||||||
|
|
||||||
|
```json5
|
||||||
|
{
|
||||||
|
"text": <new-text> // mandatory
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
- **Output**
|
||||||
|
|
||||||
|
```json5
|
||||||
|
{
|
||||||
|
"comment": <comment>
|
||||||
|
}
|
||||||
|
```
|
||||||
|
...where `<comment>` is a [comment resource](#comment).
|
||||||
|
|
||||||
|
- **Errors**
|
||||||
|
|
||||||
|
- the comment does not exist
|
||||||
|
- new comment text is empty
|
||||||
|
- privileges are too low
|
||||||
|
|
||||||
|
- **Description**
|
||||||
|
|
||||||
|
Updates an existing comment text.
|
||||||
|
|
||||||
|
|
||||||
## Listing users
|
## Listing users
|
||||||
- **Request**
|
- **Request**
|
||||||
|
|
||||||
|
@ -1225,7 +1258,7 @@ A comment under a post.
|
||||||
|
|
||||||
```json5
|
```json5
|
||||||
{
|
{
|
||||||
"id": <comment-id>,
|
"id": <id>,
|
||||||
"post": <post>,
|
"post": <post>,
|
||||||
"user": <author>
|
"user": <author>
|
||||||
"text": <text>,
|
"text": <text>,
|
||||||
|
|
|
@ -1,3 +1,4 @@
|
||||||
|
import datetime
|
||||||
from szurubooru.api.base_api import BaseApi
|
from szurubooru.api.base_api import BaseApi
|
||||||
from szurubooru.func import auth, comments, posts
|
from szurubooru.func import auth, comments, posts
|
||||||
|
|
||||||
|
@ -23,7 +24,23 @@ class CommentDetailApi(BaseApi):
|
||||||
raise NotImplementedError()
|
raise NotImplementedError()
|
||||||
|
|
||||||
def put(self, ctx, comment_id):
|
def put(self, ctx, comment_id):
|
||||||
raise NotImplementedError()
|
comment = comments.get_comment_by_id(comment_id)
|
||||||
|
if not comment:
|
||||||
|
raise comments.CommentNotFoundError(
|
||||||
|
'Comment %r not found.' % comment_id)
|
||||||
|
|
||||||
|
if ctx.user.user_id == comment.user_id:
|
||||||
|
infix = 'self'
|
||||||
|
else:
|
||||||
|
infix = 'any'
|
||||||
|
|
||||||
|
comment.last_edit_time = datetime.datetime.now()
|
||||||
|
auth.verify_privilege(ctx.user, 'comments:edit:%s' % infix)
|
||||||
|
text = ctx.get_param_as_string('text', required=True)
|
||||||
|
comments.update_comment_text(comment, text)
|
||||||
|
|
||||||
|
ctx.session.commit()
|
||||||
|
return {'comment': comments.serialize_comment(comment, ctx.user)}
|
||||||
|
|
||||||
def delete(self, ctx, comment_id):
|
def delete(self, ctx, comment_id):
|
||||||
raise NotImplementedError()
|
raise NotImplementedError()
|
||||||
|
|
|
@ -15,6 +15,12 @@ def serialize_comment(comment, authenticated_user):
|
||||||
'lastEditTime': comment.last_edit_time,
|
'lastEditTime': comment.last_edit_time,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
def get_comment_by_id(comment_id):
|
||||||
|
return db.session \
|
||||||
|
.query(db.Comment) \
|
||||||
|
.filter(db.Comment.comment_id == comment_id) \
|
||||||
|
.one_or_none()
|
||||||
|
|
||||||
def create_comment(user, post, text):
|
def create_comment(user, post, text):
|
||||||
comment = db.Comment()
|
comment = db.Comment()
|
||||||
comment.user = user
|
comment.user = user
|
||||||
|
|
97
server/szurubooru/tests/api/test_comment_updating.py
Normal file
97
server/szurubooru/tests/api/test_comment_updating.py
Normal file
|
@ -0,0 +1,97 @@
|
||||||
|
import datetime
|
||||||
|
import pytest
|
||||||
|
from szurubooru import api, db, errors
|
||||||
|
from szurubooru.func import util, comments
|
||||||
|
|
||||||
|
@pytest.fixture
|
||||||
|
def test_ctx(config_injector, context_factory, user_factory, comment_factory):
|
||||||
|
config_injector({
|
||||||
|
'ranks': ['anonymous', 'regular_user', 'mod'],
|
||||||
|
'rank_names': {'anonymous': 'Peasant', 'regular_user': 'Lord', 'mod': 'King'},
|
||||||
|
'privileges': {
|
||||||
|
'comments:edit:self': 'regular_user',
|
||||||
|
'comments:edit:any': 'mod',
|
||||||
|
},
|
||||||
|
'thumbnails': {'avatar_width': 200},
|
||||||
|
})
|
||||||
|
db.session.flush()
|
||||||
|
ret = util.dotdict()
|
||||||
|
ret.context_factory = context_factory
|
||||||
|
ret.user_factory = user_factory
|
||||||
|
ret.comment_factory = comment_factory
|
||||||
|
ret.api = api.CommentDetailApi()
|
||||||
|
return ret
|
||||||
|
|
||||||
|
def test_simple_updating(test_ctx, fake_datetime):
|
||||||
|
user = test_ctx.user_factory(rank='regular_user')
|
||||||
|
comment = test_ctx.comment_factory(user=user)
|
||||||
|
db.session.add(comment)
|
||||||
|
db.session.commit()
|
||||||
|
with fake_datetime('1997-12-01'):
|
||||||
|
result = test_ctx.api.put(
|
||||||
|
test_ctx.context_factory(input={'text': 'new text'}, user=user),
|
||||||
|
comment.comment_id)
|
||||||
|
assert result['comment']['text'] == 'new text'
|
||||||
|
comment = db.session.query(db.Comment).one()
|
||||||
|
assert comment is not None
|
||||||
|
assert comment.text == 'new text'
|
||||||
|
assert comment.last_edit_time is not None
|
||||||
|
|
||||||
|
@pytest.mark.parametrize('input,expected_exception', [
|
||||||
|
({'text': None}, comments.EmptyCommentTextError),
|
||||||
|
({'text': ''}, comments.EmptyCommentTextError),
|
||||||
|
({'text': []}, comments.EmptyCommentTextError),
|
||||||
|
({'text': [None]}, errors.ValidationError),
|
||||||
|
({'text': ['']}, comments.EmptyCommentTextError),
|
||||||
|
])
|
||||||
|
def test_trying_to_pass_invalid_input(test_ctx, input, expected_exception):
|
||||||
|
user = test_ctx.user_factory()
|
||||||
|
comment = test_ctx.comment_factory(user=user)
|
||||||
|
db.session.add(comment)
|
||||||
|
db.session.commit()
|
||||||
|
with pytest.raises(expected_exception):
|
||||||
|
test_ctx.api.put(
|
||||||
|
test_ctx.context_factory(input=input, user=user),
|
||||||
|
comment.comment_id)
|
||||||
|
|
||||||
|
def test_trying_to_omit_mandatory_field(test_ctx):
|
||||||
|
user = test_ctx.user_factory()
|
||||||
|
comment = test_ctx.comment_factory(user=user)
|
||||||
|
db.session.add(comment)
|
||||||
|
db.session.commit()
|
||||||
|
with pytest.raises(errors.ValidationError):
|
||||||
|
test_ctx.api.put(
|
||||||
|
test_ctx.context_factory(input={}, user=user),
|
||||||
|
comment.comment_id)
|
||||||
|
|
||||||
|
def test_trying_to_update_non_existing(test_ctx):
|
||||||
|
with pytest.raises(comments.CommentNotFoundError):
|
||||||
|
test_ctx.api.put(
|
||||||
|
test_ctx.context_factory(
|
||||||
|
input={'text': 'new text'},
|
||||||
|
user=test_ctx.user_factory(rank='regular_user')),
|
||||||
|
5)
|
||||||
|
|
||||||
|
def test_trying_to_update_someones_comment_without_privileges(test_ctx):
|
||||||
|
user = test_ctx.user_factory(rank='regular_user')
|
||||||
|
user2 = test_ctx.user_factory(rank='regular_user')
|
||||||
|
comment = test_ctx.comment_factory(user=user)
|
||||||
|
db.session.add(comment)
|
||||||
|
db.session.commit()
|
||||||
|
with pytest.raises(errors.AuthError):
|
||||||
|
test_ctx.api.put(
|
||||||
|
test_ctx.context_factory(input={'text': 'new text'}, user=user2),
|
||||||
|
comment.comment_id)
|
||||||
|
|
||||||
|
def test_updating_someones_comment_with_privileges(test_ctx):
|
||||||
|
user = test_ctx.user_factory(rank='regular_user')
|
||||||
|
user2 = test_ctx.user_factory(rank='mod')
|
||||||
|
comment = test_ctx.comment_factory(user=user)
|
||||||
|
db.session.add(comment)
|
||||||
|
db.session.commit()
|
||||||
|
try:
|
||||||
|
test_ctx.api.put(
|
||||||
|
test_ctx.context_factory(input={'text': 'new text'}, user=user2),
|
||||||
|
comment.comment_id)
|
||||||
|
except:
|
||||||
|
pytest.fail()
|
Loading…
Reference in a new issue