""" Convinient object mapping from slack API reponses """ from datetime import datetime from sqlalchemy import Column, Integer, Text, Boolean, ForeignKey, Float from sqlalchemy import DateTime from sqlalchemy.orm import relationship from slack_backup.db import Base class Purpose(Base): __tablename__ = 'purposes' id = Column(Integer, primary_key=True) last_set = Column(DateTime) value = Column(Text) creator_id = Column(Integer, ForeignKey('users.id'), index=True) creator = relationship("User", back_populates="purposes") channel_id = Column(Integer, ForeignKey('channels.id'), index=True) channel = relationship("Channel", back_populates="purpose") def __init__(self, data_dict=None): self.update(data_dict) def update(self, data_dict): data_dict = data_dict or {} self.last_set = datetime.fromtimestamp(data_dict.get('last_set', 0)) self.value = data_dict.get('value') def __repr__(self): return u'<%s %s>' % (str(hex(id(self))), self.__unicode__()) def __unicode__(self): return u', %s %s' % (self.id, self.value) class Topic(Base): __tablename__ = 'topics' id = Column(Integer, primary_key=True) last_set = Column(DateTime) value = Column(Text) channel_id = Column(Integer, ForeignKey('channels.id'), index=True) channel = relationship("Channel", back_populates="topic") creator_id = Column(Integer, ForeignKey('users.id'), index=True) creator = relationship("User", back_populates="topics") def __init__(self, data_dict=None): self.update(data_dict) def update(self, data_dict): data_dict = data_dict or {} self.last_set = datetime.fromtimestamp(data_dict.get('last_set', 0)) self.value = data_dict.get('value') def __repr__(self): return u'<%s %s>' % (str(hex(id(self))), self.__unicode__()) def __unicode__(self): return u', %s %s' % (self.id, self.value) class Channel(Base): __tablename__ = 'channels' id = Column(Integer, primary_key=True) slackid = Column(Text) name = Column(Text) created = Column(DateTime) is_archived = Column(Boolean, default=False) creator_id = Column(Integer, ForeignKey("users.id"), nullable=True, index=True) creator = relationship("User", back_populates="channels") purpose = relationship("Purpose", uselist=False, back_populates="channel") topic = relationship("Topic", uselist=False, back_populates="channel") messages = relationship("Message", back_populates="channel") def __init__(self, data_dict=None): self.update(data_dict) def update(self, data_dict): data_dict = data_dict or {} self.slackid = data_dict.get('id', '') self.name = data_dict.get('name', '') self.created = datetime.fromtimestamp(data_dict.get('created', 0)) self.is_archived = data_dict.get('is_archived', False) def __repr__(self): return u'<%s %s>' % (str(hex(id(self))), self.__unicode__()) def __unicode__(self): return u'%s, %s %s' % (self.__class__.__name__, self.id, self.name) class UserProfile(Base): __tablename__ = "profiles" id = Column(Integer, primary_key=True) avatar_hash = Column(Text) email = Column(Text) first_name = Column(Text) image_192 = Column(Text) image_24 = Column(Text) image_32 = Column(Text) image_48 = Column(Text) image_72 = Column(Text) image_original = Column(Text) last_name = Column(Text) real_name = Column(Text) real_name_normalized = Column(Text) user_id = Column(Integer, ForeignKey("users.id"), index=True) user = relationship("User", back_populates="profile") def __init__(self, data_dict=None): self.update(data_dict) def update(self, data_dict): data_dict = data_dict or {} self.avatar_hash = data_dict.get('avatar_hash', '') self.email = data_dict.get("email", '') self.first_name = data_dict.get('first_name', '') self.image_192 = data_dict.get('image_192', '') self.image_24 = data_dict.get('image_24', '') self.image_32 = data_dict.get('image_32', '') self.image_48 = data_dict.get('image_48', '') self.image_72 = data_dict.get('image_72', '') self.image_original = data_dict.get('image_original', '') self.last_name = data_dict.get('last_name', '') self.real_name = data_dict.get('real_name', '') self.real_name_normalized = data_dict.get('real_name_normalized', '') class User(Base): __tablename__ = 'users' id = Column(Integer, primary_key=True) deleted = Column(Boolean, default=False) name = Column(Text) real_name = Column(Text) slackid = Column(Text) channels = relationship("Channel", back_populates="creator") messages = relationship("Message", back_populates="user") profile = relationship("UserProfile", uselist=False, back_populates="user") purposes = relationship("Purpose", back_populates="creator") topics = relationship("Topic", back_populates="creator") reaction_id = Column(Integer, ForeignKey("reactions.id")) reaction = relationship("Reaction", back_populates="users") def __init__(self, data_dict=None): self.update(data_dict) def update(self, data_dict=None): data_dict = data_dict or {} self.deleted = data_dict.get('deleted', False) self.name = data_dict.get("name", '') self.real_name = data_dict.get('real_name', '') self.slackid = data_dict.get('id', '') if not self.profile: self.profile = UserProfile(data_dict.get('profile')) else: self.profile.update(data_dict.get('profile')) def __repr__(self): return u'<%s %s>' % (str(hex(id(self))), self.__unicode__()) def __unicode__(self): return u'%s, %s %s' % (self.__class__.__name__, self.id, self.name) class Reaction(Base): __tablename__ = "reactions" id = Column(Integer, primary_key=True) name = Column(Text) users = relationship("User", back_populates="reaction") message_id = Column(Integer, ForeignKey("messages.id"), nullable=True) message = relationship("Message", back_populates="reactions") def __init__(self, data_dict=None): self.update(data_dict) def update(self, data_dict): data_dict = data_dict or {} self.name = data_dict.get('name', '') class Message(Base): __tablename__ = "messages" id = Column(Integer, primary_key=True) ts = Column(Float, index=True) text = Column(Text) type = Column(Text) user_id = Column(Integer, ForeignKey("users.id"), nullable=True, index=True) user = relationship("User", back_populates="messages") channel_id = Column(Integer, ForeignKey("channels.id"), nullable=True, index=True) channel = relationship("Channel", back_populates="messages") reactions = relationship("Reaction", back_populates="message") files = relationship("File", back_populates="message") def __init__(self, data_dict=None): self.update(data_dict) def datetime(self): return datetime.fromtimestamp(self.ts) def update(self, data_dict): data_dict = data_dict or {} self.ts = float(data_dict.get('ts', 0)) self.text = data_dict.get('text', '') self.type = data_dict.get('subtype', '') class File(Base): __tablename__ = "files" id = Column(Integer, primary_key=True) url = Column(Text) thumbnail = Column(Text) relative_path = Column(Text) message_id = Column(Integer, ForeignKey('messages.id')) message = relationship('Message', back_populates='files')