This repository has been archived on 2025-02-26. You can view files and clone it, but cannot push or open issues or pull requests.
szurubooru/server/szurubooru/func/comments.py

105 lines
3 KiB
Python

from datetime import datetime
from typing import Any, Callable, Dict, List, Optional
from szurubooru import db, errors, model, rest
from szurubooru.func import scores, serialization, users
class InvalidCommentIdError(errors.ValidationError):
pass
class CommentNotFoundError(errors.NotFoundError):
pass
class EmptyCommentTextError(errors.ValidationError):
pass
class CommentSerializer(serialization.BaseSerializer):
def __init__(self, comment: model.Comment, auth_user: model.User) -> None:
self.comment = comment
self.auth_user = auth_user
def _serializers(self) -> Dict[str, Callable[[], Any]]:
return {
"id": self.serialize_id,
"user": self.serialize_user,
"postId": self.serialize_post_id,
"version": self.serialize_version,
"text": self.serialize_text,
"creationTime": self.serialize_creation_time,
"lastEditTime": self.serialize_last_edit_time,
"score": self.serialize_score,
"ownScore": self.serialize_own_score,
}
def serialize_id(self) -> Any:
return self.comment.comment_id
def serialize_user(self) -> Any:
return users.serialize_micro_user(self.comment.user, self.auth_user)
def serialize_post_id(self) -> Any:
return self.comment.post.post_id
def serialize_version(self) -> Any:
return self.comment.version
def serialize_text(self) -> Any:
return self.comment.text
def serialize_creation_time(self) -> Any:
return self.comment.creation_time
def serialize_last_edit_time(self) -> Any:
return self.comment.last_edit_time
def serialize_score(self) -> Any:
return self.comment.score
def serialize_own_score(self) -> Any:
return scores.get_score(self.comment, self.auth_user)
def serialize_comment(
comment: model.Comment, auth_user: model.User, options: List[str] = []
) -> rest.Response:
if comment is None:
return None
return CommentSerializer(comment, auth_user).serialize(options)
def try_get_comment_by_id(comment_id: int) -> Optional[model.Comment]:
comment_id = int(comment_id)
return (
db.session.query(model.Comment)
.filter(model.Comment.comment_id == comment_id)
.one_or_none()
)
def get_comment_by_id(comment_id: int) -> model.Comment:
comment = try_get_comment_by_id(comment_id)
if comment:
return comment
raise CommentNotFoundError("Comment %r not found." % comment_id)
def create_comment(
user: model.User, post: model.Post, text: str
) -> model.Comment:
comment = model.Comment()
comment.user = user
comment.post = post
update_comment_text(comment, text)
comment.creation_time = datetime.utcnow()
return comment
def update_comment_text(comment: model.Comment, text: str) -> None:
assert comment
if not text:
raise EmptyCommentTextError("Comment text cannot be empty.")
comment.text = text