1
0
mirror of https://github.com/gryf/slack-backup.git synced 2025-12-17 11:30:25 +01:00

Refactoring _update_channels method

This commit is contained in:
2016-11-20 16:09:10 +01:00
parent cf93a85268
commit 25d4de0ca3

View File

@@ -2,11 +2,12 @@
Create backup for certain date for specified channel in slack Create backup for certain date for specified channel in slack
""" """
import logging import logging
from datetime import datetime
import slackclient import slackclient
from slack_backup import db from slack_backup import db
from slack_backup import objects as o from slack_backup.objects import User, Channel, Purpose, Topic
class Client(object): class Client(object):
@@ -14,6 +15,7 @@ class Client(object):
self.slack = slackclient.SlackClient(token) self.slack = slackclient.SlackClient(token)
self.engine = db.connect(dbfilename) self.engine = db.connect(dbfilename)
self.session = db.Session() self.session = db.Session()
self.q = self.session.query
def get_hisotry(self, selected_channels=None, from_date=0): def get_hisotry(self, selected_channels=None, from_date=0):
@@ -43,6 +45,7 @@ class Client(object):
return history return history
def _get_channel_history(self, channel, latest='now'): def _get_channel_history(self, channel, latest='now'):
return [], None
result = self.slack.api_call("channels.history", result = self.slack.api_call("channels.history",
channel=channel.slackid, count=1000, channel=channel.slackid, count=1000,
latest=latest) latest=latest)
@@ -63,7 +66,7 @@ class Client(object):
logging.error(result['error']) logging.error(result['error'])
return None return None
return [o.Channel(chan) for chan in result['channels']] return [Channel(chan) for chan in result['channels']]
def _update_users(self): def _update_users(self):
"""Fetch and update user list with current state in db""" """Fetch and update user list with current state in db"""
@@ -74,42 +77,56 @@ class Client(object):
return return
for user_data in result['members']: for user_data in result['members']:
user = self.session.query(o.User).\ user = self.q(User).\
filter(o.User.slackid == user_data['id']).one_or_none() filter(User.slackid == user_data['id']).one_or_none()
if user: if user:
user.update(user_data) user.update(user_data)
else: else:
user = o.User(user_data) user = User(user_data)
self.session.add(user) self.session.add(user)
self.session.flush() self.session.flush()
self.session.commit() self.session.commit()
def get_create_obj(self, data, classobj, channel): def _get_create_obj(self, data, classobj, channel):
""" """
Return object if exist in appropriate table (class), compared to the Return object if exist in appropriate table (Topic or Purpose),
data provided, create it otherwise. compared to the data provided, create it otherwise.
""" """
user = self.session.query(o.User).\ user = self.q(User).filter(User.slackid ==
filter(o.User.slackid == data['creator']).one_or_none() data['creator']).one_or_none()
if not user: if not user:
return return
obj = self.session.query(classobj).\ obj = self.q(classobj).\
filter(classobj.last_set == data['last_set']).\ filter(classobj.last_set ==
filter(classobj.value == data['last_set']).\ datetime.fromtimestamp(data['last_set'])).\
filter(classobj.value == data['value']).\
filter(classobj.creator_id == user.id).one_or_none() filter(classobj.creator_id == user.id).one_or_none()
if not obj: if not obj:
# break channel relation
for obj in self.q(classobj).filter(classobj.channel ==
channel).all():
obj.channel = None
# create new object
obj = classobj(data) obj = classobj(data)
obj.creator = user obj.creator = user
obj.channel = channel
self.session.add(obj)
self.session.flush() self.session.flush()
return obj return obj
def _update_channel(self, channel, data):
channel.update(data)
channel.user = self.q(User).filter(User.slackid ==
data['created']).one_or_none()
channel.purpose = self._get_create_obj(data['purpose'], Purpose,
channel)
channel.topic = self._get_create_obj(data['topic'], Topic, channel)
self.session.flush()
def _update_channels(self): def _update_channels(self):
"""Fetch and update user list with current state in db""" """Fetch and update user list with current state in db"""
result = self.slack.api_call("channels.list", presence=0) result = self.slack.api_call("channels.list", presence=0)
@@ -119,25 +136,13 @@ class Client(object):
return None return None
for channel_data in result['channels']: for channel_data in result['channels']:
channel = self.session.query(o.Channel).\ channel = self.q(Channel).filter(Channel.slackid ==
filter(o.Channel.slackid == channel_data['id']).one_or_none() channel_data['id']).one_or_none()
if channel: if not channel:
channel.update(channel_data) channel = Channel()
channel.user = self.session.query(o.User).\
filter(o.User.slackid ==
channel_data['created']).one_or_none()
# channel.purpose = self.get_create_obj(channel_data['purpose'],
# o.Purpose, channel)
# channel.topic = self.get_create_obj(channel_data['topic'],
# o.Topic, channel)
else:
channel = o.Channel(channel_data)
# channel.purpose = self.get_create_obj(channel_data['purpose'],
# o.Purpose, channel)
# channel.topic = self.get_create_obj(channel_data['topic'],
# o.Topic, channel)
self.session.add(channel) self.session.add(channel)
self.session.flush()
self._update_channel(channel, channel_data)
self.session.commit() self.session.commit()