summaryrefslogtreecommitdiff
path: root/server/szurubooru/model/comment.py
blob: e64961e600bc01e55bf2b160e74e4d8adfaacc82 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
import sqlalchemy as sa

from szurubooru.db import get_session
from szurubooru.model.base import Base


class CommentScore(Base):
    __tablename__ = "comment_score"

    comment_id = sa.Column(
        "comment_id",
        sa.Integer,
        sa.ForeignKey("comment.id"),
        nullable=False,
        primary_key=True,
    )
    user_id = sa.Column(
        "user_id",
        sa.Integer,
        sa.ForeignKey("user.id"),
        nullable=False,
        primary_key=True,
        index=True,
    )
    time = sa.Column("time", sa.DateTime, nullable=False)
    score = sa.Column("score", sa.Integer, nullable=False)

    comment = sa.orm.relationship("Comment")
    user = sa.orm.relationship(
        "User",
        backref=sa.orm.backref("comment_scores", cascade="all, delete-orphan"),
    )


class Comment(Base):
    __tablename__ = "comment"

    comment_id = sa.Column("id", sa.Integer, primary_key=True)
    post_id = sa.Column(
        "post_id",
        sa.Integer,
        sa.ForeignKey("post.id"),
        nullable=False,
        index=True,
    )
    user_id = sa.Column(
        "user_id",
        sa.Integer,
        sa.ForeignKey("user.id"),
        nullable=True,
        index=True,
    )
    version = sa.Column("version", sa.Integer, default=1, nullable=False)
    creation_time = sa.Column("creation_time", sa.DateTime, nullable=False)
    last_edit_time = sa.Column("last_edit_time", sa.DateTime)
    text = sa.Column("text", sa.UnicodeText, default=None)

    user = sa.orm.relationship("User")
    post = sa.orm.relationship("Post")
    scores = sa.orm.relationship(
        "CommentScore", cascade="all, delete-orphan", lazy="joined"
    )

    @property
    def score(self) -> int:
        return (
            get_session()
            .query(sa.sql.expression.func.sum(CommentScore.score))
            .filter(CommentScore.comment_id == self.comment_id)
            .one()[0]
            or 0
        )

    __mapper_args__ = {
        "version_id_col": version,
        "version_id_generator": False,
    }