class User_Challenge_Association(PkModel): __tablename__ = "user_challenge_association" user_id = Column(db.Integer, db.ForeignKey("users.id"), nullable=False) challenge_id = Column(db.Integer, db.ForeignKey("challenges.id"), nullable=False) commited_to_at = Column(db.DateTime, nullable=False, default=dt.datetime.utcnow) done_at = Column(db.DateTime, nullable=True) succeeded = Column(db.Boolean, nullable=False, default=False) challenges = relationship("Challenge", backref="user_challenges") users = relationship("User", backref="user_challenges") def __init__(self, user_id, challenge_id, **kwargs): super().__init__(user_id=user_id, challenge_id=challenge_id, **kwargs)
class Company(PkModel): __tablename__ = "company" name = Column(db.String(80), unique=True, nullable=False) description = Column(db.String(500), nullable=True) challenges = relationship("Challenge", backref="company") def __init__(self, name, description, **kwargs): """Create instance.""" super().__init__(name=name, description=description, **kwargs)
class ChatMessage(PkModel): """A ChatMessage .""" __tablename__ = "chat_messages" text = Column(db.String(180), unique=False, nullable=False) written_at = Column(db.DateTime, nullable=False, default=dt.datetime.utcnow) chat_room_id = reference_col("chat_rooms", nullable=True) room = relationship( "ChatRoom", backref="chat_messages", collection_class=ordering_list("written_at"), ) user_id = reference_col("users", nullable=True) user = relationship("User", backref="chat_messages") def __init__(self, **kwargs): """Create instance.""" super().__init__(**kwargs) def __repr__(self): """Represent instance as a unique string.""" return f"<ChatMessage({self.text!r})>" def get_json(self): """A json representation of the chat message, who, when what.""" # ISO 8601 datetime format d = { "text": self.text, "written_at": self.written_at.strftime("%Y-%m-%dT%H:%M:%S.%f%z"), } if self.user: d["user"] = self.user.username d["is_self"] = self.user == current_user else: d["user"] = "******" d["is_self"] = False return d
class Category(PkModel): """A role for a challenge.""" __tablename__ = "category" name = Column(db.String(80), unique=True, nullable=False) parent_id = Column(db.Integer, db.ForeignKey("category.id"), nullable=True) challenges = relationship("Challenge", backref="category") def __init__(self, name, parent_id, **kwargs): """Create instance.""" super().__init__(name=name, parent_id=parent_id, **kwargs) def __repr__(self): """Represent instance as a unique string.""" return f"<Category({self.name})>"
class Role(PkModel): """A role for a user.""" __tablename__ = "roles" name = Column(db.String(80), unique=True, nullable=False) user_id = reference_col("users", nullable=True) user = relationship("User", backref="roles") def __init__(self, name, **kwargs): """Create instance.""" super().__init__(name=name**kwargs) def __repr__(self): """Represent instance as a unique string.""" return f"<Role({self.name})>"
class ChatRoom(PkModel): """ChatRoom contains various ChatMessages.""" __tablename__ = "chat_rooms" room_id = Column(db.String(80), unique=True, nullable=False) name = Column(db.String(80), unique=False, nullable=True) challenges = relationship("Challenge", backref="chat_room") def __init__(self, **kwargs): """Create instance.""" super().__init__(**kwargs) def __repr__(self): """Represent instance as a unique string.""" return f"<ChatRoom({self.room_id})>" def get_history(self, num=20): """History is a json representation of the last num chat messages in reverse order [{}, {}, ...].""" if len(self.chat_messages) > num: msg = self.chat_messages[-num:] else: msg = self.chat_messages return [m.get_json() for m in msg]