summaryrefslogtreecommitdiff
path: root/server/szurubooru/model/pool.py
blob: 3dcdd353d613d152124d0462e56bf498343ae155 (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
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
import sqlalchemy as sa
from sqlalchemy.ext.associationproxy import association_proxy
from sqlalchemy.ext.orderinglist import ordering_list

from szurubooru.model.base import Base


class PoolName(Base):
    __tablename__ = "pool_name"

    pool_name_id = sa.Column("pool_name_id", sa.Integer, primary_key=True)
    pool_id = sa.Column(
        "pool_id",
        sa.Integer,
        sa.ForeignKey("pool.id"),
        nullable=False,
        index=True,
    )
    name = sa.Column("name", sa.Unicode(128), nullable=False, unique=True)
    order = sa.Column("ord", sa.Integer, nullable=False, index=True)

    def __init__(self, name: str, order: int) -> None:
        self.name = name
        self.order = order


class PoolPost(Base):
    __tablename__ = "pool_post"

    pool_id = sa.Column(
        "pool_id",
        sa.Integer,
        sa.ForeignKey("pool.id"),
        nullable=False,
        primary_key=True,
        index=True,
    )
    post_id = sa.Column(
        "post_id",
        sa.Integer,
        sa.ForeignKey("post.id"),
        nullable=False,
        primary_key=True,
        index=True,
    )
    order = sa.Column("ord", sa.Integer, nullable=False, index=True)

    pool = sa.orm.relationship("Pool", back_populates="_posts")
    post = sa.orm.relationship("Post", back_populates="_pools")

    def __init__(self, post) -> None:
        self.post_id = post.post_id


class Pool(Base):
    __tablename__ = "pool"

    pool_id = sa.Column("id", sa.Integer, primary_key=True)
    category_id = sa.Column(
        "category_id",
        sa.Integer,
        sa.ForeignKey("pool_category.id"),
        nullable=False,
        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)
    description = sa.Column("description", sa.UnicodeText, default=None)

    category = sa.orm.relationship("PoolCategory", lazy="joined")
    names = sa.orm.relationship(
        "PoolName",
        cascade="all,delete-orphan",
        lazy="joined",
        order_by="PoolName.order",
    )
    _posts = sa.orm.relationship(
        "PoolPost",
        cascade="all,delete-orphan",
        lazy="joined",
        back_populates="pool",
        order_by="PoolPost.order",
        collection_class=ordering_list("order"),
    )
    posts = association_proxy("_posts", "post")

    post_count = sa.orm.column_property(
        (
            sa.sql.expression.select(
                [sa.sql.expression.func.count(PoolPost.post_id)]
            )
            .where(PoolPost.pool_id == pool_id)
            .as_scalar()
        ),
        deferred=True,
    )

    first_name = sa.orm.column_property(
        (
            sa.sql.expression.select([PoolName.name])
            .where(PoolName.pool_id == pool_id)
            .order_by(PoolName.order)
            .limit(1)
            .as_scalar()
        ),
        deferred=True,
    )

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