--- a/Allura/allura/model/notification.py
+++ b/Allura/allura/model/notification.py
@@ -103,6 +103,7 @@
n = cls._make_notification(artifact, topic, **kw)
if n:
mbox.queue.append(n._id)
+ mbox.queue_empty = False
return n
@classmethod
@@ -291,7 +292,9 @@
indexes = [
('project_id', 'artifact_index_id'),
('is_flash', 'user_id'),
- ('type', 'next_scheduled')]
+ ('type', 'next_scheduled'), # for q_digest
+ ('type', 'queue_empty'), # for q_direct
+ ]
_id = FieldProperty(S.ObjectId)
user_id = ForeignIdProperty('User', if_missing=lambda:c.user._id)
@@ -314,6 +317,7 @@
# a list of notification _id values
queue = FieldProperty([str])
+ queue_empty = FieldProperty(bool)
project = RelationProperty('Project')
app_config = RelationProperty('AppConfig')
@@ -423,7 +427,9 @@
for mbox in cls.query.find(d):
mbox.query.update(
{'$push':dict(queue=nid),
- '$set':dict(last_modified=datetime.utcnow())})
+ '$set':dict(last_modified=datetime.utcnow(),
+ queue_empty=False),
+ })
# Make sure the mbox doesn't stick around to be flush()ed
session(mbox).expunge(mbox)
@@ -437,7 +443,9 @@
# Queries to find all matching subscription objects
q_direct = dict(
type='direct',
- queue={'$ne':[]})
+ queue={'$ne':[]},
+ queue_empty=False,
+ )
if MAILBOX_QUIESCENT:
q_direct['last_modified']={'$lt':now - MAILBOX_QUIESCENT}
q_digest = dict(
@@ -447,7 +455,9 @@
mbox = cls.query.find_and_modify(
query=dict(_id=mbox._id),
update={'$set': dict(
- queue=[])},
+ queue=[],
+ queue_empty=True,
+ )},
new=False)
mbox.fire(now)
for mbox in cls.query.find(q_digest):
@@ -462,7 +472,9 @@
query=dict(_id=mbox._id),
update={'$set': dict(
next_scheduled=next_scheduled,
- queue=[])},
+ queue=[],
+ queue_empty=True,
+ )},
new=False)
mbox.fire(now)