szurubooru/server/szurubooru/model/user.py

123 lines
3.8 KiB
Python

import sqlalchemy as sa
from szurubooru.model.base import Base
from szurubooru.model.comment import Comment
from szurubooru.model.post import Post, PostFavorite, PostScore
class User(Base):
__tablename__ = "user"
AVATAR_GRAVATAR = "gravatar"
AVATAR_MANUAL = "manual"
RANK_ANONYMOUS = "anonymous"
RANK_RESTRICTED = "restricted"
RANK_REGULAR = "regular"
RANK_POWER = "power"
RANK_MODERATOR = "moderator"
RANK_ADMINISTRATOR = "administrator"
RANK_NOBODY = "nobody" # unattainable, used for privileges
user_id = sa.Column("id", sa.Integer, primary_key=True)
creation_time = sa.Column("creation_time", sa.DateTime, nullable=False)
last_login_time = sa.Column("last_login_time", sa.DateTime)
version = sa.Column("version", sa.Integer, default=1, nullable=False)
name = sa.Column("name", sa.Unicode(50), nullable=False, unique=True)
password_hash = sa.Column("password_hash", sa.Unicode(128), nullable=False)
password_salt = sa.Column("password_salt", sa.Unicode(32))
password_revision = sa.Column(
"password_revision", sa.SmallInteger, default=0, nullable=False
)
email = sa.Column("email", sa.Unicode(64), nullable=True)
rank = sa.Column("rank", sa.Unicode(32), nullable=False)
avatar_style = sa.Column(
"avatar_style", sa.Unicode(32), nullable=False, default=AVATAR_GRAVATAR
)
comments = sa.orm.relationship("Comment")
@property
def post_count(self) -> int:
from szurubooru.db import session
return (
session.query(sa.sql.expression.func.sum(1))
.filter(Post.user_id == self.user_id)
.one()[0]
or 0
)
@property
def comment_count(self) -> int:
from szurubooru.db import session
return (
session.query(sa.sql.expression.func.sum(1))
.filter(Comment.user_id == self.user_id)
.one()[0]
or 0
)
@property
def favorite_post_count(self) -> int:
from szurubooru.db import session
return (
session.query(sa.sql.expression.func.sum(1))
.filter(PostFavorite.user_id == self.user_id)
.one()[0]
or 0
)
@property
def liked_post_count(self) -> int:
from szurubooru.db import session
return (
session.query(sa.sql.expression.func.sum(1))
.filter(PostScore.user_id == self.user_id)
.filter(PostScore.score == 1)
.one()[0]
or 0
)
@property
def disliked_post_count(self) -> int:
from szurubooru.db import session
return (
session.query(sa.sql.expression.func.sum(1))
.filter(PostScore.user_id == self.user_id)
.filter(PostScore.score == -1)
.one()[0]
or 0
)
__mapper_args__ = {
"version_id_col": version,
"version_id_generator": False,
}
class UserToken(Base):
__tablename__ = "user_token"
user_token_id = sa.Column("id", sa.Integer, primary_key=True)
user_id = sa.Column(
"user_id",
sa.Integer,
sa.ForeignKey("user.id", ondelete="CASCADE"),
nullable=False,
index=True,
)
token = sa.Column("token", sa.Unicode(36), nullable=False)
note = sa.Column("note", sa.Unicode(128), nullable=True)
enabled = sa.Column("enabled", sa.Boolean, nullable=False, default=True)
expiration_time = sa.Column("expiration_time", sa.DateTime, nullable=True)
creation_time = sa.Column("creation_time", sa.DateTime, nullable=False)
last_edit_time = sa.Column("last_edit_time", sa.DateTime)
last_usage_time = sa.Column("last_usage_time", sa.DateTime)
version = sa.Column("version", sa.Integer, default=1, nullable=False)
user = sa.orm.relationship("User")