from sqlalchemy import Column, Integer, Unicode, DateTime from sqlalchemy.sql.expression import func from szurubooru.db.base import Base from szurubooru.db.post import Post, PostScore, PostFavorite from szurubooru.db.comment import Comment 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' # used for privileges: "nobody can be higher than admin" user_id = Column('id', Integer, primary_key=True) name = Column('name', Unicode(50), nullable=False, unique=True) password_hash = Column('password_hash', Unicode(64), nullable=False) password_salt = Column('password_salt', Unicode(32)) email = Column('email', Unicode(64), nullable=True) rank = Column('rank', Unicode(32), nullable=False) creation_time = Column('creation_time', DateTime, nullable=False) last_login_time = Column('last_login_time', DateTime) avatar_style = Column( 'avatar_style', Unicode(32), nullable=False, default=AVATAR_GRAVATAR) @property def post_count(self): from szurubooru.db import session return session \ .query(func.sum(1)) \ .filter(Post.user_id == self.user_id) \ .one()[0] or 0 @property def comment_count(self): from szurubooru.db import session return session \ .query(func.sum(1)) \ .filter(Comment.user_id == self.user_id) \ .one()[0] or 0 @property def favorite_post_count(self): from szurubooru.db import session return session \ .query(func.sum(1)) \ .filter(PostFavorite.user_id == self.user_id) \ .one()[0] or 0 @property def liked_post_count(self): from szurubooru.db import session return session \ .query(func.sum(1)) \ .filter(PostScore.user_id == self.user_id) \ .filter(PostScore.score == 1) \ .one()[0] or 0 @property def disliked_post_count(self): from szurubooru.db import session return session \ .query(func.sum(1)) \ .filter(PostScore.user_id == self.user_id) \ .filter(PostScore.score == -1) \ .one()[0] or 0