""" SQLAlchemy models for the Zulip database tables. """ from sqlalchemy import Column, Integer, String, Text, Boolean, SmallInteger, DateTime, ForeignKey, BigInteger from sqlalchemy.orm import relationship from app.db import Base class Recipient(Base): """ Model for zerver_recipient table in Zulip DB. Recipients can be of different types (e.g., stream, user, huddle). """ __tablename__ = 'zerver_recipient' __table_args__ = {'schema': 'zulip'} id = Column(Integer, primary_key=True) type_id = Column(Integer) type = Column(SmallInteger) # 1 for stream, 2 for user, 3 for huddle # Relationships messages = relationship("Message", back_populates="recipient") stream = relationship("Stream", back_populates="recipient", uselist=False) class Stream(Base): """ Model for zerver_stream table in Zulip DB. Represents a Zulip channel (called stream in Zulip terminology). """ __tablename__ = 'zerver_stream' __table_args__ = {'schema': 'zulip'} id = Column(BigInteger, primary_key=True) name = Column(String) date_created = Column(DateTime) deactivated = Column(Boolean) description = Column(String) rendered_description = Column(Text) invite_only = Column(Boolean) recipient_id = Column(Integer, ForeignKey('zulip.zerver_recipient.id')) realm_id = Column(Integer) # Relationships recipient = relationship("Recipient", back_populates="stream") class Message(Base): """ Model for zerver_message table in Zulip DB. Represents a message sent in Zulip. """ __tablename__ = 'zerver_message' __table_args__ = {'schema': 'zulip'} id = Column(Integer, primary_key=True) sender_id = Column(Integer, ForeignKey('zulip.zerver_userprofile.id')) recipient_id = Column(Integer, ForeignKey('zulip.zerver_recipient.id')) subject = Column(String) content = Column(Text) rendered_content = Column(Text) date_sent = Column(DateTime) type = Column(SmallInteger) # 1 for stream message, 2 for private message has_attachment = Column(Boolean) has_image = Column(Boolean) has_link = Column(Boolean) is_channel_message = Column(Boolean) realm_id = Column(Integer) # Relationships sender = relationship("UserProfile", back_populates="messages") recipient = relationship("Recipient", back_populates="messages") class UserProfile(Base): """ Model for zerver_userprofile table in Zulip DB. Represents a Zulip user. """ __tablename__ = 'zerver_userprofile' __table_args__ = {'schema': 'zulip'} id = Column(Integer, primary_key=True) email = Column(String) full_name = Column(String) is_active = Column(Boolean) realm_id = Column(Integer) # Relationships messages = relationship("Message", back_populates="sender") # Constants for the channels we're monitoring IT_CHANNELS = { "IT Discussions": 5, # id = 5, recipient_id = 16 "IT Knowledge": 17, # id = 17, recipient_id = 47 "IT Support": 16 # id = 16, recipient_id = 43 } # Recipient IDs for the channels we're monitoring IT_RECIPIENT_IDS = [16, 47, 43]