Optimized frontend notifications

This commit is contained in:
Ruud
2013-08-13 15:40:56 +02:00
parent 6eff724f97
commit 57e92ff8d3
+19 -13
View File
@@ -7,6 +7,7 @@ from couchpotato.core.logger import CPLog
from couchpotato.core.notifications.base import Notification from couchpotato.core.notifications.base import Notification
from couchpotato.core.settings.model import Notification as Notif from couchpotato.core.settings.model import Notification as Notif
from couchpotato.environment import Env from couchpotato.environment import Env
from operator import itemgetter
from sqlalchemy.sql.expression import or_ from sqlalchemy.sql.expression import or_
import threading import threading
import time import time
@@ -19,8 +20,6 @@ log = CPLog(__name__)
class CoreNotifier(Notification): class CoreNotifier(Notification):
m_lock = threading.Lock() m_lock = threading.Lock()
messages = []
listeners = []
def __init__(self): def __init__(self):
super(CoreNotifier, self).__init__() super(CoreNotifier, self).__init__()
@@ -51,10 +50,14 @@ class CoreNotifier(Notification):
addApiView('notification.listener', self.listener) addApiView('notification.listener', self.listener)
fireEvent('schedule.interval', 'core.check_messages', self.checkMessages, hours = 12, single = True) fireEvent('schedule.interval', 'core.check_messages', self.checkMessages, hours = 12, single = True)
fireEvent('schedule.interval', 'core.clean_messages', self.cleanMessages, seconds = 15, single = True)
addEvent('app.load', self.clean) addEvent('app.load', self.clean)
addEvent('app.load', self.checkMessages) addEvent('app.load', self.checkMessages)
self.messages = []
self.listeners = []
def clean(self): def clean(self):
db = get_session() db = get_session()
@@ -169,8 +172,8 @@ class CoreNotifier(Notification):
except: except:
log.debug('Failed sending to listener: %s', traceback.format_exc()) log.debug('Failed sending to listener: %s', traceback.format_exc())
self.listeners = []
self.m_lock.release() self.m_lock.release()
self.cleanMessages()
log.debug('Done notifying frontend') log.debug('Done notifying frontend')
@@ -199,12 +202,14 @@ class CoreNotifier(Notification):
def cleanMessages(self): def cleanMessages(self):
if len(self.messages) == 0:
return
log.debug('Cleaning messages') log.debug('Cleaning messages')
self.m_lock.acquire() self.m_lock.acquire()
for message in self.messages: time_ago = (time.time() - 15)
if message['time'] < (time.time() - 15): self.messages[:] = [m for m in self.messages if (m['time'] > time_ago)]
self.messages.remove(message)
self.m_lock.release() self.m_lock.release()
log.debug('Done cleaning messages') log.debug('Done cleaning messages')
@@ -215,16 +220,16 @@ class CoreNotifier(Notification):
self.m_lock.acquire() self.m_lock.acquire()
recent = [] recent = []
index = 0 try:
for i in xrange(len(self.messages)): index = map(itemgetter('message_id'), self.messages).index(last_id)
index = len(self.messages) - i - 1 recent = self.messages[index+1:]
if self.messages[index]["message_id"] == last_id: break except:
recent = self.messages[index:] pass
self.m_lock.release() self.m_lock.release()
log.debug('Returning for %s %s messages', (last_id, len(recent or []))) log.debug('Returning for %s %s messages', (last_id, len(recent)))
return recent or [] return recent
def listener(self, init = False, **kwargs): def listener(self, init = False, **kwargs):
@@ -237,6 +242,7 @@ class CoreNotifier(Notification):
notifications = db.query(Notif) \ notifications = db.query(Notif) \
.filter(or_(Notif.read == False, Notif.added > (time.time() - 259200))) \ .filter(or_(Notif.read == False, Notif.added > (time.time() - 259200))) \
.all() .all()
for n in notifications: for n in notifications:
ndict = n.to_dict() ndict = n.to_dict()
ndict['type'] = 'notification' ndict['type'] = 'notification'