from sqlalchemy.ext.declarative import declarative_base from sqlalchemy import Column, BigInteger, String, ForeignKey, \ Boolean, LargeBinary, Text from sqlalchemy.dialects.postgresql import UUID Base = declarative_base() class User(Base): """ All recognised Hackaday.io users, including legitmate ones. """ __tablename__ = 'user' user_id = Column(BigInteger, primary_key=True) screen_name = Column(String) url = Column(String) avatar_id = Column(BigInteger, ForeignKey('avatar.avatar_id')) last_update = Column(DateTime(timezone=True)) class Group(Base): """ Groups used for classifying users. """ __tablename__ = 'group' group_id = Column(BigInteger, primary_key=True) name = Column(String, unique=True) class GroupMember(Base): """ Group membership links. """ __tablename__ = 'group_member' group_id = Column(BigInteger, ForeignKey('group.group_id'), primary_key=True, index=True) user_id = Column(BigInteger, ForeignKey('user.user_id'), primary_key=True, index=True) class Session(Base): """ Session token storage. The session ID will be emitted to the user, so we use a UUID field to make the value unguessable. """ __tablename__ = 'session' session_id = Column(UUID, primary_key=True) user_id = Column(BigInteger, ForeignKey('user.user_id')) token = Column(String) class UserDetail(Base): """ Detail on 'suspect' users. Only users that have been identified as possibly spammy by the search algorithm, or users that have been flagged as spammy by logged-in users, appear here. """ __tablename__ = 'user_detail' user_id = Column(BigInteger, ForeignKey('user.user_id'), primary_key=True) about_me = Column(Text) who_am_i = Column(Text) class UserLink(Base): """ Links attached to 'suspect' users. """ __tablename__ = 'user_link' user_id = Column(BigInteger, ForeignKey('user.user_id'), primary_key=True) title = Column(Text) location = Column(String) url = Column(String) class Avatar(Base): """ A cache of users' avatars, as some share the same image. """ __tablename__ = 'avatar' avatar_id = Column(BigInteger, primary_key=True) url = Column(String, unique=True, index=True) avatar = Column(LargeBinary) avatar_type = Column(String) class Tag(Base): """ A list of tags seen applied to users' accounts. """ __tablename__ = 'tag' tag_id = Column(BigInteger, primary_key=True) tag = Column(String, unique=True, index=True) class UserTag(Base): """ A list of tags applied to a user's account. """ __tablename__ = 'user_tag' user_id = Column(BigInteger, ForeignKey('user.user_id'), primary_key=True) tag_id = Column(BigInteger, ForeignKey('tag.tag_id'), primary_key=True)